关于机器学习:深度学习基础入门篇序列模型11循环神经网络-RNN长短时记忆网络LSTM门控循环单元GRU原理和应用详解

3次阅读

共计 8640 个字符,预计需要花费 22 分钟才能阅读完成。

深度学习根底入门篇 - 序列模型[11]:循环神经网络 RNN、长短时记忆网络 LSTM、门控循环单元 GRU 原理和利用详解

1. 循环神经网络 RNN

生存中,咱们常常会遇到或者应用一些时序信号,比方自然语言语音,自然语言文本。以自然语言文本为例,残缺的一句话中各个字符之间是有时序关系的,各个字符程序的调换有可能变成语义齐全不同的两句话,就像上面这个句子:

  • 张三十分怄气,激动之下打了李四
  • 李四十分怄气,激动之下打了张三

从以上这个例子能够看出,名字的调换造成了齐全不同的结果,可见自然语言的时序性十分重要。那么如何对这种带有时序关系的数据进行建模呢?本节咱们未来介绍一个十分经典的循环神经网络 RNN,心愿这篇本文可能对读者带来一些帮忙

1.1 循环神经网络 RNN 是什么

循环神经网络(Recurrent Neural Network,RNN)是一个十分经典的面向序列的模型,能够对自然语言句子或是其余时序信号进行建模。进一步讲,它只有一个物理 RNN 单元,然而这个 RNN 单元能够依照工夫步骤进行开展,在每个工夫步骤接管以后工夫步的输出和上一个工夫步的输入,而后进行计算得出本工夫步的输入。

上面咱们举个例子来讨论一下,如 图 1 所示,假如咱们当初有这样一句话:”我爱人工智能”,通过分词之后变成”我,爱,人工,智能”这 4 个单词,RNN 会依据这 4 个单词的时序关系进行解决,在第 1 个时刻解决单词”我”,第 2 个时刻解决单词”爱”,顺次类推。

图 1 RNN 网络结构图

图 1 上能够看出,RNN 在每个时刻 $t$ 均会接管两个输出,一个是以后时刻的单词 $x_t$,一个是来自上一个时刻的输入 $h_{t-1}$,通过计算后产生以后时刻的输入 $h_t$。例如在第 2 个时刻,它的输出是”爱”和 $h_1$,它的输入是 $h_2$;在第 3 个时刻,它的输出是”人工”和 $h_2$, 输入是 $h_3$,顺次类推,直到解决完最初一个单词。

总结一下 ,RNN 会从左到右逐词浏览这个句子,并一直调用一个雷同的 RNN Cell 来解决时序信息,每浏览一个单词,RNN 首先将本时刻 $t$ 的单词 $x_t$ 和这个模型外部记忆的 状态向量 $h_{t-1}$ 交融起来,造成一个带有最新记忆的 状态向量$h_t$。

Tip:当 RNN 读完最初一个单词后,那 RNN 就曾经读完了整个句子,个别可认为最初一个单词输入的状态向量可能示意整个句子的语义信息,即它是整个句子的语义向量,这是一个罕用的想法。

1.2 RNN 的公式推导

在第 1 节,咱们从宏观上探讨了 RNN 的工作原理,那么 RNN 外部是怎么计算的呢,即在每个时刻如何依据输出计算失去输入的呢?本节咱们来探讨这个话题。

前边咱们谈到,在每个时刻 $t$,RNN 会接管以后时刻的输出单词 $x_t$ 和上一个时刻的输入状态 $h_{t-1}$,而后计算失去以后时刻的输入 $h_t$,在 RNN 中这个实现机制比较简单:

$$h_t = tanh(Wx_t + Vh_{t-1}+b)$$

即在时刻 $t$,RNN 单元会对两个输出 $x_t$ 和 $h_{t-1}$ 进行线性变换,而后将后果应用 $tanh$ 激活函数进行解决,失去以后时刻 $t$ 的输入 $h_t$。

