[nlp入门论文精读] | Transformer

news/2024/7/19 10:16:36 标签: 自然语言处理, transformer, 人工智能

写在前面
 
最近工作从CV转向了NLP,于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候,我们小组就选择了经典的Attention和Bert,但还有很多细节并不完全理解,实际使用时也很困惑。
 
因此这个系列就来记录NLP复习知识!文章内容会结合工作实际所需持续更新。加油哇~

Transformer

        • 1. 简介和背景
        • 2. 相关工作
        • 3. 模型结构
          • 3.1 整体概览——编码器-解码器(Encoder-Decoder)
          • 3.2 注意力机制(Attention)
          • 3.3 "point-wise"前馈神经网络
          • 3.4 向量化层(Embedding)
          • 3.5 位置编码(Positional encoding)
        • 4. 为什么使用自注意力?(self-attention)
        • 5. 文章评价

1. 简介和背景
  • 论文的工作:聚焦于序列转录模型,序列转录模型是一类根据一个序列生成另外一个序列的模型,以往主流的方法通常基于RNN或者CNN、结构上采用Encoder-Attention-Decoder;提出的Transformer这种新的网络结构仅使用Attention机制。
  • RNN特点:能够处理序列数据的关键所在,是对输入序列从左到右依次进行计算,并将前面学到的知识放入隐藏状态向后传递
    • 这种计算机制带来的问题:
      • 无法并行计算
      • 当输入序列较长时,前面学到的知识在向后传递的过程中存在信息丢失的风险
    • 已有的提升计算效率的方法,如分解技巧,并不能从根本上解决问题
  • Attention机制在以往的工作中主要用来将Encoder的信息更好地传递给Decoder,论文提出的Transformer网络,不再使用循环层,仅使用attention学习输入和输出的全局依赖关系,而且能够有效进行并行计算

2. 相关工作
  • 减少时序计算代价途径之一——使用卷积神经网络
    • cnn的缺点在于难以建模长序列,每次计算使用的是k*k(k=3,5)的卷积核,如果需要建模两个距离较远的像素,需要使用多层卷积逐层计算;而Transformer中的注意力机制,每次计算使用全部像素;
    • 卷积的好处在于使用多个输出通道计算不同的特征,所以设计多头注意力机制进行模拟。
  • 自注意力机制:在计算一个序列表达时,将序列不同位置关联起来的一种注意力机制;已有工作并非论文创新。

3. 模型结构
3.1 整体概览——编码器-解码器(Encoder-Decoder)

Transformer基于经典序列转录模型的Encoder-Decoder架构:

  • 长度为n的输入x=(x_1, x_2,…x_n),如果是一个句子,x_t表示第t个单词
  • 编码器E:将输入映射为长度同样为n的连续向量z=(z_1, z_2,…z_n)
  • 解码器D:以编码器的输出z为输入,生成长度为m的输出序列y=(y_1, y_2, …y_m)
    • m可以不等于n,例如英翻中任务中,输入的英文句子长度可以不等于输出的中文句子长度
    • 解码器是典型的自回归模型,即逐步生成序列的每个元素来生成整个序列,生成y_t时考虑已经生成的y_1到y_(t-1),过去时刻的所有输出作为当前时刻的输入
      同时在编码器和解码器堆叠了多层self-attention、norm和fc

在这里插入图片描述

  1. 编码器
    在这里插入图片描述
  • batchnorm和laynorm
    在这里插入图片描述
  1. 解码器
  • 与编码器结构相似,包含6个完全相同的层,每层除了与编码器相同的两个子层(多头自注意力和前馈神经网络)外,增加一个额外的子层,同样是多头注意力
  • 由于解码器预测t时刻输出时,只能使用0到t-1时刻的输出作为输入,而t时刻后的不能;但注意力机制每次可以看到完整输入;因此使用带掩码的注意力机制–>保证训练和测试一致。
3.2 注意力机制(Attention)

