语言模型 (Language Model, LM) 是自然语言处理的核心,其根本任务是计算一个词序列(即一个句子)出现的概率。
一个好的语言模型能够告诉我们什么样的句子是通顺的、自然的。在多智能体系统中,语言模型是智能体理解人类指令、生成回应的基础。
Sequence Transduction Model: 序列转导模型 处理序列数据的模型,序列数据就是具有顺序关系的数据,每个元素的序列对于数据的整体含义非常重要,最典型的序列转导任务有文本翻译、文本生成、语音转文字等。
背景及问题
过去的发展历程以及存在的问题
1. 传统机器学习
机器学习的核心任务是让计算机从数据中自动发现规律。
最早起的机器学习方法,比如线性回归、逻辑回归、支持向量机等,已经能解决很多简单问题,但它们又两个绕不开的瓶颈。
-
线性模型表达力不足 线性回归和逻辑回归都假设输出与输入之间是线性关系。但现实世界几乎不存在纯粹的线性问题。比如判断一张图里是猫还是狗,像素与类别之间是极度复杂的非线性映射,用线性模型强行拟合,效果会非常差。
-
人工特征工程成本高 为了让线性模型也能处理非线性问题,传统做法是人工设计特征:把原始数据转换成更利于模型分类的表征。比如图像处理里,人们手工设计边缘检测算子、颜色直方图;自然语言处理里,人们设计词频、TF-IDF等特征。问题是,这些特征依赖大量专家经验,还往往只针对某一类任务,换一个任务就得重新设计。
于是研究者思考:能不能让机器自己从原始数据中学习特征,同时也能拟合非线性关系?这催生了神经网络。
2. 感知机和神经网络的诞生
1943年,McCulloch和Pitts提出了第一个神经元的数学模型。1958年,Rosenblatt在此基础上发明了感知机,这是第一个真正意义上的神经网络模型。
感知机的结构很简单:输入特征乘以权重,求和后经过一个阶跃激活函数,输出0或1。它本质上仍然是一个线性分类器,但已经具备“自动学习权重”的能力,可以通过简单的训练规则对线性可分数据进行分类。
它解决的问题:让机器自动学习分类边界,不再完全依赖人工规则。
它留下的问题:1969年Minsky和Papert在《Perceptrons》一书中证明,感知机连“异或”这样简单的非线性问题都无法解决。因为异或问题的决策边界不是一条直线,而是两条直线组合出来的。这一结论直接导致神经网络研究陷入近20年的低谷。
关键矛盾在于:单层感知机是线性的,而现实问题是非线性的。如果增加一层,让网络变深,是不是就能解决异或?理论上可以,但当时没有有效的训练算法,多层网络无法学习。
直到1986年,Rumelhart等人重新推广了反向传播算法,这个问题才被突破。
神经网络是深度学习的形式基础,深度学习是神经网络的深度化、规模化发展。 你完全可以理解为:所有深度学习模型都是神经网络,但并非所有神经网络都叫深度学习。
反向传播算法的提出,让多层神经网络终于可以被有效训练。于是出现了真正意义上的FNN,也就是包含一个或多个隐藏层的前馈神经网络,也称为多层感知机。
3. FNN
FNN(Feedforward Neural Network),前馈神经网络。
是最基础、最经典的人工神经网络模型。
3.1它的核心特征
核心特征是信息单向流动:输入数据从输入层进入,经过一个或多个隐藏层的逐层计算,最终由输出层产生结果。整个过程中不存在反馈连接,也没有循环结构,因此被称为“前馈”。
FNN的设计初衷,是让机器能够自动学习输入到输出之间的复杂映射关系。它不需要人为指定规则,而是依靠调整大量参数来拟合数据中的规律。
3.2它的核心机制
FNN信息单向流动:输入层 → 隐藏层 → 输出层。每一层的每个神经元都与上一层的所有神经元相连。隐藏层中引入非线性激活函数,比如Sigmoid、Tanh,后来常用ReLU。
它的表达能力由万能近似定理保证:只要隐藏层神经元数量足够多,FNN可以以任意精度逼近任何一个连续函数。
3.3网络结构
一个完整的FNN由三部分组成:
- 输入层
接收原始数据的特征向量。每个神经元对应一个特征维度,比如房价预测中的面积、位置、房龄等。输入层本身不做计算,只是把数据传递给下一层。
- 隐藏层
可以有一层或多层。隐藏层中的每个神经元都会对上一层的输出进行加权求和、加上偏置,再通过激活函数产生新的输出。隐藏层是FNN表达能力的核心,也是“深度”的来源。
- 输出层
输出层产生最终预测结果。根据任务不同,输出层可以设计为一个或多个神经元,并使用不同的激活函数。每一层之间都是“全连接”的:当前层的每个神经元都与上一层的所有神经元相连,每一层内部的神经元相互独立。这种全连接结构让FNN能够捕捉输入特征之间任意形式的组合关系。
3.4数学表达与前向传播
以一个包含一个隐藏层的FNN为例。假设输入为向量 $x$,隐藏层权重为 $W^{(1)}$,偏置为 $b^{(1)}$,激活函数为 $f$,则隐藏层输出为:
$$h = f(W^{(1)}x + b^{(1)})$$
输出层的权重为 $W^{(2)}$,偏置为 $b^{(2)}$,激活函数为 $g$,则最终输出为:
$$y = g(W^{(2)}h + b^{(2)})$$
如果有多个隐藏层,就不断重复这个过程。从输入到输出的整个计算过程称为前向传播,它相当于在输入空间中进行一系列线性变换和非线性扭曲,把原始数据映射到任务所需要的输出空间。
3.5 激活函数
激活函数是FNN中不可缺少的部分。如果没有激活函数,多层线性变换叠加起来仍然是线性变换,无论网络多深,表达能力都和单层线性模型一样,无法解决非线性问题。
激活函数为神经网络引入了非线性,使得网络能够学习复杂的决策边界。
常见激活函数包括:
- Sigmoid:输出范围0到1,常用于二分类输出层。缺点是容易造成梯度饱和,导致训练缓慢。
- Tanh:输出范围-1到1,效果通常优于Sigmoid,但同样存在饱和问题。
- ReLU:当输入为正时输出等于输入,为负时输出0。计算简单,能缓解梯度消失,是当前隐藏层最常用的激活函数。
- Leaky ReLU:负半轴保留一个很小的斜率,避免ReLU中神经元死亡的问题。
- Softmax:用于多分类输出层,把多个神经元的输出转换为概率分布,且所有概率之和为1。
3.6 损失函数与输出层设计
训练FNN需要一个明确的优化目标,即损失函数。根据任务类型选择合适的损失函数和输出层:
- 回归问题:输出层使用线性激活或不使用激活函数,损失函数常用均方误差。
- 二分类问题:输出层一个神经元,使用Sigmoid激活,损失函数用二元交叉熵。
- 多分类问题:输出层多个神经元,使用Softmax激活,损失函数用交叉熵。
损失函数衡量模型预测值与真实值的差距。训练的目标就是不断降低损失函数的值。
3.7 训练过程
FNN的训练过程基于反向传播算法和梯度下降优化,包含以下步骤:
- 前向传播:输入样本经过网络逐层计算,得到预测值。
- 计算损失:用损失函数比较预测值和真实值。
- 反向传播:利用链式法则从输出层向输入层逐层计算损失对每个参数的梯度。
- 参数更新:使用优化器根据梯度更新所有权重和偏置,使损失下降。
反向传播是FNN训练的核心。它让每一层的参数都能明确知道应当向哪个方向调整,以减小误差。梯度下降常用的变体包括随机梯度下降、Momentum、RMSProp和Adam等。
训练过程中还会涉及学习率选择、批量大小设置、正则化手段、 dropout、权重初始化等细节,这些对最终模型的性能影响极大。
3.8 它解决了什么
- 非线性建模:非线性激活函数打破了线性限制,可以拟合复杂决策边界,异或问题迎刃而解。
- 自动特征提取:隐藏层逐层变换,自动从原始输入中学习对任务有用的特征,不再需要人工设计。
- 统一学习框架:反向传播、梯度下降、损失函数、参数更新,这套标准流程被继承到所有后来的深度模型中。
它留下的问题
- 输入维度固定:FNN的输入向量长度必须在设计时就固定,无法处理变长的文本、语音。
- 参数爆炸:全连接结构导致参数量随层数快速膨胀。一张256×256的灰度图有65536个像素,输入层第一个隐藏层就有65536个权重,训练极其困难。
- 丢失空间结构:图像展平成向量后,像素之间的相对位置关系完全消失,局部相关性被破坏。
- 梯度消失:层数加深后,反向传播梯度在层层相乘中迅速衰减,网络很难训练。
于是,针对图像数据,CNN站出来解决空间结构问题。
4. CNN
CNN(Convolutional Neural Network):卷积神经网络,是一类专门处理网络结构数据的深度学习模型,最典型的应用对象是图像。
它的基本思想来源于生物视觉皮层的研究。Hubel和Wiesel在1962年发现,猫的视觉皮层中的神经元只对视野中某个局部区域的特定模式产生反应,这些神经元像“局部探测器”一样,一层层从简单特征组合出复杂特征。CNN就是模仿这种局部感知、层次化抽象机制设计的。
CNN与FNN最大的区别是:FNN每个神经元连接上一层所有神经元,而CNN每个神经元只连接上一层的一个局部区域,并且同一个卷积核在整张图上共享权重。这种设计大幅减少了参数量,同时保留了空间结构。
4.1 它为何出现
FNN处理图像有两个致命伤:参数量太大,而且丢掉空间结构。人眼识别图像时,本质是局部的边缘、纹理组合成物体,而不是把每个像素孤立看待。CNN就是模仿这种局部感知机制设计的。
4.2 它的核心机制
- 局部感受野:每个卷积核只与输入的一小片区域连接,提取局部特征。
- 权值共享:一个卷积核在整个特征图上滑动,意味着同样的特征检测器被重复使用。参数数量急剧下降。
- 池化:对局部区域做最大值或平均值采样,降低空间分辨率,增强平移不变性,同时进一步减少参数。
- 层次化特征:浅层卷积核学到边缘、颜色块,深层卷积核组合出五官、部件等高级语义。
4.3 核心结构
一个典型的CNN由三类层交替堆叠而成:卷积层、池化层、全连接层。
- 卷积层 积层是CNN的灵魂。它由多个卷积核(也叫滤波器)组成,每个卷积核是一个小尺寸的权重矩阵,比如3×3、5×5。
卷积的计算过程:卷积核在输入特征图(比如一张图像的像素矩阵)上从左到右、从上到下滑动,每滑动一个位置,就把卷积核覆盖的区域与卷积核本身逐元素相乘并求和,得到一个输出值。所有位置计算完,就得到一个新的特征图。
比如输入是一个32×32的灰度图像,使用一个3×3的卷积核,生成一个30×30的特征图。如果使用多个卷积核,就会生成多个特征图,每个特征图可以理解为检测某一种特定模式的结果。
卷积层的核心特征: - 局部感受野:卷积核每次只看到输入的一个小区域,提取局部特征。 - 权值共享:同一个卷积核在整幅图上滑动,意味着同一特征检测器被复用到所有位置。这是参数量大幅下降的关键。 - 平移等变性:如果目标在图像中移动,卷积输出也会相应平移,这意味着模型对位置变化具有一定的不变性。
卷积层的关键超参数包括: - 卷积核大小:决定感受野的大小。 - 步长:卷积核每次滑动的距离,步长越大,输出特征图越小。 - 填充:在输入边缘补零,控制输出尺寸并保留边缘信息。 - 卷积核数量:决定输出的通道数,也就是提取多少种特征。 - 池化层: 池化层也叫下采样层,它的作用是缩小特征图的空间尺寸,同时对局部特征进行聚合。 最常见的两种池化: - 最大池化:在窗口内取最大值。 - 平均池化:在窗口内取平均值。 池化的作用: - 降维:减小特征图尺寸,大幅降低后续计算量。 - 平移不变性:目标在局部区域内有微小移动时,池化结果基本不变。 - 扩大感受野:每经过一次池化,后续卷积能看到更大范围的原始图像区域。 - 防止过拟合:压缩特征,减少冗余信息。 - 全连接层 在CNN的末端,经过多个卷积和池化后,特征图被展平为一维向量,然后送入一个或多个全连接层,最后通过Softmax之类的输出层得到分类结果。全连接层的作用是整合前面提取到的高层语义特征,做出全局决策。
4.4 它解决了什么
回顾FNN的局限,CNN给出了针对性解决方案: - 空间结构丢失:卷积操作天然保留像素之间的二维位置关系。 - 参数爆炸:权值共享让参数量从全连接的千万级降到万级。 - 特征提取困难:传统方法需要人工设计算子,CNN通过卷积核自动学习各种视觉特征,从边缘到物体部件,完全数据驱动。从原始像素到高层语义,全部由网络自动学习,远超人工特征的效果。
标志性事件:1998年LeCun提出LeNet,应用于手写数字识别。2012年AlexNet在ImageNet上用CNN实现巨大突破,掀起深度学习浪潮。
4.5 它留下的问题
CNN擅长处理网格结构,但面对序列数据就力不从心了。
- 文本、语音是变长序列,CNN通常需要固定窗口或额外处理。
- CNN的感受野有限,要看到很远的依赖关系必须堆叠很多层。
- 序列中“词序”和“时间顺序”对语义至关重要,CNN没有天然机制建模这种顺序关系。
而RNN正是为了序列数据而生的。
5. RNN
RNN(Recurrent Neural Network),循环神经网络,是一类专门处理序列数据的神经网络模型。
它与FNN、CNN最大的区别在于: 网络内部存在循环连接。
在FNN中,信息单向流动,每个输入独立处理,彼此无关。
而RNN在每一个时间步处理完当前输入后,也把当前状态保留下来,并传递到下一个时间步的计算中。
这种记忆能力,让RNN能够捕捉序列中前后的依赖关系。
一个直观的理解是:RNN在读取一个句子时,读到当前位置的词语时,会结合前面已经读过的内容来理解当前词的意义。比如:
- “我喜欢苹果”和“苹果喜欢我”,词完全相同,但顺序不同,意义完全相反。
- 读“苹果”这个词时,如果前面是“我喜欢”,它指一种水果;如果前面是“我咬了一口”,仍然是水果;但如果前面是“我打开了”,则可能指手机品牌。
RNN就是通过循环结构,让网络在每一步都保留并整合历史信息。
5.1 它为何出现
自然语言、语音、股票价格这类数据有一个共同特点:存在时间顺序,前后状态密切相关。
比如“我喜欢苹果”和“苹果我喜欢”意思大不相同。FNN和CNN都不适合建模这种顺序依赖,因为它们的计算是“一次成形”,没有记忆。
FNN:输入维度固定,无法处理长度可变的序列。即使强行把句子填充到固定长度,也会把每个词当作独立特征对待,完全没有顺序概念。“我打你”和“你打我”在FNN看来是一样的。
CNN:图像中的二维卷积很容易扩展到文本吗?理论上可以用一维卷积处理词序列,但卷积核只能捕捉窗口内的局部关系,比如相邻几个词。如果句子中前后相隔很远的词之间存在依赖,就需要堆叠很多层卷积才能建立联系,效率极低且难以训练。
更重要的是,这两种模型都没有时间记忆。它们把当前输入映射到输出时,无法参考之前输入的信息。
而现实世界有大量顺序依赖的数据:
- 自然语言:词与词之间存在复杂的上下文关系。
- 语音:当前发音受前后音素影响。
- 股票价格:当前价格受历史走势影响。
- 视频帧:当前画面与前后帧相关。
RNN正是为了这类数据而设计。
RNN引入循环连接,让网络在每一时刻都接收当前输入和上一时刻的隐藏状态,从而实现对历史信息的记忆。
5.2 它的核心机制
RNN的核心是一个循环单元。它在每个时间步执行同样的计算,但每步输入包括两部分:
- 当前时刻的输入 $x_t$
- 上一时刻的隐藏状态 $h_{t-1}$
隐藏状态可以理解为网络的“记忆”,它编码了从序列开始到当前时刻的所有历史信息。
每个时间步的更新公式为: $$h_t = \tanh(W_{xh} x_t + W_{hh} h_{t-1} + b)$$
每次更新时,隐藏状态 $h_t$ 同时包含当前输入的信息和以前所有时刻的压缩信息。因此,理论上RNN可以建模任意长度的序列依赖。
输出可以表示为:
$$y_t = W_{hy} h_t + b_y$$
其中 $W$ 是权重矩阵,$b$ 是偏置。注意:所有时间步共享同一套权重。这意味着RNN在不同时间步使用相同的变换规则来处理不同时刻的输入,就像一个人在阅读不同词语时使用相同的语言理解能力。
把RNN按时间线展开,可以看出它其实是一个“深度的”前馈网络,只是深度方向是沿着时间轴延伸的。这就是为什么RNN也被称为“时间深度神经网络”。
5.3 RNN的训练:随时间反向传播
RNN的训练算法称为BPTT(Backpropagation Through Time,随时间反向传播)。
核心思想是把RNN按照时间步展开成一个深度网络,然后使用标准的反向传播计算梯度。
具体步骤:
- 前向传播:按时间顺序逐帧计算隐藏状态和输出。
- 计算损失:将所有时间步的预测与真实值比较,计算总损失。
- 反向传播:从最后一个时间步开始,逆着时间顺序逐步计算损失对每个参数的梯度。
- 参数更新:将梯度累加之后,用梯度下降更新共享权重。
BPTT与普通反向传播本质相同,只是梯度需要沿着时间轴往回传递很远。这样,早期时间步的权重也能收到来自后期损失的梯度信号。
5.4 它解决了什么
- 变长序列输入:序列长度可以任意,不再需要固定输入维度。
- 序列依赖建模:隐状态保留了历史信息,能够处理语言中的上下文、语音中的前后音素关系。
- 参数共享:所有时间步共享同一组参数,这意味着无论序列多长,模型参数量都保持不变,并且可以在不同长度的序列上泛化。
5.5 RNN的常见应用
RNN在自然语言处理领域用途广泛:
- 语言模型:预测下一个词。
- 机器翻译:最早期基于Seq2Seq框架。
- 语音识别:把声学特征序列映射为音素或文本。
- 文本生成:比如自动写诗、生成评论。
- 情感分析:判断一段文本的正面或负面情绪。
- 时间序列预测:股票走势、天气预测、交通流量预测。
在CNN与RNN结合的场景中,常见做法是用CNN提取图像特征,再用RNN生成图像描述等文本输出。
5.6 它留下的问题
理论上RNN可以建模任意长度的依赖,但实践中,当序列很长时,它很难记住早期信息。这个问题来自反向传播时梯度的指数变化。
BPTT时,要计算早期时间步的梯度,需要沿着时间链乘上很多轮的权重矩阵 $W_{hh}$。如果权重矩阵的最大特征值小于1,梯度会指数衰减,趋向于0,导致早期参数几乎收不到梯度,网络无法学习长期依赖。这叫梯度消失。如果最大特征值大于1,梯度会爆炸式增长,导致训练不稳定,这叫梯度爆炸
换句话说,RNN的记忆是短期的。它对于句子中相邻的几个词能很好建模,但相隔数十步甚至上百步的信息,很难传递。
- 梯度消失/爆炸:反向传播沿着时间步展开,链条过长,梯度不断相乘,早期信息很容易被“忘记”。LSTM和GRU通过门控机制缓解,但并没有根治。
- 无法并行:计算是串行的,当前时刻必须等上一时刻算完,导致训练速度极慢,很难扩展到大规模数据。
- 长距离依赖仍然困难:虽然LSTM能记忆较远的依赖,但跨越极长距离时依然力不从心。
5.7 RNN的变体:LSTM和GRU
LSTM(长短期记忆网络)
LSTM在1997年被Hochreiter和Schmidhuber提出,通过引入门控机制来控制信息的流入、流出和遗忘。
LSTM的隐状态结构比普通RNN复杂得多,核心包括:
- 细胞状态 $C_t$:贯穿整个序列的“传送带”,用来保存长期记忆。
- 遗忘门:决定从细胞状态中丢弃哪些旧信息。
- 输入门:决定将哪些新信息存入细胞状态。
- 输出门:决定从细胞状态中输出哪些信息到当前隐藏状态。
通过这些门控,LSTM可以选择性地记住重要信息、遗忘无关信息,从而有效地缓解梯度消失问题。LSTM能够记住跨越数百步的信息,成为处理长序列的主流模型。
GRU(门控循环单元)
GRU是LSTM的简化版本,由Cho等人于2014年提出。它只使用两个门:
- 更新门:综合了LSTM的遗忘门和输入门,控制当前状态中被历史信息保留多少、新信息加入多少。
- 重置门:控制当前状态对历史信息的忽略程度。
GRU参数更少,计算更快,在某些任务上效果与LSTM相当甚至更好。
LSTM和GRU极大地提升了RNN在长序列任务上的表现,但它们依然无法从根本上解决串行计算的问题。
RNN解决了序列数据建模的问题,但仍有两个缺陷推动技术继续演进:
- 长距离依赖困难:尽管LSTM缓解,但底层串行结构使任意两个位置的联系路径仍然很长,信号传递效率有限。
- 无法并行:带来训练速度瓶颈。
为了解决这两个问题,研究者首先引入注意力机制,让解码器能直接访问编码器任意位置的隐状态,绕过长程传递。随后Transformer彻底抛弃循环结构,用自注意力实现所有位置两两直接交互,并把顺序关系通过位置编码注入模型,实现了完全的并行化。
可以说,RNN是Transformer的前夜,它的辉煌和局限共同孕育了注意力机制和Transformer架构。
此外,很多任务不只是“序列输入”,还需要“序列到序列”的变换,比如翻译。于是Encoder-Decoder框架被提了出来。
6. Encoder&Decoder
6.1 它为何出现
机器翻译的目标是:输入一句英文,输出一句中文。输入和输出都是变长序列,且长度不一定相等。RNN本身能处理序列,但怎么把一个序列的语义转移到另一个序列?需要一个通用框架。
6.2 它的核心机制
Encoder-Decoder,也叫Seq2Seq,结构分为两部分:
- Encoder:用RNN(通常是LSTM)读取整个输入序列,逐步编码,最后将最后一个时刻的隐状态作为整个句子的语义向量。
- Decoder:另一个RNN以这个语义向量为初始状态,逐字生成输出序列,每生成一个词,就作为下一步输入。
它解决的问题:首次统一了不同长度序列之间的映射问题,成为机器翻译、对话系统、文本摘要等任务的标准架构。
6.3 它留下的问题
Encoder必须把整个输入序列的全部信息压缩进一个固定长度的向量中。句子越长,信息损失越严重。翻译长句时,解码器会遗忘开头的内容。
于是,注意力机制出现了。
7. 注意力机制连接增强Encoder&Decoder
让解码器学会“回头看”
7.1 它为何出现
为了解决信息瓶颈,Bahdanau等人于2015年提出注意力机制。核心直觉是:人在翻译一个句子时,并不是先看完整句话再翻,而是在翻译每个词时重点关注原文中与之对应的部分。
7.2 它的核心机制
解码器生成第 $t$ 个词时,不再只依赖Encoder最后的固定向量,而是:
- 计算当前解码器隐状态与Encoder每一步隐状态的相似度得分。
- 对得分做Softmax,得到注意力权重。
- 用这些权重对Encoder所有隐状态做加权平均,得到一个动态的上下文向量。
这样,解码器每一步都能“关注”到输入序列中最重要的部分。
7.3 它解决了什么
- 信息瓶颈:每个输出词都能直接获取输入序列任意位置的信息,不再依赖单点压缩向量。
- 长序列性能:机器翻译在长句上的效果得到显著提升。
- 可解释性:注意力权重可视化后,能直观看到模型在翻译某词时关注了原文的哪些词。
7.4 它留下的问题
注意力机制虽然强大,但它仍然是依附在RNN之上的。底层RNN的串行计算依然存在,训练速度依然是瓶颈。而且Attention的计算本身可以并行,却被RNN的顺序结构拖累。如果完全去掉RNN和CNN,只用注意力机制来建模所有关系,会怎样?
这个想法催生了Transformer。
8.Transformer结构
彻底抛弃循环与卷积
8.1 它为何出现
2017年,Google在《Attention Is All You Need》中提出了Transformer。它的核心理念是:不需要CNN和RNN,只用注意力机制也能完成序列建模,而且效果更好、速度更快。
8.2 它的核心机制
- 自注意力 Self-Attention:序列中每个token都与序列中所有token计算相关性,得到一个加权表征。任意两个位置之间的距离直接缩短为一步,长程依赖不再依赖路径长度。
- 多头注意力 Multi-Head Attention:把输入映射到多个不同的子空间分别做注意力,让模型从不同角度捕捉依赖关系。
- 位置编码 Positional Encoding:注意力本身不包含顺序信息,所以给每个token加入正弦余弦位置编码或可学习的位置向量,让模型感知先后顺序。
- 前馈网络 + 残差连接 + 层归一化:每个注意力层后接一个前馈网络,并通过残差和归一化保证深层网络稳定训练。
- 掩码自注意力:解码器生成时只能看到当前时刻之前的内容,避免提前“看到”未来。
8.3 它解决了什么
- 并行训练:Self-Attention所有位置的计算可以同时进行,训练速度远超RNN。
- 长程依赖:任意两个token直接交互,彻底解决RNN梯度消失带来的长距离遗忘问题。
- 全局建模:相比CNN的局部感受野,Self-Attention一上来就能看到整个序列的全局信息。
- 通用架构:不再依赖领域特定的归纳偏置,既能处理文本、语音,也能处理图像、视频,甚至多模态数据。
8.4 它的深远影响
Transformer成为GPT、BERT、T5等现代大模型的基础架构。它本身也是Encoder-Decoder结构:Encoder用来理解输入,Decoder用来生成输出。后来根据不同任务,衍生出Encoder-only(BERT)、Decoder-only(GPT)、Encoder-Decoder(T5)等多种变体。
可以说,现在几乎所有大语言模型,本质上都是基于Transformer的。
总结
从机器学习到神经网络的演进,本质上是一条不断解决“表达力不足”和“结构适配”的道路:
| 模型 | 解决的核心问题 | 留下的问题 |
|---|---|---|
| 传统机器学习 | 线性模型、人工特征 | 无法自动学习非线性映射 |
| 感知机 | 自动学习线性分类 | 无法解决非线性问题 |
| FNN | 非线性拟合、自动特征提取 | 输入固定、参数爆炸、忽略结构 |
| CNN | 图像空间结构、参数缩减 | 不适合序列建模和长依赖 |
| RNN | 序列顺序依赖、变长输入 | 串行计算、梯度消失、长依赖困难 |
| Encoder-Decoder | 变长序列到变长序列的映射 | 信息瓶颈 |
| 注意力机制 | 解码时动态关注输入 | 底层RNN仍是瓶颈 |
| Transformer | 并行化、全局长程建模 | 成为大模型时代的基础 |
这条演进路线,每一步都是为了回答“前面的模型到底哪里不够好”而诞生。Transformer站在这条路的顶端,但你刚才的问题也说明:理解Transformer最好的方式,就是先理解它之前每一步模型背后的动机。