zoukankan      html  css  js  c++  java
  • 吴恩达深度学习课程笔记-15

    05. 序列模型

    第三周 序列模型和注意力机制

    3.1 基础模型

    seq2seq模型:(编码器 + 解码器)

    Image captioning模型: (AlexNet + 解码器)

    虽然简单粗暴,但是确实有效。

    3.2 选择最可能的句子

    前面讲的语言模型可以给出文本的分布( P(y^{<1>}, dots, y^{<T_y>}) ),而机器翻译模型相当于给出条件概率分布(  P(y^{<1>}, dots, y^{<T_y>} | x^{<1>}, dots, x^{<T_x>}) ). 所以机器翻译的这种模型也称作条件语言模型(conditional language model)。

    从条件概率分布得到最后的翻译结果时又存在一个问题,理论上的优化问题:

    ( argmax_{y^{<1>}, dots, y^{<T_y>}} P(y^{<1>}, dots, y^{<T_y>}|x) )

    假如词典有10000词,文本长10词,共有(10000^{10})种结果,注意在生成翻译结果的时候是一个词一个词的确定,因为前一个时间步的输出要作为下一个时间步的输入,所以这个问题解的搜索空间非常大。不同的翻译结果正确的程度不一样,例如:

    你可能觉得只要按照贪婪算法每个词选择概率最大的就好,但这种做法是把各个词看作独立,所以贪婪算法并不是最优。

    3.3 & 3.4 & 3.5 波束搜索

    解决前面说的这一问题,可以采用波束搜索(beam search)。

    波束搜索的想法是(假设波束宽度( B)):

    1. 从输出的第一个时间步开始,softmax输出10000词的概率分布,我们保留概率最高的(B)个词以及对应的概率( P(y^{<1>}|x) );
    2. 将第一步的(B)个词分别输入到下个时间步,总共得到30000种可能以及对应的概率( P(y^{<2>}|x,y^{<1>}) ),计算( P(y^{<1>},y^{<2>}|x) = P(y^{<1>}|x)P(y^{<2>}|x,y^{<1>}) ),同样保存其中最大的(B)个词以及对应的概率;
    3. 输入下一个时间步并以此类推……

    这样每一步都保留{B}个词,所以要保留(B)个模型的副本。如果波束宽度(B=1),就等价于贪婪算法进行搜索。

    对波束搜索做一些改进:

    原来目标是

    ( egin{gathered} argmax_y prod_{t=1}^{T_y}P(y^{<t>} | x, y^{<1>}, dots, y^{<t-1>}) end{gathered} )

    当文本很长时,一个问题是概率值会非常小,有可能会溢出,另一个问题是模型可能更倾向于输出较短的结果,所以改进之后的目标是:

    (  egin{gathered} frac{1}{T_y^{alpha}} argmax_y sum_{t=1}^{T_y}log P(y^{<t>} | x, y^{<1>}, dots, y^{<t-1>}) end{gathered}  )

    加入了对数运算和归一化,可取(alpha=0.7)作软化处理。

    而波束搜索的波束宽度是一个超参数,(B)越大,结果越好,但速度更慢;(B)越小,速度更快,但结果差一些。

    当机器翻译同时使用RNN和波束搜索时,如果最后结果不好,需要进行误差分析,下面介绍方法来分辨到底是RNN的问题还是波束搜索的问题。

    在开发集(验证集)上找一些表现比较差的例子 (hat{y}),同时我们有人工翻译的结果 (y^{*}),我们利用训练好的模型分别计算(P(y^{*}|x))和( P(hat{y}|x) ),这个多说一下,因为输入这个样本之后,输出的每个时间步都有10000词的概率分布,所以可以计算这两种结果的条件概率。

    • 第一种情况:( P(y^{*}|x) > P(hat{y}|x) ),波束搜索有问题,可以适当增大(B);
    • 第二种情况:(  P(y^{*}|x) le P(hat{y}|x) ),RNN有问题;

    因为波束搜索的目标就是( argmax_y P(y|x) ),如果搜索结果不满足,那一定是波束搜索的问题,而如果是第二种情况,人工翻译的结果在模型看来概率更低,那一定是模型的问题。下面就是列表格进行误差统计:

    根据统计的结果来确定是改进波束搜索还是RNN。

    3.6 Bleu 得分

    语音识别可以用准确率来度量结果的好坏,而机器翻译可能有很多结果都是正确的,所以需要一个新的单一实数指标来度量。

    这个Bleu还挺复杂的,我不太感兴趣,直接放这里吧。

    将文本拆成一元词组、二元词组等等,然后统计其机器翻译结果中的频次和在人工翻译结果中的频次,计算公式(假设取到四元词组):

    ( egin{gathered} p_n = frac{sum_{ngramin hat{y}} count_{clip}(ngram) } { sum_{ngramin hat{y}} count(ngram) } end{gathered} )

    ( egin{gathered} ext{Bleu score} = ext{BP} exp{frac{1}{4} sum_{n=1}^4 P_n} end{gathered} )

    其中BP是惩罚较短翻译结果的因子:

    以二元词组为例

    3.7 & 3.8 注意力机制

    还是机器翻译问题,我们继续从人类的工作方式寻求启发。像前面那种编码器-解码器结构虽然看起来不错了,机器翻译对于长文本的翻译表现还是不行,如下图的蓝线,那咋办呢?注意力机制来了,加了注意力机制之后就是绿线了。

    直观理解上,我们人类翻译时不是看完全部文本之后,记住所有内容再翻译,而是选择那些有帮助的上下文边看边翻译。注意力机制就是要学习一个权重,用它来衡量翻译当前词时,其他词的作用。

     

    如上图,我们使用双向RNN,计算正向和反向的激活值( overrightarrow{a}^{<t'>}, overrightarrow{a}^{<t'>} )。在翻译第一个词时,要综合多个时间步的激活值计算:

    ( egin{gathered} c^{<1>} = sum_{t'} alpha^{<1,t'>}a^{<t'>} end{gathered} )

    其中(alpha^{<1,t'>})就表示翻译第一个词时应当对第(t')个词施加的注意力,注意力总和为1.

    然后翻译第二个词也类似:

    注意力的计算公式为:

    ( egin{gathered} alpha^{<t,t'>} = frac{exp(e^{<t,t'>})}{sum_{t'=1}^{T_x} exp(e^{<t,t'>})} end{gathered} )

    其中( e^{<t,t'>} )不是指数,而是一个中间量,使用神经网络预测,同时使用softmax确保总和为1.

    3.9 & 3.10 语音识别和触发字检测

     没什么好讲的,只是两种应用,以后你都会的。

  • 相关阅读:
    3.0.35 platform 设备资源和数据
    老子《道德经》第六十三章
    linux spi 主机与外设分离思想
    3.0.35 platform 总线、设备与驱动
    Linux 内核SPI子系统架构
    C 显示一个字符的编码值
    JAVA高级特性--内部类
    Java面向对象----接口概念
    Java面向对象----抽象类
    Java面向对象----多态概念,对象上下转型
  • 原文地址:https://www.cnblogs.com/tofengz/p/12266099.html
Copyright © 2011-2022 走看看