RNN循环神经网络中的权重更新算法-BPTT

参考:

http://ir.hit.edu.cn/~jguo/docs/notes/bptt.pdf

http://www.cnblogs.com/wacc/p/5341670.html

https://zybuluo.com/hanbingtao/note/541458

http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/

一段时间学习了ML的基础算法,但是对DL没怎么接触,这算是首次触电吧。写的不好请大家指正。

一、下图是对RNN的整体剖析,大家应该比较熟悉了:

RNN循环神经网络中的权重更新算法-BPTT_第1张图片

二、而我们所用于分析权重梯度变化的无非用到里面的一个具体环节,现在把它形式化展现:

RNN循环神经网络中的权重更新算法-BPTT_第2张图片

RNN循环神经网络中的权重更新算法-BPTT_第3张图片

三、下面我们来执行权重更新:

RNN循环神经网络中的权重更新算法-BPTT_第4张图片RNN循环神经网络中的权重更新算法-BPTT_第5张图片

        self.calc_delta(sensitivity_array, activator)
        self.calc_gradient()
    def calc_delta(self, sensitivity_array, activator):
        self.delta_list = []  # 用来保存各个时刻的误差项
        for i in range(self.times):
            self.delta_list.append(np.zeros(
                (self.state_width, 1)))
				#对每一时刻的误差项进行初始化
        self.delta_list.append(sensitivity_array)
		#将sensitivity_array作为最后的误差项;就是t时刻的误差项delta
        for k in range(self.times - 1, 0, -1):
            self.calc_delta_k(k, activator)
			 # 迭代计算每个k时刻的误差项
			 
    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)
					#对于k+1时刻的s状态,每个隐层中的s执行反向backward()操作,实际上得到上一时刻k对应的s状态state_list[k];
        self.delta_list[k] = np.dot(
            np.dot(self.delta_list[k+1].T, self.W),
            np.diag(state[:,0])).T
			# .T代表矩阵的转置

RNN循环神经网络中的权重更新算法-BPTT_第6张图片

        计算每个时刻t权重的梯度
        '''
        gradient = np.dot(self.delta_list[t],
            self.state_list[t-1].T)
        self.gradient_list[t] = gradient

    def calc_gradient(self):
        self.gradient_list = [] # 保存各个时刻的权重梯度
        for t in range(self.times + 1):
            self.gradient_list.append(np.zeros(
                (self.state_width, self.state_width)))
        for t in range(self.times, 0, -1):
            self.calc_gradient_t(t)
        # 实际的梯度是各个时刻梯度之和
        self.gradient = reduce(
            lambda a, b: a + b, self.gradient_list,
            self.gradient_list[0]) # [0]被初始化为0且没有被修改过

RNN循环神经网络中的权重更新算法-BPTT_第7张图片RNN循环神经网络中的权重更新算法-BPTT_第8张图片

你可能感兴趣的:(深度学习)