Transformer系列(一):NLP中放弃使用循环神经网络架构
NLP中放弃使用循环神经网络架构
- 一、符号表示与概念基础
- 二、循环神经网络
- 1. 依赖序列索引存在的并行计算问题
- 2. 线性交互距离
- 三、总结
该系列笔记阐述了自然语言处理(NLP)中不再采用循环架构(recurrent architectures)的原因,介绍了自注意力机制,并构建了一个基于自注意力的极简神经架构。最后,深入探讨了Transformer架构的细节。同时,可能延申描述一些Transformer的应用。

在self-attention和Transformer架构出现之前,自然语言处理(NLP)中通常采用的是循环架构(recurrent architectures),这篇文章将为大家介绍,为什么self-attention出现后,就不再用recurrent architectures。
一、符号表示与概念基础
假设 w 1 : n w_{1:n} w1:n是一个序列,每一个 w i ∈ V w_{i}\in V wi∈V, V V V为一个有限的词汇表。同时,让 w 1 : n w_{1:n} w1:n除了表示原本的序列外,还额外表示一个独热向量矩阵, w 1 : n ∈ R n × ∣ V ∣ w_{1:n}\in R^{n\times|V|} w1:n∈Rn×∣V∣。用 w ∈ V w\in V w∈V表示一个任意的词汇单元,并且 w i ∈ V w_{i}\in V wi∈V来选择序列 w 1 : n w_{1:n} w1:n中的一个具体的有索引的单元。用下式表示 w t w_{t} wt是服从 ∼ \sim ∼右侧定义的概率分布:
w t ∼ s o f t m a x ( f ( w 1 : t − 1 ) ) (1) w_{t} \sim softmax(f(w_{1:t-1})) \tag{1} wt∼softmax(f(w1:t−1))(1)
其中, f ( w 1 : t − 1 ) ∈ R ∣ V ∣ f(w_{1:t-1})\in R^{|V|} f(w1:t−1)∈R∣V∣,当用上述的softmax函数时,不会直接指明进行归一化操作的维度。如果 A A A时形状为 R l , d R^{l,d} Rl,d,softmax可以用下式计算:
s o f t m a x ( A ) i , j = e x p A i , j ∑ j ′ = 1 d e x p A i , j ′ (2) softmax(A)_{i,j} = \frac{expA_{i,j}}{\sum_{j'=1}^dexpA_{i,j'}} \tag{2} softmax(A)i,j=∑j′=1dexpAi,j′expAi,j(2)
对于所有的 i ∈ { 1 , … , ℓ } i \in \{1, \ldots, \ell\} i∈{1,…,ℓ}, j ∈ { 1 , … , d } j \in \{1, \ldots, d\} j∈{1,…,d},对于超过两个轴的张量也是类似的计算方式。也就是说,如果我们有一个张量 B ∈ R m , ℓ , d B \in \mathbb{R}^{m,\ell,d} B∈Rm,ℓ,d,我们同样对最后一个维度定义softmax函数。为了避免产生歧义,我们详细写出来:
s o f t m a x ( B ) q , i , j = e x p B q , i , j ∑ j ′ = 1 d e x p B q , i , j ′ (3) softmax(B)_{q,i,j} = \frac{expB_{q,i,j}}{\sum_{j'=1}^dexpB_{q,i,j'}} \tag{3} softmax(B)q,i,j=∑j′=1dexpBq,i,j′expBq,i,j(3)
⭐ 说明softmax函数可以使用不同维度的张量, A i , j A_{i,j} Ai,j表示的二维张量, B q , i , j B_{q,i,j} Bq,i,j表示三维张量
⚡ 在本文所有的方法中,作者将假设存在一个嵌入矩阵 E ∈ R d × ∣ V ∣ E\in\mathbb{R}^{d\times|V|} E∈Rd×∣V∣,它将词汇空间映射到隐藏维度 d d d,表示为 E x ∈ R d Ex\in\mathbb{R}^{d} Ex∈Rd。
序列 w 1 : n w_{1:n} w1:n中的某个词元 w i w_{i} wi的嵌入 E w i Ew_{i} Ewi是一种上下文无关的表示,尽管 w i w_{i} wi出现在序列中,但 E w i Ew_{i} Ewi这一表示却与上下文无关。 然而,我们总是处理 w 1 : n w_{1:n} w1:n的嵌入版本,所以我们令 x = E w x=Ew x=Ew并且 x 1 : n = w 1 : n E T ∈ R n × d x_{1:n}=w_{1:n}E^T\in R^{n\times d} x1:n=w1:nET∈Rn×d。本文中讨论的方法的目标是开发一个强大的词元上下文表示,也就是 w i w_{i} wi表征 h i h_{i} hi,但同时也是整个序列 x 1 : n x_{1:n} x1:n的函数。例如:
一句话为W1:n = {"我要吃好吃的东西"}, W4对应的是‘好’这个token,它的表征h4不仅表征着W4,还表征着x1:n=w1:nET
⭐ 序列 x 1 : n x_{1:n} x1:n中词元 x i x_{i} xi的非上下文表示仅取决于 x i x_{i} xi本身的标识;而 x i x_{i} xi的上下文表示 h i h_{i} hi则依赖于整个序列(或前缀 x 1 : i x_{1:i} x1:i)。
二、循环神经网络
处理自然语言任务时,2017年左右的默认的选择是循环神经网络。通用的建模技术和表示方法在自然语言处理领域有着悠久的历史,其中各种技术经历了兴衰起伏。例如,词嵌入的历史远比我们在最初几节课中学习的word2vec词嵌入要长得多(Schutze,1992年)。同样,循环神经网络在建模问题上也有着漫长且并非单调发展的历史(Elman,1990年;Bengio等人,2000年)。然而,到了2017年,解决自然语言处理任务的基本策略却是从使用循环神经网络开始。一个简单的RNN可以用下面公式来表示:

