作者 | Edwin Chen
编译 | AI100
第一次接触长短期记忆神经网络(LSTM)时,我惊呆了。
原来,LSTM是神经网络的扩展,非常简单。深度学习在过去的几年里取得了许多惊人的成果,均与LSTM息息相关。因此,在本篇文章中我会用尽可能直观的方式为大家介绍LSTM——方便大家日后自己进行相关的探索。
首先,请看下图:
神经网络
我们的算法首先可能需要学习检测低级图形,如形状和棱边等。
在数据变多的情况下,算法可能会学习将这些图形与更为复杂的形式结合在一起,如人脸(一个椭圆形的东西的上方是一个三角形,三角形上有两个圆形)或猫。
如果数据量进一步增多的话,算法可能会学习将这些高级图样映射至活动本身(包含嘴、肉排和餐叉的场景可能就是在用餐)
算法通过一组学习后的权重将每个输入神经元连接至神经元的一个隐含层。
第j个隐层神经元输出为,其中ϕϕ是激活函数。
为了使符号更加简洁些,我假设x和h各包含一个额外的偏差神经元,偏差设置为1固定不变,方便学习偏差权重。
利用RNN记忆信息
在时间t处计算得出的隐状态(ht为我们的内部知识)在下个时间步长内会被反馈给神经网络。(另外,我会在本文中交替使用隐状态、知识、记忆和认识等概念来描述ht)
利用LSTM实现更长久的记忆
我们的工作记忆为:
换言之,我们注意关注向量为1的元素,忽视关注向量为0的元素。
而 LSTM 则会利用数个方程式:
想象一个可以使你在手机上进行编码的自动填充编码插件(code autocompleter)。LSTM(理论上)可以跟踪你当前使用的方法的返回类型,并能对应当返回的变量做出更好的建议;它还能在不进行编译的情况下通过返回错误类型得知你是否犯有错误。
它还能跟踪子程序和嵌套层数:语句的缩进始终正确,并且Loop循环结构始终关闭。
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
探究LSTM内部结构
(N个"a"后跟着一个分隔符X,X后跟着N个"b"字符,其中1 <= N <= 10),并且训练了一个带有10个隐层神经元的单层LSTM。
研究模型的内部,我们期望找到一个能够计算a's数量的隐层神经元。我们也确实找到了一个:
(N个a's 中随机夹杂几个X's,然后加一个分隔符Y,Y后再跟N个b's)。LSTM仍需计算a's的数量,但是这次它需要忽视X's。
(即一个"A" or "B",紧跟1-10个x's,再跟一个分隔符"Y",结尾是开头字符的小写形式)。在这种情况下,神经网络需要记住它是处于"A" 状态还是 "B"状态中。我们期望找到一个在记忆以"A"开头的序列时激活的神经元,以及一个在记忆以"B"开头的序列时激活的神经元。我们的确找到了。
思考一下LSTM的工作方式你就会知道,LSTM并不十分擅长记忆大量单独且详细的信息。例如,你可能注意到由LSTM生成的代码有个大缺陷,那就是它常常会使用未定义的变量——LSTM无法记住哪些变量已经被定义过并不令人感到惊讶,因为很难使用单一的cell来有效地编码多值信息,如特征等。同时,LSTM并没有可以用来串连相邻记忆形成相关话语的自然机制。记忆网络和神经图灵机( neural Turing machines )是神经网络的两个扩展,它们可以借助外部记忆控件来增强记忆能力,从而帮助修复这个问题。因此,虽然LSTM并不能十分高效地进行复制,但是观察它们进行各种尝试也非常有趣。
为了完成复制任务,我在如下形式的序列上训练了一个小的2层LSTM。
(即先是一个由a's、b's和 c's组成的3字符序列,中间插一个分隔符"X",后半部分则组前半部分的序列相同)。
振兴神经网络
总结
原文链接:
http://blog.echen.me/2017/05/30/exploring-lstms/
维权声明:凡是机器人2025发布的文章都会找原文作者授权并给予白名单,若没有授权到的文章,如涉及版权等问题,请及时联系运营者(微信:hongruo888)我们将第一时间处理,谢谢!
大家好,我是机器人2025一个专注于全球智能机器人产业的开放合作平台,为打造机器人产业界第一高端人脉与价值分享平台而努力。