吴恩达深度学习笔记-Sequence models & Attention mechanism(第15课)【完结篇】

发布于:2023-01-08 ⋅ 阅读:(467) ⋅ 点赞:(0)

参考博文

一、Basic Models

序列模型在机器翻译和语言识别方面都有广泛的应用。

下面给出一个机器翻译的例子:

想将法语 x < 1 > … x < 5 > x^{<1>…}x^{<5>} x<1>x<5>,翻译为英语 y < 1 > … y < 6 > y^{<1>…}y^{<6>} y<1>y<6>
在这里插入图片描述

这个问题可以使用“编码网络”(encoder network)+“解码网络”(decoder network)两个RNN模型组合形式解决。

如下图,编码网络(前半部分)先将待翻译语句转换为一个特征向量(绿色框部分),解码网络(后半部分)再将编码向量转换为目标翻译。

在这里插入图片描述

【解码网络网络类似文本生成的RNN网络,当前输出作为下一节点输入】

类似的模型也可以应用到图像捕捉邻域。比如:输入下面这张图片,输出A cat sitting on a chair
在这里插入图片描述
先使用去掉softmax输出层的AlexNet CNN神经网络将输入图片转换成 4096 × 1 4096 \times 1 4096×1的特征向量;再将特征向量输入到序列模型中去输出相应的语句。如下图:

在这里插入图片描述

基本思路是:
先用特定模型转换成特征向量,再将特征向量作为序列模型的输入,获得文本输出。

二、选择最可能的句子

回想之前的语言模型,结构如下图所示,要做的工作就是找到一句话的概率,即
P ( y < 1 > … , y < T y > ) P(y^{<1>}…,y^{<T_y>}) P(y<1>,y<Ty>)
在这里插入图片描述
语言模型同时也能够生成新的一句话,我们将它当作机器翻译中的解码网络,结构如下图所示:

在这里插入图片描述

解码网络(紫色部分)的 a < 0 > a^{<0>} a<0>不再是输入0向量了,而是编码网络输出的特征向量;所以编码网络可以看作解码网络的 a < 0 > a^{<0>} a<0>,是模型的一个条件。因此,machine translation可以看成是有条件的语言模型。

y < 1 > y^{<1>} y<1>输出可以看作 P ( y < 1 > ∣ x ) P(y^{<1>}|x) P(y<1>x),不再是之前任意一个单词的概率了。同理, y < 2 > y^{<2>} y<2>输出可以看作 P ( y < 2 > ∣ y < 1 > , x ) P(y^{<2>}|y^{<1>},x) P(y<2>y<1>,x);以此类推。【这里的 x x x表示 x < 1 > , ⋯ , x < T x > x^{<1>},⋯,x^{<Tx>} x<1>,,x<Tx>

但是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^{<Ty>}|x^{<1>},x^{<2>},⋯,x^{<Tx>}) max P(y<1>,y<2>,,y<Ty>x<1>,x<2>,,x<Tx>)

如何选择单词使上面的概率最大化呢?比较直接的方式就是贪心算法,每次选取概率最大的单词;

但是贪心算法存在一些缺点:因为每次只搜索一个单词,没有考虑该单词前后关系,概率选择上有可能会出错。即当前局部最优解并非一定是全局最优解。

所以贪心算法不是最佳方法。

三、Beam Search

Beam Search可以设置一个窗口参数 B B B,表示一次搜索找到 B B B个概率最大的句子。

