TensorFlow - LSTM 原理

TensorFlow - LSTM 原理

flyfish 笔记

摘自 《Understanding LSTM Networks》和《白话深度学习与TensorFlow》

Understanding LSTM Networks
http://colah.github.io/posts/2015-08-Understanding-LSTMs/

LSTM算法的全称是长短期记忆网络(long short–term memory),由LSTM算法对标准的RNN进行的改进,会得到LSTM网络——这当然也是RNN的一种了,不过由于它规避了标准的RNN中的梯度爆炸和梯度消失的问题,所以会显得更好用一些,学习速度更快。 现在在工业上,如果考虑使用RNN作为模型来训练的时候通常也是直接使用LSTM网络,这一点大家可以省点心了。LSTM网络与传统的RNN网络相比多了一个非常有用的机制,就是忘记门(forget gate) 。这个事例说明几乎是现在所有的LSTM算法介绍的资料中都喜欢引用的一个最经典的例子了。 先看一个最基本的LSTM单元连接起来的样子,如下图: 
TensorFlow - LSTM 原理_第1张图片

TensorFlow - LSTM 原理_第2张图片
对于一个输入的序列Xi来说,某一个X值可能会影响一个在时间上或者空间上比较远的hj的输出,训练过程就是要学习到影响的量化关系。上图这种说的是有一层LSTM单元连接起来的样子,拓扑结构就这样。
TensorFlow - LSTM 原理_第3张图片
在工业上使用的时候,LSTM是可以像上面这样成为一个很大的方阵的,其中除了输入层和输出层分别对应着Xt和ht的值以外,中间的部分都是一个一个的LSTM单元。我们来解剖一下这个单元,看看有什么特别的地方。

TensorFlow - LSTM 原理_第4张图片

这里写图片描述
 neural network layer 神经网络层
pointwise operation逐点操作
vector transfer 向量传输
concatenate 连接合并
copy 拷贝
(sigma/’sɪɡmə/ Σ σ ς) LSTM的单元看上去就是这样一种效果,一个一个首尾相接,同一层的会把前面单元的输出作为后面单元的输入;前一层的输出会作为后一层的输入。这似乎没有什么太多好说的,那我们来看看具体一个单元中都有什么东西。 

TensorFlow - LSTM 原理_第5张图片
首先从左到右会有这样的一个向量进行传输,从单元的左侧进入我们称作Ct-1,从右侧输出称作Ct。这上面只有两个交互的部分,一个是左侧的“乘号”,一个是右侧的“加号”。先说加号部分,这就是普通的向量线性叠加,也没什么稀奇的。左边这个乘号是一个乘法器,这个操作相当于左侧的Ct-1进入单元后,先要被一个乘法器乘以一个系数后,再线性叠加一个数值然后从右侧输出去。 
TensorFlow - LSTM 原理_第6张图片
刚刚提到的乘法器乘的这个系数是 这样一个来源。可以看到左侧的ht-1和下面输入的xt经过了连接操作,再通过一个线性单元,和一个σ也就是Sigmoid函数之后生成了一个0到1之间的数字作为系数输出。表达式如上图
这个部分就是一个“忘记门”了,所谓“忘记”就是指这个相乘的过程,如果Sigmoid函数输出为1,那就是完全记住,如果输出是0那就是完全忘记,中间的值那就是一个记忆的比例或者说忘记的比例问题了。这个Wf和bf作为待定系数是要进行训练学习的。
TensorFlow - LSTM 原理_第7张图片
这里有两个小的神经网络层,一个是我们熟悉的σ标识的部分,表达式为:
这里写图片描述
旁边的这个tanh标识也是一个神经网络层,表达式为:
这里写图片描述
这个tanh函数在前面只提到过一次,它可以把一个值映射到-1和1之间,这里的WC和bC也是要通过训练得到的。
TensorFlow - LSTM 原理_第8张图片
在这之后,由前一次传递过来的Ct-1向量会和 进行线性叠加。
到这里其实决定了本次输出的Ct究竟有多少采纳本次输入的信息,有多少采纳上一次遗留下来的信息。如果是在语言模型中,那么就是关于前一个主语到当前是否应该被遗忘,而新的主语是否应该代替原先的主语出现。
TensorFlow - LSTM 原理_第9张图片
最后的输出有两个部分,从图上就可以看出来是该单元生成的ht,一个输出到同层下一个单元,一个输出到下一层的单元上。

这里其实可以看出来这个要输出的Ct向量又经过一个Ot忘记门(forget gate)的乘积效果来做输出成为ht。在语言模型中,这种影响是可以影响前后 词之间词形的相关性的,例如前面输入的是一个代词或者名词,后面跟随的动词会学到是否使用“三单形式”或根据前面输入的名词数量来决定输出的代词是单数形式还是复数形式。 在NLP领域LSTM应用还是比较成熟的,而且应用也比较广泛,我们在这里只是了解一下它内部工作的大致原理。我们只要清楚,一段输入的内容如果上下文有着潜在的影响关系,那么用LSTM可以帮我们把这些关系学出来的。最终在实际工程中我们还是会用TensorFlow这种封装好的库来实现。

应用场景

说到RNN网络——这里说的RNN网络泛指以循环神经网络的方式来实现的网络,包括传统RNN或LSTM等,其结构比原先的BP网络和CNN网络都要复杂,尤其是它允许输入和输出都是多个值或者说多个向量,所以它的功能更为丰富。 

TensorFlow - LSTM 原理_第10张图片
它可以做分类工具,可以做有限状态机(控制程序),可以做翻译器,可以做聊天机器人等看上去很酷炫的事情。 这里有一个RNN可以做的事情的“可视化”归纳,大致分就是“一到一”、“一到多”、“多到一”、“多到多”的映射种类。

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