LSTM详解 反向传播公式推导[通俗易懂]

LSTM详解 反向传播公式推导[通俗易懂]部分参考:http://colah.github.io/posts/2015-08-Understanding-LSTMs/1.结构1.1比较RNN:LSTM:其中的notation:1.2核心思想:LSTM在原来的隐藏层上增加了一个ThekeytoLSTMsisthecellstate,thehorizont…

大家好,又见面了,我是你们的朋友全栈君。

部分参考: http://colah.github.io/posts/2015-08-Understanding-LSTMs/

1. 结构

1.1 比较

RNN:

LSTM详解 反向传播公式推导[通俗易懂]

LSTM:

LSTM详解 反向传播公式推导[通俗易懂]

其中的notation:

LSTM详解 反向传播公式推导[通俗易懂]

1.2 核心思想:

LSTM在原来的隐藏层上增加了一个

The key to LSTMs is the cell state, the horizontal line running through the top of the diagram.

LSTM详解 反向传播公式推导[通俗易懂]

LSTM详解 反向传播公式推导[通俗易懂]

  1. LSTM比RNN多了一个细胞状态,就是最上面一条线,像一个传送带,它让信息在这条线上传播而不改变信息。

    The cell state is kind of like a conveyor belt. It runs straight down the entire chain, with only some minor linear interactions. It’s very easy for information to just flow along it unchanged.

    LSTM详解 反向传播公式推导[通俗易懂]

  2. LSTM可以自己增加或移除信息,通过“门”的结构控制。

    “门”选择性地让信息是否通过,“门”包括一个sigmoid层和按元素乘。如下图:

    LSTM详解 反向传播公式推导[通俗易懂]

    sigmoid层输出0-1的值,表示让多少信息通过,1表示让所有的信息都通过。

    一个LSTM单元有3个门。

2. 流程

上面一条线 C t C_t Ct是细胞状态,下面的 h t h_t ht是隐藏状态 。

其实看多少个圆圈、黄框就知道有哪些操作了。

三个sigmoid层是三个门:忘记门、输入门、输出门。
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) C t ~ = t a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) C t = f t ∗ C t − 1 + i t ∗ C t ~ o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) h t = o t ∗ t a n h ( C t ) f_t=\sigma(W_f \centerdot [h_{t-1},x_t]+b_f)\\ i_t=\sigma(W_i \centerdot [h_{t-1},x_t]+b_i)\\ \tilde{C_t}=tanh(W_C \centerdot [h_{t-1},x_t]+b_C)\\ C_t=f_t*C_{t-1}+i_t*\tilde{C_t}\\ o_t=\sigma(W_o \centerdot [h_{t-1},x_t]+b_o)\\ h_t=o_t*tanh(C_t) ft=σ(Wf[ht1,xt]+bf)it=σ(Wi[ht1,xt]+bi)Ct~=tanh(WC[ht1,xt]+bC)Ct=ftCt1+itCt~ot=σ(Wo[ht1,xt]+bo)ht=ottanh(Ct)
LSTM详解 反向传播公式推导[通俗易懂]

2.1 忘记门:扔掉信息(细胞状态)

第一步是决定从细胞状态里扔掉什么信息(也就是保留多少信息)。将上一步细胞状态中的信息选择性的遗忘 。

实现方式:通过sigmoid层实现的“忘记门”。以上一步的 h t − 1 h_{t-1} ht1和这一步的 x t x_t xt作为输入,然后为 C t − 1 C_{t-1} Ct1里的每个数字输出一个0-1间的值,表示保留多少信息(1代表完全保留,0表示完全舍弃),然后与 C t − 1 C_{t-1} Ct1乘。

例子:让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的类别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
例如,他今天有事,所以我… 当处理到‘’我‘’的时候选择性的忘记前面的’他’,或者说减小这个词对后面词的作用。

LSTM详解 反向传播公式推导[通俗易懂]

2.2 输入层门:存储信息(细胞状态)

第二步是决定在细胞状态里存什么。将新的信息选择性的记录到细胞状态中。

实现方式:包含两部分,1. sigmoid层(输入门层)决定我们要更新什么值;2. tanh层创建一个候选值向量 C t ~ \tilde{C_t} Ct~,将会被增加到细胞状态中。 我们将会在下一步把这两个结合起来更新细胞状态。