Beam Search步骤:

  • Step 1:
    B B B=3,从 y ^ < 1 > \hat{y}^{<1>} y^<1>中选取 B B B个概率最大的单词:
    在这里插入图片描述
    假设这3个单词是in、jane和September,这时候可以得到3个概率值 P ( y < 1 > ∣ x ) P(y^{<1>}|x) P(y<1>x)。将这三个单词作为下一个时间步的输入,去预测第二个单词,如下图:
    在这里插入图片描述

  • Step 2:
    对于第二个单词,选取使 P ( y ^ < 1 > , y ^ < 2 > ∣ x ) P(\hat{y}^{<1>},\hat{y}^{<2>}|x) P(y^<1>,y^<2>x)最大的单词。目前有的概率信息是:第一个时间步输出 P ( y ^ < 1 > ∣ x ) P(\hat{y}^{<1>}|x) P(y^<1>x)和第二个时间步输出 P ( y ^ < 2 > ∣ x , y ^ < 1 > ) P(\hat{y}^{<2>}|x,\hat{y}^{<1>}) P(y^<2>x,y^<1>),利用下面的概率公式计算 P ( y ^ < 1 > , y ^ < 2 > ∣ x ) P(\hat{y}^{<1>},\hat{y}^{<2>}|x) P(y^<1>,y^<2>x)
    P ( y ^ < 1 > , y ^ < 2 > ∣ x ) = P ( y ^ < 1 > ∣ x ) ⋅ P ( y ^ < 2 > ∣ x , y ^ < 1 > ) P(\hat{y}^{<1>},\hat{y}^{<2>}|x)=P(\hat{y}^{<1>}|x)\cdot P(\hat{y}^{<2>}|x,\hat{y}^{<1>}) P(y^<1>,y^<2>x)=P(y^<1>x)P(y^<2>x,y^<1>)
    假设词汇表有10k个单词,对于 B B B y < 1 > y^{<1>} y<1>,使用三个RNN模型副本计算出3x10k个 P ( y ^ < 1 > , y ^ < 2 > ∣ x ) P(\hat{y}^{<1>},\hat{y}^{<2>}|x) P(y^<1>,y^<2>x)结果,从中选取概率最高的 y < 2 > y^{<2>} y<2>作为下一个时间步的输入。
    在这里插入图片描述

  • Step 3:
    依次类推,同样策略去选取第三个单词。最后三个模型副本分别输出 B B B句话。从中选取概率最大的作为翻译结果即可。

四、改进Beam Search

Beam Search中我们的目标是使下面这个函数最大化:
P ( y < 1 > , … , y < T y > ∣ x ) = P ( y < 1 > ∣ x ) P ( y < 2 > ∣ x , y < 2 > ) … P ( y < T y > ∣ x , y < 1 > , … , y < T y > − 1 ) P(y^{<1>},…,y^{<T_y>}|x)=P(y^{<1>}|x)P(y^{<2>}|x,y^{<2>})…P(y^{<T_y>}|x,y^{<1>},…,y^{<T_y>-1}) P(y<1>,,y<Ty>x)=P(y<1>x)P(y<2>x,y<2>)P(y<Ty>x,y<1>,,y<Ty>1)
P ( y < 1 > ∣ x ) P ( y < 2 > ∣ x , y < 2 > ) … P ( y < T y > ∣ x , y < 1 > , … , y < T y > − 1 ) = ∏ t = 1 T y P ( y ^ < t > ∣ x , y ^ < 1 > , ⋯   , y ^ < t − 1 > ) P(y^{<1>}|x)P(y^{<2>}|x,y^{<2>})…P(y^{<T_y>}|x,y^{<1>},…,y^{<T_y>-1})=\prod_{t=1}^{T_y} P(\hat y^{<t>}|x,\hat y^{<1>},\cdots,\hat y^{<t-1>}) P(y<1>x)P(y<2>x,y<2>)P(y<Ty>x,y<1>,,y<Ty>1)=t=1TyP(y^<t>x,y^<1>,,y^<t1>)

涉及到很多概率相乘,这些概率又是远小于1的数,最后的结果可能会出现数值下溢的问题。

为了解决这个问题,可以将上述式子取对数log;因为取对数运算,将乘积转化为求和形式,避免了数值下溢,使得数据更加稳定有效。上述连乘式子变成了连加:
∑ t = 1 T y l o g P ( y ^ < t > ∣ x , y ^ < 1 > , ⋯   , y ^ < t − 1 > ) \sum_{t=1}^{T_y} logP(\hat y^{<t>}|x,\hat y^{<1>},\cdots,\hat y^{<t-1>}) t=1TylogP(y^<t>x,y^<1>,,y^<t1>)