简要理解:注意力函数将输入的 query,key-value 映射为输出output;具体来说,输出是value的加权和(二者维度相同),权重由query和key的相似度函数计算得出。其中不同的相似度函数则对应不同的注意力机制。

  1. 点乘注意力(Scaled dot attention)——TransFormer中使用的注意力机制
    在这里插入图片描述
  • quey的个数可以和kye-value对的个数不一样,但维度相同
  • 为什么要做缩放?当d_k较大时,点乘的值会变大,对应的softmat结果靠近1,使得梯度比较小
  • mask的目的——避免t时刻的query看到t时刻之后的key-value对;具体计算时,将t时刻之后的qk设置成较大的负数,经过softmax计算后变成0
  1. 多头注意力(Multi-Head attention)
    目的:模拟卷积神经网络不同输出通达学习不同特征
    做法:将QKV先投影到低维空间,投影h次–>缩放的点乘注意力机制–>拼接之后投影到原维度
    在这里插入图片描述

  2. Transformer中三种不同的注意力
    (1)Encoder中
    在这里插入图片描述
    (2)Dncoder中
    第一个注意力机制与Encoder相似,增加了mask机制:预测t时刻输出时,t时刻之后的权重设置为0
    第二个不再是自注意力,key-value对来自编码器的输出
    在这里插入图片描述

3.3 "point-wise"前馈神经网络
  • point-wise的意思:输入序列每个位置的词语都会经过相同的前馈神经网络计算
  • 两个线性层,使用Relu激活函数,将512维输入映射到2048维度后再映射回512维
  • 为什么是point-wise?注意力子层已经把输入的整个句子信息做了一次汇聚,使得注意力层输出的每个向量中都融合了其他位置信息(权重不同,感兴趣信息不同),因此每个位置词语对应的注意力子层输出向量可以单独进入前馈神经网络进行计算。
    在这里插入图片描述
3.4 向量化层(Embedding)
  • 整个网络包括三个向量化层,分别在编码器输入、解码器输入和解码器输出softmax层前。三者共享权重(训练简单)
  • 在编码器和解码器的输入部分,目的是将输入词映射成d_model向量;在解码器的输出部分,则是将隐藏状态的向量(eg:512维)映射到词汇表大小(eg:3万)的维度空间,然后进入softmax函数计算每个词概率值。

补充chatgpt的解释: Q:在decoder的softmax之前也会embedding,这是为什么呢?
A:在Transformer解码器中,在进行softmax之前进行额外的嵌入操作,通常是因为需要将解码器的输出(即经过softmax后的概率分布)转换为最终的词汇预测。这个额外的嵌入操作通常被称为"输出投影"(output
projection)或者"生成词嵌入"(generation embedding)。 这个额外的嵌入操作的作用有几个方面:

  1. 维度匹配:通常情况下,解码器的隐藏状态的维度可能与词汇表的大小不匹配。因为在解码器的隐藏状态中,每个时间步都有一个隐藏状态向量,而词汇表的大小通常远大于隐藏状态的维度。所以,需要通过输出投影将隐藏状态的维度转换为词汇表大小,以便之后进行softmax计算得到每个词汇的概率分布。
  2. 生成词嵌入:除了维度匹配之外,输出投影还可以被看作是将隐藏状态映射到词嵌入空间的过程。通过这个过程,模型可以更好地捕捉输出词汇的语义信息,从而更准确地预测下一个词汇。
    综上所述,在Transformer解码器中,在进行softmax之前进行额外的嵌入操作,既可以保证维度匹配,又可以提高模型对输出词汇的表示能力,从而提高预测的准确性。
3.5 位置编码(Positional encoding)
  • RNN是通过将上一时刻输出作为下一时刻输入来编码序列信息的,但注意力却缺少对时序信息的编码,针对这个问题,Transformer选择直接在输入中加入词语的位置信息。
  • 位置编码是一个与位置相关的向量,它被加到词嵌入向量中,以使模型能够区分不同位置的词汇。它通过周期不同的正弦、余弦函数计算而得,使得每个位置都会有一个唯一的位置编码向量与之对应。
