在隐藏状态(Hidden State)为“战斗场景开始”的情况下输入神奇宝贝喷水进攻图,RNN能够根据“嘴中喷水”的场景推测图一神奇宝贝是在进攻的概率为85%。之后我们在记忆为“在战斗、敌人在攻击和敌人是水性攻击”三个条件下输入图片二,RNN就会分析出“卡比兽被攻击”是概率最大的情况。 LSTM 在长期记忆(Long-Term Memory)为“卡比兽喜欢吃竹子”、“每个战斗回合为一分钟”和“敌人在屏幕中央”,工作记忆(Working Memory)为“每个战斗回合为一分钟”“敌人在屏幕中央”的情况下,输入卡比兽被喷水的图片,LSTM会选择性处理一些信息。它选择性记忆了卡比兽的痛苦的表情,忘掉了“屏幕中央的是敌人”这条信息,得出卡比兽被攻击的可能性最大。 学会编码 有一种字符级的LSTM模型,可以通过输入的字符级序列来预测下一个可能出现的字符。我将用这种模型向大家展示LSTM的用法。 虽然这个方法看起来不成熟,但不得不说字符级的模型使非常实用,个人觉得比单词级模型还要实用一些。比如下面这两个例子: 1. 假设有一种代码自动填充器足够智能,允许手机端编程。 理论上讲,LSTM可以跟踪当前所用方法的返回类型,更好地建议返回哪个变量;也可以通过返回错误类型告诉你程序是否有bug。 2. 像机器翻译这种自然语言处理程序通常很难处理生僻术语。 怎样才能把之前从未见过的形容词转换成相应的副词?即使知道一条推文是什么意思,但怎样为它生成标签?字符级模型就可以帮你处理这些新出现的术语,不过这也是另外一个领域研究的事情了。 所以在一开始,我用亚马逊AWS弹性计算云EC2的p2.xlarge在Apache Commons Lang代码库训练了三层LSTM,几个小时后生成了这个程序:
虽然这段代码并不完美,但已经比我认识的很多数据专家编写的代码优秀了。从这里我们可以看出LSTM已经学会很多有趣且正确的编码行为: 可以构建class:优先放许可证,之后是程序包和导入包,再之后放注释和类别定义,最后是变量和方法。它也知道如何创造方法:需要遵循正确的描述顺序,查看装饰器是否处于正确的位置,以适当的语句返回无类型指针。重要的是,这些行为还跨越了大量的代码。 可以跟踪子程序和嵌套级别:如果语句循环总是被关闭的话,缩进处理是一个不错的选择。 它甚至知道如何创建测试。 此模型到底是怎样做到上面这些功能的呢?我们可以看几个隐藏状态。 这是一个神经元,看起来它似乎在追踪代码的缩进级别。在神经元以字符为输入进行读取,例如试图生成下一个字符的时候,每个字符都根据神经元的状态被标记了颜色,红色表示负值,蓝色表示正值。
这里有一个可以计算两个标签距离的神经元:
还有一个在TensorFlow代码库中生成的不同3层LSTM的有趣输出结果:
上面我们了解了几个隐藏状态的例子,不妨再聊得深入一些。我在考虑LSTM cell和它们的其他记忆机制。或许它们之间也存在令人惊叹的关系。 计数 为了探究这个问题,我们需要先教LSTM学会计数,所以我生成了下面这个序列: aaaaaXbbbbb 这串序列中,在N个a之后跟着一个定界符X,之后又跟着N个字符b。在这里,1<=N<=10。我们用此序列训练带有10个隐藏神经元的单层LSTM。 正如预期的那样,LSTM在其训练范围内表现良好,甚至可以生成一些超过了训练范围的东西。 aaaaaaaaaaaaaaaXbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbbbb aaaaaaaaaaaaaaaaaaaXbbbbbbbbbbbbbbbbbb 我们期望找到一个隐藏的状态神经元计算a的数量: 为此我还专门构建了一个小型网页应用,它不仅可以在刚刚的基础上计算a的数量,还能计算b的数量。 此时cell表现很相似: 还有一件有趣的事情,工作记忆看起来像一个长期记忆的增强版,这在一般情况下是正常的吗? (责任编辑:本港台直播) |