下記のような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];
                                        } 
                                    }
                                }
                            }
                        }
}