基于时间的反向传播算法BPTT(Backpropagation through time)
来源:互联网 发布:研如寓 知乎 编辑:程序博客网 时间:2024/05/16 08:56
本文是读“Recurrent Neural Networks Tutorial, Part 3 – Backpropagation Through Time and Vanishing Gradients”的读书笔记,加入了自己的一些理解,有兴趣可以直接阅读原文。
1. 算法介绍
这里引用原文中的网络结构图
其中
为了与文献中的表示一致,我们用
使用交叉熵(cross entropy)作为损失函数
我们使用链式法则来计算后向传播时的梯度,以网络的输出
因此可以求V的梯度
这里求导时将
相对V的梯度,因为
其中
U的梯度类似
2. 代码分析
首先我们给出作者自己实现的完整的BPTT,再各部分分析
def bptt(self, x, y): T = len(y) # Perform forward propagation o, s = self.forward_propagation(x) # We accumulate the gradients in these variables dLdU = np.zeros(self.U.shape) dLdV = np.zeros(self.V.shape) dLdW = np.zeros(self.W.shape) delta_o = o delta_o[np.arange(len(y)), y] -= 1. # For each output backwards... for t in np.arange(T)[::-1]: dLdV += np.outer(delta_o[t], s[t].T) # Initial delta calculation: dL/dz delta_t = self.V.T.dot(delta_o[t]) * (1 - (s[t] ** 2)) # Backpropagation through time (for at most self.bptt_truncate steps) for bptt_step in np.arange(max(0, t-self.bptt_truncate), t+1)[::-1]: # print "Backpropagation step t=%d bptt step=%d " % (t, bptt_step) # Add to gradients at each previous step dLdW += np.outer(delta_t, s[bptt_step-1]) dLdU[:,x[bptt_step]] += delta_t # Update delta for next step dL/dz at t-1 delta_t = self.W.T.dot(delta_t) * (1 - s[bptt_step-1] ** 2) return [dLdU, dLdV, dLdW]
2.1. 初始化
结合完整的代码,我们可知梯度的维度
#100*8000dLdU = np.zeros(self.U.shape)#8000*100dLdV = np.zeros(self.V.shape)#100*100dLdW = np.zeros(self.W.shape)
2.2. 公共部分
对照上面的理论可知,无论是V,还是U,W,都有
#o是forward的输出,T(句子的实际长度)*8000维,每一行是8000维的,就是词表中所有词作为输入x中每一个词的后一个词的概率delta_o = o#[]中是索引操作,对y中的词对应的索引的概率-1delta_o[np.arange(len(y)), y] -= 1.
2.3. V的梯度
结果是M*N维的
#delta_o是1*8000维向量,s[t]是1*100的向量,转不转置对outer并没有什么区别,其实和delta_o[t].T * s[t]等价,*是矩阵相乘,结果是8000*100维的矩阵dLdV += np.outer(delta_o[t], s[t].T)
2.4. W和U的梯度
对比W和U的梯度公式,我们可以看到,两者+号的第二部分前面的系数是一样的,也就是
delta_t = self.V.T.dot(delta_o[t]) * (1 - (s[t] ** 2)) # Backpropagation through time (for at most self.bptt_truncate steps)#截断for bptt_step in np.arange(max(0, t-self.bptt_truncate), t+1)[::-1]: # print "Backpropagation step t=%d bptt step=%d " % (t, bptt_step) # Add to gradients at each previous step #计算+号的第一部分,第二部分本次还没得到,下次累加进来 dLdW += np.outer(delta_t, s[bptt_step-1]) #x为单词的位置向量,与delta_t相乘相当于dLdU按x取索引(对应的词向量)直接与delta_t相加 dLdU[:,x[bptt_step]] += delta_t # Update delta for next step dL/dz at t-1 #更新第二部分系数 delta_t = self.W.T.dot(delta_t) * (1 - s[bptt_step-1] ** 2)
阅读全文
0 0
- 基于时间的反向传播算法BPTT(Backpropagation through time)
- 基于时间的反向传播算法BPTT(Back Propagation Trough Time)
- BPTT(BackPropagation Through Time)
- RNN与反向传播算法(BPTT)的理解
- backpropagation反向传播算法
- 神经网络的反向传播算法Backpropagation
- 反向传播算法(BackPropagation,BP)
- 如何理解反向传播算法(backpropagation)
- 理解反向传播(BackPropagation)算法(之一)
- 深入浅出BP(BackPropagation)反向传播算法
- 循环神经网络(RNN)反向传播算法(BPTT)理解
- 循环神经网络(RNN)反向传播算法(BPTT)理解
- 循环神经网络(RNN)反向传播算法(BPTT)
- 反向传播(backpropagation)算法的多层神经网络训练过程
- 深度学习笔记三:反向传播(backpropagation)算法
- 反向传播算法(backPropagation,简称BP算法)
- 基于时间的反向传播算法和梯度消失 -part3
- 神经网络BP反向传播算法Error Backpropagation
- C/C++ memset详解
- js--事件对象
- facebook数据爬取
- 60. Permutation Sequence
- 手机端html5触屏事件(touch事件)3
- 基于时间的反向传播算法BPTT(Backpropagation through time)
- css技巧--进阶
- Windows下使用taskkill命令批量结束进程
- android studio 配置 opencv for android
- AndroidExported receiver does not require permission.
- 容器Response详解
- windows CMD 命令下dir 命令
- addEventListener() 方法,事件监听
- 大数据正式13