跳转到主要内容
LLM 学习笔记 | AnteLacus
一、核心思想&缺陷
(一)核心思想
尝试通过模拟人类大脑的工作流程来训练一个计算机模型。
人类大脑的工作流程:阅读时根据某个词的上下文来判断和理解这个词的意思,尽管每个词都会有不同的意思和语义,但一旦被放入一个句子中,几乎所有的词的意思和语义都会被固定下来。
(二)实现途径
1. 理解语义
让模型将输入内容拆分为最小语义单位(token),然后把每个token映射到非常高维的空间里,以便于后续为每个token在不同维度上分配不同的“意义”。
而分配这些“意义”的方法就是大量语料训练。
在语料训练量足够大后,通过调整模型中数量惊人的参数,模型就能逐渐为每个token对应高维向量的不同维度赋予不同的“意义”(类比为词性、语气、不同的词义等),至此,每个token可能代表的“意义”就有了。
假设我们有句子 "The bank robber fled to the river bank ."。 bank
这个token的向量,其方向是由“河岸”、“银行”、“牌堆”等所有语境下的用法共同决定的。它会位于“river”, "money", "card"这些词向量所构成的区域的中间某处,但与”state”, "ultimately"等token距离更远。
2. 理解上下文
在灌注语义后,模型会使用线性变换矩阵来理解输入的token之间的关系,进而确定每个token在上下文中的“意义”究竟是什么。
在第一阶段后,我们得到了两个完全相同的 bank
向量。我们的目标是,通过一个数学过程,将第一个 bank
向量移动或旋转 到更靠近“金融”、“犯罪”的区域,同时将第二个 bank
向量移动或旋转 到更靠近“地理”、“自然”的区域。
我们使用三个线性变换矩阵分别和token相乘,使得token投影到3个不同的子空间,分别用于提问、索引和提供信息。这个过程中,模型会综合考量第一个bank
的整个语义环境 。因为robber
这个词提供了强烈的‘金融’上下文线索,模型学到的W^Q
矩阵会将第一个bank
的初始向量转换(投影)成一个在语义上预先就偏向于‘金融’提问的Q向量 。这个Q向量的生成,考虑了全局信息,而不仅仅是局部邻近词。
“提问”向量的方向会指向“我想知道我的具体含义”,而“键”向量的方向会宣告“我能提供关于‘犯罪/金融’的上下文”。因为它们在语义上高度相关,所以模型参数会使得这两个向量在空间中的指向非常接近,点积结果就非常大。
相反,q_{bank1}
与k_{river}
的点积就会很小,因为它们的语义方向几乎是无关的。
这些巨大的点积值经过Softmax归一化后,变成了注意力权重。最终,第一个"bank"的新向量,就是所有词的值向量的加权平均。
因为q_{bank1}
和k_{robber}
的点积最大,所以v_{robber}
这个携带了“强盗”信息的向量会获得最高的权重,被大量地“注入”到第一个"bank"的新表示中。
这个融合过程,在向量空间中,就等同于将原始的“bank”向量,向着v_{robber}
等高相关性词语的向量方向进行了一次拉动(translation)或旋转 。
在同一层注意力计算中,所有词的Q向量会与所有词的K向量并行地计算相关性(点积),从而为每个Q向量都生成一套针对所有词的注意力权重。然后,每个词再利用它自己的这套权重,去对所有词的V向量进行加权求和 ,得到自己最终的、融合了全局上下文的新向量表示。经过多层这样的处理,所有token在句子中的精确含义就被确定了下来,模型就能准确‘理解’输入的句子了。
(三)Transformer架构的思想突破
它不仅是聪明的工程产物,更是一种关于如何表征和处理信息 的深刻哲学。它相信全局关系 优于线性时序,极简假设 优于特定偏置,迭代精炼 优于一步到位,以及责任解耦 优于混为一谈。
1. 并行化与全局视野——对“时间”的彻底颠覆 (Parallelization & Global View: The Complete Overthrow of "Time")
这是Transformer相较于其前任(如RNN、LSTM)最根本的、革命性的区别。
旧思想(RNN/LSTM) :语言是有时间顺序的 。要理解一个词必须先处理它前面的词。这个过程是串行(serial)的。这导致了两个问题:
Transformer的新思想 :抛弃时间的线性束缚 。在理解一个句子时,同时审视所有单词 ,并将任何一个单词与句子中的任何其他单词直接建立联系,无论它们相距多远。
每一个词对所有其他词
更高层次的理解 :Transformer从根本上认为,语言的意义网络不是一条线,而是一个高度连接的图(Graph) 。它将句子从一个一维的时间序列 解放出来,还原成了一个高维的关系网络 。这种并行化处理全局信息的能力,是其性能和效率远超RNN的核心原因。
2. 归纳偏置的极简主义——万物皆可为集合 (The Minimalism of Inductive Bias: All is a Set) “归纳偏置”(Inductive Bias)是指在设计模型时,预先植入的关于数据规律的“假设”。一个模型的归纳偏置决定了它擅长学习什么样的问题。
Transformer的新思想 :尽可能减少偏见,让数据自己说话 。自注意力机制的核心,其归纳偏置极度简约:它只假设输入是一组元素的集合(a set of elements) 。它不对元素之间的关系做出任何预先的假设(比如相邻的就更重要)。它认为任何两个元素之间都可能 存在直接的关键联系。
技术细节的映射 :核心的自注意力计算本身是置换不变的(permutation-invariant) 。如果你打乱一个句子中词的顺序,它计算出的注意力权重模式虽然会变,但其计算机制本身不依赖于固定的前后位置。这就是为什么必须额外引入“位置编码”(Positional Encoding) ,相当于告诉这个“只认集合”的机制:“嘿,别忘了,这些元素原本是有顺序的。”
更高层次的理解 :这种极简的归纳偏置,赋予了Transformer无与伦比的通用性 。因为它不对数据的结构做过多假设,所以它不仅能处理语言(一维序列),还能处理图像(二维网格)、蛋白质序列、表格数据等等。你只需要把任何事物表示成一个“向量的集合”,Transformer就能在其中寻找内在关系。这也是它能够“一统江湖”的哲学基础。
3. 迭代式精炼——堆叠带来的“思维深度” (Iterative Refinement: The "Depth of Thought" from Stacking) 一个单独的自注意力层能做的事情是有限的。Transformer的威力来自于将这些结构相同的块(Block)深度堆叠 起来。即对信息的理解不是一步到位的,而是一个迭代式地、由浅入深地精炼过程 。
多层堆叠 (Stacking Layers) :第一层自注意力可能主要在解决词义的模糊性(比如区分两种"bank")。它的输出(一个初步“净化”过的上下文向量)会成为第二层的输入。第二层基于这个更清晰的输入,可能会去理解句法结构(比如主谓宾关系)。第三层则可能去理解更深层的逻辑或指代关系。每一层都在前一层的基础上,对整个序列的表示进行一次更复杂的重写(rewrite)和精炼。
残差连接 (Residual Connections) :这是让深度堆叠成为可能的关键。它在每一层都创建了一条“高速公路”,让原始输入(或前几层的输出)可以直接流向更高层。这保证了在进行深度精炼时,模型不会“忘记”最开始的信息。它允许模型在每一层选择是“深度加工”还是“基本保留”输入信息。
更高层次的理解 :Transformer的深度堆叠,模拟了人类的深度思考过程 。我们读一个复杂句子时,也不是瞬间就完全理解。我们的大脑可能会先识别词义,再分析句法,再联系背景知识,最后形成一个完整的理解。Transformer的N个层,就是在数学空间中对这个多层次的认知过程的模拟。
4. 解耦的智慧——内容与位置的分离 (The Wisdom of Decoupling: Separating Content from Position) 这是对思想二的进一步延伸和具体化,一个词的“语义内容”(what it is)和它的“序列位置”(where it is)是两种不同但都至关重要的信息,最好将它们分开处理,再进行组合。
词嵌入(Word Embedding) :负责编码一个词纯粹的、不考虑位置的“语义内容”。
位置编码(Positional Encoding) :负责编码一个位置纯粹的、不考虑上面是什么词的“顺序信息”。
向量相加 :通过简单的向量加法,将这两种信息“注入”到同一个向量中。
更高层次的理解 :这种“解耦再融合”的设计体现了一种优雅的工程思想。它使得核心的注意力机制可以专注于它最擅长的事情——在集合中寻找关系,而不用同时分心去处理顺序问题。顺序问题由一个专门的、可插拔的模块来解决。这种清晰的责任分离,使得整个架构更加灵活和强大。
(四)主要缺陷
1. 缺乏真实世界模型与推理能力 (Lack of a True World Model & Reasoning) 当前的语言模型本质上是一个文本世界的大师 ,而不是物理世界的理解者 。它通过学习海量的文本,掌握了人类语言的语法、风格和知识的“统计模式”。它知道“引力”这个词后面很可能跟“是牛顿发现的”,但它对一个苹果掉在地上的过程没有任何直观的、基于物理规律的内在模型 。它的“知识”是二手的、基于描述的,而不是一手经验的、基于模型的。
具体表现 :在复杂的逻辑推理、数学证明、物理问题和需要常识规划的任务上,即使是最大的模型也常常会犯一些匪夷所思的低级错误。
2. 自回归的“近视”与缺乏规划能力 (The "Myopia" of Auto-regression & Lack of Planning) LLM是自回归 的,即逐字(token-by-token)生成内容。这是一种贪心算法(Greedy Approach) 。在每一步,模型都只选择在“局部”看起来最优的下一个词。它缺乏一个高层次的、全局的“规划”能力。
具体表现 :生成长文本时,模型可能会前后矛盾、重复观点、或在故事后期忘记自己设定的情节。它很难完成需要复杂多步规划才能解决的任务。
3. 暴力美学与学习效率的低下 (The "Brute-Force" Aesthetic & Inefficient Learning) Transformer的成功,在很大程度上是“大力出奇迹”。它依赖于前所未有的庞大数据集和令人咋舌的计算资源(算力)。它的学习效率与人类相比,低得可怕。
具体表现 :训练成本极高,使得只有少数科技巨头能参与这场游戏,形成技术垄断。同时,其巨大的能耗也带来了严重的环境问题。
4. 不可解释性与不可控性 (Unexplainability & Uncontrollability) 拥有数千亿甚至万亿参数的模型是一个巨大的**“黑箱”**。我们知道输入和输出,但我们无法精确地解释为何模型会给出某个特定的回答。我们无法追踪其“思考”的链路。
幻觉(Hallucinations) :模型会自信地“一本正经地胡说八道”,捏造事实、引用不存在的论文。这是因为它是在生成“最可能的文本序列”,而不是在查询“真实的知识库”。
偏见(Bias) :模型会完美地复现并放大训练数据中存在的社会偏见。
可控性差 :很难通过“微创手术”的方式去修正模型的一个错误认知。你无法像修改代码一样去删除或修改它的某项“知识”。
二、注意力机制(Attention mechanism)
(一)主要分类
(二)自注意力
1. 技术思路 这是LLM的核心,其中心思想为使模型关注input中最相关的部分,方法为为input中的每个token创建三要素并产生关联。
Queries:代表当前这个token为了更好地理解自己,主动发出的一个**“查询”或“问题”**。它想知道:“序列中的哪些其他部分与我相关?”。
Keys:代表序列中每一个token(包括自己)所拥有的一个**“标签”或“索引”**,用来表明“我是什么”或“我有什么样的信息”。
Values:代表序列中每一个token实际携带的**“内容”或“信息”**。
如果两个token之间QK相似,则二者关系强度就更高。
2. 处理流程
(1) 词嵌入 (Input Embeddings) input会被拆解为token,token和单词或单字不完全对应。
token通过特定方法被映射到高维向量空间中的一个点,表示为一个初始列向量。
这个列向量还会被附上在input中的位置编码(Positonal Encoding), 位置编码是一个计算得到的列向量,它会逐元素添加到token对应的列向量中。
(2) 线性变换(以多头注意力为例,单头相似) 线性变换:m1的向量和n m的矩阵相乘,会得到一个n*1的向量。
注意力机制会设置三个矩阵,WQ(DkDmodel),WK(Dk Dmodel),WV(Dv*Dmodel),其中Dk=Dmodel/注意力头数量。这三个矩阵会通过特定方法设定初始值,后续根据模型学习过程(反向传播和梯度下降)不断调整值。
每个token对应的Dmodel1向量通过三次线性变换(分别和一个训练得到的矩阵相乘)形成三个向量Q(Dk 1)、K(Dk1)和V(Dv 1)。
但在实际应用中,通常会将所有向量合并成一个矩阵后再分别做三次线性变换。
(3) 相关性计算(对于所有token同时发生) 每个Q会同时和所有K之间计算相似度(即每个Q向量分别和包括自己在内的所有K向量相乘),以确定彼此关系远近。
方法为将K转置,Q和K相乘会得到一个点积,这个点积的值越大,Q和K相似度越高。这个点积会经过一次缩放(Scale),因为随着维度Dk的增大,点积的结果的方差会增大,这会导致一些值变得非常大。将这些巨大的值输入Softmax函数后,梯度会变得极其微小(梯度消失),使得模型训练困难。
应用softmax函数将所有缩放后的点积转化为概率分布,也就是注意力机制中的注意力权重。这组权重表示,每个token应该对其他所有token(包括它自己)投入多少关注。
用注意力权重去乘以对应的v向量,然后将所有结果相加,得到每个token全新的空间向量。这个结果就体现了对于每一个Q而言的上下文信息。
回顾(1)-(3),每个token通过词嵌入形成的Dmodel1向量现在变成了Dv 1向量,且其中包含了这个token在句子中的位置和所有上下文信息。
Attention(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{D_k}})V
在完整的Transformer块中,这个输出向量还会经过一个前馈神经网络(Feed-Forward Network)和残差连接,其维度最终会变回Dmodel,以便输入到下一个Transformer块中。
(三)多头注意力特殊点 不同的“头”会重点关注不同的方面,比如名词间关系、形容词-名词关系、短语结构等。
分割思想 :我们将Dmodel维度的Q, K, V “分割”成h个更小的部分。这在实践中是通过创建h组(每组三个)独立的权重矩阵来实现的。
并行计算 :原始的输入(经过词嵌入和位置编码)分别与这h组权重矩阵相乘,得到h组低维度的Q、K、V。这些Q、K、V的维度通常是Dk=Dv=Dmodel/h。
独立注意力 :对这h组Q、K、V分别独立地执行标准的缩放点积注意力计算,得到h个输出矩阵。每个矩阵的维度是Dv*l。
拼接 (Concatenate) :将这h个输出矩阵沿最后一个维度拼接起来。拼接后的矩阵维度是Dmodel*l。
最终线性变换 :将拼接后的矩阵乘以一个新的权重矩阵(Dmodel*Dmodel),做一次最终的线性变换,得到多头注意力层的最终输出。这一步的目的是让模型学习如何将从不同“头”中学到的不同信息(如句法信息、指代信息等)最佳地融合起来。
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) × W^O
其中 head_i = Attention(Q×W^Q_i, K×W^K_i, V×W^V_i)
三、Transformer架构
(一)组成部分
1. 编码器
2. 解码器 与编码器类似,只是多了一个“编码器-解码器注意力”层。
(二)训练流程 以英语⇒法语翻译为例。The cat is cute.⇒Le chat est mignon.
所有会在训练中更新的参数被标注为红色 。未介绍的参数(如偏置项、增益参数、偏置参数等),可在感兴趣的时候了解。
1. 编码器处理
(1) 输入准备 : 将英语输入序列进行分词 (tokenization)、词嵌入 (embedding) 和位置编码 (positional encoding)。得到输入矩阵。
(2) 逐层处理 :
输入矩阵会依次经过多头自注意力层 (包括3个线性变换矩阵及其偏置项 ,1个最终线性变换矩阵及其偏置项 )和前馈神经网络层 (包括两个线性层,每层1个线性变换矩阵及其偏置项)
每个子层后面都跟着残差连接和层归一化(一个增益参数 和一个偏置参数 )
(3) 堆叠传递 : 第一个编码器块的输出,会作为第二个编码器块的输入 ,以此类推,直到通过所有n个编码器块。
(4) 最终输出 : 最后一个编码器块的输出,是一个包含了输入序列深度上下文信息的矩阵,我们称之为memory(Dmodel*l)。
(5) momery为解码器中的“编码器-解码器注意力”层(也叫“交叉注意力层”)提供键(Keys)和 值(Values) 。 而该层的**查询(Queries)**则来自解码器自身。
2. 解码器处理
(1) 输入准备 :
获取完整的 法语目标语句(Ground Truth)。
对其进行"右移"操作:在句首添加一个特殊的起始符 [BOS]
,并移除句末的最后一个词。例如,对于目标句 "Le chat est mignon",解码器的输入是 "[BOS]
Le chat est"。
对这个右移后的序列进行分词、词嵌入 和位置编码。
(2) 逐层处理 :将准备好的输入矩阵送入第一个解码器块 。
(3) 解码器块 (Decoder Block) 内部 - 包含三个核心子层 :
子层1:掩码多头自注意力 (Masked Multi-Head Self-Attention) (包括3个线性变换矩阵及其偏置项 ,1个最终线性变换矩阵及其偏置项 )
目的 :让解码器在预测当前词时,只能“看到”已经生成的、位于当前位置之前的所有词。
数据来源 :该层的 Q, K, V 全部来自解码器自身的输入 (即上面第1步生成的右移序列)。
核心机制 :在计算注意力分数后、应用Softmax之前,会使用一个“未来掩码”(look-ahead mask),将所有未来位置的注意力分数设置为一个极大的负数,这样Softmax之后它们的权重就趋近于0。
子层2:编码器-解码器交叉注意力 (Encoder-Decoder Cross-Attention) (包括1个查询线性变换矩阵及其偏置项 ,2个键值线性变换矩阵及其偏置项 ,1个输出线性变换矩阵及其偏置项 )
子层3:前馈神经网络 (Feed-Forward Network) (包括两个线性层,每层1个线性变换矩阵及其偏置项 )
每个子层后面都跟着残差连接和层归一化(一个增益参数 和一个偏置参数 )
(4) 堆叠与最终输出 :
(5) 损失计算 : 模型会拿这个概率分布与真实的下一个词(即原始目标序列中对应的词)进行比较,计算损失(如交叉熵损失),然后通过反向传播更新整个模型的所有参数。
(三)使用流程(以英法翻译为例) 对于本例,解码器是自回归的(一次生成一个法语单词)。
1. 生成第一个词:
(1) 以特殊的[BOS]
(beginning of sentence)标记开始,对其进行多维词嵌入和位置编码处理
(2) 掩码自注意力 处理(确保只能看到已生成的词):在第一个子层(Masked Self-Attention),Q, K, V都来自 [BOS]
的嵌入向量。它只能关注自己,所以这一步的信息提取有限。
(3) 交叉注意力 (通过编码器-解码器注意力 层):
(4) 预测 : 经过前馈网络和最后的线性+Softmax层,模型预测出概率最高的词,比如 "Le"。
2. 循环
(1) 更新输入 : 现在解码器的输入序列是 [BOS] Le
。
(2) 重复 : 重复上述过程。在掩码自注意力层,"Le"可以关注到[BOS]
,但不能关注未来。在交叉注意力层,由"[BOS]
Le"生成的新Q会再次去查询编码器的K和V,以预测下一个词。
(3) 这个循环一直持续,直到模型生成一个特殊的结束符 [EOS]
(end of sentence)。
(四)使用流程(以提问“请解释什么是深度学习?”为例)
1. 提问处理(Prompt Ingestion):
2. 前向传播(The Forward Pass)
输入矩阵被送入Transformer模型巨大的网络中,进行一次“前向传播”,逐层穿过所有(比如几十上百个)Decoder Block。
逐层处理 :在每一个Decoder Block内部,输入矩阵都会经过掩码自注意力(Masked Self-Attention)和前馈神经网络(Feed-Forward Network)的处理。
上下文的深度融合 :由于自注意力的存在,当模型处理到“深度学习”这个词时,它的向量表示已经融合了前面“请解释”、“什么是”这些词的上下文信息。经过几十层的处理后,模型对您提问的每一个token都形成了极其深刻和丰富的上下文理解。
3. 生成第一个新词(First Token Generation)
聚焦最后一个词 :模型会特别关注前向传播后,代表您提问中最后一个token (这里是“?”)的最终输出向量。这个向量在理论上包含了对整个问题的理解,并指向了最可能出现的回答的开头。
预测概率分布 :这个最终向量被送入模型顶部的最终线性层(Final Linear Layer) 。该层将其从Dmodel维度投影到一个极高维度的向量上,这个向量的维度等于模型的整个词汇表大小(例如,几十万)。这个向量被称为logits 。
应用Softmax :Logits向量经过Softmax函数处理,转换成一个概率分布 。现在,词汇表中的每一个词都有一个对应的概率值,表示它作为回答第一个词的可能性。
“深度”
可能有 0.25 的概率
“当然”
可能有 0.18 的概率
“苹果”
可能有 0.00001 的概率
采样(Sampling) :模型不一定 总是选择概率最高的那个词(这被称为Greedy Search,会让回答很死板)。它会采用一些采样策略(如Top-k Sampling或Nucleus Sampling)从这个概率分布中“随机”选择一个词。这样做可以增加回答的多样性和创造性。假设这次模型选择了“深度”作为第一个词。
4. 自回归循环(The Auto-regressive Loop)
追加新词 :刚刚生成的词“深度”被追加到原始的输入序列后面。现在模型的“记忆”变成了:["请", "解释", "什么", "是", "深度", "学习", "?", "深度"]
。
重复过程 :这个新的、更长的序列 被作为全新的输入 ,完整地重复一遍第2步(前向传播)和第3步(生成新词)。
生成下一个词 :因为新的输入最后是“深度”,模型现在会预测最可能跟在“...深度学习?深度”后面的词。经过计算,它可能会选择“学习”。
持续循环 :现在模型的记忆是 [..., "?", "深度", "学习"]
。它再次将此作为输入,预测下一个词,可能是“是”。这个 “处理 -> 预测 -> 追加 -> 再处理” 的循环会一直进行下去。
5. 结束生成
这个自回归循环会在以下几种情况之一发生时停止:
模型生成了一个特殊的句子结束标记([EOS]
) 。
生成的文本达到了预设的最大长度限制。
最终,所有被依次生成的token ["深度", "学习", "是", "机器", "学习", "的", "一个", "分支", "..."]
拼接在一起就构成流畅完整的回答。