nlp中的经典深度学习模型(二)

本系列是七月算法nlp就业班学习笔记。
attention和transformer都是面试重点。

3 seq2seq+Attention

3.1 Sequence to Sequence Model

3.1.2 模型介绍

Sequence to Sequence Model解决y=f(x)的问题。
x是一个序列,y是一个序列。
最常应用于翻译问题。

模型包含编码器和解码器2部分。
在这里插入图片描述

编码器:输入序列编码为隐变量 。用RNN作为大体结构。得到一个隐变量h。

解码器:auto-regressive自回归解码套路
对于一个序列使用前t-1个输出,预测第t个输出,这种方式称为自回归

    第一步:输入编码器得到的隐变量h,以及特殊字符<SOS> start of sentence
            输出解码得到的词y1,以及隐状态h0
            假设词库有10万个词,h0是一个10万维的向量,在这一时刻哪个词的可能性最大,则这个位置的概率最大。
            y1 是概率最大的那个词
    第二步:输入y1,h0
          输出y2,以及隐状态h1

    第三步:输入y2,h1
            是输出y3,以及隐状态h2
    
    ......

    一直到解码出来特殊字符例如EOS停止解码,或者解码到一定长度停止。

    解码器只能是单向的,但是可以堆叠多层的网络

模型中包含的参数
1 解码器参数 θ 1 \theta_1 θ1
2 解码器参数 θ 2 \theta_2 θ2
3 词向量矩阵 θ 3 \theta_3 θ3 ,随机初始化(这个词向量可以用skip-gram模型学出来的值吗?)
4 h 0 ′ h_0' h0, h 1 ′ h_1' h1…映射到词表上的那个矩阵 θ 4 \theta_4 θ4

3.1.2 模型训练

  • 要点1:模型是一个求条件概率的过程
    y=F(x) 等价于 P(Y|X) 就是拟合了一个条件概率分布
    P ( Y ∣ X ) = P ( y 1 , y 2 . . . y n ∣ X ) = P ( y 1 ∣ X ) P ( y 2 ∣ y 1 , X ) P ( y 3 ∣ y 1 , y 2 , X ) . . . = ∏ i = 1 n P ( y i ∣ y 1 , y 2 . . . y i − 1 , X ) P(Y|X) =P(y_1,y_2...y_n|X) = P(y_1|X)P(y_2|y_1,X)P(y_3|y_1,y_2,X)...=\prod_{i=1}^nP(y_i|y_1,y_2...y_{i-1},X) P(YX)=P(y1,y2...ynX)=P(y1X)P(y2y1,X)P(y3y1,y2,X)...=i=1nP(yiy1,y2...yi1,X)

预测y2: P ( y 2 ∣ y 1 , h ) = P ( y 2 ∣ y 1 , X ) P(y_2|y_1,h) = P(y2|y1,X) P(y2y1,h)=P(y2y1,X), h h h是由X决定的。

每一个时间步,做的是条件概率分布,做一个分类,损失函数交叉熵损失。所有时间的损失加起来就是整个loss。

  • 要点2:输入词向量和输出词向量绑定

参数 θ 3 \theta_3 θ3称为输入词向量
参数 θ 4 \theta_4 θ4称为输出词向量
假如词库有10万词,词向量的维度是100。
参数 θ 4 \theta_4 θ4是一个10万x100的矩阵, h 0 ′ h_0' h0是 一个100维的向量, θ 4 \theta_4 θ4x h 0 ′ h_0' h0=10万维的向量,得到每个词的概率分布。
参数 θ 3 \theta_3 θ3 和参数 θ 4 \theta_4 θ4 维度一样。可以共享。可以降低计算量。 换句话说 输入词向量和输出词向量绑定。

  • 要点3:teacher forcing

在第二个位置预测出一个错误的词,怎么办?
每次给下一阶段的词都是正确的词,称为teacher forcing
每次使用预测出来的词给下一阶段,称为非teacher forcing 。这样的模型具有纠错功能

3.2注意力机制

3.2.1介绍

注意力机制是seq2seq带给nlp最好的礼物。
上面模型的问题是,只有编码器的最后一个输出,作为解码器的输入。这样会导致前面的输入会忘记,影响力会低。
在这里插入图片描述

