大家都喜爱的神经网络系列之LSTM

Neil Zhu,ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

本文介绍 LSTM 基本原理,和在 torch 以及 Theano 下给出两个例子。
LSTM 本质上是一种 RNN。人们发现 RNN 在训练中会遇到较为严重的梯度消失问题(误差梯度随重要事件的时间差的大小指数级下降)。使用 LSTM 模块后,当误差从输出层反向传播回来时,可以使用模块的记忆元记下来。所以 LSTM 可以记住比较长时间内的信息。

LSTM 现在应用非常广泛:

  1. Robot control[8]
  2. Time series prediction[9]
  3. Speech recognition[10][11][12]
  4. Rhythm learning[13]
  5. Music composition[14]
  6. Grammar learning[15][16][17]
  7. Handwriting recognition[18][19]
  8. Human action recognition[20]
  9. Protein Homology Detection[21]

我们的例子是训练一个基于字符的 LSTM 语言模型,使用中文的古诗词数据来训练。

在语言建模中,我们的任务是对词的序列的出现概率进行建模,通常是使用词,但这里使用的字符(为了看看实验的情况)。更加准确地说,就是对一个 T 长的词列表 $$w_1,w_2,...,w_T$$,我们定义概率如下:
$$P(w_1,w_2,...,w_T) = \prod_{t=1}^T P(w_t | w_{1:(t-1)})$$
其中 $$1 : (t - 1)$$ 表示从 $$1$$ 到 $$t-1$$。因此我们希望模型能够给高的概率给更加合理的字符序列,而非乱序的组合。

在我之前几篇译文里面介绍了很多神经网络的知识,其中也包含了 LSTM 网络。比如说梯度的消失和爆炸的情况。这里我再顺手贴上几个公式,显得很专业一下。
其实这两种关于梯度的问题,本质上很简单。梯度消失就是将一个导数的序列相乘,由于其中的某些导数变的很小 $$< 1$$,这样最终的乘积就变成接近 $$0$$ 的值了。反过来,若是梯度非常大,那乘积就是变得无比的大,也就爆炸了。
这样会导致梯度下降的快于在输入的两个相关事件的距离。

LSTM 通过在传播导数的时候,保证其能够传播得尽可能远而不会明显的改变。下面会解释。所以 LSTM 就能够学得更长的依赖关系。

仔细看看,其实 LSTM 就是下面几个方程:

  • 输入门:控制当前输入 $$x_t$$ 和前一步输出 $$h_{t-1}$$ 进入新的 cell 的信息量:
  • 忘记门:决定是否清楚或者保持单一部分的状态
  • cell 更新变换:变换输出和前一状态到最新状态
  • cell 状态更新步骤:计算下一个时间戳的状态使用经过门处理的前一状态和输入:


  • 输出门:计算 cell 的输出

  • 最终 LSTM 的输出:使用一个对当前状态的 tanh 变换进行重变换:

现在可以看看为何这样的设计能够解决梯度消失问题,对于 $$k


这里我们可以看到一条清晰的路径,让梯度无阻碍地进行流动(也就是说,不会下降到 $$0$$),除非对来自忘记门的常量(wrt $$c_{t-1}$$)乘法因子这会总在 $$1$$ 的附近,所以不会导致太大的下降,除了忘记门清除了 cell 的状态,这样的话梯度也不会回流了。

对比 RNN 的梯度流动的路径,就可以看到不少 sigmoid 函数和权重矩阵的导数,这两类都更加可能远离 $$1$$。

前向传播

我们现在描述前向传播如何进行。
模型有 3 个组成部分

  1. LSTM 模块
  2. 映射词(这里是字符)到连续值向量的嵌入模块
  3. 线性模型加上一个 softmax,将 LSTM 的输出 $$h_t$$ 映射到概率分布

准备动作:我们将 LSTM 展开到 T 个时间步,每次都有 LSTM 共享权重的副本($W_{xi}$、$W_{xo}$、$X_{xf}$ 等等)。我们按照同样的操作完成 T 步的共享权重。

前向传播

  1. 将输入通过嵌入层,来获得 T 个嵌入
  2. 对每一步:
  3. 运行 LSTM 的一个时间步,使用时间 t 的嵌入作为输入
  4. 获得时间 t 处的输出,这个就是在时间 t 的预测结果

反向传播

现在反向传播就是很简单了:我们首先进行前向传播,然后完全反序执行,调用 backward 而非 forward,保持每步 backward() 返回的 gradInput 的记录
,将其传递给下一个 backward 调用。细节请参考 train.lua

LSMT 中采样

在每个时间步,LSTM 都使用了 softmax 输出了一个在字符集上的概率分布。

给定每个时间步的分布,有几种方法来获得单个的字符,每个字符获得其相应的嵌入然后传递给 LSTM 作为下一步的输入:

  1. 获得当前时间步最大的值(试试运行不加 -samplesample.lua看看)
  2. 从分布中使用 softmax 采样
  3. 获取前 k 个结果,使用 beam 搜索(这里并没有实现)

评价采样的质量

最简单的方法:可视化数据!诸如“the”或者“and”这样的词出现得非常频繁,即使就是训练很多的时间。随着训练的继续,样本会越来越像真的英语。

而更加形式化的性能评估就是测量 perplexity 在一个新的测试集合上。Perplexity 是测试集的逆概率,使用词的数目正规化。最小化 perplexity 和最大化概率是一样的,所以一个更低的 perplexity 模型能够更好地描述数据。Perplexity 是一种常用的度量语言模型的测度,其定义如下:


其中的 $$w_1, ..., w_N$$ 是训练数据的整个序列;我们将整个这些看成是一个序列。在 bigram 模型中,条件是截断的,

在实践中,我们没有测试集,所以就不会测量 perplexity,我们训练的字符层的模型。perplexity 通常用在词层的语言模型上。

参考牛津大学机器学习课程

[待续]

“忽如寄,壽無金酒固枝思, 歲上泰隨鳴餘娥, 采良隔逝閣附悲, 蟀箕袍德舉指鳥, 花有疏生佳柱蟀, 下佳能度”

你可能感兴趣的:(大家都喜爱的神经网络系列之LSTM)