序列模型——循环序列模型 (理论部分)

一. 序列模型常用领域如下:

Speech recognition(语音识别)
Music generation (音乐生成): In this cases,only the Y is a sequence, and X can be a single integer or the empty set. Y
Sentiment classification (情感分析): X is a sequence, i.e. ,”There is nothing to like in this movie”. Y is how many stars do you think this review will be?
DNA sequence analysis (DNA序列分析): DNA can be represented via the four alphabets A, C, G, and T. When given a sequence of DNA, label which part of this DNA sequence say corresponds to a protein. (给定一段DNA序列,标明哪段DNA序列对应哪种蛋白质)
Machine translation (机器翻译): The input X is a given sentence, output Y is the translation in a different language.
Video activity recognition (物体行为识别): X is a sequence of video frames, Y is the activity.
Name entity recognition (命名实体识别): you might be given a sentence and asked to identify the people in that sentence.

这里写图片描述

二. 数字符号

对于命名实体识别,即Name entity recognition:

X: Harry Potter and Hermione Granger invented a new spell. ( X < 1 > X < t > X < 9 > )
其中 X < t > 代表X序列的第 t 个单词的索引, T x 代表序列X(输入)的长度

Y: Y < 1 > Y < t > Y < 9 > 代表每个输入序列对应的输出的索引, T y 代表序列Y(输出)的长度

X ( i ) < t > 代表第 i 个样本的第 t 个单词, T x ( i ) 代表第 i 个样本的序列长度, 依次类推可得出 Y ( i ) < t > T y ( i ) 的含义。

在这个例子中 T y = T x = 9

这里写图片描述

三. 循环卷积网络模型

对于时间序列而言,传统的神经网络有俩大不足的地方:
1. Inputs, outputs can be different lengths in different examples (在不同的例子中拥有不同的输入和输出),尽管可以填充使其输入和输出达到最大值,但似乎不是很好的方法。
2. Doesn’t share features learned across different positions of text. (在序列的不同地方不能够共享学到的特征)

对于命名实体识别而言,若使用单向循环卷积网络,那么只能对于诸如 “ He said, ‘Teddy Roosevelt was a great President.’ ” 对于判断Teddy是否为人名来说,单纯使用如下循环卷积网络,则判断 “Teddy” 时,只是简单的用到了 “He said,”.这里写图片描述

对于正向传播来说,我们应该有以下公式:
a < t > = g 1 ( W a [ a < t 1 > , x < t > ] + b a ) …………. (我在想这里的 [ a < t 1 > , x < t > ] 是不是应该是 [ a < t 1 > , x < t > ] T )

y ^ < t > = g 2 ( W y a < t > + b y )

其中, g 1 g 2 分别代表 非线性激活函数, g 1 一般为 tanh 或者 relu 函数, g 2 一般为 Sigmoid 或者 Softmax 函数

这里写图片描述

四.通过时间序列的反向传播

对于正向传播而言,其流程如下图所示, 得到 a < 0 > x < 1 > = a < 1 > ; a < 1 > a < 2 > = a 2 ; . . . ; a t 1 x t = a t a < 1 > > y ^ < 1 > ; a < 2 > > y ^ < 2 > ; . . . ; a < t > > y ^ < t >

其中这里需要注意的是从 a t 1 x t a t w a b a ( w a b a ) , a t y t w y b y ( w y b y )

这里写图片描述

为了计算反向传播,需要一个损失函数,特别的有:
如果在一段序列中,输入的 X < 1 > 是一个单词,那么 y t 是这个而单词的概率为1,而 y ^ < t > 是这个神经网络的输出,概率可能为1,那么代价函数可以定义为 L o g i s t i c ,也叫作交叉熵损失函数,即如下所示:

L < t > ( y ^ < t > , y < t > ) = y < t > l o g ( y < t > ) 1 y < t > l o g 1 y < t > , 这个是对于时间 t 的时候的损失函数

对于整个时间序列,则有损失函数:

L ( y ^ , y ) = t = 1 T y < t > l o g ( y < t > ) 1 y < t > l o g 1 y < t >

然后通过代价函数和梯度下降进行参数的学习,如下图所示,红色箭头代表 反向传播,绿色箭头代表正向传播。