这里须要留神一下,tanh 函数是一个值域 (-1,1) 的函数,如 图 2 所示,能够长期维持外部记忆在一个固定的数值范畴内,避免因屡次迭代更新导致的数值爆炸,同时,tanh 的导数是一个平滑的函数,让神经网络的训练变得更加简略。

图 2 tanh 函数图像

1.3 RNN 的缺点

上边咱们貌似提出了一个十分优良的 RNN 模型建模时序数据,但在实在的工作训练过程中,存在一个显著的缺点,那就是当浏览很长的序列时,网络外部的信息会逐步变得越来越简单,以至于超过网络的记忆能力,使得最终的输入信息变得凌乱无用。例如上面这句话:

我感觉这家餐馆的菜品很不错,烤鸭十分正宗,包子也不错,酱牛肉很有嚼劲,然而服务员态度太顽劣了,咱们在门口等了 50 分钟都没有能胜利进去,好不容易进去了,桌子也半天没人清扫,整个环境十分吵闹,我的孩子都被吓哭了,我下次不会带敌人来。

显然这是个比拟长的文本序列,当 RNN 读到这句话时,有可能前半句还能精确地表白这句话的语义,然而读到后半句可能就齐全凌乱了,不能精确地表白这句话的语义信息,即不能放弃长期的信息之间的依赖。

因而,针对这个问题,后续呈现了很多基于 RNN 的改良模型,比方 LSTM,GRU 等等,这些在后续的章节咱们将持续探讨。

1.4 RNN 的几种常见模式

循环神经网络能够利用到很多不同类型的工作中,依据这些工作的的特点能够分为以下几种模式:

  • 序列到类别模式
  • 同步的序列到序列模式
  • 异步的序列到序列模式

上面咱们来进一步聊聊这几种模式,以便大家 RNN 适宜利用在什么样的工作上。

1.4.1 序列到类别模式¶

第 1 节咱们讲到,在 RNN 读完一个句子的最初一个单词后,该单词对应的输入便能够看做可能代表整个句子的语义向量,依据这个语义向量能够进一步计算一些工作,比方文本分类,假如通过这个语义向量可能将”我爱人工智能”这句话划分为”科技”类别,那这就是一个残缺的序列到类别模式的利用。

序列到类别模式 是将一串输出映射为一个向量,如 图 3 所示。在这种模式下,模型的输出是一个序列 $=[x_1,x_2,x_3,..,x_n]$,最终应用的模型输入是一个向量 $h_n$(图 3 中输入的绿色向量),能够依据这个输入向量 $h_n$ 进一步做一些工作。

图 3 序列到类别模式图

除了将最初时刻的状态作为整个序列的语义向量之外,咱们还能够对整个序列的所有状态进行均匀,并用这个均匀状态作为整个序列的语义向量,如 图 4 所示。

图 4 序列到类别模式图

1.4.2 同步的序列到序列模式¶

同步的序列到序列模式 是将一串输出 $x=[x_1,x_2,..,x_n]$ 映射为一串输入向量 $h=[h_1,h_2,…,h_n]$,并且每个输出和输入是一一对应的,如 图 5 所示。同步的序列到序列模式次要用于 序列标注(Sequence Labeling) 工作上。

图 5 同步的序列到序列模式

词性标注(Part-of-Speech Tagging) 为例,该工作冀望失去一个句子中每个单词的词性,因而它的输出就是一个句子中的单词,它的输入就是每个单词对应的词性。

1.4.3 异步的序列到序列模式¶

异步的序列到序列模式也成为编码器 - 解码器模型 (encoder-decoder),它同样是将一串输出映射 $x=[x_1,x_2,..,x_n]$ 为一串输入向量 $h=[h_1,h_2,…,h_m]$,然而输出序列和输入序列不要求有严格的一一对应关系,也不须要放弃雷同的长度,如 图 6 所示。例如在机器翻译 - 英译汉工作中,输出为中文的单词序列,输入为英文的单词序列。

图 6 异步的序列到序列模式