4. 为什么使用自注意力?(self-attention)

虽然论文中这个章节标题是why self-attention,但并不是解释为什么这么设计,而是侧重时间复杂度、并行程度等相比RNN和CNN的优势
在这里插入图片描述

衡量三个维度

  • 每层的时间复杂度
  • 顺序计算:下一步计算必须等前面多少步完成计算,值越低并行程度越高
  • 最大路径长度:信息从一个点到另一个点要走多少步
    (1) 自注意力层:query矩阵n行d列,key矩阵n行d列,二者时间复杂度是n^2d;query和所有的key计算,输出是所有value的加权和,所以query一次就可以完成所有key-value计算,同时矩阵之间并行运算,所以每一步无需等待,信息传输一次完成。
    剩余三者计算量再补充

TODO:剩余循环层和卷积层计算之后遇到实际场景后再补充


5. 文章评价

论文写作:正文精简讲好一个故事,为什么要做?设计理念是什么?思考–>增加文章深度
模型本身:几乎可以用于所有NLP任务;扩展到图像、语音等领域;预训练让整个训练过程变的简单


2024.03.09 春日伊始,阳光明媚;在北京的小破出租屋,第一次更新:论文中Transformer基本结构。


http://www.niftyadmin.cn/n/5418529.html

相关文章

解决eclipse上启动不了tomcat问题

一、问题:在eclipse上启动不了tomcat 网上搜的方法基本都不行,改Maven配置和重建项目等等都解决不了。问题如下 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component …

Vue3 子/父组件相互调用

1&#xff1a;子组件调用父组件 父组件&#xff1a; <template><div><button style"margin: 50px">父按钮</button> <!--已clk为名称的事件传递给子组件&#xff0c;传递的是父组件的a函数/事件 --><Child clk"a" />…

RAG(检索增强生成): 上下文整合

在RAG&#xff08;检索增强生成&#xff09;系统中&#xff0c;上下文整合是将检索到的信息与用户查询相结合的过程&#xff0c;以便为生成阶段提供丰富的背景知识。这一步骤对于生成准确、相关且信息丰富的文本至关重要。以下是上下文整合的一些关键方案和技术实现&#xff1a…

C++ 疑难点

C疑难点 this指针 调用成员函数时&#xff0c;成员函数通过一个名为 this 的隐式参数来访问调用它的那个对象&#xff0c;用请求该函数的对象地址初始化 this &#xff0c;this 的指向总是自己这个对象&#xff0c;所以 this 是一个常量指针 Box* get_address() //得到thi…

【Demo】游戏小地图

简介 该Demo基于2D关卡随机生成项目进行实现&#xff0c;旨在初步探索游戏小地图的制作。 演示 MiniMapDemo 资源下载 百度网盘&#xff08;提取码&#xff1a;1314&#xff09; 如果这篇文章对你有帮助&#xff0c;请给作者点个赞吧&#xff01;

郭炜老师mooc第九章正则表达式

正则表达式 正则表达式是个某些字符有特殊含义字符串&#xff0c;表示一种字符串的模式&#xff08;格式) 正则表达式中的功能字符 d&#xff1a;digits&#xff1a;spacew&#xff1a;word 花括号量词{m,n}&#xff0c;逗号后面要紧跟数字&#xff0c;不能打空格&#xff0c…

初识C语言—结构体

生活中很多东西都是复杂对象 就比如一本书&#xff0c;有书名&#xff0c;作者&#xff0c;编号&#xff0c;价钱 C语言中提供了结构体来让我们描述这种复杂结构 结构体可以让C语言创造新的类型出来 //创建一个学生 struct Stu {char name[20];int age;double score; }; ​ //…

Linux 安装 mongodb

Linux 安装 mongodb 1.下载 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.6.tgz 2.安装依赖 yum install libcurl openssl xz-libs 3.解压 tar -zxvf mongodb-linux-x86_64-rhel70-6.0.6.tgz 4.复制文件并改名 mv mongodb-linux-x86_64-rhe…