但是上面这两个式子都会更偏向于更短的句子。如连乘的式子,句子越长,乘积后的概率值就会趋近于0;连加的式子,句子越长,相加后的值就会越趋近于较小的负数。

为了解决这个问题,可以实进行长度归一化:
1 T y ∑ t = 1 T y P ( y ^ < t > ∣ x , y ^ < 1 > , ⋯   , y ^ < t − 1 > ) \frac{1}{T_y}\sum_{t=1}^{T_y} P(\hat y^{<t>}|x,\hat y^{<1>},\cdots,\hat y^{<t-1>}) Ty1t=1TyP(y^<t>x,y^<1>,,y^<t1>)

实际应用中会引入一个归一化因子 α α α:
1 T y α ∑ t = 1 T y P ( y ^ < t > ∣ x , y ^ < 1 > , ⋯   , y ^ < t − 1 > ) \frac{1}{T_y^{\alpha}}\sum_{t=1}^{T_y} P(\hat y^{<t>}|x,\hat y^{<1>},\cdots,\hat y^{<t-1>}) Tyα1t=1TyP(y^<t>x,y^<1>,,y^<t1>)

α α α=1,则完全进行长度归一化;当 α α α=0,不进行归一化。一般设置 α α α=0.7。

参数 B B B的选择也是个问题, B B B过小,运算速度快,预测结果就不会那么好; B B B过大,计算的时间代价就会很大,结果也会更完善。
一般产品中会设置 B B B=10,对于科研来说,想要压榨所有的潜能, B B B可能会被设置为1000甚至更大; B B B越大,性能提升就会越来越少。

五、Beam Search的误差分析

待翻译句子:
Jane visite l’Afrique en septembre.

人工翻译句子 y ∗ y^* y
Jane visits Africa in September.

RNN预测句子 y ^ \hat{y} y^
Jane visited Africa last September.

可以看到 y ^ \hat{y} y^已经更改了原句的意思,为了确定是Beam Search还是RNN网络的问题,我们比较 y ^ \hat{y} y^ y ∗ y^* y在RNN网络中输出的 P ( y ^ ∣ x ) P(\hat{y}|x) P(y^x) P ( y ∗ ∣ x ) P(y^*|x) P(yx)的大小。

  • P ( y ∗ ∣ x ) > P ( y ^ ∣ x ) P(y^*|x)>P(\hat y|x) P(yx)>P(y^x):Beam Search有问题
  • P ( y ∗ ∣ x ) ≤ P ( y ^ ∣ x ) P(y^*|x)≤P(\hat y|x) P(yx)P(y^x):RNN网络有问题

基于上面,我们可以多测试几个预测与人工翻译相差很大的句子,列一个表格,比较Beam Search问题和RNN问题的比例,再决定去花费时间去优化特定方面的问题。像之前的机器学习策略一样,优先改进那些会是模型提升最高的部分。

六、Bleu得分

例如下面的几句话(人工翻译视为基准):
法语:Le chat est sur le tapis.
人工翻译1:The cat is on the mat.
人工翻译2:There is a cat on the mat.

要对机器翻译进行打分,一个想法是判断机器翻译的单词有几个出现在了人工翻译里,出现的越多,得分越高。但是看下面的这个机器翻译:

机器翻译1:the the the the the the the.

按照上面的评分标准:这七个单词都在人工翻译中出现了。那么得分为 7 7 = 1 \frac{7}{7}=1 77=1,显然不正确。

在此基础上进行改良,为机器翻译中的单词都设置一个得分上限;上限取决于这个单词在人工翻译单句中出现的最高次数。

例如:the单词在人工翻译1中出现了2次,人工翻译2中出现了1次,所以上限取较大的2。则机器翻译的得分变为 2 7 \frac{2}{7} 72,这种评价方法较为准确。

按照beam search的思想,另外一种更科学的打分方法是bleu score on bigrams,即同时对两个连续单词进行打分。

还是对上面的句子进行翻译,现在的机器翻译输出为:
机器翻译2:The cat the cat on the mat.