例子:在我们语言模型的例子中,我们希望增加新的主语的类别到细胞状态中,来替代旧的需要忘记的主语。 例如:他今天有事,所以我… 当处理到‘’我‘’这个词的时候,就会把主语我更新到细胞中去。

LSTM详解 反向传播公式推导[通俗易懂]

2.3 更新细胞状态(细胞状态)

更新旧的细胞状态

实现方式: C t = f t ∗ C t − 1 + i t ∗ C t ~ C_t=f_t*C_{t-1}+i_t*\tilde{C_t} Ct=ftCt1+itCt~ f t f_t ft表示保留上一次的多少信息, i t i_t it表示更新哪些值, C t ~ \tilde{C_t} Ct~表示新的候选值。候选值被要更新多少(即 i t i_t it)放缩。

这一步我们真正实现了移除哪些旧的信息(比如一句话中上一句的主语),增加哪些新信息。

LSTM详解 反向传播公式推导[通俗易懂]

2.4 输出层门:输出(隐藏状态)

最后,我们要决定作出什么样的预测。

实现方式:1. 我们通过sigmoid层(输出层门)来决定输出新的细胞状态的哪些部分;2. 然后我们将细胞状态通过tanh层(使值在-1~1之间),然后与sigmoid层的输出相乘。

所以我们只输出我们想输出的部分。

例子:在语言模型的例子中,因为它就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是复数,这样如果是动词的话,我们也知道动词需要进行的词形变化。
例如:上面的例子,当处理到‘’我‘’这个词的时候,可以预测下一个词,是动词的可能性较大,而且是第一人称。 会把前面的信息保存到隐层中去。

LSTM详解 反向传播公式推导[通俗易懂]

3. 反向传播

LSTM详解 反向传播公式推导[通俗易懂]

如图上的5个不同的阶段反向传播误差。

1. 维度

先介绍下各个变量的维度, h t h_t ht 的维度是黄框里隐藏层神经元的个数,记为d,即矩阵 W ∗ W_* W 的行数(因为 W j i W_{ji} Wji是输入层的第 i i i个神经元指向隐藏层第 j j j个神经元的参数), x t x_t xt的维度记为n,则 [ h t − 1 x t ] [h_{t-1}\quad x_t] [ht1xt]的维度是 d + n d+n d+n,矩阵的维度都是 d ∗ ( d + n ) d*(d+n) d(d+n),其他的向量维度都是 d ∗ 1 d*1 d1。(为了表示、更新方便,我们将bias放到矩阵里)

W f W_f Wf举例:
LSTM详解 反向传播公式推导[通俗易懂]

同理:
LSTM详解 反向传播公式推导[通俗易懂]
合并为一个矩阵就是:
LSTM详解 反向传播公式推导[通俗易懂]

2.一些符号

⊙ \odot 是element-wise乘,即按元素乘。其他的为正常的矩阵乘。

为了表示向量和矩阵的元素,我们把时间写在上标。

δ z t \delta z^t δzt表示 E t E^t Et z t z^t zt的偏导。

⊗ ​ \otimes​ 表示外积,即列向量乘以行向量

3.两点疑惑

  1. 3.2中 δ C t + = δ h t ⊙ o t ⊙ [ 1 − t a n h 2 ( C t ) ] \delta C^t+=\delta h^t \odot o^t \odot [1-tanh^2(C^t)] δCt+=δhtot[1tanh2(Ct)] 我还没想明白
  2. 3.5中下划线的是 h t − 1 h^{t-1} ht1的函数 ,但 C i t − 1 C^{t-1}_i Cit1 也是 h t − 1 h^{t-1} ht1的函数,不知道为什么不算 。

3.1 δ h t \delta h^t δht

我们首先假设 ∂ E t ∂ h t = δ h t \frac{\partial E^t}{\partial h^t}=\delta h^t htEt=δht ,这里的 E t E^t Et指的是t时刻的误差,对每个时刻的误差都要计算一次。

LSTM详解 反向传播公式推导[通俗易懂]

3.2 δ o t 、 δ C t \delta o^t 、\delta C^t δotδCt

