cyrixlin
cyrixlin
学习长短时记忆网络(LSTM)中发现一个问题,Wfx、Wix, Wox, Wcx的权重梯度的计算,没有对历史时刻t进行累加。而在循环神经网络(RNN)中,损失函数E对权重矩阵U的梯度,也是各个时刻E对U的梯度之和。因此很奇怪,LSTM中损失函数对Wfx、Wix, Wox, Wcx的权重梯度,只取最后时刻的梯度,而没有按历史时刻进行梯度累加。 我怀疑LSTM里Wfx、Wix, Wox, Wcx的权重梯度的计算写错了,也应当按照历史时刻t进行梯度累加。
首先,非常感谢《零基础入门深度学习》作者hanbingtao付出的辛苦努力,提供了这么好的教程和代码程序。 在学习的过程中我发现,零基础入门深度学习(5) - 循环神经网络的代码实现rnn.py有个明显错误的地方,并且我用梯度检验程序验过了,确实有问题。现提出问题和解决方法如下,供作者参考。 原方法内容: def calc_delta_k(self, k, activator): ''' 根据k+1时刻的delta计算k时刻的delta ''' state = self.state_list[k+1].copy() element_wise_op(self.state_list[k+1], activator.backward) self.delta_list[k] = np.dot( np.dot(self.delta_list[k+1].T, self.W), np.diag(state[:,0])).T 这里存在2处明显的错误: 1. state 应取self.state_list[k].copy(),而非k+1元素。 2. state变量取出后,没进行element_wise_op操作,应当放在element_wise_op方法中进行逐元素的activator.backward操作。 分析:...
首先,非常感谢《零基础入门深度学习》作者hanbingtao付出的辛苦努力,提供了这么好的教程和代码程序。 误差项沿时间的反向传递 公式(13)明显写错了。 将误差项向前传递到任意k时刻的公式: δ k T = ∏ j = k t − 1 δ o , j T W o h + δ f , j T W...