序列模型——循环序列模型 (理论部分)
一. 序列模型常用领域如下:Speech recognition(语音识别)Music generation (音乐生成):In this cases,only the Y is a sequence, and X can be a single integer or the empty set. YSentiment classification (情感分析):X is a ...
##一. 序列模型常用领域如下:##
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^{<1>}X<1> … X<t>X^{<t>}X<t> … X<9>X^{<9>}X<9> )
其中 X<t>X^{<t>}X<t> 代表X序列的第 t 个单词的索引,TxT_xTx 代表序列X(输入)的长度
Y: Y<1>Y^{<1>}Y<1> … Y<t>Y^{<t>}Y<t> … Y<9>Y^{<9>}Y<9> 代表每个输入序列对应的输出的索引,TyT_yTy 代表序列Y(输出)的长度
而 X(i)<t>X^{(i)<t>}X(i)<t> 代表第 i 个样本的第 t 个单词, Tx(i)T^{(i)}_{x}Tx(i) 代表第 i 个样本的序列长度, 依次类推可得出 Y(i)<t>Y^{(i)<t>}Y(i)<t> 和 Ty(i)T^{(i)}_{y}Ty(i) 的含义。
在这个例子中 TyT_yTy = TxT_xTx = 9
三. 循环卷积网络模型
对于时间序列而言,传统的神经网络有俩大不足的地方:
- Inputs, outputs can be different lengths in different examples (在不同的例子中拥有不同的输入和输出),尽管可以填充使其输入和输出达到最大值,但似乎不是很好的方法。
- Doesn’t share features learned across different positions of text. (在序列的不同地方不能够共享学到的特征)
对于命名实体识别而言,若使用单向循环卷积网络,那么只能对于诸如 “ He said, ‘Teddy Roosevelt was a great President.’ " 对于判断Teddy是否为人名来说,单纯使用如下循环卷积网络,则判断 “Teddy” 时,只是简单的用到了 “He said,”.
对于正向传播来说,我们应该有以下公式:
$ a^{} = g_{1} ( W_{a} [a^{}, x^{}] + b_{a}) $ … (我在想这里的 $ [a^{}, x^{}]$ 是不是应该是 $ [a^{}, x{<t>}]{T}$ )
y^<t>=g2(Wya<t>+by)\hat{y}^{<t>} = g_{2} (W_{y} a^{<t>} + b_{y})y^<t>=g2(Wya<t>+by)
其中,g1g_{1}g1 和 g2g_{2}g2 分别代表 非线性激活函数, g1g_{1}g1 一般为 tanh 或者 relu 函数,g2g_{2}g2 一般为 Sigmoid 或者 Softmax 函数
四.通过时间序列的反向传播
对于正向传播而言,其流程如下图所示, 得到 $a^{<0>} \bigoplus x^{<1>} = a^{<1>} ; a^{<1>} \bigoplus a^{<2>} = a^{2} ; … ; a^{t-1} \bigoplus x^{t} = a^{t} $ 和 $ a^{<1>} -> \hat{y}^{<1>}; a^{<2>} -> \hat{y}^{<2>}; … ; a^{} -> \hat{y}^{}$
其中这里需要注意的是从 $ 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>X^{<1>}X<1> 是一个单词,那么 yty^{t}yt 是这个而单词的概率为1,而y^<t>\hat{y}^{<t>}y^<t> 是这个神经网络的输出,概率可能为1,那么代价函数可以定义为 “标准Logistic回归损失函数”“标准 Logistic 回归损失函数”“标准Logistic回归损失函数”,也叫作交叉熵损失函数,即如下所示:
L<t>(y^<t>,y<t>)=−y<t>log(y<t>)−(1−y<t>)log(1−y<t>)L^{<t>}(\hat {y}^{<t>}, y^{<t>}) = -y^{<t>} log (y^{<t>}) - (1-y^{<t>} )log (1- y^{<t>})L<t>(y^<t>,y<t>)=−y<t>log(y<t>)−(1−y<t>)log(1−y<t>), 这个是对于时间 t 的时候的损失函数
对于整个时间序列,则有损失函数:
L(y^,y)=∑t=1T−y<t>log(y<t>)−(1−y<t>)log(1−y<t>)L (\hat {y}, y) = \sum_{t=1}^{T}-y^{<t>} log (y^{<t>}) - (1-y^{<t>} )log (1- y^{<t>})L(y^,y)=∑t=1T−y<t>log(y<t>)−(1−y<t>)log(1−y<t>)
然后通过代价函数和梯度下降进行参数的学习,如下图所示,红色箭头代表 反向传播,绿色箭头代表正向传播。
五. 不同类型的循环神经网络
Many - to -many:
当 Tx(多个)T_{x} (多个)Tx(多个) 和 Ty(多个)T_{y} (多个)Ty(多个) 是一致的时候,我们称这个网络为 多对一 网络。例如英文翻译成中文的例子:
当 TxT_{x}Tx 和 TyT_{y}Ty 长度不一致的时候,以 法语 跟 英语 之间翻译转换而言,我们可知其输入跟输出是不一样的,这就需要新的网络如下:
Many - to - one:
当 Tx(多个)T_{x} (多个)Tx(多个) 和 Ty(1)T_{y} (1)Ty(1) 的时候,我们称这个网络为 多对一网络。 例如通过电影评价来给电影评星的情况:
One - to - many:
当 $T_{x} (1) $ 和 Ty(多个)T_{y} (多个)Ty(多个) 的时候,我们称这个网络为 一对多网络。 例如通过一个音符或者一个数字来生成一段音乐:
当生成序列的时候,通常会把第一个合成的输出,也 feed 给下一层,所以实际上的网络结构如下图所示:
六. 语言模型和序列生成
为了建立 RNN 这样的模型,首先需要一个训练集,包含一个很大的英文文本语料库(word corpus), word corpus是自然语言 NLP 的一个专有名词。
对于句子 Cats ( y<1>y^{<1>}y<1>) average(y<2>y^{<2>}y<2>) 15(y<2>y^{<2>}y<2>) hours(y<3>y^{<3>}y<3>) of(y<4>y^{<4>}y<4>) sleep(y<5>y^{<5>}y<5>) a(y<6>y^{<6>}y<6>) day(y<7>y^{<7>}y<7>)
这里的 y<1>y^{<1>}y<1>, y<2>y^{<2>}y<2> 都是一个one-hot向量,即该词在word corpus中所占的索引。 同时还要定义句子是否结束了,那么可以用 EOS 来作为句子的结尾标记。
预测的步骤:
A.当我们要预测这个句子的时候,我们第一个输出初始化为 x<1>=0^x^{<1>} = \hat{0}x<1>=0^ 向量,同时 $ a^{<0>} = \hat{0}$向量,然后得到 a1a^{1}a1 经过 SoftmaxSoftmaxSoftmax 函数可以得到第一词,所以 y^<1>\hat{y}^{<1>}y^<1> 只是为了预测第一个词的概率。
B.在下一个时间步中,我们要把之前预测的第一个单词的概率 x<2>=y<1>x^{<2>} = y^{<1>}x<2>=y<1>, 作为输出算出 a<2>a^{<2>}a<2>, 然后最后得到 y^<2>\hat{y}^{<2>}y^<2>, 其中 y^<2>\hat{y}^{<2>}y^<2> 是第二个词的概率,即 P(average∣Cats)P(average | Cats)P(average∣Cats).
C.然后 y^<2>\hat{y}^{<2>}y^<2> 是第三个词的概率,则可以得到P(average∣Cats,average)P(average | Cats, average)P(average∣Cats,average)
对于整个句子的概率,我们有 P(y<1>,y<2>,y<3>)=P(y<1>)P(y<2>∣y<1>)P(y<3>∣y<1>,y<2>)P(y^{<1>}, y^{<2>}, y^{<3>} ) = P(y^{<1>})P(y^{<2>} | y^{<1>}) P(y^{<3>}|y^{<1>},y^{<2>})P(y<1>,y<2>,y<3>)=P(y<1>)P(y<2>∣y<1>)P(y<3>∣y<1>,y<2>)
七. 对新序列采样
在训练一个序列模型后,要想了解这个模型学了什么,可以对RNN进行一次新序列的采样。
八. 带有神经网络的梯度消失
对于在自然语言处理中,可能会经常处理以下文本:
- The cat, … (中间20个词), was full.
- The cats, … (中间20个词), were full.
对于上面说讲到的RNN 结构,并不会有长期的记忆功能,即第一句 was 很难 从 cat 学到是单数, 而第二句 were 很难从 cats 学到是否是复数,因为中间相差了大概有 几十个词,而普通的RNN并不具备长期记忆功能。
同时,对于梯度消失而言,当网络很深的时候,在进行反向传播的时候,可能会遇到梯度消失的时候。
九. GRU 单元(Gated Recurrent Unit)##
对于门控单元,我们令 C 抽象为记忆单元,那么我们有 C = memory cell
1.C<t>=a<t>1. C^{<t>} = a^{<t>}1.C<t>=a<t>
2.C~<t>=tanh(Wc[c<t−1>,xt]+bc)2. \widetilde{C}^{<t>} = tanh( W_{c} [c^{<t-1>}, x^{t}] + b_{c})2.C <t>=tanh(Wc[c<t−1>,xt]+bc) (候选的抽象记忆单元,等待更新)
3.Γu(u为update的意思)=σ(Wu[c<t−1>,xt]+bu)3. \Gamma{u} (u为update的意思) = \sigma( W_{u} [c^{<t-1>}, x^{t}] + b_{u})3.Γu(u为update的意思)=σ(Wu[c<t−1>,xt]+bu) (这一步是GRU真正的思想,有个门,0或者1,使用了sigmoid 参数)
$4. {C}^{} = \Gamma{u} * \widetilde{C}^{} + (1- \Gamma{u})*C^{} $ (如果 Γu=1\Gamma{u}=1Γu=1 的话,意味着要更新,如果 Γu=0\Gamma{u}=0Γu=0 的话,意味着不更新)
举个例子: 当句子为 The cat, which already ate … ,was full.
当在cat的时候,c<t>=1(代表单数),Γu=1c^{<t>} = 1(代表单数), \Gamma{u}=1c<t>=1(代表单数),Γu=1, 在这个时候更新, 但是当到cat 后面的单词…, Γ=0\Gamma =0Γ=0(没有更新),这时候 $c^{}=1 $(因为没有更新,所以一直为单数)
示意图如下所示(简化版的GRU单元):
在上图中,很容易看到,x<t>x^{<t>}x<t>, C<t−1>=a<t−1>C^{<t-1>} = a^{<t-1>}C<t−1>=a<t−1> 作为输入(一般而言会初始化为0向量),通过 tanh 激活函数得到 C~<t>\widetilde{C}^{<t>}C <t>, 通过 sigmoid 激活函数得到 Γu\Gamma{u}Γu (0 或 1), 最后通过 C<t>=Γu∗C~<t>+(1−Γu)∗C<t−1>{C}^{<t>} = \Gamma{u} * \widetilde{C}^{<t>} + (1- \Gamma{u})*C^{<t-1>}C<t>=Γu∗C <t>+(1−Γu)∗C<t−1>(黑框) 得到 C<t>=a<t>C^{<t>}=a^{<t>}C<t>=a<t>。 最后添加一个门的相关性,如下所示:
十. 长短期记忆(LSTM)
对于上面提到的 GRU,更加强大的有 LSTM,其具有三个门, 在LSTM里,不再跟上面一样具有 C<t>=a<t>C^{<t>}=a^{<t>}C<t>=a<t> 的性质。
C~<t>=tanh(wc[a<t−1>,xt]+bc)\widetilde{C}^{<t>}= tanh(w_{c} [a^{<t-1>}, x^{t}]+b_{c})C
<t>=tanh(wc[a<t−1>,xt]+bc)
Γu=σ(wa[a<t−1>,xt]+bu)\Gamma{u}=\sigma(w_{a}[a^{<t-1>},x^{t}]+b_{u})Γu=σ(wa[a<t−1>,xt]+bu) (更新门)
Γf=σ(wf[a<t−1>,xt]+bf)\Gamma{f}=\sigma(w_{f}[a^{<t-1>},x^{t}]+b_{f})Γf=σ(wf[a<t−1>,xt]+bf) (遗忘门)
Γo=σ(wo[a<t−1>,xt]+bo)\Gamma{o}=\sigma(w_{o}[a^{<t-1>},x^{t}]+b_{o})Γo=σ(wo[a<t−1>,xt]+bo) (输出门)
C<t>=Γu∗C~<t>+Γf∗C<t−1>C^{<t>}=\Gamma_{u}*\widetilde{C}^{<t>} + \Gamma_{f}*C^{<t-1>}C<t>=Γu∗C
<t>+Γf∗C<t−1>
$ a^{}=\Gamma_{o} * tanhC^{}$
正如下图横线所示,只要正确设置了更新门和遗忘门,LSTM 是很容易把c0c^{0}c0 一直传递下去的。其中值得指出的是,门值Γo\Gamma_{o}Γo 不仅仅取决于 a<t−1>,x<t>a^{<t-1>},x^{<t>}a<t−1>,x<t> 参数, 也可以取决于上一个记忆细胞的值,即 Γo=σ(wo[a<t−1>,xt]+bo)\Gamma{o}=\sigma(w_{o}[a^{<t-1>},x^{t}]+b_{o})Γo=σ(wo[a<t−1>,xt]+bo) 也可以写成 Γo=σ(wo[a<t−1>,xt,C<t−1>]+bo)\Gamma{o}=\sigma(w_{o}[a^{<t-1>},x^{t}, C^{<t-1>}]+b_{o})Γo=σ(wo[a<t−1>,xt,C<t−1>]+bo), 然后通过窥视孔连接(peephole connection)可以达到改变三个门的值。
但是必须清楚的是:第 50 个 C<t>C^{<t>}C<t> 只能影响第50个元素,第100个 C<t>C^{<t>}C<t> 只会影响第100个元素(这里的元素指的是门的值)
十一. 双向神经网络
对于句子:
He said, “Teddy bears are on sale!”
He said, “Teddy Roosevelt was a great President!”
对这俩个句子, 当我们只看前三个单词的时候,并不能清楚的知道 “Teddy” 是人还是泰迪熊,这就需要双向传播了。
双向 RNN 的双向传播的基本原理:
- (蓝色框框)a→<1>\overrightarrow{a}^{<1>}a<1> ,a→<2>\overrightarrow{a}^{<2>}a<2>,a→<3>\overrightarrow{a}^{<3>}a<3> ,a→<4>\overrightarrow{a}^{<4>}a<4> 来代表前向的循环单元,这里可以用 LSTM 或者 GRU 都可以。
2.(绿色框框)a←<1>\overleftarrow{a}^{<1>}a<1> ,a←<2>\overleftarrow{a}^{<2>}a<2>,a←<3>\overleftarrow{a}^{<3>}a<3> ,a←<4>\overleftarrow{a}^{<4>}a<4> 来代表反向的循环单元,同样的可以用LSTM 和 GRU来表示。
给定一个输入序列, X1X^{1}X1 到 X4X^{4}X4, 这个序列首先计算前向的 a<1>a^{<1>}a<1>, 然后计算前向的a<2>a^{<2>}a<2>, 然后是 a<3>,a<4>a^{<3>}, a^{<4>}a<3>,a<4>, 而反向序列,则是从计算 a<4>a^{<4>}a<4> 开始的,然后到达 a<1>a^{<1>}a<1>。(这里值得注意的是,虽然是反向的,但是计算的激活值还是前向的,即训练出来的参数还是为前向传播服务的,即前向传播一部分是从左到右,一部分又是从右到左的)
则公式为 y^=g(wa[a→<t>,a←<t>]+ba)\hat{y}=g(w_{a}[\overrightarrow{a}^{<t>}, \overleftarrow{a}^{<t>}]+b_{a})y^=g(wa[a<t>,a<t>]+ba)
十二. 深层循环神经网络
对于深层循环神经网络,其实就是在每一个时间段的输出对其进行另一个神经网络的叠加。 值得注意的是,每一层的神经网络参数 wa,baw_{a}, b_{a}wa,ba 和 wy,byw_{y}, b_{y}wy,by 在每一个时间节点都是共享同样的参数的。
对于参数 a[2]<3>a^{[2]<3>}a[2]<3> 而言 ,其输入参数来自于bottom 和 left,其表达式可写为:
$a^{[2]<3>} = g (w^{[2]}{a} [a^{[2]<2>}, a^{[1]<3>}] + b{a}^{[2]}) $
更多推荐
所有评论(0)