Python LSTM Обратное распространение не проходит проверку градиента - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь закодировать рекуррентную нейронную сеть в python, и у меня возникают проблемы с получением шага обратного распространения для правильного вычисления градиентов, поскольку при проверке с использованием проверки градиента относительная ошибка обычно составляет 1e-2, и я не могу посмотри, где ошибка. Любая помощь будет принята с благодарностью.

def backward(cache, next, prob, target,model):
    wy, by, wf, bf, wu, bu, wo, bo, wc, bc = model
    c_temp, hf, hu, ho, c, a, X, c_old = cache
    a_next, c_next = next
    dy = np.copy(prob)
    dy[target] -= 1
    dwy = np.dot(dy, a.T)
    dby = dy
    dh = wy.T @ dy + a_next
    dho = tanh(c) * dh
    dho = sigmoidGradient(ho) * dho
    dc = ho * dh * tanhGradient(c)
    dc = dc + c_next
    dhf = c_old * dc
    dhf = sigmoidGradient(hf) * dhf
    dhu = c_temp * dc
    dhu = sigmoidGradient(hu) * dhu
    dc_temp = hu * dc
    dc_temp = tanhGradient(c_temp) * dc_temp
    dwf = np.dot(dhf, X.T)
    dbf = dhf
    dXf = np.dot(wf.T, dhf)
    dwu = np.dot(dhu, X.T)
    dbu = dhu
    dXu = np.dot(wu.T, hu)
    dwo = np.dot(dho, X.T)
    dbo = dho
    dXo = np.dot(wo.T, dho)
    dwc = np.dot(dc_temp, X.T)
    dbc = dc_temp
    dXc = np.dot(wc.T, dc_temp)
    dX = dXo + dXc + dXu + dXf
    a_next = dX[:hidden_size, :]
    c_next = hf * dc
    next = (a_next, c_next)
    grad = [dwy, dby, dwf, dbf, dwu, dbu, dwo, dbo, dwc, dbc]
    return next, grad

Примечание: dhf - это ворота забытия, dhu - это ворота обновления, а dho - ворота выхода.

...