在这个模式下,个别先将输出序列传到一个 RNN(encoder, 图 6 橙色单元)中,而后再将 encoder 的输入向量作为另一个 RNN(解码器, 图 6 黄色单元)的输出,由解码器进行序列解码。在解码器的解码过程中,往往会将前一个时刻输入的单词作为以后时刻输出的单词,采纳这种自回归的形式进行解码。

  • 援用

[1] 邱锡鹏. 神经网络与深度学习[M]. 北京:机械工业出版社,2021.
[2] 吴飞. 人工智能导论:模型与算法[M]. 北京:高等教育出版社,2020.

2. 长短时记忆网络 LSTM

长短时记忆网络 (Long Short Term Memory,简称 LSTM) 是循环神经网络的一种,它为了解决 RNN 本身的缺点,向 RNN 单元中引入了 门机制 进行改善,上面咱们来看看它具体是怎么做的吧

2.1 LSTM 的设计思路

在循环神经网络 RNN 中咱们谈到,RNN 不太可能放弃长期的依赖,过长的信息容易导致 RNN 单元外部状态的凌乱,导致无奈精确的表白一句话的语义。

我感觉这家餐馆的菜品很不错,烤鸭十分正宗,包子也不错,酱牛肉很有嚼劲,然而服务员态度太顽劣了,咱们在门口等了 50 分钟都没有能胜利进去,好不容易进去了,桌子也半天没人清扫,整个环境十分吵闹,我的孩子都被吓哭了,我下次不会带敌人来。

咱们来看下面这句话,这句话很长,然而人读这句话的时候会记住几个要害的信息,比方烤鸭正宗,牛肉有嚼劲,服务员态度恶劣,环境吵闹等信息;但同时也会疏忽掉一些内容,比方”我感觉”,”好不容易”等不重要的内容。这阐明有抉择的记忆比记忆整句话更加容易,LSTM 正是受这一点的启发而设计的。

它通过引入门机制来管制 LSTM 单元须要记忆哪些信息,忘记哪些信息,从而放弃更长的信息依赖,更加轻松地表白整个句子语义。

2.2. LSTM 是怎么工作的

同 RNN 一样,LSTM 也是一种循环神经网络,他也是只有一个物理 LSTM 单元,依照工夫步骤开展解决时序数据,如 图 1 所示。

图 1 LSTM 开展图

假如当初有这样一句话:我爱人工智能,分词之后是:[我,爱,人工,智能]。LSTM 单元在第 1 个时刻会解决”我”这个单词,在第 2 个时刻会解决”爱”这个单词,顺次类推。

咱们再来看下每个时刻 LSTM 单元的输出和输入,显然在每个时刻 LSTM 会接管 3 种数据,同时输入 2 种数据。在时刻 $t$LSTM 单元的输出是:单词 $x_t$ (词向量),上一个时刻的状态向量 $c_{t-1}$ (上边的横线) 和 上一个时刻的隐状态向量 $h_{t-1}$ (下边的横线);LSTM 单元的输入是: 以后时刻的状态向量 $c_{t}$ 和 以后时刻的隐状态向量 $h_{t}$。

图 2 LSTM 数据处理样例

图 2 展现了 LSTM 解决”我爱人工智能”这句话的过程,咱们能够看到在第 1 个时刻,模型输出了单词”我”, 初始的状态向量 $c_0$ 和初始的隐状态向量 $h_0$,模型输入的是状态向量 $c_1$ 和隐状态向量 $h_1$;在第 2 个时刻,模型输出了单词”爱”, 第 1 个时刻的状态向量 $c_1$ 和 $h_1$,模型的输入是状态向量 $c_2$ 和隐状态向量 $h_2$,其余的时刻顺次类推。这就是 LSTM 解决时序信息的整体过程。

这里须要留神的是,在 LSTM 中尽管有两个状态向量 $c_{t}$ 和 $h_{t}$,但一般来讲,咱们会将 $c_{t}$ 视为可能代表浏览到以后 LSTM 单元信息的状态(或者说是记忆),而 $h_{t}$ 是以后 LSTM 单元对外的输入状态,它是理论的工作状态向量,即个别会利用 $h_{t}$ 来做一些具体的工作。