这里写图片描述

五. 不同类型的循环神经网络

Many - to -many:
T x T y ( ) 是一致的时候,我们称这个网络为 多对一 网络。例如英文翻译成中文的例子:

这里写图片描述

T x T y 长度不一致的时候,以 法语 跟 英语 之间翻译转换而言,我们可知其输入跟输出是不一样的,这就需要新的网络如下:
这里写图片描述
Many - to - one:
T x ( ) T y ( 1 ) 的时候,我们称这个网络为 多对一网络。 例如通过电影评价来给电影评星的情况:

这里写图片描述

One - to - many:
T x ( 1 ) T y ( ) 的时候,我们称这个网络为 一对多网络。 例如通过一个音符或者一个数字来生成一段音乐:

当生成序列的时候,通常会把第一个合成的输出,也 feed 给下一层,所以实际上的网络结构如下图所示:

这里写图片描述

六. 语言模型和序列生成

为了建立 RNN 这样的模型,首先需要一个训练集,包含一个很大的英文文本语料库(word corpus), word corpus是自然语言 NLP 的一个专有名词。

对于句子 Cats ( y < 1 > ) average( y < 2 > ) 15( y < 2 > ) hours( y < 3 > ) of( y < 4 > ) sleep( y < 5 > ) a( y < 6 > ) day( y < 7 > )

这里的 y < 1 > , y < 2 > 都是一个one-hot向量,即该词在word corpus中所占的索引。 同时还要定义句子是否结束了,那么可以用 EOS 来作为句子的结尾标记。

预测的步骤:
A.当我们要预测这个句子的时候,我们第一个输出初始化为 x < 1 > = 0 ^ 向量,同时 a < 0 > = 0 ^ 向量,然后得到 a 1 经过 S o f t m a x 函数可以得到第一词,所以 y ^ < 1 > 只是为了预测第一个词的概率。

B.在下一个时间步中,我们要把之前预测的第一个单词的概率 x < 2 > = y < 1 > , 作为输出算出 a < 2 > , 然后最后得到 y ^ < 2 > , 其中 y ^ < 2 > 是第二个词的概率,即 P ( a v e r a g e | C a t s ) .

C.然后 y ^ < 2 > 是第三个词的概率,则可以得到 P ( a v e r a g e | C a t s , a v e r a g e )

对于整个句子的概率,我们有 P ( y < 1 > , y < 2 > , y < 3 > ) = P ( y < 1 > ) P ( y < 2 > | y < 1 > ) P ( y < 3 > | y < 1 > , y < 2 > )

这里写图片描述

七. 对新序列采样

在训练一个序列模型后,要想了解这个模型学了什么,可以对RNN进行一次新序列的采样。

八. 带有神经网络的梯度消失

对于在自然语言处理中,可能会经常处理以下文本:
1. The cat, …. (中间20个词), was full.
2. The cats, …. (中间20个词), were full.

对于上面说讲到的RNN 结构,并不会有长期的记忆功能,即第一句 was 很难 从 cat 学到是单数, 而第二句 were 很难从 cats 学到是否是复数,因为中间相差了大概有 几十个词,而普通的RNN并不具备长期记忆功能。

同时,对于梯度消失而言,当网络很深的时候,在进行反向传播的时候,可能会遇到梯度消失的时候。

这里写图片描述

九. GRU 单元(Gated Recurrent Unit)

对于门控单元,我们令 C 抽象为记忆单元,那么我们有 C = memory cell

1. C < t > = a < t >

2. C ~ < t > = t a n h ( W c [ c < t 1 > , x t ] + b c ) (候选的抽象记忆单元,等待更新)

3. Γ u ( u u p d a t e ) = σ ( W u [ c < t 1 > , x t ] + b u ) (这一步是GRU真正的思想,有个门,0或者1,使用了sigmoid 参数)

4. C < t > = Γ u C ~ < t > + ( 1 Γ u ) C < t 1 > (如果 Γ u = 1 的话,意味着要更新,如果 Γ u = 0 的话,意味着不更新)

举个例子: 当句子为 The cat, which already ate …. ,was full.