Forward: h t = o t ⊙ t a n h ( C t ) h^t=o^t \odot tanh(C^t) ht=ottanh(Ct)

已知: δ h t \delta h^t δht

求: δ o t 、 δ C t \delta o^t 、\delta C^t δotδCt

解:由于
LSTM详解 反向传播公式推导[通俗易懂]
所以
LSTM详解 反向传播公式推导[通俗易懂]

但是 这里提到 δ C t + = δ h t ⊙ o t ⊙ [ 1 − t a n h 2 ( C t ) ] \delta C^t+=\delta h^t \odot o^t \odot [1-tanh^2(C^t)] δCt+=δhtot[1tanh2(Ct)] 我还没想明白

3.3 δ f t 、 δ i t 、 δ C t ~ 、 δ C t − 1 \delta f_t、\delta i_t、\delta \tilde{C_t}、\delta C^{t-1} δftδitδCt~δCt1

Forward: C t = f t ⊙ C t − 1 + i t ⊙ C t ~ C^t=f^t \odot C^{t-1}+i^t \odot \tilde{C^t} Ct=ftCt1+itCt~

已知: δ o t 、 δ C t \delta o^t 、\delta C^t δotδCt

求: δ f t 、 δ i t 、 δ C t ~ 、 δ C t − 1 \delta f_t、\delta i_t、\delta \tilde{C_t}、\delta C^{t-1} δftδitδCt~δCt1

解:因为
LSTM详解 反向传播公式推导[通俗易懂]
所以:
LSTM详解 反向传播公式推导[通俗易懂]

3.4 δ W f 、 δ W i 、 δ W c 、 δ W o \delta W_f、 \delta W_i 、\delta W_c 、\delta W_o δWfδWiδWcδWo

Forward: f t = W f ⋅ s t , i t = W i ⋅ s t , o t = W o ⋅ s t , C t ~ = W C ⋅ s t f^t=W_f \cdot s^t ,i^t=W_i \cdot s^t ,o^t=W_o \cdot s^t ,\tilde{C^t}=W_C \cdot s^t \quad ft=Wfst,it=Wist,ot=Wost,Ct~=WCst

已知: δ f t 、 δ i t 、 δ C t ~ 、 δ C t − 1 \delta f_t、\delta i_t、\delta \tilde{C_t}、\delta C^{t-1} δftδitδCt~δCt1

求: δ W f 、 δ W i 、 δ W c 、 δ W o \delta W_f、 \delta W_i 、\delta W_c 、\delta W_o δWfδWiδWcδWo

解:由于
LSTM详解 反向传播公式推导[通俗易懂]

所以:
LSTM详解 反向传播公式推导[通俗易懂]

合并在一起就是:
LSTM详解 反向传播公式推导[通俗易懂]

3.5 δ h t − 1 \delta h_{t-1} δht1

Forward:
LSTM详解 反向传播公式推导[通俗易懂]
下划线的是 h t − 1 ​ h^{t-1}​ ht1的函数 ,但 C i t − 1 ​ C^{t-1}_i​ Cit1 也是 h t − 1 ​ h^{t-1}​ ht1的函数,不知道为什么不算 。

已知: δ f t 、 δ i t 、 δ C t ~ 、 δ C t − 1 \delta f_t、\delta i_t、\delta \tilde{C_t}、\delta C^{t-1} δftδitδCt~δCt1

求: δ h t − 1 \delta h_{t-1} δht1

解:
LSTM详解 反向传播公式推导[通俗易懂]
式1是Forward里第一个式子对 o i t 和 c i t o^t_i和c^t_i oitcit求导;式2是Forward里第二个式子对 f i t , i i t , C t ~ f^t_i,i^t_i,\tilde{C^t} fit,iit,Ct~求导。

然后看Forward里的后几个式子,对 h t − 1 h^{t-1} ht1求导:
LSTM详解 反向传播公式推导[通俗易懂]
所以(*)式用矩阵计算则为:
LSTM详解 反向传播公式推导[通俗易懂]

3.6 总梯度

∂ E ∂ W = ∑ t = 0 T ∂ E t ∂ W \frac{\partial E}{\partial W}=\sum^T_{t=0} \frac{\partial E^t}{\partial W} WE=t=0TWEt

