用阿里云服务器做刷单网站,企业做产品网站费用大概是多少,wordpress加载图片的速度,怎么做图片展示网站前言
上一篇学习了RNN#xff0c;也知道了在沿着时间线对上下文权重求梯度的时候#xff0c;可能会导致梯度消失或者梯度爆炸#xff0c;然后我们就得学习一波比较常见的优化方法之LSTM
国际惯例#xff0c;参考网址#xff1a;
LSTM Networks for Sentiment Analysis …前言
上一篇学习了RNN也知道了在沿着时间线对上下文权重求梯度的时候可能会导致梯度消失或者梯度爆炸然后我们就得学习一波比较常见的优化方法之LSTM
国际惯例参考网址
LSTM Networks for Sentiment Analysis
Understanding LSTM Networks
简介
传统的循环神经网络RNN在梯度反传阶段梯度信号经常被上下文连接权重矩阵乘很多次(与时间戳的数目一直)这就意味着转移矩阵的权重大小对学习过程有很大的影响。
如果权重很小(权重矩阵的最大特征值小于1)就会导致梯度消失梯度信号变得很小学习就会变得很慢或者停止学习了。这使得对具有长时依赖数据的学习变得困难。反之如果权重很大(权重值大于1)就会导致梯度信号很大造成学习发散这通常称为梯度爆炸。
LSTM模型主要就是引入了记忆单元来减轻这些问题一个记忆单元包含四个主要成分输入门自连接遗忘门输出门。自连接权重是1不受任何外部干扰记忆单元的状态从一个时间戳到另一个时间戳保持常量。门是为了模拟记忆单元间自身与环境的交互。输入门允许输入信改变记忆单元的状态或者阻止它。输出门允许记忆单元的状态影响到其它单元或者是组织它。遗忘门模拟记忆单元自身的循环连接允许单元记住或者忘记之前的状态。
理论
下图对比的是传统RNN与具有记忆单元的LSTM的拓扑结构 可以发现LSTM与RNN的区别在于后者多了一条线上行线是记忆信息按时间传递下行线是与RNN相同的隐层信息按时间传递。
这个记忆细胞的连接看着挺复杂的虽然暂时看到记住了但是过段时间肯定忘记这个得理解性记忆看看每一部分都代表什么吧看样子这个记忆单元主要包含三个连接部分如下图红圈所示 接下来就对这些红圈分别理解接下来的博文是对第二篇参考博客的翻译与理解看原文请直接戳前言。
第一部分 决定即将通过记忆单元的信息是什么通过一个由sigmoid层构成的遗忘门决定此门接收的输入包含原始数据的输入与上一时刻的隐状态计算结果即 ftσ(WfxtUfht−1bf)ftσ(WfxtUfht−1bf)f_t=\sigma(W_fx_t+U_fh_{t-1}+b_f) 比如语言建模中想基于之前所有的状态预测下一个词记忆状态可能包括主语的性别这样才能使用正确的代词(他/她)当新的主语出现我们可能要忘记之前的主语性别。第二部分 决定什么信息可以被存储在记忆单元中分为两个部分 ①一个sigmoid层称为输入门决定将更新什么值 itσ(WixtUiht−1bi)itσ(WixtUiht−1bi)i_t=\sigma(W_ix_t+U_ih_{t-1}+b_i) ②tanh层计算新的候选值向量Ct^Ct^\hat{C_t}这个值可以被加到状态中。下一步就是将这两个值结合起来更新状态 Ct^tanh(WcxtUcht−1bc)Ct^tanh(WcxtUcht−1bc)\hat{C_t}=\tanh(W_cx_t+Uch_{t-1}+b_c) 如果按照语言建模的例子这部分做的就是我们想将新的主语性别加入到单元状态中去替代想忘记的旧的主语的性别。结合第一部分和第二部分 我们已经计算了想传递什么以及是否去忘记它怎么去更新状态。 假设旧的记忆状态是Ct−1Ct−1C_{t-1}想要更新到CtCtC_t之前我们已经计算了去做什么现在我们只需要做它就行了方法就是将ftftf_t与旧状态相乘即可忘记那些早想忘记的事情。 之后将it×Ct^it×Ct^i_t\times \hat{C_t}加进去这是新的候选值并且依据对于每个状态我们所决定的更新量去缩放它。 Ctit∗Ct^ft×Ct−1Ctit∗Ct^ft×Ct−1C_t=i_t*\hat{C_t}+f_t\times C_{t-1} 这就相当于在语言模型中我们确实丢失了旧主语的性别信息并且新增了我们在上一步已经决定添加的新信息。第三部分 最后就是决定我们要输出啥。这个输出单元状态但是需要被过滤一下。首先使用sigmoid决定哪一部分单元状态需要被输出然后将单元状态通过tanh(将值归一化到-1至1)使用sigmoid遗忘门的输出乘以它因此就仅仅会输出我们想要的那部分。 othtσ(WoxtUoht−1bo)ot×tanh(Ct)otσ(WoxtUoht−1bo)htot×tanh(Ct)\begin{aligned}o_t一旦见到一个主语就想输出相关的动词相关的信息比如是单数还是复数这样我们可以知道所连接 的动词形式。
总结一波假如面试的时候面试官让你画LSTM的结构图怎么下手
①首先一个框竖着两条线分别代表输入输出再横着两条线一条是隐层的自连接一条是记忆单元的信息传递。就相当于先画个RNN然后横着添一条记忆线就行。 ②画第一个单元决定需要传递的信息连接输入和隐层使用sigmoid激活 ③画第二个单元更新记忆单元状态连接输入和隐层分别使用sigmoid和tanh激活 ④连接第一二个单元第一个单元的输出与历史细胞状态做乘积第二个单元的sigmoid和tanh做乘积然后与前一个单元做加和 ⑤画第三个单元确定输出依旧是连接输入和隐层使用sigmoid激活得到ototo_t将第一二部分更新的状态值使用tanh归一化一下与ototo_t相乘即可得到隐层输出。 其实整个流程就是决定更新啥更新状态确定输出。
实例
主要有官方提供的两个实例以及自己修改的将LSTM套入到上一篇RNN博客的序列预测中。官方实例戳这里基本无需配置下载那几个文件就能用了文末我也会放网盘。
另一个实例是我自己将上一篇RNN的博客中代码替换成LSTM的理论进行序列预测原始的Elman-RNN的循环代码如下
def step(x_t,h_tm1):h_tself.activation(T.dot(x_t,self.W_in) T.dot(h_tm1,self.W)self.bh)y_tT.dot(h_t,self.W_out)self.byreturn h_t,y_t
[self.h,self.y_pred],_theano.scan(step,sequencesself.input,outputs_info[self.h0,None])
改成LSTM就是 #针对LSTM对RNN做相关改进def step(x_t,h_tm1,C_tm1):preactT.dot(x_t,self.W_in) T.dot(h_tm1,self.W)self.bhf_tT.nnet.sigmoid(preact)i_tT.nnet.sigmoid(preact)hatC_tT.tanh(preact)C_ti_t*hatC_tf_t*C_tm1 o_tT.nnet.sigmoid(preact)h_to_t*T.tanh(C_t)y_tT.dot(h_t,self.W_out)self.byreturn h_t,C_t,y_t [self.h,self.C_t,self.y_pred],_theano.scan(step,sequencesself.input,outputs_info[self.h0,self.C0,None])
但是比较奇怪的是实验效果竟然比RNN差点不知道为什么难道还要改其它地方或者此处改的有问题python渣躲墙角持续检查代码.png 后记
没啥说的贴代码吧
官方代码链接https://pan.baidu.com/s/1cxTyVWBVM9L3iuGz_OkLZQ 密码ntp0
本博文代码链接https://pan.baidu.com/s/1IBy8ue8lT3cjXOEnQUf_8Q 密码k0zw