其中, h t ∈ R d h_{t}\in R^d ht∈Rd, U ∈ R d × d U\in R^{d\times d} U∈Rd×d 并且 W ∈ R d × d W\in R^{d\times d} W∈Rd×d。
到 2017 年,人们的直观认识是循环神经网络形式存在两方面的问题,而这两个问题都与公式 4 中所强调的对序列索引的依赖(通常被称为对 “时间” 的依赖)有关。
1. 依赖序列索引存在的并行计算问题
现代图形处理单元(GPU)非常擅长并行处理大量简单操作(比如加法)。例如,当我有一个矩阵 A ∈ R n × k A\in\mathbb{R}^{n\times k} A∈Rn×k和一个矩阵 B ∈ R k × d B\in\mathbb{R}^{k\times d} B∈Rk×d时,GPU 在计算 A B ∈ R n × d AB\in\mathbb{R}^{n\times d} AB∈Rn×d时速度极快。然而,并行操作的限制至关重要——在以最简单的方式计算 A B AB AB时,我要进行一系列乘法运算,然后再进行一系列求和运算,其中大多数运算彼此并不依赖于对方的输出。但是,在循环神经网络中,当我进行计算时 :
h 2 = σ ( W h 1 + U x 2 ) (5) h_{2}=\sigma(Wh_{1}+Ux_{2}) \tag{5} h2=σ(Wh1+Ux2)(5)
⚡只有知道 h 2 h_{2} h2才能计算 h 1 h_{1} h1,所以上式需要被写成:
h 2 = σ ( W ( W h 0 + U x 1 ) + U x 2 ) (6) h_{2}=\sigma(W(Wh_{0}+Ux_{1})+Ux_{2}) \tag{6} h2=σ(W(Wh0+Ux1)+Ux2)(6)
同样地,如果我想计算 h 3 h_3 h3,在知道 h 2 h_2 h2之前我无法计算它,而在知道 h 1 h_1 h1之前我又无法计算 h 2 h_2 h2,以此类推。从直观上看,就如图1所示。随着序列变得越来越长,由于存在大量的串行依赖关系(串行意味着一个接一个),在图形处理单元(GPU)上,我能够对网络计算进行并行处理的程度非常有限。

