畳み込みニューラルネットワークの畳み込み層における誤差逆伝播について
下記のようなC言語で畳み込み層の逆伝播計算を行う関数を作ったのですが、dWが単調減少しカーネルWの要素が単調増加してしまう現象が起こっているのですが、式にどこか間違いはあるでしょうか?
void convolution_bwd(int m,
int n,
int M,
int N,
float *dY, //(M - m + 1, N - n + 1)
float *dW, //(m, n)
float *db,
const float *X, //(M, N)
const float *W, //(m, n)
float *dX //(M, N)
){
float dbs = *db;
for (int s = 0; s < m; s++) {
for (int t = 0; t < n; t++) {
for (int i = 0; i < M - m + 1; i++) {
for (int j = 0; j < N - n + 1; j++) {
dW[s * n + t] += dY[i * (N - n + 1) + j] * X[t + s * N + i * N + j];
}
}
}
}
for (int i = 0; i < M - m + 1; i++) {
for (int j = 0; j < N - n + 1; j++) {
dbs += dY[i * (N - n + 1) + j];
}
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
for (int s = 0; s < m; s++) {
for (int t = 0; t < n; t++){
if (i - s > 0 && j - t > 0) {
dX[i * (N - n + 1) + j] += dY[- t - s*N + i*N + j] * W[s * n + t];
}
}
}
}
}
}