大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
写在前面:这是翻译自colah的一篇博客,原文关于LSTM神经网络模型的理解写的非常直观、简单易懂,所以翻译过来帮助大家学习理解LSTM模型。
当然我不是按照原文一字不落的翻译,而是摘出其中对模型理解最有帮助的部分,然后用我自己理解的方式和语言来写的博文。这是我翻译博文的一贯做法。
有兴趣的可以自行去看原文,比较简短,原博客地址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/
一、循环神经网络RNN
RNN循环神经网络使用循环核来实现特征在时间上的共享,记住每个时间步的输入信息。
1、RNN的网络结构
1.1 循环核
RNN中的一个循环核块通常这样表示的:
循环核实现参数的时间共享,循环层用来提取时间信息。
1.2 循环核按时间步展开
参数ht随着时间的变化而变化,输入数据x也随着变化而变化。训练优化的就是这些参数构成的矩阵,训练完成后,我们选择效果最好的模型,执行前向传播。
上面的一个循环核块按照时间步展开后是:
图中标示的wx,h 、bh、wh,h 就是可训练的参数。这里展示的是每个时间步都有输出的情况。
有些循环核块中间时间步是没有输出的,只有最后一个时间步才有输出,即没有h0,h1,..ht-1, 只有ht。样子是这样:
1.3 循环计算层
向输出方向生长,循环核中记忆体的个数和参数可以自己设置
TF中实现循环计算层的代码
tf.keras.layers.SimpleRNN(记忆体个数,
activation = '激活函数', # 其中默认为tanh
return_sequences = Ture or False # 是否每个时刻输出ht到下一层,
# 如果不是则仅最后时间步输出ht,False为默认值
)
2、RNN循环核的计算过程
下面展示了循环核是如何根据这些可训练参数来计算ht的过程,也展示了可训练参数矩阵wx,h 、bh、wh,h又是如何做到在各时间步间做到参数共享的。非常直观!
二、LSTM模型
LSTM模型要解决什么问题?为什么要不能直接使用RNN模型,而一定要设计LSTM模型来解决这个问题呢?这就是信息的长期依赖问题。
在预测模型中,如果预测所需要的信息离输入信息距离比较近,正确预测出的概率比较大。但如果我们要预测的信息距离输入的信息比较远,正确预测出的可能性就不那么高了。即便能使用RNN神经网络来做到很好的预测结果,那也是需要工程师们很小心的来调整参数的。
在这种情境下,长短期记忆网络,即LSTM模型诞生了。它很好的解决了答案的信息是在较早,还在较晚出现的输入信息中这个问题,预测效果很好,并且不需要工程师们费尽心力的来调参。
1、LSTM模型的结构
LSTM模型也是RNN模型,所有模型结构中也有循环核的部分,它的构成是这样的:
我们先说明下这些图示的含义,
:表示一个神经网络层,即一层激活函数的运算
:表示特征向量的元素对元素级别的运算,即点运算。可以是乘法、加法或减法。
:表示特征向量的流向
:表示特征向量的拼接
:表示内容复制,但内容流向不同的路径
2、LSTM模型的核心思想
我们将用如下的一些概念来描述LSTM模型中的计算模块,它们就是LSTM模型的精髓所在了。现在可以不懂它们到底是什么,在接下下来我们逐步过计算过程的时候,这些概念就不言自明了。
LSTM模型的核心思想是细胞态(cell state),就是图中上方水平的那一条贯穿整个循环核的数据流向线。
这个细胞态(cell state)就像数据传输带一样,数据沿着它流动。只不过在有交叉点的地方需要数据会根据交叉点的含义做相应的改变。
LSTM模型的另外一个核心就是控制细胞态中的信息/数据被移除(remove)或增加(add)的结构,这个结构叫做门(gates)。
通过门(gates),我们可以控制信息是通过、不通过、还是部分通过,然后被融入到上方的数据流中。门是由sigmoid神经网络层和点运算 两部分组成的。其中sigmoid函数的输出是0-1之间的数值,所以通过它就描述了信息通过的比例情况。0意味着什么也没通过,1意味着数据全部通过。
一个门(gate)的组成结构如下:
3、逐步拆解LSTM的计算过程
有了上面的这些基本概念和认识后,我们接下来开始逐步说明LSTM的循环核层,看LSTM模型的循环核到底做了怎样的计算过程。
3.1 第一道门“遗忘门”(forget fgate layer)
前一个时间步的循环核的数据ht-1 和 第t个时间的输入特征xt拼接,进入sigmoid激活函数的神经网络层,生成的数据ft是0-1之间的数,代表了细胞态Ct-1应该保留的比率。0代表Ct-1数据全部遗忘,1代表Ct-1数据全部保留。
这里的可训练参数就是Wf ,bf 参数矩阵。
3.2 第二道门“输入门”(input gate layer)
这一步要决定应该记住哪些新的信息到细胞态中。
这里有两步,第一步是“输入门”(input gate layer),即图中的sigmoid函数神经网络层,决定了应不应该更新数据、或者多大比例的去更新数据。
第二步是一个tanh神经网络层,这步生成了一个加入到细胞态的候选向量。
将第一步和第二步的结果向量进行点乘,才最终确定如何去更新细胞态。
这里的可训练参数是Wi,bi,Wc,bc 参数矩阵。
3.3 更新细胞态(cell state)
“遗忘门”和“输入门”的步骤都计算完成之后,就要开始更新细胞态了。Ct的更新公式如上,很清晰的说明了“遗忘门”、“输入门”到底是如何对长期、短期的信息来实现遗忘或记住的。
这里没有可训练的参数,都是之前已有的数据。
3.4 第三道门“输出门”(output gate layer)
最后要做的就是确定输出数据,这是根据细胞态(cell state)、时刻t的输入信息xt、时刻t-1的循环核ht 来共同决定的。
首先xt 、ht-1经过一层sigmoid激活函数的神经网络层,即“输出门”,得到一个向量,它将决定我们应该按照多大概率输出数据。
而细胞态Ct经过一层tanh激活函数的神经网络,得到-1 到1之间的向量,这就是候选的输出数据。
将“输出门”的概率向量和候选的输出结果向量 进行点乘,就得到我们最终要输出的结果ht。
这里的可训练参数是Wo,bo 参数矩阵。
4、LSTM模型的变体
我们上面介绍的是一种非常典型的LSTM模型结构。不是所有的LSTM模型都是这样的结构,它有很多变体,在结构上是略有不同的。我们列举几个例子。
其中一个比较流行的LSTM变体是Gers & Schmidhuber (2000) 介绍的,这里引入了窥探孔连接“peephole connections.” 模型结构如下:
另外一个变体使用了成对出现的“遗忘门”和“输入门”。这里的特点是成对出现的“遗忘门”+“输入门”=1, 即我们只有在遗忘一些信息的时候才会输入对应的一部门新信息。
GRU模型(Gated Recurrent Unit)是由 Cho, et al. (2014)引入的,是一个非常瞩目的LSTM模型。它将“遗忘门”、“输入门”结合起来组成了一个“更新门”(update gate)的单元。除此外,它还融合了细胞态和隐藏状。GRU模型比经典的LSTM模型更简单,并且发展也非常迅速。
除了上面的这些变体,还有很多其他的变体,比如Depth Gated RNNs Yao, et al. (2015), Clockwork RNNs Koutnik, et al. (2014)等。
这么多的LSTM模型,那么到底哪个的效果最好,我们又该如何选择呢?
Greff, et al. (2015) 对上一些流行的LSTM变体做了对比,发现它们的效果差不多。Jozefowicz, et al. (2015)则比较了上千个RNN结构,发现在一些特定的任务中还是有模型比LSTM效果要好的。
总结
以上介绍了LSTM模型及其变种。RNN循环神经网络中还有其他值得关注的模型,比如注意力机制的RNN,以及Grid LSTM等。大家有兴趣就进一步的去学习和研究。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195303.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...