

現在、書籍「ゼロから作るDeepLearning２」でRNNの誤差逆伝播法を学習しており、  
そのアルゴリズムについて不明な点があったため、ご教示いただきたいです。  
該当するソースコードと不明点を下記に、記載させていただきます。

質問①： 誤差逆伝播を行う関数への引数が、「時刻tにおける出力の勾配(dhs)と、時刻t+1の勾配(dh)を足し合わせた値」を渡している理由がわからない。  
勾配の更新処理について、ソースコードと、いくつかのサイトの数式を比較したところ、  
数式にはdhsとdhを足し合わせている部分が見当りませんでした。足し合わせている理由についてご教示いただけないでしょうか。

質問②：なぜRNNでは、各時刻tにおける勾配を足し合わせたものを最終的な勾配としているのでしょうか。

[code]

    def backward(self, dhs):
        Wx, Wh, b = self.params
        N, T, H = dhs.shape
        D, H = Wx.shape
    
        dxs = np.empty((N, T, D), dtype='f')
        dh = 0
        grads = [0, 0, 0]
        for t in reversed(range(T)):
            layer = self.layers[t]
            # 勾配の足し合わせ部分
            dx, dh = layer.backward(dhs[:, t, :]+dh) <-- 質問①
            dxs[:, t, :] = dx
    
            for i, grad in enumerate(layer.grads): <-- 質問②
                grads[i] += grad　
    
        for i, grad in enumerate(grads):
            self.grads[i][...] = grad　　
    
        self.dh = dh
    
        return dxs
    
[/code]

初歩的な質問で恐縮ですが、  
何卒よろしくお願いいたします。


CC BY-SA 4.0
2020-01-05T04:41:17.790
61978
2020-01-05T04:41:17.790
28758
question
python 機械学習
RNNの誤差逆伝播法における勾配の足し合わせ処理について