zoukankan      html  css  js  c++  java
  • Seq2Seq模型 与 Attention 策略

    Seq2Seq模型

    传统的机器翻译的方法往往是基于单词与短语的统计,以及复杂的语法结构来完成的。基于序列的方式,可以看成两步,分别是 EncoderDecoder,Encoder 阶段就是将输入的单词序列(单词向量)变成上下文向量,然后 decoder根据这个向量来预测翻译的结果。

    encoder 阶段

    encoder 阶段面临的一个问题是,对于输入语句,语句的长度往往是不固定的,但是我们训练神经网络往往都是要固定长度的向量。所以如何解决这个问题是 encoder阶段的关键。我们通常使用多层的 LSTM,上一层的输出将作为下一层的输入。

    在 Google 提出 Seq2Seq 的时候,提出了将输出的语句反序输入到 encoder中,这么做是为了在 encoder阶段的最后一个输出恰好就是 docoder阶段的第一个输入。

    decoder阶段

    这一阶段要稍微与encoder阶段要复杂一点点。首先是一个 Token, 一般是一个 <EOS> 表示输入的结束,也就是下图中的 "Go",表示 decoder 阶段的开始,还有一点不一样就是,我们期望用以及正确预测的数据作为下一次的上下文参考,所以也就是上一节讲到的 (C_i) 的信息,作用到下一个时间点。横向可以看成 序列的,纵向可以看成是并行的(但是实际上不是并行的)。

    双向 RNN

    上面的方法面临这样一个问题,那就是单词向量往往是与上下文有关的,而不仅仅只于前面的文字有关,所以需要改进单向 RNN,这里我们使用双向 RNN来解决这个问题:

    上图是一个双向 LSTM,图中是一个encoder的例子,每一个隐含层的状态都有两个向量表示,分别表示两个方向,(h=left[h^{(f)} quad h^{(b)} ight])。输出也有两个,分别是 (left[ egin{array}{ll}{o_{t}^{(f)}} & {o_{t}^{(b)}}end{array} ight])

    基于全局的 Attention 策略

    Attention Layer
    [Not supported by viewer]
    Context vector
    [Not supported by viewer]
    Global align weights
    [Not supported by viewer]
    $oldsymbol{C}_{t}$
    $oldsymbol{C}_{t}$
    $oldsymbol{a}_{t}$
    [Not supported by viewer]
    $ ilde{oldsymbol{h}}_{t}$
    <font style="font-size: 14px">$ ilde{oldsymbol{h}}_{t}$</font>
    $y_{t}$
    [Not supported by viewer]
    $oldsymbol{h}_{t}$
    [Not supported by viewer]
    $overline{oldsymbol{h}}_{oldsymbol{s}}$
    <font style="font-size: 14px">$overline{oldsymbol{h}}_{oldsymbol{s}}$</font>

    基于局部的 Attention 策略

    Attention Layer
    [Not supported by viewer]
    Context vector
    [Not supported by viewer]
    Local weights
    [Not supported by viewer]
    $oldsymbol{C}_{t}$
    $oldsymbol{C}_{t}$
    $oldsymbol{a}_{t}$
    [Not supported by viewer]
    $ ilde{oldsymbol{h}}_{t}$
    <font style="font-size: 14px">$ ilde{oldsymbol{h}}_{t}$</font>
    $y_{t}$
    [Not supported by viewer]
    $oldsymbol{h}_{t}$
    [Not supported by viewer]
    $overline{oldsymbol{h}}_{oldsymbol{s}}$
    <font style="font-size: 14px">$overline{oldsymbol{h}}_{oldsymbol{s}}$</font>
    Aligned position
    [Not supported by viewer]
    $p_{t_{1}}$
    [Not supported by viewer]

    Attention 机制

    在翻译的模型中,举个简单的例子,

    "the ball is on the field,"

    其中关键的单词就那么几个,而且很多情况下,如果将所有的单词都考虑进来的话,会导致过拟合,反而会导致语义的不准确,所以提出了attention 的机制,主要思想作用在 decoder阶段,每次观察整个句子,在每一步可以决定那些单词是重要的。

    Bahdanau et al.提出的 神经网络翻译模型

    encoder阶段使用一个双向 LSTM,

    decoder阶段

    神经网络隐含层的使用的机制:

    [s_{i}=fleft(s_{i-1}, y_{i-1}, c_{i} ight) ]

    其中 (s_{i-1}) 是神经网络前一层的输出,然后 (y_{i-1}) 是上一个时间序列,也就是预测的上一个单词的输出,(C_{t}) 于LSTM中的 (C_t)不太一样,但是本质上都是用来记录信息的。

    通过神经网络的输出,预测的机制:

    [pleft(y_{i} | y_{1}, ldots, y_{i-1}, mathbf{x} ight)=gleft(y_{i-1}, s_{i}, c_{i} ight) ]

    上面式子中用到的 (y_{i-1}) 就很容易理解了。

    这个 (C_i) 本质上都是用来记录信息的,这里的计算方式是:

    [c_{i}=sum_{j=1}^{T_{x}} alpha_{i j} h_{j} ]

    ​ 上式中的 (h_j) 也不是LSTM中的隐含层的状态,隐含层的状态是 (s_i) ,而是包含了重点关注第 (i)个单词的信息。所以我们很容易想到,这里获取 (c_i) 的时候必须要加权,就是对每个 (i),进行加权,那么衡量权重的标志是什么呢?我们用 (e_{ij}) 来表示,

    [e_{i j}=aleft(s_{i-1}, h_{j} ight) ]

    这是一个对齐模型,表示输入的单词 (j), (我们重点关注的)在输出位置为 (i) 的可能性大小。然后我们将这个得分进行加权计算,就得到了

    [alpha_{i j}=frac{exp left(e_{i j} ight)}{sum_{k=1}^{T_{x}} exp left(e_{i k} ight)} ]

    再返回去求 (c_i)。上面的对齐模型,我们可以直接使用一个传统的神经网络。attention 机制的一个好处就是可以很好的翻译长句子,因为可以忽略不需要的信息。

    Huong et al. 的神经网络翻译模型

    全局attention 机制

    对于encoder阶段给出的隐藏层的状态,(h_{1}, ldots, h_{n}),对于 decoder阶段的隐含层状态,(overline{h_{1}}, ldots, overline{h_{n}})。我们可以计算一个得分,(h_{i}) 是当前时间序列已得到的隐含层输出 ,使用下面任意一种函数:

    [operatorname{score}left(h_{i}, overline{h}_{j} ight)=left{egin{array}{l}{h_{i}^{T} overline{h}_{j}} \ {h_{i}^{T} W overline{h}_{j}} \ {Wleft[h_{i}, overline{h}_{j} ight]}end{array} ight. ]

    然后就像上面的那个模型一样,通过 (softmax) 函数来计算概率,将这个概率作为加权即可,

    [alpha_{i, j}=frac{exp left(operatorname{score}left(h_{j}, overline{h}_{i} ight) ight)}{sum_{k=1}^{n} exp left(operatorname{score}left(h_{k}, overline{h}_{i} ight) ight)} ]

    然后就得出了单词的文本向量,

    [c_{i}=sum_{j=1}^{n} alpha_{i, j} h_{j} ]

    接下来就可以计算新的隐含层的状态了:

    [ ilde{h}_{i}=fleft(left[overline{h}_{i}, c_{i} ight] ight) ]

    然后通过最后的预测函数,预测出下一个单词。这里在时间上 ( ilde{h}_{i}) 也会作为下一个时间点的输入。

    Local attention 的机制

    Local Attention 就是使用了一个窗口表示关注的单词,可以改变窗口的大小,说明对任意的单词都可以关注。

    Sequence model decoders

    上面的例子也说明了,在 Attention 阶段最重要的是 Decoder的策略。

    机器翻译起源于统计翻译,我们从概率的角度就是对于输入语句 (S) 与目标语句 (overline{S}),我们的目标就是

    [overline{s} *=operatorname{argmax}_{overline{s}}(mathbb{P}(overline{s} | s)) ]

    但是对于目标语句可能性太多,也就造成了计算量太大,我们有几种策略:

    Beam search 是使用的最多的一种策略,这种方法就是每次维持一个大小为 (K) 的翻译语句集合,

    [mathcal{H}_{t}=left{left(x_{1}^{1}, ldots, x_{t}^{1} ight), ldots,left(x_{1}^{K}, ldots, x_{t}^{K} ight) ight} ]

    当我们预测 (t+1) 的时刻的时候,我们依然取可能性最大的 (K) 个集合:

    [ ilde{mathcal{H}}_{t+1}=igcup_{k=1}^{K} mathcal{H}_{t+1}^{ ilde{k}} ]

    其中

    [mathcal{H}_{t+1}^{ ilde{k}}=left{left(x_{1}^{k}, ldots, x_{t}^{k}, v_{1} ight), ldots,left(x_{1}^{k}, ldots, x_{t}^{k}, v_{|V|} ight) ight} ]

    表示每一种可能的组合。

    机器翻译的评估系统

    Evaluation against another task

    将我们翻译的语句用于其他的系统中以查看翻译的效果。举个例子,我们将翻译的语句用于问答系统,与标准的语句用于问答系统,都能得到准确的回答,那么说明我们翻译的过程中抓住了句子的关键信息,在评估翻译结果的时候,时要考虑多方面的,这是我们既不能说我们的翻译完全正确,也不能说是失败了。

    Bilingual Evaluation Understudy (BLEU)

    这个方法是通过将一个参与的翻译系统的结果 B,与人工翻译的结果 A,进行对比评估,使用 n-gram 的方法进行对比。其中可能会有多个参考也就是reference。

    n-gram 的方法主要是关注窗口的大小。将连在一起的单词作为一个窗口,然后计算匹配的窗口的个数。最简单的例子就是:

    img

    对于窗口,我们用 window 来表示,出现的次数,

    [Count_{clip}=min left( ext { Count }, ext { Max }_{-} ext { Ref }_{-} ext { Count } ight) ]

    表示这个 window 在翻译文本与 reference文本中出现的最低的次数,那么精度可以这样计算:

    [P_{n}=frac{sum_{i} sum_{k} min left(h_{k}left(c_{i} ight), max _{j in m} h_{k}left(s_{i j} ight) ight)}{sum_{i} sum_{k} min left(h_{k}left(c_{i} ight) ight)} ]

    (H_k(c_i)) 表示机器翻译的结果中 (c_i) 出现的次数,(H_k(s_{ij})) 表示标准答案下 (S_{ij}) 出现的次数,这里为什么 (S) 下面有双下标,是因为,这里我们可以有很多个 reference。

    惩罚因子

    考虑机器翻译的结果为第二句,第一句为参考的情况,这个时候,计算的结果表明,翻译的很好,因为第二个语句比较短,所以 (H_k(s_{ij})) 的正确率表现得比较高,但是实际上整个句子的翻译效果没有那么高:

    there are many ways to evaluate the quality of a translation, like comparing the number of n-grams between a candidate translation and reference

    the quality of a translation is evaluate of n-grams in a reference and with translation

    因此我们引入一个惩罚因子:

    [eta=e^{min left(0,1-frac{operatorname{le}_{mathrm{ref}}}{operatorname{len}_{mathrm{MT}}} ight)} ]

    其中分子表示 reference的长度,分母是机器翻译结果的长度,那么最终的评分我们就可以表示成:

    [B L E U=eta imes exp left(sum_{n=1}^{N} w_{n} log P_{n} ight) ]

    Dealing with the large output vocabulary

    还有一个问题就是处理 vocabulary 过大的情况下,由于输出的时候需要经过一个 (softmax) 函数,所以在输出的时候,如果输出的 vocabulary 过大的话,那么 softmax 这一过程计算量就会特别大。

    在第一节课里面我们就介绍过两种方法,分别是分层 SoftMax 与 Negative Sampling(负采样)。传送门:传送门

    还有一些方法可以用:

    降低词典的大小

    为了限制词典的大小,对于语句中出现的未知的单词,我们就用 <UNK> 来表示,但是这样可能会导致源语句失去一些关键信息。还有一种方法就是,

    还有一种做法就是将数据集进行划分,这样的好处是,相似关系的数据集一般在一起。每个训练数据的子集取大小为 $ au=left|V^{prime} ight|$ 的字典。然后对整个数据集进行迭代。主要思想就是,我们在训练的时候,将训练数据分成很多个 Min-Batches,对每个 Min-Batches 的选取就是选取到 $ au$ 个单词的时候,用来表示这个字典,然后在训练的时候用这种数据会大大降低在 SoftMax 阶段的计算量。我们假设每次训练集的目标单词,也就是 Min-Batches 部分的单词,构成集合 (V_{i}^{prime}),那么这个集合中每个单词的概率就是:

    [Q_{i}left(y_{k} ight)=left{egin{array}{ll}{frac{1}{left|V_{i}^{prime} ight|}} & { ext { if } y_{t} in V_{i}^{prime}} \ {0} & { ext { otherwise }}end{array} ight. ]

    基于单词的模型与基于字母的模型

    基于单词的模型,可以选取出现概率最高的 n-gram 框,然后将这个框不断地加到数据集中去。

    简单说下这两种方式的混合策略,

    混合策略中,首先是对于单词的预测,使用常规的 LSTM,但是遇到输出的单词是 <UNK> 的时候,我们就需要使用字母级上的神经网络了。

  • 相关阅读:
    Javascript图片轮播
    Javascript返回顶部
    Android Studio 中 Svn的使用
    js简介
    使用Androd Studio开发Andriod程序查看Sha1的方法
    VueJs学习路线
    Eclipse 项目导入 Studio Debug运行卡死在进入界面
    Node软件的安装
    TextView加边框,自定义,上下左右四条线 颜色,想用哪个用哪个
    安装Eclipse(android)新建项目时遇到的问题
  • 原文地址:https://www.cnblogs.com/wevolf/p/10886260.html
Copyright © 2011-2022 走看看