ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

大模型如何理解人类语言:从Tokenizer到Transformer

大模型如何理解人类语言:从Tokenizer到Transformer 1. 从字符到向量大模型如何读懂人类语言当我们在聊天框中输入你好时这个简单的问候是如何被数十亿参数的大模型理解并生成回应的整个过程就像把一本中文书翻译成只有数学家能看懂的密码本再通过复杂的数学运算还原出新的内容。让我们拆解这个神奇的过程。1.1 文本的第一次变形Tokenizer分词器想象你有一盒乐高积木但每块积木的形状和大小都不规则。Tokenizer的工作就是把句子拆成模型能处理的积木块token。以ChatGPT很棒为例英文模型可能拆分为[Chat, G, PT, is, great]中文模型可能拆分为[Chat, GPT, 很, 棒]这里有个关键细节不同tokenizer的分词策略直接影响模型表现。比如unhappiness可能被拆为[un, happiness]或[unhappiness]整个词。实践中Byte Pair Encoding (BPE)算法是最常用的方案它通过统计语料库中字符组合的频率找到最优分词方式。提示当处理专业术语或新词汇时不合理的tokenization会导致信息丢失。这就是为什么有些模型对特定领域表现不佳——它们的词典里没有对应的积木块。1.2 从符号到数字Embedding嵌入层分词后的token仍然是离散符号计算机无法直接处理。Embedding层就像一本翻译字典把每个token转换为固定长度的向量通常是512或768维。这个转换过程不是简单的编码而是保留了语义关系猫和狗的向量距离会比猫和汽车更近大-小的向量差 ≈ 长-短的向量差现代大模型通常使用可学习的embedding即在训练过程中不断调整这些向量值。一个有趣的发现是embedding空间会自发形成几何结构比如国王-男人女人≈女王这样的关系。2. 位置信息的魔法为什么顺序如此重要狗咬人和人咬狗有完全不同的含义但传统的embedding会丢失这种顺序信息。这就是Transformer需要positional encoding的原因。2.1 绝对位置编码的经典方案原始Transformer论文采用正弦/余弦函数生成位置编码 $$ PE_{(pos,2i)} \sin(pos/10000^{2i/d_{model}}) \ PE_{(pos,2i1)} \cos(pos/10000^{2i/d_{model}}) $$其中pos是位置i是维度索引。这种编码的特点是每个位置有唯一编码相对位置可以通过线性变换表示能扩展到比训练时更长的序列实际代码实现通常是这样PyTorch示例class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len5000): super().__init__() pe torch.zeros(max_len, d_model) position torch.arange(0, max_len, dtypetorch.float).unsqueeze(1) div_term torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model)) pe[:, 0::2] torch.sin(position * div_term) pe[:, 1::2] torch.cos(position * div_term) self.register_buffer(pe, pe) def forward(self, x): return x self.pe[:x.size(1)]2.2 现代大模型的进化旋转位置编码(RoPE)ChatGPT等最新模型更多采用Rotary Position Embedding (RoPE)它的核心思想是通过旋转矩阵将位置信息注入到注意力计算中将query和key向量视为复数空间中的向量对不同位置施加不同角度的旋转相对位置差异体现在旋转角度差上RoPE的优势在于更好地建模相对位置关系适合处理长文本在自注意力机制中实现位置感知3. 信息加工的流水线Transformer的编码过程3.1 自注意力机制全局关联的建立经过embedding和positional encoding后输入向量进入Transformer的核心——多头自注意力层。以苹果公司发布新款手机这句话为例每个词向量生成Query、Key、Value三个表示计算Query与所有Key的点积得到注意力分数通过softmax归一化后加权求和Value向量这个过程允许苹果与公司建立强关联同时弱化不相关的词组合。多头机制则让模型在不同表示子空间学习不同关系。3.2 前馈神经网络的非线性变换注意力层的输出会经过一个前馈神经网络(FFN)通常是两层全连接加ReLU激活 $$ FFN(x) W_2 \cdot \text{ReLU}(W_1 \cdot x b_1) b_2 $$这个看似简单的结构实际上承担着重要的信息整合和转换功能。在大模型中FFN层的参数量往往占模型总参数的三分之二。4. 实战中的挑战与解决方案4.1 长文本处理的技巧当处理超过模型最大长度限制的文本时常见解决方案包括滑动窗口法将文本切分为重叠的片段处理记忆压缩将前文信息压缩为摘要向量层次化处理先分段编码再整合4.2 多语言处理的特殊考量对于多语言模型tokenizer设计需要特别注意不同语言的词汇量差异很大某些语言如中文没有自然的分词界限共享subword词汇表可以提高低资源语言的表现4.3 位置编码的替代方案除了前述方法业界还尝试过可学习的位置嵌入如BERT最初版本相对位置编码仅编码token间相对距离混合位置编码不同层使用不同方案5. 从理论到实践一个完整的处理示例让我们用伪代码展示Hello world在模型中的完整处理流程text Hello world # 分词 tokens tokenizer.tokenize(text) # [Hello, world] # 转换为token ID token_ids tokenizer.convert_tokens_to_ids(tokens) # [19082, 2968] # 获取embedding token_embeddings embedding_layer(token_ids) # shape: [2, 768] # 添加位置编码 position_ids [0, 1] position_embeddings positional_encoding(position_ids) # shape: [2, 768] input_embeddings token_embeddings position_embeddings # 通过Transformer层 for layer in transformer_layers: input_embeddings layer(input_embeddings) # 最终得到上下文感知的表示 contextual_embeddings input_embeddings # shape: [2, 768]在实际的大模型应用中这个过程会涉及更多优化技巧如批处理加速计算混合精度训练注意力掩码处理6. 前沿发展与未来方向当前的研究正在探索更高效的位置编码方案如ALiBi动态调整的tokenization策略完全不需要位置编码的架构如RWKV多模态统一表示方法我在实际项目中发现理解这些底层机制对于解决以下问题特别有帮助模型对某些短语理解异常长文本生成质量下降多语言混合输入的混乱领域适应时的性能波动最后分享一个实用技巧当遇到模型对词序敏感度不足的问题时可以检查positional encoding的实现是否正确或者尝试调整最大序列长度的超参数。有时候简单的调整就能带来显著的改进。
返回列表