深入理解大模型的核心技术原理是掌握API经济学的基础。本章将系统讲解Transformer架构、注意力机制、预训练范式等关键技术,为后续的成本优化和实战应用奠定理论基础。
Transformer架构是大模型的基石,其创新性地完全基于注意力机制,摒弃了传统的RNN和CNN结构。
D --> D1[自注意力层] D --> D2[前馈网络] D --> D3[残差连接] D --> D4[层归一化] E --> E1[自注意力层] E --> E2[交叉注意力层] E --> E3[前馈网络] E --> E4[残差连接] E --> E5[层归一化]
</div> **编码器-解码器架构**:Transformer采用编码器-解码器结构,编码器负责理解输入,解码器负责生成输出。 #### 2. 嵌入层与位置编码 - **词嵌入**:将词汇转换为高维向量,捕捉语义信息 - **位置编码**:为序列中的每个位置添加位置信息,保持序列的顺序性 - **类型编码**:区分不同类型的token(如实体、谓词等) **数学表达**: ```python import torch import torch.nn as nn import math class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len=5000): super().__init__() pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len, dtype=torch.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) pe = pe.unsqueeze(0).transpose(0, 1) self.register_buffer('pe', pe) def forward(self, x): return x + self.pe[:x.size(0), :]
注意力机制是Transformer的核心创新,通过计算序列中不同元素之间的关联性,实现对重要信息的重点关注。
自注意力让序列中的每个元素都能够关注序列中的所有其他元素:
注意力计算公式:
def scaled_dot_product_attention(query, key, value, mask=None): """缩放点积注意力""" matmul_qk = torch.matmul(query, key.transpose(-2, -1)) dk = key.size()[-1] scaled_attention_logits = matmul_qk / math.sqrt(dk) if mask is not None: scaled_attention_logits = scaled_attention_logits.masked_fill(mask == 0, -1e9) attention_weights = torch.nn.functional.softmax(scaled_attention_logits, dim=-1) output = torch.matmul(attention_weights, value) return output, attention_weights
多头注意力并行计算多个不同的注意力子空间:
subgraph 多头结构 C1[头1: 语义关注] C2[头2: 语法关系] C3[头3: 长距离依赖] C --> C1 C --> C2 C --> C3 end
</div> **多头注意力实现**: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super().__init__() assert d_model % num_heads == 0, "d_model must be divisible by num_heads" self.d_model = d_model self.num_heads = num_heads self.depth = d_model // num_heads self.wq = nn.Linear(d_model, d_model) self.wk = nn.Linear(d_model, d_model) self.wv = nn.Linear(d_model, d_model) self.wo = nn.Linear(d_model, d_model) def split_heads(self, x, batch_size): x = x.view(batch_size, -1, self.num_heads, self.depth) return x.permute(0, 2, 1, 3) def forward(self, q, k, v, mask): batch_size = q.size(0) # 线性变换 q = self.wq(q) k = self.wk(k) v = self.wv(v) # 分多头 q = self.split_heads(q, batch_size) k = self.split_heads(k, batch_size) v = self.split_heads(v, batch_size) # 计算注意力 attention, weights = scaled_dot_product_attention(q, k, v, mask) # 合并多头 attention = attention.permute(0, 2, 1, 3).contiguous() attention = attention.view(batch_size, -1, self.d_model) # 最终线性投影 output = self.wo(attention) return output, weights
现代大模型的成功很大程度上归功于预训练与微调的范式设计。
目标:在海量无标注数据上学习通用的语言理解能力
主要任务类型:
掩码语言建模:BERT类模型
因果语言建模:GPT类模型
序列到序列:T5类模型
目标:在特定领域数据上适应特定任务
微调方法:
1. 完全微调
def full_fine_tuning(model, train_dataloader, epochs=3, lr=2e-5): optimizer = torch.optim.AdamW(model.parameters(), lr=lr) for epoch in range(epochs): model.train() total_loss = 0 for batch in train_dataloader: inputs = batch['input_ids'].to(device) labels = batch['labels'].to(device) optimizer.zero_grad() outputs = model(inputs, labels=labels) loss = outputs.loss loss.backward() optimizer.step() total_loss += loss.item() avg_loss = total_loss / len(train_dataloader) print(f"Epoch {epoch+1}, Loss: {avg_loss:.4f}")
2. 参数高效微调(PEFT)
大模型的规模与性能之间存在明确的规律性。
参数缩放:模型性能随参数数量增加而提升
数据缩放:更多的训练数据带来更好的性能
计算缩放:更多的计算资源提升模型质量
Chinchilla缩放定律:
能力涌现:
质量提升:
# 基础环境要求 torch>=2.0.0 transformers>=4.30.0 datasets>=2.12.0 accelerate>=0.20.0 tokenizers>=0.13.0 # 可选增强库 peft>=0.3.0 # 参数高效微调 bitsandbytes>=0.39.0 # 量化训练 deepspeed>=0.9.0 # 分布式训练
import torch import torch.nn as nn import math import torch.nn.functional as F class Transformer(nn.Module): def __init__(self, vocab_size, d_model, num_heads, num_layers, d_ff, max_seq_len): super().__init__() # 嵌入层 self.token_embedding = nn.Embedding(vocab_size, d_model) self.position_embedding = nn.Embedding(max_seq_len, d_model) # 编码器层 self.encoder_layers = nn.ModuleList([ EncoderLayer(d_model, num_heads, d_ff) for _ in range(num_layers) ]) # 解码器层 self.decoder_layers = nn.ModuleList([ DecoderLayer(d_model, num_heads, d_ff) for _ in range(num_layers) ]) # 输出层 self.output_projection = nn.Linear(d_model, vocab_size) # 参数初始化 self.init_weights() def init_weights(self): for p in self.parameters(): if p.dim() > 1: nn.init.xavier_uniform_(p) def forward(self, src, tgt, src_mask=None, tgt_mask=None): # 输入嵌入 src_emb = self.embed(src) tgt_emb = self.embed(tgt) # 编码器 encoder_output = src_emb for encoder_layer in self.encoder_layers: encoder_output = encoder_layer(encoder_output, src_mask) # 解码器 decoder_output = tgt_emb for decoder_layer in self.decoder_layers: decoder_output = decoder_layer(decoder_output, encoder_output, tgt_mask, src_mask) # 输出投影 output = self.output_projection(decoder_output) return output def embed(self, x): seq_len = x.size(1) positions = torch.arange(0, seq_len, device=x.device).unsqueeze(0) token_emb = self.token_embedding(x) pos_emb = self.position_embedding(positions) return token_emb + pos_emb class EncoderLayer(nn.Module): def __init__(self, d_model, num_heads, d_ff): super().__init__() self.self_attn = MultiHeadAttention(d_model, num_heads) self.feed_forward = PositionwiseFeedForward(d_model, d_ff) self.norm1 = nn.LayerNorm(d_model) self.norm2 = nn.LayerNorm(d_model) self.dropout = nn.Dropout(0.1) def forward(self, x, mask): # 自注意力 attn_output, _ = self.self_attn(x, x, x, mask) x = x + self.dropout(attn_output) x = self.norm1(x) # 前馈网络 ff_output = self.feed_forward(x) x = x + self.dropout(ff_output) x = self.norm2(x) return x class PositionwiseFeedForward(nn.Module): def __init__(self, d_model, d_ff): super().__init__() self.fc1 = nn.Linear(d_model, d_ff) self.fc2 = nn.Linear(d_ff, d_model) self.relu = nn.ReLU() self.dropout = nn.Dropout(0.1) def forward(self, x): return self.fc2(self.dropout(self.relu(self.fc1(x))))
A:多头注意力有多个优势:
实验表明,适当数量(4-12个)的多头注意力比单头注意力性能更好,但过多的头会导致训练不稳定。
A:预训练和微调是两个不同阶段:
预训练:在无标注海量数据上学习通用语言能力
微调:在特定领域少量标注数据上适应特定任务
关键区别:
A:不一定,存在几个关键限制因素:
1. 临界质量点:
2. 数据质量:
3. 训练方法:
4. 应用场景适配:
最佳实践:
大模型核心技术原理是理解API经济学的基础。通过深入学习Transformer架构、注意力机制、预训练微调范式等内容,我们建立了对大模型技术本质的深刻理解。
关键要点:
技术启示:
实践价值:
下一节我们将深入探讨大模型API的架构设计,将理论知识应用到实际API构建中。
关键词:Transformer, 注意力机制, 预训练, 微调, 规模效应
难度:进阶
预计阅读:45 分钟