当在cat的时候, c < t > = 1 ( ) , Γ u = 1 , 在这个时候更新, 但是当到cat 后面的单词…, Γ = 0 (没有更新),这时候 c < t > = 1 (因为没有更新,所以一直为单数)

示意图如下所示(简化版的GRU单元):

这里写图片描述

在上图中,很容易看到, x < t > , C < t 1 > = a < t 1 > 作为输入(一般而言会初始化为0向量),通过 tanh 激活函数得到 C ~ < t > , 通过 sigmoid 激活函数得到 Γ u (0 或 1), 最后通过 C < t > = Γ u C ~ < t > + ( 1 Γ u ) C < t 1 > (黑框) 得到 C < t > = a < t > 。 最后添加一个门的相关性,如下所示:

这里写图片描述

十. 长短期记忆(LSTM)

对于上面提到的 GRU,更加强大的有 LSTM,其具有三个门, 在LSTM里,不再跟上面一样具有 C < t > = a < t > 的性质。

C ~ < t > = t a n h ( w c [ a < t 1 > , x t ] + b c )
Γ u = σ ( w a [ a < t 1 > , x t ] + b u ) (更新门)
Γ f = σ ( w f [ a < t 1 > , x t ] + b f ) (遗忘门)
Γ o = σ ( w o [ a < t 1 > , x t ] + b o ) (输出门)
C < t > = Γ u C ~ < t > + Γ f C < t 1 >
a < t > = Γ o t a n h C < t >

这里写图片描述

正如下图横线所示,只要正确设置了更新门和遗忘门,LSTM 是很容易把 c 0 一直传递下去的。其中值得指出的是,门值 Γ o 不仅仅取决于 a < t 1 > , x < t > 参数, 也可以取决于上一个记忆细胞的值,即 Γ o = σ ( w o [ a < t 1 > , x t ] + b o ) 也可以写成 Γ o = σ ( w o [ a < t 1 > , x t , C < t 1 > ] + b o ) , 然后通过窥视孔连接(peephole connection)可以达到改变三个门的值。

但是必须清楚的是:第 50 个 C < t > 只能影响第50个元素,第100个 C < t > 只会影响第100个元素(这里的元素指的是门的值)

这里写图片描述

十一. 双向神经网络

对于句子:

He said, “Teddy bears are on sale!”
He said, “Teddy Roosevelt was a great President!”

对这俩个句子, 当我们只看前三个单词的时候,并不能清楚的知道 “Teddy” 是人还是泰迪熊,这就需要双向传播了。

双向 RNN 的双向传播的基本原理:
1. (蓝色框框) a < 1 > , a < 2 > , a < 3 > , a < 4 > 来代表前向的循环单元,这里可以用 LSTM 或者 GRU 都可以。

2.(绿色框框) a < 1 > , a < 2 > , a < 3 > , a < 4 > 来代表反向的循环单元,同样的可以用LSTM 和 GRU来表示。

给定一个输入序列, X 1 X 4 , 这个序列首先计算前向的 a < 1 > , 然后计算前向的 a < 2 > , 然后是 a < 3 > , a < 4 > , 而反向序列,则是从计算 a < 4 > 开始的,然后到达 a < 1 > 。(这里值得注意的是,虽然是反向的,但是计算的激活值还是前向的,即训练出来的参数还是为前向传播服务的,即前向传播一部分是从左到右,一部分又是从右到左的)

则公式为 y ^ = g ( w a [ a < t > , a < t > ] + b a )

这里写图片描述

十二. 深层循环神经网络

对于深层循环神经网络,其实就是在每一个时间段的输出对其进行另一个神经网络的叠加。 值得注意的是,每一层的神经网络参数 w a , b a w y , b y 在每一个时间节点都是共享同样的参数的。

这里写图片描述

对于参数 a [ 2 ] < 3 > 而言 ,其输入参数来自于bottom 和 left,其表达式可写为:

a [ 2 ] < 3 > = g ( w a [ 2 ] [ a [ 2 ] < 2 > , a [ 1 ] < 3 > ] + b a [ 2 ] )

猜你喜欢

转载自blog.csdn.net/hansry/article/details/79450955