设置2个单词为组进行打分,先拆解机器翻译2:

词组 || 机器翻译中的出现次数( c o u n t count count)
the cat || 2
cat the || 1
cat on || 1
on the || 1
the mat || 1

然后统计各单词得分( c o u n t c l i p count_{clip} countclip)
the cat || 1 (得分上限是1)
cat the || 0
cat on || 1
on the || 1
the mat || 1

最后的bigrams precision为:
p 2 = c o u n t c l i p c o u n t = 1 + 0 + 1 + 1 + 1 2 + 1 + 1 + 1 + 1 = 4 6 = 2 3 p_2=\frac{count_{clip}}{count}=\frac{1+0+1+1+1}{2+1+1+1+1}=\frac46=\frac23 p2=countcountclip=2+1+1+1+11+0+1+1+1=64=32

当看连续n个单词打分,n-grams precision为:
在这里插入图片描述

看不同个数的单词,即取不同的n,计算 p 1 … p n p_1…p_n p1pn,然后取平均:
p = 1 n ∑ i = 1 n p i p=\frac1n\sum_{i=1}^np_i p=n1i=1npi

为了惩罚一些比较短的句子,加上一个惩罚项 B P BP BP(brevity penalty),为了“惩罚”机器翻译语句过短而造成的得分“虚高”的情况。得分p公式变为:
p = B P ⋅ e x p ( 1 n ∑ i = 1 n p i ) p=BP\cdot exp(\frac1n\sum_{i=1}^np_i) p=BPexp(n1i=1npi)

BP取值可以参照下图:
在这里插入图片描述
当机器翻译长度>参考输出翻译是,不进行惩罚;否则乘于一个小于1的数,减少得分。

七、注意力模型直观理解

RNN的编码网络会读整个句子,记忆整个句子,再在感知机中传递句子信息,然后通过解码网络进行整体翻译。

如果待翻译的句子很长或者很短,预测结果的Bleu得分不会很高,如下图:
在这里插入图片描述
对较长句子的翻译,应该像人工翻译那样,每次只对长句子的一部分进行翻译。对于模型来说,就是每次预测只需要注重一部分上下文区域,这种方法使模型在翻译长句子时,bleu得分不会受长度影响。

根据上面的想法,搭建注意力模型(attention model):
在这里插入图片描述

可以看到 S < t > S^{<t>} S<t>感知机的预测与编码网络的附近单元输出有关,为这几个输出分配不同的注意力权重,表示在预测时需要花多少注意力在这些输出上,同时 S < t > S^{<t>} S<t>感知机还会接收 S < t − 1 > S^{<t-1>} S<t1>的预测结果。

S < t > S^{<t>} S<t>的预测输出取决于 a → < t > \overset{→}{a}^{<t>} a<t> a ← < t > \overset{←}{a}^{<t>} a<t>周围几个时间步的输出,还取决于 S < t − 1 > S^{<t-1>} S<t1>的输出。所以当前的翻译即考虑了原件的上下文,还考虑了之前的翻译内容。

