序列模型-RNN

79 阅读8分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

序列模型

输入或者输出中包含有序列数据的模型叫做序列模型。

序列数据

举几个例子:

语音识别,输入一个音频片段,你会得到一系列的点,组成波纹状的,这就是序列数据。

文本的情感分析,一组句子也是序列数据,句子中的词汇也具有先后关系。

DNA 序列分析,一段DNA 组成也是序列数据,每一个单元都是有着固定的关系构成,而不是独立的。

等等…

其实你会发现,这几个例子中的序列数据,有一个共同点:每一个组成单元不是独立存在在的,可能依赖前面的单元。对视频行为识别,你不可能从一帧中识别出来,结合前几帧,后几帧进行分析。

数学标记

假设有这么一句话进行分析:**Harry Potter and Herminoe Granger invented a new spell.**同时这个 yy 能够表明输入的单词是否是人名的一部分。

输入数据是由 9 个单词组成的序列 xx,按照序列中元素的位置进行索引:x<1>x^{<1>},x<2>x^{<2>},x<3>x^{<3>},….x<9>x^{<9>}x<t>x^{<t>},用于索引序列中的元素。

输出数据是一组 [1,1,0,1,1,0,0,0,0][1,1,0,1,1,0,0,0,0] 的结果,索引方式为y<t>y^{<t>},与输入数据一致。

Tx(i)T^{(i)}_{x} 代表输入序列的长度,ii 代表样本位置。

序列模型优势

为什么要使用RNN这样的序列模型,而不是直接使用标准的全连接神经网络来解决输入或输出为序列数据的问题呢?

第一点:全连接的神经忘了不能够适应输入或输出中不同序列长度。。例如,在不使用数据填充的技巧下,无法用同一个全连接模型架构对15个单词的长度的句子和150个单词长度的句子进行情感分析。但是RNN则能够自然地适应这种序列长度的变化。

第二点:全连接神经网络不能共享在序列不同位置学到的权重,而RNN则能够跨时间共享权重。

第三点:以RNN为基础的序列模型通常还有时间平移非对称的特性,通常模型会更容易受到输入序列中较后位置的数据的影响。这一特性在时间序列预测等问题中通常是非常重要的,而全连接神经网络和卷积神经网络则不具有这样的特性。

RNN模型

RNN的最大特点:会将上一个时间点的值传递到下一个时间点作为输入的一部分。在零时刻,通常会输入一个零向量传入RNN单元。

前向传播的形式如下图所示:

img

公式如下:

a<t>=g(Waaa<t1>+Waxx<t>+ba)y^<t>=g(Wyaa<t>+by)\begin{array}{c} a^{<t>}=g\left(W_{a a} a^{<t-1>}+W_{a x} x^{<t>}+b_{a}\right) \\ \hat{y}^{<t>}=g\left(W_{y a} a^{<t>}+b_{y}\right) \end{array}

公式中的 gg ,代表激活函数,在循环神经网络中一般使用 tanh 作为激活函数,对于输出 yy 而言,如果是个分类问题则使用 softmax 作为激活函数或者 sigmoid 函数。

整体的过程根据图很好理解,从零向量 a<0>a^{<0>} 开始,首先用 a<0>a^{<0>}x<1>x^{<1>} 计算出 a<1>a^{<1>}y<1>y^{<1>} ,然后用 a<1>a^{<1>}x<2>x^{<2>} 计算出 a<2>a^{<2>}y<2>y^{<2>},这样一直进行下去,像图中从做到右完成向前传播。

类型

根据输入和输出序列情况,可以将序列模型分为以下类型:

One-to-One

image.png

其实 a<0>a^{<0>} 是一个零向量,所以这个类型就是一个经典的全连接模型。

One-to-Many

img

其实该类型一般应用于音乐生成,根据一个音乐类型或者某一个值,生成一段音乐的序列。输入是一个值,生成是一串序列。

Many-to-One

img

该类型一般应用于文本情感分析,输入是一串序列值,输出是一个值,例如分类的one-hot

Many-to-Many

img

该类型可能用于序列标注情况(Ty==TxT_{y}==T_{x}),例如识别句子中某些单词是否是人名。还有就是Ty!=TxT_{y}!=T_{x},可能会用于机器翻译场景。输入是一串序列,输出也是一串序列。

反向传播

使用方法是沿时梯度反向传播(Backpropagation Through Time),逆着前向传播的方向进行梯度传播。

image.png

假设我们解决的问题是文本情感分析,这是一个分类问题,使用交叉熵(cross entropy)作为损失函数,对于单个样本中元素损失函数:

L<t>(y^<t>,y<t>)=y<t>logy^<t>(1y<t>)log(1y^<t>)L^{<t>}\left(\hat{y}^{<t>}, y^{<t>}\right)=-y^{<t>} \log \hat{y}^{<t>}-\left(1-y^{<t>}\right) \log \left(1-\hat{y}^{<t>}\right)

将样本的所有元素损失函数进行加和:

L(y^,y)=t=1TyL<t>(y^<t>,y<t>)L(\hat{y}, y)=\sum_{t=1}^{T_{y}} L^{<t>}\left(\hat{y}^{<t>}, y^{<t>}\right)

根据前向传播,需要学习的参数很多,以权重 ww 为例:

