零基础认识大语言模型LLM工作原理(3.大模型绕不开的架构–Transformer到底是怎么工作的?)引言为什么Transformer是LLM的基石在之前的文章中我们了解了LLM如何通过海量文本学习语言规律。但你可能好奇究竟是什么技术让机器能“理解”一句话中每个词的位置和关系答案就是——Transformer架构。它就像LLM的“大脑”负责处理输入文本并提取语义信息。想象你正在读一句话“猫追老鼠它跑得很快。”这里的“它”指的是猫还是老鼠人类能轻松判断但机器需要一种机制来“关注”句子中的关键元素。Transformer中的自注意力机制Self-Attention就是解决这个问题的关键工具。## 1. 从传统模型到Transformer的突破在Transformer出现之前自然语言处理主要依赖循环神经网络RNN和长短期记忆网络LSTM。它们虽能处理序列数据但有两个致命缺点-串行计算必须按顺序处理每个词导致训练速度极慢-长距离依赖丢失当句子很长时前面的词对后面词的影响会衰减2017年Google团队在论文《Attention is All You Need》中提出了Transformer它通过并行计算和自注意力机制完美解决了上述问题。简单来说Transformer能让模型同时看到句子中的所有词并动态计算每个词与其他词的关系权重。## 2. 核心部件拆解自注意力机制### 2.1 什么是自注意力自注意力机制的核心思想是对于输入序列中的每个词计算它与其他所有词的相关性然后根据相关性加权聚合信息。举个例子句子“The animal didn’t cross the street because it was too tired.”中的“it”与“animal”高度相关自注意力机制会给“animal”分配更高的权重。### 2.2 数学实现Query, Key, Value自注意力机制通过三个矩阵实现-Query查询向量当前词向其他词“提问”的向量-Key键向量其他词“回答”的标识符-Value值向量其他词的实际信息内容计算流程如下1. 每个词生成Q、K、V三个向量2. 计算当前词的Q与所有词的K的点积得到注意力分数3. 通过Softmax归一化得到权重4. 将权重与对应V相乘并求和得到最终输出### 2.3 代码示例实现简单自注意力让我们用Python实现一个迷你版的自注意力机制帮助你直观理解pythonimport numpy as np# 模拟输入序列假设有3个词每个词用4维向量表示# 例如词1[1,0,0,0], 词2[0,1,0,0], 词3[0,0,1,0]input_sequence np.array([ [1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0]])# 随机初始化权重矩阵将输入映射为Q,K,V# 输入维度4 - QKV维度3简化计算W_q np.random.randn(4, 3) # Query权重W_k np.random.randn(4, 3) # Key权重W_v np.random.randn(4, 3) # Value权重# 计算每个词的Q,K,VQ np.dot(input_sequence, W_q) # 形状(3,3)K np.dot(input_sequence, W_k)V np.dot(input_sequence, W_v)# 计算注意力分数Q与K的转置相乘# 结果形状(3,3)第i行第j列表示词i对词j的注意力分数scores np.dot(Q, K.T)# 缩放除以维度平方根防止梯度爆炸d_k K.shape[1] # 获取K的维度这里是3scores_scaled scores / np.sqrt(d_k)# Softmax归一化将分数转为概率分布def softmax(x): exp_x np.exp(x - np.max(x, axis-1, keepdimsTrue)) # 数值稳定 return exp_x / np.sum(exp_x, axis-1, keepdimsTrue)attention_weights softmax(scores_scaled)# 加权求和用注意力权重乘以Value并求和output np.dot(attention_weights, V)print(原始输入序列每个词4维)print(input_sequence)print(\n注意力权重矩阵第i行是词i对其他词的关注度)print(np.round(attention_weights, 2))print(\n输出序列每个词现在包含上下文信息)print(np.round(output, 2))运行这段代码你会发现输出不再是孤立的词向量而是融合了上下文信息的表示。例如词1的输出会包含与词2、词3的关联信息。## 3. 多头注意力从单一视角到多维理解### 3.1 为什么需要多头注意力单一的自注意力机制可能只捕捉到一种语义关系比如语法结构。但实际文本中存在多种关系词性、语义、位置等。因此Transformer使用多头注意力即并行运行多个自注意力机制每个“头”学习不同的关系模式。### 3.2 代码示例实现多头注意力简化版pythonimport numpy as npclass SimpleMultiHeadAttention: def __init__(self, d_model4, num_heads2): # d_model: 输入维度这里设为4 # num_heads: 注意力头数这里设为2 self.num_heads num_heads self.d_model d_model self.d_head d_model // num_heads # 每个头的维度 # 初始化Q,K,V权重每个头有自己的权重 self.W_q np.random.randn(num_heads, d_model, self.d_head) self.W_k np.random.randn(num_heads, d_model, self.d_head) self.W_v np.random.randn(num_heads, d_model, self.d_head) # 输出投影权重 self.W_o np.random.randn(d_model, d_model) def softmax(self, x): exp_x np.exp(x - np.max(x, axis-1, keepdimsTrue)) return exp_x / np.sum(exp_x, axis-1, keepdimsTrue) def forward(self, x): # x形状: (seq_len, d_model) 例如 (3,4) seq_len x.shape[0] outputs [] for h in range(self.num_heads): # 每个头独立计算 # 计算当前头的Q,K,V Q np.dot(x, self.W_q[h]) # (seq_len, d_head) K np.dot(x, self.W_k[h]) V np.dot(x, self.W_v[h]) # 计算注意力 scores np.dot(Q, K.T) / np.sqrt(self.d_head) weights self.softmax(scores) head_output np.dot(weights, V) # (seq_len, d_head) outputs.append(head_output) # 拼接所有头的输出 concat np.concatenate(outputs, axis-1) # (seq_len, d_model) # 通过输出投影层 final_output np.dot(concat, self.W_o) # (seq_len, d_model) return final_output# 测试多头注意力input_seq np.array([ [1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0]])mha SimpleMultiHeadAttention()output mha.forward(input_seq)print(多头注意力输出每个词4维但包含多视角信息)print(np.round(output, 2))## 4. 完整Transformer架构解析一个完整的Transformer由编码器Encoder和解码器Decoder组成### 4.1 编码器结构每个编码器层包含1.多头自注意力层捕捉词间关系2.前馈神经网络FFN对每个词独立进行非线性变换3.残差连接 层归一化防止梯度消失加速训练### 4.2 解码器结构每个解码器层包含1.掩码多头自注意力防止解码时看到未来信息类似考试不能看答案2.交叉注意力让解码器关注编码器输出的关键信息3.前馈神经网络 残差与归一化### 4.3 位置编码由于Transformer没有循环结构必须额外加入位置编码来告诉模型词的位置。常见做法是使用正弦/余弦函数生成唯一的位置向量加到输入嵌入中。## 5. 为什么Transformer如此强大1.并行计算所有词同时处理训练速度比RNN快数百倍2.全局视野每个词都能直接关注到序列中任意位置的词3.可扩展性通过堆叠多层编码器/解码器可以处理极其复杂的语言模式4.迁移学习预训练好的Transformer模型如BERT、GPT可以微调用于各种任务## 总结本文从零开始剖析了Transformer的核心工作原理-自注意力机制让模型能动态计算词与词之间的相关性-多头注意力让模型能从多个维度理解语义关系-编码器-解码器结构分别负责理解输入和生成输出-位置编码解决了并行计算中丢失位置信息的问题理解Transformer是理解大语言模型的关键一步。它就像乐高积木中的基础模块——通过堆叠和组合我们就能构建出GPT、BERT等强大的预训练模型。在下一篇文章中我们将探索如何用这些Transformer模块训练出能写诗、编程、对话的超级AI记住不要被复杂的数学公式吓倒先理解“每个词要关注其他哪些词”这个核心思想其他细节都是围绕这个目标优化的工具。