序列模型与注意力机制

很久以前看吴恩达老师的视频和西瓜书时用jupyter写的,今天想起来就把它转到这里,真的挺方便

基础模型:Sequence to sequence(序列)模型在机器翻译和语音识别方面都有着广泛的应用。

机器翻译:使用“编码网络(encoder network)”+“解码网络(decoder network)”两个RNN模型组合的形式来解决。encoder network将输入语句编码为一个特征向量,传递给decoder network,完成翻译。

from IPython.display import Image
libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "19.png", width=600, height=100)

序列模型与注意力机制_第1张图片

encoder vector代表了输入语句的编码特征。encoder network和decoder network都是RNN模型,可使用GRU或LSTM单元。

这种模型也可以应用到图像捕捉领域。图像捕捉,即捕捉图像中主体动作和行为,描述图像内容。

首先,可以将图片输入到CNN,例如使用预训练好的AlexNet,删去最后的softmax层,保留至最后的全连接层。则该全连接层就构成了一个图片的特征向量(编码向量),表征了图片特征信息。然后,将encoder vector输入至RNN,即decoder network中,进行解码翻译。

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "20.png", width=600, height=100)

序列模型与注意力机制_第2张图片
Sequence to sequence machine translation模型与我们第一节课介绍的language模型有一些相似,但也存在不同之处。二者模型结构如下所示:

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "21.png", width=600, height=100)

序列模型与注意力机制_第3张图片

Language model是自动生成一条完整语句,语句是随机的。而machine translation model是根据输入语句,进行翻译,生成另外一条完整语句。decoder network与language model是相似的,encoder network可以看成是language model的 a < 0 > a^{<0>} a<0>.
也就是说,machine translation model是加了条件的Language model。

所以,machine translation的目标就是根据输入语句,作为条件,找到最佳翻译语句,使其概率最大:

m a x P ( y < 1 > , y < 2 > , ⋯ , y < T y > ∣ x < 1 > , x < 2 > , ⋯ , x < T x > ) max P(y^{<1>},y^{<2>},⋯,y^{}|x^{<1>},x^{<2>},⋯,x^{}) maxP(y<1>,y<2>,,y<Ty>x<1>,x<2>,,x<Tx>)

优化目标是让正确翻译对应的$ P(y{<1>},y{<2>},⋯,y{}|x{<1>},x{<2>},⋯,x{})$ 最大。

优化方法:贪婪搜索:Greedy search根据条件,每次只寻找一个最佳单词作为翻译输出,力求把每个单词都翻译准确。缺点:每次只搜索一个单词,没有考虑该单词前后关系;运算成本较大。

Beam Search(定向搜索):优化了贪婪搜索,每次找出预测概率最大的B个单词。B为超参数。

B=1时,Beam Search就是贪婪搜索。

1.从词汇表中找出翻译的第一个单词概率最大的B个预测单词。
概率表示为: P ( y ^ < 1 > ∣ x ) P(\hat y^{<1>}|x) P(y^<1>x)

2.再以这B个单词为初始条件( a ( 0 ) a^{(0)} a(0))计算第二个单词的概率,选出B个预测值。
联合概率表示为: P ( y ^ < 2 > ∣ x , y ^ < 1 > ) P(\hat y^{<2>}|x,\hat y^{<1>}) P(y^<2>x,y^<1>)

3.以开始的B个单词结合了B个预测值之后 为初始条件,继续进行
联合概率表示为: P ( y ^ < 3 > ∣ x , y ^ < 1 > , y ^ < 2 > ) P(\hat y^{<3>}|x,\hat y^{<1>},\hat y^{<2>}) P(y^<3>x,y^<1>,y^<2>)

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "22.png", width=600, height=100)
#beam search就是对以下概率对最大化
#符号是乘积运算

在这里插入图片描述

beam search的改进:

长度归一化:以上式子中每一项p都是小于1的,假设要预测的序列很长,那么就会有很多P相乘,会得到很小很小的数字,导致电脑的浮点不能精确得储存。所以将上述式子变成log形式求和的模式。

a r g m a x ∑ t = 1 T y P ( y ^ < t > ∣ x , y ^ < 1 > , ⋯ , y ^ < t − 1 > ) arg max∑_{t=1}^{T_y}P(\hat y^{}|x,\hat y^{<1>},⋯,\hat y^{}) argmaxt=1TyP(y^<t>x,y^<1>,,y^<t1>)

当序列很长的时候,每一项的概率值很小,那么log之后就为负,所有log项相加就会越来越负,使得模型更倾向于输出较短的句子。
解决方法:上面那个句子除以句子长度,实现长度归一化。

a r g m a x 1 T y ∑ t = 1 T y P ( y ^ < t > ∣ x , y ^ < 1 > , ⋯ , y ^ < t − 1 > ) arg max \frac 1{T_y}∑_{t=1}^{T_y}P(\hat y^{}|x,\hat y^{<1>},⋯,\hat y^{}) argmaxTy1t=1TyP(y^<t>x,y^<1>,,y^<t1>)

实际应用中,会引入归一化因子α(超参数):

a r g m a x 1 T y α ∑ t = 1 T y P ( y ^ < t > ∣ x , y ^ < 1 > , ⋯ , y ^ < t − 1 > ) arg max \frac 1{T_y^α}∑_{t=1}^{T_y}P(\hat y^{}|x,\hat y^{<1>},⋯,\hat y^{}) argmaxTyα1t=1TyP(y^<t>x,y^<1>,,y^<t1>)