📔 图1:按时间展开的循环神经网络(RNN)。 这些矩形表示循环神经网络的中间状态(例如,第一行是嵌入层,第二行是每个时间步的循环神经网络隐藏状态),第一行矩形中的数字表示在计算出这个中间状态之前需要执行的串行操作的数量。
随着图形处理单元(GPU)(后来,像张量处理单元(TPU)这样的其他加速器也变得更加强大),并且研究人员想要更充分地利用它们,这种对时间的依赖就变得站不住脚了。
2. 线性交互距离
循环神经网络(RNN)存在的另一个相关问题是,序列中距离较远的词元难以相互产生交互作用。这里所说的 “交互”,是指一个词元(之前已经出现过的)的存在能有效地影响另一个词元的处理过程。例如,在这样一个句子中:
The chef1 who ran out of blackberries and went to the stores is1
例如,将“chef”和“is”分隔开来的中间计算的数量——比如矩阵乘法和非线性运算——会随着它们之间单词的数量而增加。我们在图2中直观展示了这一点。

📔 图2:按时间展开的循环神经网络(RNN)。 这些矩形表示循环神经网络的中间状态(例如,第一行是嵌入层,第二行是每个时间步的循环神经网络隐藏状态),矩形中的数字大致是将单词“tea”的词汇信息与每个中间状态分隔开来的操作数量。
例如: is到chef的操作距离为11步;
直观地说,研究人员认为线性交互距离存在一个问题,因为当在观察到某个单词之后进行大量的运算操作时,网络很难精确地 “回忆” 起这个单词的存在。这可能会使得学习相距较远的单词应该如何影响当前单词的表示变得困难。
序列中元素之间这种直接交互的概念可能会让你联想到机器翻译中的注意力机制(Bahdanau等人,2014年)。在机器翻译的情境中,在生成译文时,我们学习了对于译文中的每个词元,如何回过去关注源语言序列。在本笔记中,我们将介绍一种完全基于注意力机制的方法,用以替代循环神经网络。这将同时解决循环神经网络中存在的并行化问题以及线性交互距离问题。
三、总结
由于循环神经网络在分析某一token的上下文关联时需要操作很多步骤,并且只有在知道上一时刻的状态时,才能计算下一时刻的状态,这给模型带来了很多限制。因此,当2017年Transformer架构出现后,NLP的处理放弃了循环神经网络的架构,而转向拥抱自注意力机制。下一篇文章将详细介绍自注意力机制。
欢迎大家讨论交流!
相关文章:
Transformer系列(一):NLP中放弃使用循环神经网络架构
NLP中放弃使用循环神经网络架构 一、符号表示与概念基础二、循环神经网络1. 依赖序列索引存在的并行计算问题2. 线性交互距离 三、总结 该系列笔记阐述了自然语言处理(NLP)中不再采用循环架构(recurrent architectures)的原因&…...
【人工智能】大模型的Prompt工程:释放DeepSeek潜能的艺术与科学
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 Prompt工程是大模型应用中的关键技术,通过精心设计的提示词(Prompt),用户能够有效引导模型生成高质量输出。本文深入探讨了优化DeepSee…...
9.QT-显示类控件|Label|显示不同格式的文本|显示图片|文本对齐|自动换行|缩进|边距|设置伙伴(C++)
Label QLabel 可以⽤来显⽰⽂本和图⽚ 属性说明textQLabel中的⽂本textFormat⽂本的格式.• Qt::PlainText 纯⽂本• Qt::RichText 富⽂本(⽀持html标签)• Qt::MarkdownText markdown格式• Qt::AutoText 根据⽂本内容⾃动决定⽂本格式pixmapQLabel 内部包含的图⽚.scaledCo…...
【c语言】深入理解指针1
深入理解指针1 一、数组名的理解二、使用指针访问数组三、一维数组传参本质四、二级指针 一、数组名的理解 数组名就是数组首元素的地址,类型是指针类型,但是存在两个例外: sizeof(arr) : 整个数组在内存中的大小 &arr : 整个数组的地址…...
4.QT-信号和槽|存在意义|信号和槽的连接方式|信号和槽断开|lambda表达式|信号和槽优缺点(C++)
信号和槽存在意义 所谓的信号槽,终究要解决的问题,就是响应用户的操作 信号槽,其实在GUI开发的各种框架中,是一个比较有特色的存在 其他的GUI开发框架,搞的方式都要更简洁一些~~ 网页开发 (js dom api) 网…...
单元测试的一般步骤
Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架,用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试;现问如何使用Qt进行单元测试&…...
UE5 渲染视频
文章目录 概述插件开始渲染渲染透明背景的视频 概述 渲染视频需要使用关卡序列 渲染原理就是将一个关卡序列渲染为序列帧 序列帧放到AE里会自动变成视频 UE版本是5.4.4 插件 首先开启新的渲染插件,否则会自动使用旧的渲染插件 插件里搜Render,开启这…...
pycharm无法识别到本地python的conda环境解决方法
问题一 现象描述: 本地已经安装了conda,但在pycharm中选择conda环境却识别不到, 解决方法:手动输入conda path,点击R eload environments基本就能修复,比如我的路径如下 /Users/test/conda/miniconda3/b…...
LFM调制信号分类与检测识别
LFM调制信号分类与检测识别 LFM调制信号分类识别AlexNet网络识别InceptionV3、ResNet-18、ResNet-50网络识别 LFM调制信号检测识别 LFM调制信号分类识别 支持识别LFM信号、间歇采样干扰(ISRJ)、灵巧噪声干扰(SNJ)、扫频干扰(SJ)、瞄准干扰(AJ)、阻塞干扰(BJ)、密集假目标干扰(…...
头歌实训之连接查询
🌟 各位看官好,我是maomi_9526! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C语言的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更…...
基于 pnpm + Monorepo + Turbo + 无界微前端 + Vite 的企业级前端工程实践
基于 pnpm Monorepo Turbo 无界微前端 Vite 的企业级前端工程实践 一、技术演进:为什么引入 Vite? 在微前端与 Monorepo 架构落地后,构建性能成为新的优化重点: Webpack 构建瓶颈:复杂配置导致开发启动慢&#…...
常见的服务器硬盘接口
常见的服务器硬盘接口有SATA、SAS、M.2、U.2 一、SATA接口 SATA(Serial Advanced Technology Attachment)是广泛应用于存储设备的串行接口标准,在服务器中主要用于连接大容量机械硬盘(HDD)或经济型固态硬盘ÿ…...
一文读懂Python之numpy模块(34)
一、模块简介 numpy是Python语言中做科学计算的基础库,重在于数值计算,有一个强大的N维数组对象Array,同时NumPy 提供了大量的库函数和操作,可以帮助程序员轻松地进行Array数值计算。 numpy在数据分析和机器学习领域被广泛使用。…...
SpringBoot编写单元测试
pom.xml引入单元测试的坐标 <!--单元测试坐标--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>编写单元测试类 测试类…...
C++ static 关键字的用途与特点
static 关键字在 C 中是一个多功能的关键字,用于控制变量的存储期、作用域和链接属性。 局部静态变量 在函数内定义的局部变量前加上 static,该变量就成为局部静态变量。 局部静态变量具有以下特点: 存储期 :静态存储期&#…...
Python爬虫实战:基于 Scrapy 框架的微博数据爬取研究
一、引言 1.1 研究背景 在当今数字化时代,社交媒体已成为信息传播和公众交流的重要平台。微博作为国内极具影响力的社交媒体之一,每日产生海量的用户生成内容,涵盖新闻资讯、社交互动、娱乐八卦、热点话题讨论等多个领域。这些数据不仅反映了公众的兴趣偏好、情感态度和社…...
目标分割模型优化自身参数都是梯度下降算法吗?
在计算机视觉的深度学习任务中,诸如 CNN、FCN、U-Net、DeepLab 系列模型已成为图像分类与图像分割任务的核心架构。它们在网络结构和任务上有所差异,但是否共享同一种优化机制?是否都使用梯度下降?优化过程中又有什么本质区别&…...
基于springboot的商城
1 项目使用技术 后端框架:SpringBoot 数据库:MySQL 开发工具:IDEA 2 项目功能模块 商城功能包含前台和后台。 (1)前台主要包含:用户注册登录模块、首页模块、搜索模块、商品详情、购物车、提交订单、…...
MATLAB 控制系统设计与仿真 - 37
范数鲁棒控制器的设计 鲁棒控制器的设计 根据双端子状态方程对象模型结构,控制器设计的目标是找到一个控制器K(s),它能保证闭环系统的范数限制在一个给定的小整数下,即 这时控制器的状态方程为: 其中X与Y分别为下面两个代数Riccati方程的解…...
英码科技与泊川软件,携手加速AI与嵌入式系统融合创新
2025年4月15日,广州英码信息科技有限公司(以下简称“英码科技”)与广州泊川软件技术有限公司(以下简称“泊川软件”) 正式签署战略合作框架协议。此次合作将充分发挥双方在AI计算硬件与嵌入式操作系统领域的技术优势&a…...
电脑 访问 github提示 找不到网页,处理方案
1、找到 本机的 host文件 例如 windows 的 一般在 C:\Windows\System32\drivers\etc\hosts 用管理员身份打开 hosts 文件 如果文件中没有 github的配置,需要自己手动添加上去; 如果有,则需要 检查 github.com 与 github.global.ssl.fastly.…...
Linux学习——了解和熟悉Linux系统的远程终端登录
Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare,选择编辑虚拟机设置,在网络适配器设置中,选择“桥接模式”,保存设置并启动Ubuntu。 2、配置Ubuntu的…...
AI 中的 CoT 是什么?一文详解思维链
文章目录 CoT 的组成CoT 的作用CoT 的推理结构变体CoT 的特点CoT 的适用场景总结 在人工智能领域,尤其是自然语言处理和机器学习中,有一种名为思维链(Chain of Thought,CoT)的技术,它正逐渐改变着我们对 AI…...
【OC】AVPlayerLayer的学习
文章目录 前言关于AVPlayer概念及作用具体方法及使用 关于AVPlayerLayer基本概念及作用具体用法 AVPlayer与AVPlayerLayer结合实现视频播放应用使用本地视频使用网络请求申请视频数据 总结 前言 在编写类视频软件项目时,涉及到视频播放的问题,我们需要给…...
C++笔记-list
list即是我们之前学的链表,这篇主要还是讲解list的底层实现,前面会讲一些list区别于前面string和vector的一些接口以及它们的注意事项。 一.list的基本使用 和之前的string,vector一样,有很多之前见过的一些接口,经过…...
k8s报错kubelet.go:2461] “Error getting node“ err=“node \“k8s-master\“ not found“
问题 首先最初问题: [rootk8s-master ~]# kubectl get pods -owide --all-namespaces The connection to the server 192.168.2.129:6443 was refused - did you specify the right host or port?检查kubelet状态 查看kubelet status报找不到master节点 [rootk8…...
open webui 介绍 是一个可扩展、功能丰富且用户友好的本地部署 AI 平台,支持完全离线运行。
AI MCP 系列 AgentGPT-01-入门介绍 Browser-use 是连接你的AI代理与浏览器的最简单方式 AI MCP(大模型上下文)-01-入门介绍 AI MCP(大模型上下文)-02-awesome-mcp-servers 精选的 MCP 服务器 AI MCP(大模型上下文)-03-open webui 介绍 是一个可扩展、功能丰富且用户友好的…...
使用cursor进行原型图设计
1.下载cursor 2.模式设置: 模型使用claude-3.7-sonnet的think模式 3.引导词模板: 我想要开发一个中高考英语口语考试的模拟考试系统,我需要将上面的这个应用输出成高保真的原型图设计。请考虑以下的规范: 用户体验࿱…...
极狐GitLab 登录限制如何设置?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 登录限制 (BASIC SELF) 您可以使用登录限制自定义 Web 界面以及基于 HTTP(S) 的 Git 的身份验证限制。 设置 要访问登录限…...
设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用
目录 一、设计思路 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 二、UML类图(PlantUML格式) 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 三、实现过程与结果 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 四、总结 在面向对…...
