0
点赞
收藏
分享

微信扫一扫

从零实现深度学习框架——LSTM从理论到实战【理论】


引言

本着“凡我不能创造的,我就不能理解”的思想,​​本系列​​文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。

要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实现我们想要的模型。​​本系列​​文章的宗旨就是通过这样的过程,让大家切实掌握深度学习底层实现,而不是仅做一个调包侠。

我们前面介绍的简单RNN存在一些问题,即很难保持远离当前位置的信息和梯度消失的问题。

LSTM

LSTM被设计来解决上面的问题。通过使网络学到忘记不需要的信息,并记住将来作出决定所需要的信息,以明确地管理上下文信息。

LSTM将上下文管理问题分成两个子问题:从上下文中移除不再需要的信息,以及增加未来决定更可能需要的信息。

架构

从零实现深度学习框架——LSTM从理论到实战【理论】_lstm

解决这两个问题的关键是学习如何管理这个上下文,而不是将策略硬编码到架构中。LSTM首先增加一个显示的上下文层到网络中(除了常用的RNN隐藏层),并通过使用专门的神经元,利用门来控制信息流进流出组成网络层的单元。这些门是通过使用在输入、前一个隐藏状态和前一个上下文状态上分别添加的额外权重操作来实现的。

LSTM中的这些门共用了同样的设计模式:每个包含一个前馈网络,接着是sigmoid激活函数,最后是一个与被门控层元素级乘法。

选择sigmoid作为激活函数基于它的输出是在0到1之间。与元素级乘法结合的效果类似于二元掩码(binary mask)。与掩码中接近1的值对应的门层中的值几乎原样通过;与较低值对应的值基本上被擦除。

遗忘门

我们第一个介绍的门为遗忘门(forget gate)。该门的目的是删除上下文不再需要的信息。遗忘门计算前一个隐藏状态和当前输入的加权和,并通过sigmoid进行转换。得到mask,该mask然后与上下文向量元素级相乘来移除不再需要的上下文信息。

从零实现深度学习框架——LSTM从理论到实战【理论】_python_02
其中从零实现深度学习框架——LSTM从理论到实战【理论】_激活函数_03从零实现深度学习框架——LSTM从理论到实战【理论】_深度学习_04为两个权重矩阵;从零实现深度学习框架——LSTM从理论到实战【理论】_python_05为前一个隐藏状态;从零实现深度学习框架——LSTM从理论到实战【理论】_权重_06为当前输入;从零实现深度学习框架——LSTM从理论到实战【理论】_lstm_07为sigmoid函数,这里我们忽略偏置项。

从零实现深度学习框架——LSTM从理论到实战【理论】_权重_08
其中从零实现深度学习框架——LSTM从理论到实战【理论】_python_09代表之前的上下文层向量;两个向量的元素级乘法(由操作符从零实现深度学习框架——LSTM从理论到实战【理论】_激活函数_10表示,有时称为哈达玛积)是两个向量对应元素相乘。

遗忘门控制内存之中的上下文向量从零实现深度学习框架——LSTM从理论到实战【理论】_python_09是否被遗忘掉。

输入门

类似地,输入门也通过前一个隐藏状态从零实现深度学习框架——LSTM从理论到实战【理论】_python_05和当前输入从零实现深度学习框架——LSTM从理论到实战【理论】_权重_06计算:
从零实现深度学习框架——LSTM从理论到实战【理论】_深度学习_14
然后我们计算从前一个隐藏状态从零实现深度学习框架——LSTM从理论到实战【理论】_python_05和当前输入从零实现深度学习框架——LSTM从理论到实战【理论】_权重_06中提取实际的信息——所有RNN网络使用的基本运算:
从零实现深度学习框架——LSTM从理论到实战【理论】_深度学习_17
在简单RNN中,上面计算的结果就是当前时刻的隐藏状态了,但在LSTM中不是。LSTM中的隐藏状态是根据上下文状态从零实现深度学习框架——LSTM从理论到实战【理论】_python_18计算的。
从零实现深度学习框架——LSTM从理论到实战【理论】_python_19

乘上输入门用来控制从零实现深度学习框架——LSTM从理论到实战【理论】_权重_20(也称为候选值)能多大程度地存入当前上下文状态从零实现深度学习框架——LSTM从理论到实战【理论】_python_18

我们把上面得到的从零实现深度学习框架——LSTM从理论到实战【理论】_权重_22从零实现深度学习框架——LSTM从理论到实战【理论】_python_23加起来就得到了当前上下文状态从零实现深度学习框架——LSTM从理论到实战【理论】_python_18
从零实现深度学习框架——LSTM从理论到实战【理论】_权重_25

输出门

最后一个门是输出门,它用于控制当前隐藏状态的哪些信息是需要的。
从零实现深度学习框架——LSTM从理论到实战【理论】_深度学习_26

从零实现深度学习框架——LSTM从理论到实战【理论】_激活函数_27

从零实现深度学习框架——LSTM从理论到实战【理论】_深度学习_28

给定不同门的权值,LSTM接受前一时刻的上下文层和隐藏层以及当前输入向量作为输入。然后,它生成更新的上下文向量和隐藏向量作为输出。隐藏层从零实现深度学习框架——LSTM从理论到实战【理论】_python_29可以用作堆叠RNN中后续层的输入,或者为网络的最后一层生成输出。

比如基于当前的隐藏状态,可以计算出当前时刻的输出从零实现深度学习框架——LSTM从理论到实战【理论】_激活函数_30
从零实现深度学习框架——LSTM从理论到实战【理论】_激活函数_31

总之,LSTM计算从零实现深度学习框架——LSTM从理论到实战【理论】_python_18从零实现深度学习框架——LSTM从理论到实战【理论】_python_29从零实现深度学习框架——LSTM从理论到实战【理论】_python_18就是长期记忆,从零实现深度学习框架——LSTM从理论到实战【理论】_python_29就是短期记忆。使用输入从零实现深度学习框架——LSTM从理论到实战【理论】_权重_06从零实现深度学习框架——LSTM从理论到实战【理论】_python_05更新长期记忆,在更新中,一些从零实现深度学习框架——LSTM从理论到实战【理论】_python_18的特征由遗忘门从零实现深度学习框架——LSTM从理论到实战【理论】_python_39清除,还有一些特征由输入门增加到从零实现深度学习框架——LSTM从理论到实战【理论】_python_18中。

新的短期记忆是长期记忆经过从零实现深度学习框架——LSTM从理论到实战【理论】_权重_41后乘以输出门得到的。注意,执行更新时,LSTM不会查看长期记忆从零实现深度学习框架——LSTM从理论到实战【理论】_python_18。只修改它。从零实现深度学习框架——LSTM从理论到实战【理论】_python_18也永远不会经历线性转换。这就是解决梯度消失和爆炸的原因。

References

  1. Speech and Language Processing


举报

相关推荐

0 条评论