2.3. 从公式层面了解 LSTM

前边咱们从宏观上解释了 LSTM 是如何工作的,接下来我深刻到 LSTM 单元外部进行介绍,看看它是如何保持数据的长期依赖的。咱们先来看下 LSTM 单元外部是什么样的。

图 3 LSTM 单元内部结构

图 3 展现了 LSTM 单元外部的构造,外面蕴含了这样截个重要的组件:

  • 状态向量 $c_t$:它管制着整个 LSTM 单元的状态或者记忆,它会依据每个时刻的输出进行更新,从而实时放弃 LSTM 单元的记忆。
  • 隐状态向量 $h_t$:它是以后 LSTM 单元对外的输入状态,它是理论的工作状态向量,即个别会利用 $h_{t}$ 来做一些具体的工作。
  • 输出门$i_t$:管制以后时刻的输出信息须要向状态向量 $c_t$ 中注入哪些信息。举个例子,当输出信息是一些没有实际意义的词,比方”的”,可能模型不会让这些信息流入到状态向量中,从而放弃模型的语义表白。
  • 忘记门$f_t$:管制前一时刻的状态向量 $c_{t-1}$ 须要被屏蔽 / 忘记哪些信息。举个例子,昨天我去爬了长城,哦不对是前天,当模型看到”不对,是前天”的时候,可能就会遗记前边的”昨天”。
  • 输入门$o_t$:管制以后时刻的状态向量 $c_t$ 须要对外输入哪些信息,最终输入的信息即为 $h_t$。

在理解了这些基本概念后,咱们来看下这些组件的具体生成过程,首先来看下这三个门的生成过程,以时刻 $t$ 为例:

$$\begin{split}\begin{align} i_t &= sigmoid(W_ix_t+U_ih_{t-1}+b_i) \\ f_t &= sigmoid(W_fx_t+U_fh_{t-1}+b_f) \\ o_t &= sigmoid(W_ox_t+U_oh_{t-1}+b_o) \end{align}\end{split}$$

能够看到,这三个门的计算是应用输出数据 $x_t$ 和 $h_{t-1}$ 进行线性变换后,将后果传递给 $sigmoid$ 函数,因为 $sigmoid$ 函数是值域 (0,1) 的函数,即它可能将数据映射到这个固定区间,从而管制信息的流动。

接下来我门来计算下以后 LSTM 单元的 待输出信息

$$a_t = tanh(W_ax_t+U_ah_{t-1}+b_a)$$

同样是对输出数据 $x_t$ 和 $h_{t-1}$ 进行线性变换,而后将后果传递给 $tanh$ 函数,最终的后果即为待向以后 LSTM 单元的状态向量 $c_t$ 中注入的信息。有了以上这些组件,接下来就能够更新以后 LSTM 单元的状态向量 $c_t$ 了。

$$c_t = f_t \cdot c_{t-1} + i_t \cdot a_t$$

显然,LSTM 单元状态 $c_t$ 的更新是对上一个时刻的状态 $c_{t-1}$ 进行有抉择的忘记,对以后时刻的待输出信息 $a_t$ 将有抉择的输出,最初将两者的后果进行相加,示意向以后 LSTM 单元即融入了以前的状态信息 $c_{t-1}$,同时又注入了以后最新的信息 $a_t$。在计算出以后时刻的状态向量 $c_t$ 后,就能够依据该状态向量对外进行输入了。

$$h_t=o_t \cdot tanh(c_t)$$

即通过输入门对以后的状态信息 $c_t$ 进行有抉择的输入。

2.4. 应用 LSTM 设计情感剖析工作

前边咱们讲完了 LSTM 的原理,包含宏观工作流程和宏观公式实践,上面咱们应用 LSTM 去简略生成一个情感剖析的案例,冀望可能给读者带来一些应用教训。

2.4.1 情感剖析是什么

