语言模型与 Transformer 架构从 N-gram 到 RNN语言模型 (Language Model, LM)是自然语言处理的核心其根本任务是计算一个词序列即一个句子出现的概率。在多智能体系统中语言模型是智能体理解人类指令、生成回应的基础。统计语言模型与N-gram的思想在深度学习兴起之前统计方法是语言模型的主流。概率的链式法则其核心思想是一个句子出现的概率等于该句子中每个词出现的条件概率的连乘。马尔可夫假设 (Markov Assumption)其核心思想是我们不必回溯一个词的全部历史可以近似地认为一个词的出现概率只与它前面有限的 n−1 个词有关。基于这个假设建立的语言模型我们称之为N-gram模型。这些概率可以通过在大型语料库中进行最大似然估计(Maximum Likelihood Estimation,MLE)来计算其思想非常直观最可能出现的就是我们在数据中看到次数最多的。N-gram缺陷数据稀疏性 (Sparsity) 泛化能力差模型无法理解词与词之间的语义相似性。神经网络语言模型与词嵌入N-gram 模型的根本缺陷在于它将词视为孤立、离散的符号。思想用连续的向量来表示词。构建一个语义空间创建一个高维的连续向量空间然后将词汇表中的每个词都映射为该空间中的一个点。这个点即向量就被称为词嵌入 (Word Embedding)或词向量。在这个空间里语义上相近的词它们对应的向量在空间中的位置也相近。学习从上下文到下一个词的映射利用神经网络的强大拟合能力来学习一个函数。这个函数的输入是前 n−1 个词的词向量输出是词汇表中每个词在当前上下文后出现的概率分布。在这个架构中词嵌入是在模型训练过程中自动学习得到的。一旦我们将词转换成了向量我们就可以用数学工具来度量它们之间的关系。最常用的方法是余弦相似度 (Cosine Similarity)它通过计算两个向量夹角的余弦值来衡量它们的相似性。神经网络语言模型通过词嵌入成功解决了 N-gram 模型的泛化能力差的问题。然而它仍然有一个类似 N-gram 的限制上下文窗口是固定的。神经网络语言模型虽然引入了词嵌入解决了泛化问题但它和 N-gram 模型一样上下文窗口是固定大小的。为了预测下一个词它只能看到前 n−1 个词再早的历史信息就被丢弃了。这显然不符合我们人类理解语言的方式。循环神经网络 (RNN) 与长短时记忆网络 (LSTM)为了打破固定窗口的限制循环神经网络 (Recurrent Neural Network, RNN) 应运而生其核心思想非常直观为网络增加“记忆”能力。RNN 的设计引入了一个隐藏状态 (hidden state) 向量我们可以将其理解为网络的短期记忆。在处理序列的每一步网络都会读取当前的输入词并结合它上一刻的记忆即上一个时间步的隐藏状态然后生成一个新的记忆即当前时间步的隐藏状态传递给下一刻。然而标准的 RNN 在实践中存在一个严重的问题长期依赖问题 (Long-term Dependency Problem)。为了解决长期依赖问题长短时记忆网络 (Long Short-Term Memory, LSTM)被设计出来。LSTM 是一种特殊的 RNN其核心创新在于引入了细胞状态 (Cell State)和一套精密的门控机制 (Gating Mechanism)。细胞状态可以看作是一条独立于隐藏状态的信息通路允许信息在时间步之间更顺畅地传递。门控机制则是由几个小型神经网络构成它们可以学习如何有选择地让信息通过从而控制细胞状态中信息的增加与移除。遗忘门、输入门、输出门Transformer 架构解析RNN及LSTM通过引入循环结构来处理序列数据这在一定程度上解决了捕捉长距离依赖的问题。然而这种循环的计算方式也带来了新的瓶颈它必须按顺序处理数据。然而这种循环的计算方式也带来了新的瓶颈它必须按顺序处理数据。第 t 个时间步的计算必须等待第 t−1 个时间步完成后才能开始。这意味着 RNN 无法进行大规模的并行计算在处理长序列时效率低下这极大地限制了模型规模和训练速度的提升。Transformer在2017 年由谷歌团队提出。它完全抛弃了循环结构转而完全依赖一种名为注意力 (Attention)的机制来捕捉序列内的依赖关系从而实现了真正意义上的并行计算。Encoder-Decoder 整体结构最初的Transformer 模型是为端到端任务机器翻译而设计的。如图所示它在宏观上遵循了一个经典的编码器-解码器 (Encoder-Decoder) 架构。编码器 (Encoder)任务是“理解”输入的整个句子。它会读取所有输入词元最终为每个词元生成一个富含上下文信息的向量表示。解码器 (Decoder)任务是“生成”目标句子。它会参考自己已经生成的前文并“咨询”编码器的理解结果来生成下一个词。从自注意力到多头注意力想象一下我们阅读这个句子“The agent learns because it is intelligent.”。当我们读到加粗的 “it” 时为了理解它的指代我们的大脑会不自觉地将更多的注意力放在前面的 “agent” 这个词上。自注意力 (Self-Attention) 机制就是对这种现象的数学建模。它允许模型在处理序列中的每一个词时都能兼顾句子中的所有其他词并为这些词分配不同的“注意力权重”。权重越高的词代表其与当前词的关联性越强其信息也应该在当前词的表示中占据更大的比重。自注意力机制为每个输入的词元向量引入了三个可学习的角色查询 (Query, Q)代表当前词元它正在主动地“查询”其他词元以获取信息。键 (Key, K)代表句子中可被查询的词元“标签”或“索引”。值 (Value, V)代表词元本身所携带的“内容”或“信息”。这三个向量都是由原始的词嵌入向量乘以三个不同的、可学习的权重矩阵得到的。计算相关性得分Q向量与K向量点积运算稳定化与归一化将得到的所有分数除以一个缩放因子防止梯度过小然后用Softmax函数将分数转换成总和为1的权重也就是归一化的过程。加权求和将上一步得到的权重分别乘以每个词对应的V向量然后将所有结果相加。如果只进行一次上述的注意力计算即单头模型可能会只学会关注一种类型的关联。多头注意力机制应运而生。它的思想很简单把一次做完变成分成几组分开做再合并。它将原始的 Q, K, V 向量在维度上切分成 h 份h 就是“头”数每一份都独立地进行一次单头注意力的计算。前馈神经网络在每个 Encoder 和 Decoder 层中多头注意力子层之后都跟着一个逐位置前馈网络(Position-wise Feed-Forward Network, FFN)。如果说注意力层的作用是从整个序列中“动态地聚合”相关信息那么前馈网络的作用从这些聚合后的信息中提取更高阶的特征。这个名字的关键在于“逐位置”。它意味着这个前馈网络会独立地作用于序列中的每一个词元向量。换句话说对于一个长度为 seq_len 的序列这个 FFN 实际上会被调用 seq_len 次每次处理一个词元。重要的是所有位置共享的是同一组网络权重。这种设计既保持了对每个位置进行独立加工的能力又大大减少了模型的参数量。这个网络的结构非常简单由两个线性变换和一个 ReLU 激活函数组成其中x是注意力子层的输出。残差连接与层归一化在 Transformer 的每个编码器和解码器层中所有子模块如多头注意力和前馈网络都被一个 Add Norm 操作包裹。这个组合是为了保证 Transformer 能够稳定训练。这个操作由两个部分组成残差连接 (Add)该操作将子模块的输入 x 直接加到该子模块的输出 Sublayer(x) 上。这一结构解决了深度神经网络中的梯度消失 (Vanishing Gradients)问题。在反向传播时梯度可以绕过子模块直接向前传播从而保证了即使网络层数很深模型也能得到有效的训练。其公式可以表示为OutputxSublayer(x)。层归一化 (Norm)该操作对单个样本的所有特征进行归一化使其均值为0方差为1。这解决了模型训练过程中的内部协变量偏移 (Internal Covariate Shift)问题使每一层的输入分布保持稳定从而加速模型收敛并提高训练的稳定性。位置编码Transformer 的核心是自注意力机制它通过计算序列中任意两个词元之间的关系来捕捉依赖。然而这种计算方式有一个固有的问题它本身不包含任何关于词元顺序或位置的信息。对于自注意力来说“agent learns” 和 “learns agent” 这两个序列是完全等价的因为它只关心词元之间的关系而忽略了它们的排列。为了解决这个问题Transformer 引入了位置编码 (Positional Encoding)。位置编码的核心思想是为输入序列中的每一个词元嵌入向量都额外加上一个能代表其绝对位置和相对位置信息的“位置向量”。这个位置向量不是通过学习得到的而是通过一个固定的数学公式直接计算得出。原论文中提出的位置编码使用正弦和余弦函数来生成其公式如下Decoder-Only 架构