4.变种

GRU

It combines the forget and input gates into a single “update gate.” It also merges the cell state and hidden state, and makes some other changes. The resulting model is simpler than standard LSTM models, and has been growing increasingly popular.

LSTM详解 反向传播公式推导[通俗易懂]

add peephole

LSTM详解 反向传播公式推导[通俗易懂]

use coupled forget

Another variation is to use coupled forget and input gates. Instead of separately deciding what to forget and what we should add new information to, we make those decisions together. We only forget when we’re going to input something in its place. We only input new values to the state when we forget something older.

LSTM详解 反向传播公式推导[通俗易懂]

其他

These are only a few of the most notable LSTM variants. There are lots of others, like Depth Gated RNNs by Yao, et al. (2015). There’s also some completely different approach to tackling long-term dependencies, like Clockwork RNNs by Koutnik, et al. (2014).

Which of these variants is best? Do the differences matter? Greff, et al. (2015) do a nice comparison of popular variants, finding that they’re all about the same. Jozefowicz, et al. (2015)tested more than ten thousand RNN architectures, finding some that worked better than LSTMs on certain tasks.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142951.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 开启新篇章——软工视频总结

    开启新篇章——软工视频总结开启新篇章——软工视频总结

  • BackTrack3(BT3激活成功教程wifi密码)

    BackTrack3(BT3激活成功教程wifi密码)BackTrack3(BT3激活成功教程)  准备工作  1、一个有可激活成功教程无线信号的环境。如我在家随便搜索出来的信号。  2、带无线网卡的电脑一台(笔记本台式机均可,只要无线网卡兼容BT3),我用的是三星NC10的上网本。  3、4G以上优盘一个(我用的是kingston8G的)  4、下载BT3,约900多兆。注:BT3全称BackTrack3,与我们常说的bt下载是完全不同的…

  • Eclipse使用入门教程[通俗易懂]

    Eclipse使用入门教程[通俗易懂]Eclipse使用入门教程 说起java的IDE,朗朗上口的无非是Eclipse了,假若能熟练Eclipse,对于我们编写java程序会起到事半功倍的效果,大大提高我们工作效率。因此本篇博文,笔者只是针对刚刚入门java的新手,以便他们能尽快掌握Eclipse的使用。 1.常用快捷键 这是使用工具的第一步,熟练使用快捷键对于我们编写程序会起到相当大帮助,所以这里笔者列出的快捷键建议大家必须都掌握…

  • 虚拟机usb设备连接不成功_ssh怎么连接虚拟机

    虚拟机usb设备连接不成功_ssh怎么连接虚拟机解决【使用shell连接虚拟机时连接等待时长过长】的问题打开sshd服务的配置文件/etc/ssh/sshd_config把UseDNSyes,改为UseDNSno重启ssh服务打开sshd服务的配置文件/etc/ssh/sshd_config以管理员身份输入下面的命令:vi/etc/ssh/sshd_config把UseDNSyes,改为UseDNSno1、按下键盘的I键,进入编辑模式2、找到UseDNSyes,把注释#去掉,把yes修改为no3、按下键盘的Esc键,并

  • java snmp协议_snmp属于哪一层协议

    java snmp协议_snmp属于哪一层协议背景控制华为交换机的poe供电与断电来重启PADsnmp协议使用importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjava.util.Vector;importlombok.extern.slf4j.Slf4j;importorg.snmp4j.CommunityTarget;importorg.snmp4j.PDU;importorg.snmp4j.Snmp;

    2022年10月16日
  • idea下划线怎么去除_word怎么加虚线下划线

    idea下划线怎么去除_word怎么加虚线下划线初次安装使用IDEA,总是能看到导入代码后,出现很多的波浪线,下划线和虚线,这是IDEA给我们的一些提示和警告,但是有时候我们并不需要,反而会让人看着很不爽,这里简单记录一下自己的调整方法,供其他的小伙伴在使用的时候参考。主要有:代码中大量的波浪线,参数和变量下划线,Typo提示,neverused和注释参数名不匹配提示,以及变量初始化多余时提示,形参名的提示。下面是具体操作步骤,如果按照对应的…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号