Неправильные обновления Backprop в Batchnorm - PullRequest
0 голосов
/ 02 мая 2018

У меня есть эти обновления для Backprop, пожалуйста, дайте мне знать, где часть dx неверна. На графике вычислений я использую X, sample_mean и sample_var. Спасибо за вашу помощь

(x, norm, sample_mean, sample_var, gamma, eps) = cache
dbeta = np.sum(dout, axis = 0)
dgamma = np.sum(dout * norm, axis = 0)
dxminus = dout * gamma / np.sqrt(sample_var + eps)
dmean = - np.sum(dxminus, axis = 0)
dxmean = np.full(x.shape, 1.0/x.shape[0]) * dmean
dvar = np.sum(dout * gamma * (x - sample_mean), axis = 0)
dxvar = dvar * (-1 / x.shape[0]) * np.power(x, -1.5) * (x - sample_mean)
dx = dxminus + dxmean + dxvar

Вычислительный график BatchNorm, который я использовал для получения

1 Ответ

0 голосов
/ 12 мая 2018

Ваша формула dx выглядит неправильно, поскольку узел x будет получать обратное сообщение от двух других узлов (один - сумма, а другой - среднее значение) и выглядит так, как будто вы вычисляете только один компонент:

backprop

Так это должно выглядеть примерно так:

dx1 = dxmu1 + dxmu2
dmu = -1 * np.sum(dxmu1+dxmu2, axis=0)
dx2 = 1. /N * np.ones((N,D)) * dmu
dx = dx1 + dx2

Картинка из этого замечательного поста . Вы также можете найти полный код там.

...