E3W3=k=03E3y^3y^3s3(j=k+13sjsj1)skW\frac{\partial E_{3}}{\partial W^{3}}=\sum_{k=0}^{3} \frac{\partial E_{3}}{\partial \hat{y}_{3}} \frac{\partial \hat{y}_{3}}{\partial s_{3}}\left(\prod_{j=k+1}^{3} \frac{\partial s_{j}}{\partial s_{j-1}}\right) \frac{\partial s_{k}}{\partial W}

根据公式中(j=k+13sjsj1)\left(\prod_{j=k+1}^{3} \frac{\partial s_{j}}{\partial s_{j-1}}\right) 这是一个递归的求导公式,就会出现过长的时间点会导致梯度消失的问题。

变体(LSTM/GRU)

主要解决梯度下降过程中出现的过长的时间点会导致梯度消失的问题。

Tips: σ 为sigmoid函数,通过这个函数可以将数据变换为0-1范围内的数值,从而来充当门控信号。

LSTM(Long Short-Term Memory)

介绍一下 LSTM 模型的每个重要组成部分。

遗忘门:将数据经过 sigmoid 激活函数之后会形成一组数据,该组数据里面都是[0…1],该组数据配合后续信号进行对信号选择遗忘(该组数据如果存在 0 后续与信号相乘就会遗忘该信息)。

image.png

输入门:对信号进行激活函数处理。

image.png

输入:它与经典RNN模型不同的是,它会拥有细胞状态(CC),负责记忆长期的信号。乘号:其实对信号进行选择操作。加号:记忆信号。

image.png

输出门:长期信号指细胞状态(CC),输入则负责短期信号,两者进行相乘也是再选择信号进行输出。

image.png

LSTM 单元在基本的 RNN 单元基础上作了很大的改进,使得 LSTM 单元拥有了细胞状态(CC),细胞状态取值负责记忆长期信息,而激活函数值负责记忆短期信息。

细胞状态的取值由更新门和遗忘门来控制。在极端情况下,如果更新门一直取 0,并且遗忘门一直取 1,那么细胞状态将不会有改变,久远的信息将能够一直保持记忆并作用到输出中。

和基本的 RNN 相比,LSTM 单元能够记住长期信息,解决了长期依赖问题,缓解了梯度消失,但计算量较大。

GRU(Gated Recurrent Unit)

GRU 单元结构图如下:

image.png

首先,通过上一次传输的状态 ht1h_{t-1} 和当前节点输入 xtx_{t} 获取两个门控状态:其中 rr 控制重置的门控(reset gate), zz 为控制更新的门控(update gate)。

rtht1r_t*h_{t-1} 其实这个操作是控制前一状态有多少信息被写入到当前的候选集 h~t\tilde{h}_{t}h~t\tilde{h}_{t} 会获取部分 ht1h_t-1 信号和 输入信息 xtx_t,正在记忆前一阶段的信号。

1z1-z 其实在翻转信号,σ\sigma 函数就是在选择信号进行遗忘操作,但是经过1z1-z 操作,我觉得是在将之前应该遗忘的信号进行加强。

zth~tz_t*\tilde{h}_{t}:选择记忆 h~t\tilde{h}_{t} 里面的信号。

1z1-zzz 他们都是在选择记忆(遗忘),他们遗忘对象不同,前者是加强本应该遗忘信号,后者遗忘部分前一个状态信号和输入信号。

We choose to use Gated Recurrent Unit(GRU)(Cho et al.,2014) in our experiment since it performssimilarly to LSTM (Hochreiter & Schmidhuber, 1997) but is computationally cheaper.

译文:我们在我们的实验中选择GRU是因为它的实验效果与LSTM相似,但是更易于计算。

与 LSTM 相比,GRU内部少了一个门控,参数比 LSTM 少,但是却也能够达到与 LSTM 相当的功能。考虑到硬件的计算能力时间成本,大多情况我们会选择GRU。

GRU 的细胞状态可以通过更新门进行控制,当更新门取 0 时,GRU 的细胞状态将不会更新,这使得 GRU 单元能够较好地解决梯度消失问题和长期依赖问题。

双向与多层RNN

对于翻译来讲,单词的含义不仅和它前面的单词有关,也和它后面的单词有关。我们不能仅仅从左到右的进行扫描,这是不能够解决问题。

双向的 BRNN 能够同时从过去和未来的序列中获得信息。它实际上是由普通的从左到右传播的单向的 RNN 和从右到左传播的单向 RNN 并联而成。输出构成不仅仅通过从左到右单向扫描还要获取从右向左的扫描结果,再次进行激活。

y^t^=g(ωy[a(t),a(t)]+by)\hat{y}^{\hat{\langle t\rangle}}=g\left(\omega_{y}\left[\overrightarrow{a}^{(t)}, \overleftarrow{a}^{(t)}\right]+b_{y}\right)

多层 RNN 结构和普通的全连接神经网络相似,通过把上一层的激活函数值序列作为新的输入序列构造一个新的RNN层,RNN也可以有深层结构。深层RNN的层数通常不会太大,层数为3或者5的多层RNN已经足够复杂。

参考

cloud.tencent.com/developer/a…

www.jiqizhixin.com/articles/20…