NLP--Transformer概览【笔记】

9 篇文章 0 订阅
4 篇文章 0 订阅

阅读本篇文章的时候,可以先去看看我写的前两篇笔记,能够相辅相成,更加深入了解Transformer。

  • 第一篇宏观探索,其实是从词嵌入开始说起,从ELMO、BERT、GPT等入手让你明白,哪些用了Transformer的那些部分,以及演变过程
  • 第二篇是从Transformer的细节处讲,有图有真相,明白里面的构造是什么,如果初学,容易绕进去,形成障碍。可以先阅读本文,再折回去阅读微观探索。(不过这个阅读顺序,无所谓,核心是掌握Transformer)

编码器

  • 首先,我们将每个词转化为其对应的词嵌入向量。嵌入只是词的特征向量,这个特征向量也是需要通过训练获得的。

  • 矩阵 X \mathbf{X} X的维度为 [ 句子的长度 × 词嵌入向量维度 ] [句子的长度×词嵌入向量维度] [句子的长度×词嵌入向量维度]

  • 创建三个权重矩阵 W Q 、 W K 、 W V \mathbf{W}^{\mathbf{Q}}、\mathbf{W}^{\mathbf{K}}、\mathbf{W}^{\mathbf{V}} WQWKWV,用矩阵 X \mathbf{X} X分别乘以矩阵 W Q 、 W K 、 W V \mathbf{W}^{\mathbf{Q}}、\mathbf{W}^{\mathbf{K}}、\mathbf{W}^{\mathbf{V}} WQWKWV,就可以依次创建出查询矩阵 Q \mathbf{Q} Q、键矩阵 K \mathbf{K} K和值矩阵 V \mathbf{V} V

自注意力机制

  1. 自注意力机制首先要计算查询矩阵 Q Q Q与键矩阵 K T K^T KT的点积
    • Q ⋅ K T Q·K^T QKT矩阵的第一行,一行计算的是查询向量 q 1 ( I ) q_1(I) q1(I)与所有的键向量 k 1 ( I ) 、 k 2 ( a m ) 、 k 3 ( g o o d ) k_1(I)、k_2(am)、k_3(good) k1(I)k2(am)k3(good)的点积。通过计算两个向量的点积可以知道它们之间的相似度。(单词与句子中的所有单词的相似度)
  2. Q ⋅ K T Q·K^T QKT矩阵除以键向量维度的平方根,这样是为了获得稳定的梯度
  3. 目前所得的相似度分数尚未被归一化,我们需要使用softmax函数对其进行归一化处理(分数矩阵)
    • 应用softmax函数将使数值分布在0到1的范围内,且每一行的所有数之和等于1。
  4. 计算注意力矩阵 Z Z Z
    • 注意力矩阵包含句子中每个单词的注意力值。它可以通过将分数矩阵softmax ( Q ⋅ K T d k Q·K^T\over\sqrt{d_k} dk QKT)乘以值矩阵 V V V得出
    • 注意力矩阵 Z Z Z就是值向量与分数加权之后求和所得到的结果
    • 通过自注意力机制,我们可以了解一个词与句子中所有词的相关程度。

多头注意力层

如果某个词实际上由其他词的值向量控制,而这个词的含义又是模糊的,那么这种控制关系是有用的;否则,这种控制关系反而会造成误解。为了确保结果准确,我们不能依赖单一的注意力矩阵,而应该计算多个注意力矩阵,并将其结果串联起来。使用多头注意力的逻辑是这样的:使用多个注意力矩阵,而非单一的注意力矩阵,可以提高注意力矩阵的准确性。

假设我们有8个注意力矩阵,即 Z 1 Z_1 Z1 Z 8 Z_8 Z8,那么可以直接将所有的注意力头(注意力矩阵)串联起来,并将结果乘以一个新的权重矩阵 W 0 W_0 W0,从而得出最终的注意力矩阵,
M u l t i − h e a d a t t e n t i o n = C o n c a t e n a t e ( Z 1 , Z 2 , . . . , Z 8 ) W 0 Multi-head attention=Concatenate(Z_1,Z_2,...,Z_8)W_0 Multiheadattention=Concatenate(Z1,Z2,...,Z8)W0

位置编码

Transformer将句子中的所有词并行地输入到神经网络中。并行输入有助于缩短训练时间,同时有利于学习长期依赖。

位置编码是指词在句子中的位置(词序)的编码。

正弦函数来计算位置编码:
P ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d m o d e l ) P ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d m o d e l ) P(pos,2_i)=\sin({pos\over{10000^{2_i/d_{model}}}})\\ P(pos,2_i+1)=\cos({pos\over{10000^{2_i/d_{model}}}}) P(pos,2i)=sin(100002i/dmodelpos)P(pos,2i+1)=cos(100002i/dmodelpos)

  • 只需将输入矩阵 X X X与计算得到的位置编码矩阵 P P P进行逐元素相加,并将得出的结果作为输入矩阵送入编码器中。

前馈网路层

前馈网络由两个有ReLU激活函数的全连接层组成。前馈网络的参数在句子的不同位置上是相同的,但在不同的编码器模块上是不同的。

叠加和归一组件

  • 同时连接多头注意力层的输入和输出
  • 同时连接多头注意力层的输入和输出