情感剖析(sentiment classification)意在提炼出一句话中的感情色调,比方快乐,一般,诧异,伤心,愤恨等。但个别为了简化问题,会将这些感情划分为 3 类:踊跃、中立和消极情感,如 图 4 所示。因而能够将情感剖析工作建模成一个 文本三分类 问题。

图 4 情感三分类

咱们来看下边的例子,第 1 句话显然是对手机的赞美,因而它的情感类别为踊跃;第 2 个句话是说热水器有问题,因而它的情感类别为消极;第 3 句话不带有任何感情色调,因而它的情感类别是中立。

我很喜爱这款手机,它的拍照性能很弱小。
这个热水器太费电了,千万不能买。
明天我看了一本书,这本书的名字是世间失格。

2.4.2 应用 LSTM 进行文本分类建模

在循环神经网络 RNN 章节中,咱们谈到当 RNN 读完最初一个单词的时候,其实曾经读完了整个句子,那么最初这个单词输入的向量能够被视为整个句子的语义向量。LSTM 同样实用这个做法,只是这里个别将前边讲到的隐状态向量作为整个句子的语义向量。

图 5 一种应用 LSTM 建模文本分类的结构图

图 5 展现了一种应用 LSTM 建模文本分类的结构图,当给定一个文本序列的时候,首先咱们先对文本序列进行分词,而后将每个单词的词向量传递 LSTM,LSTM 后会生成该句子的语义向量;而后将该语义向量传递给一个线性层,从而将这个语义向量映射为一个长度为 3 个情感向量,其中每一维代表一个情感类别。然而这个这个情感向量数值未归一化,因而还须要应用 $softmax$ 进行归一化,使其变成一个数值在 [0,1] 之间,相加和为 1 的数值。最初这个情感向量分数最大的那一维对应的情感类别就是整个句子的情感类别。

总结一下,本篇文章讲述了 LSTM 的设计原理,LSTM 的宏观工作流程,LSTM 的公式推导,以及应用 LSTM 简略实现情感剖析性能,看到这里置信大家对 LSTM 曾经有了不错的意识。

3. 门控循环单元 GRU

在神经网络倒退的过程中,简直所有对于 LSTM 的文章中对于 LSTM 的构造都会做出一些变动,也称为 LSTM 的变体。其中变动较大的是门控循环单元(Gated Recurrent Units),也就是较为风行的 GRU。GRU 是 2014 年由 Cho, et al 在文章《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》中提出的,某种程度上 GRU 也是对于 LSTM 构造复杂性的优化。LSTM 可能解决循环神经网络因长期依赖带来的梯度隐没和梯度爆炸问题,然而 LSTM 有三个不同的门,参数较多,训练起来比拟艰难。GRU 只含有两个门控构造,且在超参数全副调优的状况下,二者性能相当,然而 GRU 构造更为简略,训练样本较少,易实现。

GRU 在 LSTM 的根底上次要做出了两点扭转:

(1)GRU 只有两个门。GRU 将 LSTM 中的输出门和忘记门合二为一,称为更新门(update gate),上图中的 $z_{t}$,管制前边记忆信息可能持续保留到以后时刻的数据量,或者说决定有多少前一时间步的信息和以后工夫步的信息要被持续传递到将来;GRU 的另一个门称为重置门(reset gate),上图中的 $r_{t}$,管制要忘记多少过来的信息。

(2)勾销进行线性自更新的记忆单元(memory cell),而是间接在暗藏单元中利用门控间接进行线性自更新。GRU 的逻辑图如上图所示。

GRU 的公式化表白如下:

$$z_{t}=\sigma(W_{z} \cdot [h_{t-1},x_{t}])$$

$$r_{t}=\sigma(W_{r} \cdot [h_{t-1},x_{t}])$$

$$\tilde h=tanh(W \cdot [r_{t} \odot h_{t-1},x_{t}])$$

$$h_{t}=(1-z_{t})\odot h_{t-1}+z_{t} \odot \tilde h_{t-1}$$