八、注意力模型(补充细节)

  • 规定解码器的时间步为 t t t,编码器的时间步为 t ′ t^\prime t
  • 对于编码器的双向RNN, a < t ′ > = ( a → < t ′ > , a ← < t ′ > ) a^{<t'>}=(a^{\rightarrow <t'>},a^{\leftarrow <t'>}) a<t>=(a→<t>,a←<t>)
  • 注意力权重用 α α α表示, α < t , t ′ > α^{<t,t^\prime>} α<t,t>代表预测第 t t t个单词需要花费多少注意力在 a < t ′ > a^{<t'>} a<t>上;即输出 y < t > y^{<t>} y<t>对RNN单元 a < t ′ > a^{<t^′>} a<t>的注意力权重因子。
  • α < t , t ′ > α^{<t,t^\prime>} α<t,t>要满足:
    ∑ t ′ α < 1 , t ′ > = 1 \sum_{t'}\alpha^{<1,t'>}=1 tα<1,t>=1
  • c < t > c^{<t>} c<t>表示预测第 t t t个单词解码网络的输入:
    c < t > = ∑ t ′ α < t , t ′ > ⋅ a < t ′ > c^{<t>}=\sum_{t'}\alpha^{<t,t'>}\cdot a^{<t'>} c<t>=tα<t,t>a<t>
  • 为了使 α < t , t ′ > \alpha^{<t,t'>} α<t,t>和为1,利用softamx思想,引入参数 e < t , t ′ > e^{<t,t'>} e<t,t>
    α < t , t ′ > = e < t , t ′ > ∑ t ′ T x e < t , t ′ > \alpha^{<t,t'>}=\frac{e^{<t,t'>}}{\sum_{t'}^{Tx}e^{<t,t'>}} α<t,t>=tTxe<t,t>e<t,t>
  • 可以利用一个简单的神经网络来计算 e < t , t ′ > e^{<t,t'>} e<t,t>,如下图:
    在这里插入图片描述
    然后,利用梯度下降算法迭代优化,计算得到 e < t , t ′ > e^{<t,t^′>} e<t,t> α < t , t ′ > α^{<t,t^′>} α<t,t>

注意力模型缺点就是计算量比较大,若输入句子长度是 T x T_x Tx,输出句子长度是 T y T_y Ty,那么参数的个数就会是 T x × T y T_x\times T_y Tx×Ty

注意力机制在别的方面也有广泛的应用:

  • 时间格式的转化
    在这里插入图片描述
  • 给图片取标题
  • 比较有趣的是我们可以将注意力权重进行可视化,如下图:
    在这里插入图片描述

九、语音识别

语音识别的输入的输入是声音,可以量化成一个时间序列来表示。更一般地,将音频信号转化为频域信号,即将音频变成一张声谱图(横轴为时间,纵轴为声音的频率),然后作为RNN模型的输入进行语音识别。
在这里插入图片描述

很早之前,语言学家将语言中的单词分解成多个音位(phoneme),构建语言识别系统。但是在end-to-end深度神经网络模型中,这种音位表示法已经不再必要了,而是可以直接构建一个系统,通过向系统中输入原始音频片段,然后就可以直接获得输出的音频文本;但这种end-to-end的方式需要大量的训练样本,上千上万小时的语音素材。【省去了人工操作】

语音识别的注意力模型(attention model)如下图所示:
在这里插入图片描述
语音识别的输入都会很长,输出的识别文本会很短, T x T_x Tx T y T_y Ty差别很大。为了使 T x = T y T_x=T_y Tx=Ty,可以允许连续输出重复的字符并加入空白符,如我们要识别“the quick brown fox”这段语音,RNN预测输入可以如下所示:
t t t _ h _ e e e _ _ _ ⊔ _ _ _ q q q _ _ ⋯ ttt \_ h\_eee\_ \_ \_ \sqcup\_ \_ \_ qqq\_ \_ \cdots ttt_h_eee______qqq__

  • 空白符“_”≠空格符“ ⊔ \sqcup

之后再将空白符“_”之间的单词合并后去掉空白符,如上面的句子合并后得到: t h e ⊔   q ⋯ t he\sqcup\ q \cdots the q

允许空白符和允许连续输出重复字符可以确保输入长度和输出长度一致了,即 T x = T y T_x=T_y Tx=Ty。这种模型被称为CTC(Connectionist temporal classification)。
在这里插入图片描述

十、触发字检测(Trigger Word Detection)

触发字检测(Trigger Word Detection):指的是说出某段语音来触发某个设备的工作,

如:说出“小爱同学”激活小米手机的操作。

触发字检测系统可以使用RNN模型来建立。如下图所示,输入语音中包含一些触发字,其余都是非触发字。RNN检测到触发字后输出1,非触发字输出0。这样训练的RNN模型就能实现触发字检测。

在这里插入图片描述

但是这种方式下0和1的比例相差悬殊,即正负样本不均匀。解决的方法是使触发词附近时间步都输出1,简单粗暴的增加正样本数量,如下图:

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到