叠加和归一组件实际上包含一个残差连接与层的归一化
层的归一化可以防止每层的值剧烈变化,从而提高了模型的训练速度。

编码器总览

在这里插入图片描述

N N N个编码器一个接一个地叠加起来。从最后一个编码器(顶层的编码器)得到的输出将是给定输入句子的特征值。让我们把从最后一个编码器得到的特征值表示为 R R R

R R R作为输入传给解码器。解码器将基于这个输入生成目标句。

解码器

一个解码器(第一个除外)将有两个输入:一个是来自前一个解码器的输出,另一个是编码器输出的特征值。

在每一步中,解码器都将上一步新生成的单词与输入的词结合起来,并预测下一个单词

  • 在编码器部分,我们将输入转换为嵌入矩阵,并将位置编码添加到其中,然后将其作为输入送入编码器。同理,我们也不是将输入直接送入解码器,而是将其转换为嵌入矩阵,为其添加位置编码,然后再送入解码器。
  • 假设在时间步 t = 2 t=2 t=2,我们将输入转换为嵌入(我们称之为嵌入值输出,因为这里计算的是解码器在以前的步骤中生成的词的嵌入),将位置编码加入其中,然后将其送入解码器。

带掩码的多头注意力层

  • 在训练期间,由于有正确的目标句,解码器可以直接将整个目标句稍作修改作为输入。解码器将输入的作为第一个标记,并在每一步将下一个预测词与输入结合起来,以预测目标句,直到遇到标记为止。因此,我们只需将标记添加到目标句的开头,再将整体作为输入发送给解码器。
  • 掩码有助于自注意力机制只注意模型在测试期间可以使用的词

多头注意力层

每个解码器中的多头注意力层都有两个输入:

  • 一个来自带掩码的多头注意力层,
    • 矩阵 M M M
  • 另一个是编码器输出的特征值。
    • 矩阵 R R R

用从上一个子层获得的注意力矩阵 M M M创建查询矩阵 Q i Q_i Qi,使用编码器输出的特征值 R R R创建键矩阵和值矩阵。由于采用多头注意力机制,因此对于头 i i i,需做如下处理:

  • 查询矩阵 Q i Q_i Qi通过将注意力矩阵 M M M乘以权重矩阵 W i Q W_i^Q WiQ来创建。
  • 键矩阵和值矩阵通过将编码器输出的特征值 R R R分别与权重矩阵 W i K 、 W i V W_i^K、W_i^V WiKWiV相乘来创建

通过上面你将知道日常在Transformer中所提到的Q、K、V是从哪来,对应的是那一部分

为什么要用 M M M计算查询矩阵,而用 R R R计算键矩阵和值矩阵呢?
因为查询矩阵是从 M M M求得的,所以本质上包含了目标句的特征。键矩阵和值矩阵则含有原句的特征,因为它们是用 R R R计算的

前馈网络层

与编码器中的一样

叠加和归一组件

线性层和softmax层

解码器总览

在这里插入图片描述

  • 首先,我们将解码器的输入转换为嵌入矩阵,然后将位置编码加入其中,并将其作为输入送入底层的解码器(解码器1)。
  • 解码器收到输入,并将其发送给带掩码的多头注意力层,生成注意力矩阵 M M M
  • 然后,将注意力矩阵 M M M和编码器输出的特征值 R R R作为多头注意力层(编码器−解码器注意力层)的输入,并再次输出新的注意力矩阵。
  • 把从多头注意力层得到的注意力矩阵作为输入,送入前馈网络层。前馈网络层将注意力矩阵作为输入,并将解码后的特征作为输出。
  • 最后,我们把从解码器1得到的输出作为输入,将其送入解码器2。
  • 解码器2进行同样的处理,并输出目标句的特征。

我们可以将 N N N个解码器层层堆叠起来。从最后的解码器得到的输出(解码后的特征)将是目标句的特征。接下来,我们将目标句的特征送入线性层和softmax层,通过概率得到预测的词。

训练Transformer

解码器预测的是词汇的概率分布,并选择概率最高的词作为输出。所以,我们需要让预测的概率分布和实际的概率分布之间的差异最小化。要做到这一点,可以将损失函数定义为交叉熵损失函数。我们通过最小化损失函数来训练网络,并使用Adam算法来优化训练过程。

词汇的概率分布,并选择概率最高的词作为输出。所以,我们需要让预测的概率分布和实际的概率分布之间的差异最小化。要做到这一点,可以将损失函数定义为交叉熵损失函数。我们通过最小化损失函数来训练网络,并使用Adam算法来优化训练过程。

为了防止过拟合,我们可以将dropout方法应用于每个子层的输出以及嵌入和位置编码的总和。

总结

从上面的整个过程中,你可以通俗易懂的了解,Transformer中的编码器、解码器是什么以及他们中间的细节所对应的概念是什么,具体中间是怎么变化的,可以看看我的微观探索部分

以上是我个人在学习过程中的记录所学(“温故而知新”),希望对正在一起学习的小伙伴有所帮助!!!
如果对你有帮助,希望你能一键三连【关注、点赞、收藏】!!!

参考链接

以上是我在阅读《BERT基础教程:Transformer大模型实战》中所记录的笔记,详细细节书中讲的会更好。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故事挺秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值