[nlp入门论文精读] | 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

- 编码器

- batchnorm和laynorm

- 解码器
- 与编码器结构相似,包含6个完全相同的层,每层除了与编码器相同的两个子层(多头自注意力和前馈神经网络)外,增加一个额外的子层,同样是多头注意力;
- 由于解码器预测t时刻输出时,只能使用0到t-1时刻的输出作为输入,而t时刻后的不能;但注意力机制每次可以看到完整输入;因此使用带掩码的注意力机制–>保证训练和测试一致。
3.2 注意力机制(Attention)
简要理解:注意力函数将输入的 query,key-value 映射为输出output;具体来说,输出是value的加权和(二者维度相同),权重由query和key的相似度函数计算得出。其中不同的相似度函数则对应不同的注意力机制。
- 点乘注意力(Scaled dot attention)——TransFormer中使用的注意力机制

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

-
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)。 这个额外的嵌入操作的作用有几个方面:
- 维度匹配:通常情况下,解码器的隐藏状态的维度可能与词汇表的大小不匹配。因为在解码器的隐藏状态中,每个时间步都有一个隐藏状态向量,而词汇表的大小通常远大于隐藏状态的维度。所以,需要通过输出投影将隐藏状态的维度转换为词汇表大小,以便之后进行softmax计算得到每个词汇的概率分布。
- 生成词嵌入:除了维度匹配之外,输出投影还可以被看作是将隐藏状态映射到词嵌入空间的过程。通过这个过程,模型可以更好地捕捉输出词汇的语义信息,从而更准确地预测下一个词汇。
综上所述,在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基本结构。
相关文章:
[nlp入门论文精读] | Transformer
写在前面 最近工作从CV转向了NLP,于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候,我们小组就选择了经典的Attention和Bert,但还有很多细节并不完全理解,实际使用时也很困惑。 因此这个系列就来记…...
科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」
2024年3月7日~8日,第八届瑞芯微开发者大会(RKDC2024)在福州举行,本届大会以“AI芯片AI应用AloT”为主题,邀请各行业的开发者共启数智化未来。 本届大会亮点颇多,不仅有13大芯片应用展示、9场产品和技术论坛…...
代码随想录算法训练营第五十九天丨503. 下一个更大元素 II、42. 接雨水
503. 下一个更大元素 II 还是比较容易想的,扩展数组一倍即可。 class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:extended_nums nums * 2n len(nums)mono []res [- 1] * nfor i, num in enumerate(extended_nums):while mono…...
全代码分享|R语言孟德尔随机化怎么做?TwoSampleMR包MR一套标准流程
文章目录 1.前言1.1 成立条件1.2 三大要素1.3 统计原理 2.demo2.1 加载R包2.2 主要MR分析2.3 MR补充分析、多态性、验证 2.4 结果可视化 1.前言 孟德尔随机化(Mendelian randomization,MR)是一种利用基因变异作为工具变量来评估暴露与结果之间因果关系的统计方法。…...
【AI视野·今日NLP 自然语言处理论文速览 第八十四期】Thu, 7 Mar 2024
AI视野今日CS.NLP 自然语言处理论文速览 Thu, 7 Mar 2024 Totally 52 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers The Heuristic Core: Understanding Subnetwork Generalization in Pretrained Language Models Authors Adith…...
英伟达推出免训练,可生成连贯图片的文生图模型ConsiStory,生成角色一致性解决新方案
目前,多数文生图模型皆使用的是随机采样模式,使得每次生成的图像效果皆不同,在生成连贯的图像方面非常差。 例如,想通过AI生成一套图像连环画,即便使用同类的提示词也很难实现。虽然DALLE 3和Midjourney可以对图像实现…...
Jmeter 性能 —— 50TPS与秒杀分析!
1、50tps——5tps分析 50tps基本上已经满足了大部分中小型企业要求了 需求:期望我项目的接口,都要能满足50tps? 算 50tps:50 个事务每秒50 t/s 1分钟:50\*60s 3000 事务1小时 3000 \* 60 180000 事务 1小时要处理…...
【前端】如何计算首屏及白屏时间
文章目录 一、首屏时间二、白屏时间 一、首屏时间 白屏时间:页面渲染完所有内容的时间 简单点就是在<body> 标签后写js代码计算,但是不是很准确 <head><title>白屏时间</title> </head> <body></body> <s…...
重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-ServletWebServerFactoryAutoConfiguration类 工作原理关键组件以TomcatServletWebServerFactory为例ServletWebServerFactory会创建webServer的时机关键…...
FileZillaClient连接被拒绝,无法连接
1.ECONNREFUSED - 连接被服务器拒绝 2、无法连接FZ时,判断没有ssh 更新源列表: sudo apt-get update 安装 openssh-server :sudo apt-get install openssh-server 查看是否启动ssh:sudo ps -e | grep ssh...
每日一面——成员初始化列表、移动构造和拷贝构造
写前声明:参考链接 C面经、面试宝典 等 ✊✊✊每日一面——成员初始化列表、移动构造和拷贝构造 一、类成员初始化方式?构造函数的执行顺序?为什么用成员初始化列表会快一些?二、final和override关键字三、拷贝初始化和直接初始化…...
OPC UA 服务器的Web访问
基于Web 的应用非常普及,例如基于web 的SCADA ,物联网 Dashboard 等等,那么基于Web 的应用如何访问OPC UA 服务器呢?本博文讨论这方面的问题。 Web 的通信方式 Web 是我们通常讲的网站,它由浏览器,HTTP 服…...
docker 子网
当需要给容器分配指定 ip ,为避免ip 冲突,指定容器子网处理 创建 subnet 子网 docker network create --subnet 10.0.0.0/24 --gateway 10.0.0.1 subnet-testdocker network ls NETWORK ID NAME DRIVER SCOPE ... f582ecf297bc sub…...
QT使用RabbitMQ
文章目录 1.RabbitMQ 客户端下载地址:1.1RabbitMQ基本结构:2.搭建RabbitMQ server3.安装步骤4.运行4.1 报错问题解决5.使用5.1 配置Web管理界面6.常用命令总结7.Qt客户端编译7.1 这里重点强调一下,这个文件需要改成静态库7.2 下载地址:(qamqp自己下载,下载成功后,静态编译…...
什么是R语言?什么是R包?-R语言001
R语言是一种专为统计计算和图形而设计的编程语言和环境。它最初由罗斯伊哈卡和罗伯特亨特尔在1993年创建,灵感来源于S语言。R语言已经发展成为统计学、数据分析、科学研究以及许多其他领域中最受欢迎和广泛使用的工具之一。R语言的核心是一个开源的解释型语言&#…...
Java17 --- springCloud之LoadBalancer
目录 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom 1.3、80服务controller层: 一、LoadBalancer实现负载均衡 1.1、创建两个相同的微服务 1.2、在客户端80引入loadBalancer的pom <!--loadbalancer-->&…...
Mac(含M1) 使用 brew 安装nvm
目录 Mac 安装nvm 下载命令 配置环境变量 刷新 Mac(M1) 安装nvm 搜索 下载 为nvm创建文件夹 配置环境变量 刷新 Mac 安装nvm 下载命令 brew install nvm 配置环境变量 vi ~/.zshrc 内容如下: export NVM_DIR"$HOME/.nvm"[ -s "/usr/local…...
优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:前端零基础教学,实战进阶 景天的主页:景天科技苑 文章目录 Vuevue.js库的基本使用vue.js的M-V-VM思…...
<2024最新>ChatGPT逆向教程
前言 在使用本篇文章用到的项目以及工具时,需要对其有一定的了解,无法访问以及无法使用的问题作者不承担任何责任,可以自行想办法解决遇到的问题。 文章若有不合适,有问题的地方,请私聊指出,谢谢~ 准备工具 一台至少 2 核 2G 内存的服务器,推荐是位于香港、新加坡或…...
C#编程技巧--2
1.使用泛型: 泛型允许你编写更加灵活和可重用的代码,同时提高类型安全性。 C# 中的泛型功能允许你编写更加灵活和可重用的代码,并且可以增加类型安全性。通过使用泛型,你可以编写适用于不同类型的代码,而无需为每种类型单独重写代…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