若α=1,则完全进行长度归一化;若α=0,则不进行长度归一化。一般令α=0.7.

Error analysis in beam search:首先,为待翻译语句建立人工翻译,记为 y ∗ y^∗ y。在RNN模型上使用beam search算法,得到机器翻译,记为 y ^ \hat y y^

对于一个输入语句,分别计算输出是 y ∗ y^∗ y的概率P( y ∗ y^∗ y|x)和 y ^ \hat y y^的概率P( y ^ \hat y y^|x)。

然后比较大小:

P( y ∗ y^∗ y|x)>P( y ^ \hat y y^|x):Beam search算法有误,可以调试参数B。

P( y ∗ y^∗ y|x) y ^ \hat y y^|x):RNN模型有误,可以增加网络层数,使用正则化,增加训练样本数目等方法来优化。

对机器翻译进行打分。以人工翻译为标准,观察机器翻译与人工翻译的符合度进行打分。

1.机器翻译的单词出现在人工翻译中的总次数除以机器翻译单词数目。

2.bleu score:1中是对一个单词进行操作,现在同时对两个连续单词进行打分。机器翻译中连续的2个单词出现在机器翻译中的次数之和除以机器翻译中连续的2个单词出现在人工翻译中的总次数。

对于机器翻译语句过短而造成的得分“虚高”的情况,引入参数因子brevity penalty,记为BP。

注意力模型:因为单纯的encoder-decoder RNN对较长语句的把握较差,因为encoder阶段要记住整句输入再传递给decoder进行翻译,于是提出“注意力机制”。

对待长语句,正确的翻译方法是将长语句分段,每次只对长语句的一部分进行翻译。即局部聚焦.

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "23.png", width=600, height=100)
#注意力模型

序列模型与注意力机制_第4张图片

attention model仍由类似的编码网络(下)和解码网络(上)构成。其中,S由原语句附近单元共同决定,原则上说,离得越近,注意力权重(attention weights)越大,相当于在你当前的注意力区域有个滑动窗。

注意力模型:采用双向RNN,每个a表示:

a < t ′ > = ( a → < t ′ > , a ← < t ′ > ) a^{}=(a^{→},a^{←}) a<t>=(a<t>,a<t>)

RNN编码生成特征,注意力权重用α表示,C是各个RNN神经元经过注意力权重得到的参数值。

例如, α < 1 , t ′ > α^{<1,t′>} α<1,t>表示机器翻译的第一个单词“jane”对应的第t’个RNN神经元对应的注意力权重, C < 1 > C^{<1>} C<1>表示机器翻译第一个单词“jane”对应的解码网络输入参数。满足:

∑ t ′ α < 1 , t ′ > = 1 ∑_{t′}α^{<1,t′>}=1 tα<1,t>=1

C < 1 > = ∑ t ′ α < 1 , t ′ > ⋅ a < t ′ > C^{<1>}=∑_{t′}α^{<1,t′>}⋅a^{} C<1>=tα<1,t>a<t>
也就是说, α < t , t ′ > α^{} α<t,t>表示输出 y ^ < t > \hat y^{} y^<t>对RNN单元 a < t ′ > a^{} a<t>的注意力权重因子。

为了让 α < t , t ′ > α^{} α<t,t>之和为1,利用softamx思想,引入参数 e < t , t ′ > e^{} e<t,t>,使得:

α < t , t ′ > = e < t , t ′ > ∑ t ′ T x e < t , t ′ > α^{}=\frac {e^{}}{∑^{Tx}_{t′}e^{}} α<t,t>=tTxe<t,t>e<t,t>

e < t , t ′ > e^{} e<t,t>:建立一个简单的神经网络,如下图所示。输入是 S < t − 1 > 和 a < t ′ > , 输 出 是 e < t , t ′ > S^{}和a^{},输出是e^{} S<t1>a<t>,e<t,t>

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "24.png", width=600, height=100)

序列模型与注意力机制_第5张图片
Attention model的一个缺点是其计算量较大,若输入句子长度为Tx,输出句子长度为Ty,则计算时间约为Tx∗Ty。但是,其性能提升很多,计算量大一些也是可以接受的。

Attention model还能有效处理很多机器翻译问题。

Speech recognition:语音识别的输入是声音,量化成时间序列。更一般地,可以把信号转化为频域信号,即声谱图(spectrogram),再进入RNN模型进行语音识别。

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "25.png", width=500, height=100)

序列模型与注意力机制_第6张图片

CTC模型(Connectionist temporal classification)

语音识别的注意力模型(attention model):语音识别的输入时间序列都比较长,而翻译的语句通常很短,Tx与Ty差别很大。为了让Tx=Ty,可以把输出相应字符重复并加入空白(下划线”_“)。

没有被空白符”_“分割的重复字符将被折叠到一起,即表示一个字符。通过这样,使得Tx=Ty。

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "26.png", width=500, height=100)

序列模型与注意力机制_第7张图片

触发字检测:使用RNN模型来建立,RNN检测到触发字后输出1,非触发字输出0。

模型缺点:触发字较非触发字数目少得多,即正负样本分布不均。一种解决办法是在出现一个触发字时,将其附近的RNN都输出1。

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "27.png", width=500, height=100)

序列模型与注意力机制_第8张图片

libo="C:/Users/libo/Desktop/machine learning/序列模型/图片/"
Image(filename = libo + "28.png", width=500, height=100)

序列模型与注意力机制_第9张图片

你可能感兴趣的:(序列模型,注意力机制,深度学习)