我们希望 h 1 , h 2 , h 3 , h 4 h_1,h_2,h_3,h_4 h1,h2,h3,h4都能参与到解码器的计算中。这样就需要给他们分配一个权重,那这个权重怎么学习呢?
我们把编码器的输出变量 h 1 , h 2 , h 3 , h 4 h_1,h_2,h_3,h_4 h1,h2,h3,h4称为value。
把解码器的每一步输出 h i ′ h_i' hi称为query。
使用(query,key)对计算权重。key就是 h 1 , h 2 , h 3 , h 4 h_1,h_2,h_3,h_4 h1,h2,h3,h4
上一步得到的权重与value(这里仍然是 h 1 , h 2 , h 3 , h 4 h_1,h_2,h_3,h_4 h1,h2,h3,h4)加权平均得到注意力输出。

在这里插入图片描述

这样的模式可以推广到所有需要注意力模型的地方。
value通常是上一个阶段的输出,key和value是一样的。
query通常是另外的一个向量。
使用 (query,key) 进行加权求和,得到的值作为权重,再对value进行加权求和。
这样的话在decoder阶段,每一步的输入会有3个变量:编码器经过注意力加权后的输出h(这个时候的query是 h i − 1 ′ h_{i-1}' hi1),解码器上一步的隐状态 h i − 1 ′ h_{i-1}' hi1,上一步的输出 y i − 1 y_{i-1} yi1
这里的公式可以参考第八课 RNN条件生成与Attention机制的2.2

3.2.1“Bahdanau” style attention

论文:Dzmitry Bahdanau, KyungHyun Cho, Yoshua Bengio. Neural Machine Translation by Jointly Learning to Align and Translation

Bahdanau是注意力机制的一种计算方法,也是现在很多工具包中的实现方法。
在这里插入图片描述
输入是 X 1 , X 2 . . . X T X_1,X_2...X_T X1,X2...XT,经过RNN之后得到多个隐状态 h 1 , h 2 , . . . h T h_1,h_2,...h_T h1,h2,...hT
我们使用这里的隐状态作为key和value,使用解码器的上一步隐状态 s i − 1 s_{i-1} si1作为query。

如何计算第i步,每个隐状态的权重呢?

P ( y i ∣ y 1 , y 2 . . . y i − 1 , X ) = g ( y i − 1 , s i , c i ) P(y_i|y_1,y_2...y_{i-1},X) = g(y_{i-1},s_i,c_i) P(yiy1,y2...yi1,X)=g(yi1,si,ci)
在计算第i步的输出的时候,与上一步的输出,这一步的隐状态以及第i步的contex有关系。

s i = f ( s i − 1 , y i − 1 , c i ) s_i=f(s_{i-1},y_{i-1},c_i) si=f(si1,yi1,ci)
第i步的隐状态是关于上一步的隐状态,上一步的输出以及第i步的contex有关系。

c i = ∑ j = 1 T x α i j h j c_i=\sum_{j=1}^{T_x}\alpha_{ij}h_j ci=j=1Txαijhj
第i步的context是解码器所有隐状态的加权平均。

α i j = e x p ( e i j ) ∑ j = 1 T x e x p ( e i k ) \alpha_{ij}=\dfrac{exp(e_{ij})}{\sum_{j=1}^{T_x}exp(e_{ik})} αij=j=1Txexp(eik)exp(eij)

e i j = a ( s i − 1 , h j ) e_{ij}=a(s_{i-1,h_j}) eij=a(si1,hj)

加权平均的 h j h_j hj的参数是这样计算的:
解码器上一步的隐状态拼接 h j h_j hj得到一个2n维的向量,使用一个2nx1维度的矩阵乘以这个向量得到 e i j e_{ij} eij,对 e i j e_{ij} eij过softmax得到权重参数。

3.2.2“Luong” style attention

在解码器计算第i步的时候:
先用 h t − 1 h_{t-1} ht1 y t 1 y_{t_1} yt1计算得到 h t h_t ht,使用 h t h_t ht作为query。而在Bahdanau中是使用 h t − 1 h_{t-1} ht1作为query的。
编码器的隐状态作为key和value。计算得到 c i c_i ci
拼接 c i c_i ci h t h_t ht,作为输入,去预测得到 h ~ i \tilde{h}_i h~i,再用 h ~ i \tilde{h}_i h~i预测得到 y i y_i yi
这样做的好处是,可以在解码的时候堆叠很多层。让解码做得更好。

对(query,key)的处理,文章中提到了多种。
在这里插入图片描述

文章中还提供了local attention机制。随着算力主键提升,这种策略也不再流行了。

4 Transformer

2017年某一天,有人提出将seq2seq中的RNN去掉,只留下attention。这样的模型就是Transformer。
论文:Attention is All You Need
在这里插入图片描述

transformer由编码器和解码器两部分构成。
这里有很重要的三种操作是Multi-head Attention、残差链接和Add&Norm(层正则化)。

4.1 Multi-head Attention

Multi-head Attention是自注意力机制的一种特殊情况。

4.1.1 自注意力机制

自注意力机制是指注意力机制中的query不是别的向量,而是自己序列本身。
在这里插入图片描述

例如在学习 x 2 x_2 x2的权重参数值时候,使用 x 2 x_2 x2作为query, x 1 , x 3 , x 4 x_1,x_3,x_4 x1,x3,x4作为key和value。
对每个位置都计算得到权重参数,然后加权平均得到 y 2 y_2 y2
同理 y 3 , y 4 , y 1 y_3,y_4,y_1 y3,y4,y1的计算也是一样。
在这里插入图片描述
d k d_k dk是embedding的维度。在归一化之前会对每一个分数除以定值(embedding的维度开根号)。这样可以让softmax的分布更加平滑。

4.1.2 自注意力机制加强版

在这里插入图片描述
增强版的自注意力机制是
1 不使用 x 2 x_2 x2作为query,而是先对 x 2 x_2 x2做线性变换: W q x 2 W_qx_2 Wqx2,之后的向量作query。
2 x 1 , x 3 , x 4 x_1,x_3,x_4 x1,x3,x4不直接作为key和value,而是先做线性变换之后再做key和value。 W k x 1 W_kx_1 Wkx1作为key, W v x 1 W_vx_1 Wvx1作为value。
其余步骤相同。
这样的模型有更多的参数,模型性能也更加强大。

4.1.3 Multi-head Attention

在这里插入图片描述

在每一步计算的时候,对于向量拆分之后再输入到模型。例如 x i x_i xi是一个100维的向量。现在把它拆为h=5份。每一个就是一个20维的向量。将query、key、value都做这样的拆分。分别在5组向量上面做self-attention。得到5个20维的向量,然后拼接起来称为一个100维的向量。
不同head的长度一样,但是映射参数是不一样的。

经过multi-head之后,得到 h 1 , h 2 , h 3 , h 4 h_1,h_2,h_3,h_4 h1,h2,h3,h4

4.2 残差链接

残差链接是这样的。
将输入x加到multi-head的输出h上。这样可以加快训练。
这一步得到的结果记为 h 1 ′ , h 2 ′ , h 3 ′ , h 4 ′ h_1',h_2',h_3',h_4' h1,h2,h3,h4

4.3 layer norm

层正则化,是对残差链接的结果做正则化。

h 1 ′ , h 2 ′ , h 3 ′ , h 4 ′ h_1',h_2',h_3',h_4' h1,h2,h3,h4这4个向量分别计算每个向量的均值 μ \mu μ和方差 σ \sigma σ
在这里插入图片描述
γ \gamma γ β \beta β是共享的参数,在模型中需要训练。
γ \gamma γ β \beta β可以在一定程度上抵消掉正则的操作。为什么正则了又要抵消呢?
这样做可以让每一个时间步的值更平均一些,差异不会特别大。
这一步的输出是 h 1 ′ ′ , h 2 ′ ′ , h 3 ′ ′ , h 4 ′ ′ h_1'',h_2'',h_3'',h_4'' h1,h2,h3,h4

4.4 前馈神经网络以及后续操作

对于上一步的结果加一个前馈神经网络。
在每一个时间步会做一个y=F(x)的变化,得到另外的100维的向量。
对这一步的结果再加一个残差链接和层正则化。

这样就得到一个transformer block。
在这里插入图片描述

4.5解码器部分

解码器和编码器差不多。
解码器有一个master multi head attention。就是说在解码的时候,每一个时间步只能看到它前面的状态。例如在计算 x 2 x_2 x2的参数时候, x 2 x_2 x2作为query,能作为key和value的只有 x 1 x_1 x1

还有一点不同是
在这里插入图片描述

这里是以解码器的输出作为key和value,这一时间步的输出作为query计算attention。

猜你喜欢

转载自blog.csdn.net/flying_all/article/details/115341381