大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
递归神经网络(RNN)
人类不会每时每刻都开始思考。 当你阅读这篇文章时,你会根据你对之前单词的理解来理解每个单词。 你不会忘掉掉所有东西,然后再从头开始思考。 你的想法有持久性。
传统的神经网络不能做到这一点,这是一个主要的缺点。 例如,假设您想要对电影视频中每个点发生的事件进行分类。 目前尚传统神经网络无法利用其对电影中先前事件的推理来预测后者。
循环神经网络解决了这个问题。 它们是带有循环的网络,允许信息持续存在。
在上图中,一块神经网络A查看一些输入xt并输出一个值ht。 循环允许信息从网络的一个步骤传递到下一个步骤。
这些循环使得循环神经网络看起来有点神秘。 但是,如果你多想一点,事实证明它们与普通的神经网络并没有什么不同。 可以将循环神经网络视为同一网络的多个副本,每个副本都将消息传递给后继者。 考虑如果我们展开循环会发生什么:
这种类似链的性质表明,递归神经网络与序列和列表密切相关。 它们是用于此类数据的神经网络的自然架构。
在过去几年中,将RNN应用于各种问题取得了令人难以置信的成功:语音识别,语言建模,翻译,图像字幕…这个列表还在继续增加。
这些成功的关键在于使用“LSTM”,这是一种非常特殊的递归神经网络,对于许多任务而言,它比标准版本好得多。 几乎所有基于递归神经网络的令人兴奋的应用都是用它们实现的。 这里主要探讨这些LSTM。
LSTM 网络
长短期记忆网络 – 通常只称为“LSTM” – 是一种特殊的RNN,能够学习长期的规律。 它们是由Hochreiter&Schmidhuber(1997)首先提出的,并且在后来的工作中被许多人精炼和推广。他们在各种各样的问题上应用得非常好,现在被广泛的使用。
LSTM明确旨在避免长期依赖性的问题。 长时间记住信息实际上是他们的默认行为,而不是他们难以学习的东西!
所有递归神经网络都具有神经网络重复模块链的形式。 在标准RNN中,该重复模块将具有非常简单的结构,例如单个tanh层。
LSTM也具有这种类似链的结构,但重复模块具有不同的结构。 有四个,而不是一个神经网络层,如下图所示。
我们将逐步介绍LSTM图。 现在,让我们来介绍所使用的符号。
在上图中,每箭头都携带一个向量,从上一个节点的输出到其他节点的输入。 粉色圆圈表示逐点运算,如矢量加法,而黄色框表示神经网络层。 箭头合并表示连接,而箭头分叉表示其内容被复制,副本将转移到不同的位置。
LSTM背后的核心理念
LSTM的关键是单元状态,水平线贯穿图的顶部。
有些像传送带。 它直接沿着整个链运行,只有一些次要的线性交互。 信息很容易沿着它不变地流动。
LSTM能够移除或添加信息到结点来改变信息流状态,由称为门(gate)的结构精心调节。
门是一种可选择通过信息的节点。 它们由西格玛(Sigmoid)神经网络层和逐点乘法运算组成。
sigmoid层输出0到1之间的数字,描述每个信息向量应该通过多少。 值为零意味着“不让任何东西通过”,而值为1则意味着“让一切都通过!”
LSTM具有三个这样的门,用于保护和控制信息流向量状态。
LSTM 详细介绍
我们的LSTM的第一步是确定我们将从节点状态中丢弃哪些信息。 该判定由称为“遗忘门层”的西格玛(Sigmoid)层决定。它查看ht-1和xt,并为单元状态Ct-1中的每个数字输出0到1之间的数字。 1代表“完全保持这个”,而0代表“完全摆脱这个”。
让我们回到语言模型示例,试图根据以前的所有单词预测下一个单词。 在这样的问题中,节点状态可能包括当前受试者的性别,因此可以使用正确的代词。 当我们看到一个新主题时,我们想要忘记旧主题的性别。
下一步是确定我们将在单元节点状态中存储哪些新信息。 这有两个部分。 首先,称为“输入门层”的sigmoid层决定我们将更新哪些值。 接下来,tanh层创建可以添加到状态的新候选值C~t的向量。 在下一步中,我们将结合这两个来创建状态更新。
在我们语言模型的例子中,我们想要将新主题的性别添加到单元格状态,以替换我们忘记的旧主题。
现在是时候将旧的单元状态Ct-1更新为新的单元状态Ct。 之前的步骤已经决定要做什么,我们只需要实际做到这一点。
我们将旧状态乘以ft,忘记我们之前决定忘记的事情。 然后我们添加* C~t。 这是新的候选值,根据我们决定更新每个状态的值来缩放。
在语言模型的情况下,我们实际上放弃了关于旧主题的性别的信息并添加新信息,正如我们在前面的步骤中所做的那样。
最后,我们需要决定我们要输出的内容。 此输出将基于我们的单元状态,但将是过滤版本。 首先,我们运行一个sigmoid层,它决定我们要输出的单元状态的哪些部分。 然后,我们将单元状态置于tanh(将值推到介于-1和1之间)并将其乘以sigmoid门的输出,以便我们只输出我们决定的部分。
对于语言模型示例,由于它只是看到一个主题,它可能想要输出与动词相关的信息,以防接下来会发生什么。 例如,它可能输出主语是单数还是复数,以便我们知道动词应该与什么形式共轭,如果接下来的话。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195072.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...