上面咱们将分步介绍 GRU 的单元传递过程,公式也会在接下来的章节进行具体的介绍:

上图是带有门控循环单元的循环神经网络。

3.1. 更新门

在工夫步 t,咱们首先须要应用以下公式计算更新门 $$z_{t}=\sigma(W_{z} \cdot [h_{t-1},x_{t}])$$

其中 $x_{t}$ 为第 t 个工夫步的输出向量,即输出序列 X 的第 t 个重量,它会通过一个线性变换(与权重矩阵 $W_{z}$ 相乘)。$h_{t-1}$ 保留的是前一个工夫步 t-1 的信息,它同样也会通过一个线性变换。更新门将这两局部信息相加并投入到 Sigmoid 激活函数中,因而将激活后果压缩到 0 到 1 之间。以下是更新门在整个单元的地位与示意办法。

更新门帮忙模型决定到底要将多少过来的信息传递到将来,或到底前一时间步和以后工夫步的信息有多少是须要持续传递的。这一点十分弱小,因为模型能决定从过来复制所有的信息以缩小梯度隐没的危险。

3.2. 重置门

实质上来说,重置门次要决定了到底有多少过来的信息须要忘记,咱们能够应用以下表达式计算:$$r_{t}=\sigma(W_{r} \cdot [h_{t-1},x_{t}])$$ 该表达式与更新门的表达式是一样的,只不过线性变换的参数和用途不一样而已。下图展现了该运算过程的示意办法。

如后面更新门所述,$h_{t-1}$ 和 $x_{t}$ 先通过一个线性变换,再相加投入 Sigmoid 激活函数以输入激活值。

3,3. 以后记忆内容

当初咱们具体讨论一下这些门控到底如何影响最终的输入。在重置门的应用中,新的记忆内容将应用重置门贮存过来相干的信息,它的计算表达式为:$$\tilde h=tanh(W \cdot [r_{t} \odot h_{t-1},x_{t}])$$

输出 $x_{t}$ 与上一时间步信息 $h_{t-1}$ 先通过一个线性变换,即别离右乘矩阵 W。

计算重置门 $r_{t}$ 与 $h_{t-1}$ 的 Hadamard 乘积,即 $r_{t}$ 与 $h_{t-1}$ 的对应元素乘积。因为后面计算的重置门是一个由 0 到 1 组成的向量,它会掂量门控开启的大小。例如某个元素对应的门控值为 0,那么它就代表这个元素的信息齐全被忘记掉。该 Hadamard 乘积将确定所要保留与忘记的以前信息。

将这两局部的计算结果相加再投入双曲正切激活函数中。该计算过程可示意为:

3.4. 以后工夫步的最终记忆

在最初一步,网络须要计算 $h_t$,该向量将保留以后单元的信息并传递到下一个单元中。在这个过程中,咱们须要应用更新门,它决定了以后记忆内容 $\tilde h$ 和前一时间步 $h_{t-1}$ 中须要收集的信息是什么。这一过程能够示意为:

$$h_{t}=(1-z_{t})\odot h_{t-1}+z_{t} \odot \tilde h_{t-1}$$

$z_t$ 为更新门的激活后果,它同样以门控的模式管制了信息的流入。$1-z_t$ 与 $h_{t-1}$ 的 Hadamard 乘积示意前一时间步保留到最终记忆的信息,该信息加上以后记忆保留至最终记忆的信息 ($z_t$ 与 $\tilde h_{t-1}$ 的 Hadamard 乘积) 就等于最终门控循环单元输入的内容。

以上表达式能够展现为:

门控循环单元不会随工夫而革除以前的信息,它会保留相干的信息并传递到下一个单元,因而它利用全副信息而防止了梯度隐没问题。

参考文献

Chung, J., Gulcehre, C., Cho, K., & Bengio, Y. (2014). Empirical evaluation of gated recurrent neural networks on sequence modeling. arXiv preprint arXiv:1412.3555. 链接

经典必读:门控循环单元(GRU)的基本概念与原理

正文完
 0