预训练与微调:大模型如何“学习知识”?
引言:知识的两阶段习得
Transformer架构的千亿参数模型(如GPT、BERT)并非直接针对具体任务训练,而是通过预训练(Pre-training)与微调(Fine-tuning)两阶段实现知识的泛化与迁移。预训练阶段从海量无标注数据中学习语言的通用模式,微调阶段则针对下游任务进行参数校准。本文将从数学原理和代码实现角度,拆解这一过程的底层逻辑。
一、预训练:无监督学习的知识沉淀
核心目标函数
预训练的核心是通过自监督任务(Self-supervised Learning)从无标注数据中提取语义特征。以BERT为例,其采用掩码语言模型(MLM)和下一句预测(NSP)双任务驱动:
• MLM:随机掩码输入token(如15%概率),模型预测被掩码部分:LMLM=−∑i∈MlogP(xi∣x\M)
其中 M 为掩码位置集合,x\M 为未掩码上下文。
• NSP:判断两个句子是否为连续关系:LNSP=−logP(y∣CLS)
其中 y∈{0,1} 表示是否为相邻句,CLS为分类标记的嵌入向量。数学意义:MLM迫使模型理解双向上下文,NSP增强句子级语义建模能力。
代码实现(MLM损失函数)
class MLMLoss(nn.Module): def __init__(self, vocab_size): super().__init__() self.criterion = nn.CrossEntropyLoss(ignore_index=-100) def forward(self, logits, masked_labels): # logits: (batch_size, seq_len, vocab_size) # masked_labels: (batch_size, seq_len),未掩码位置为-100 loss = self.criterion(logits.view(-1, logits.size(-1)), masked_labels.view(-1)) return loss
关键点:仅计算被掩码位置的损失,忽略其他位置。
二、微调:任务适配的参数校准
微调策略
• 全参数微调:直接更新所有参数,适用于数据量充足的任务(如GLUE)。
• 参数高效微调(Parameter-Efficient Fine-tuning, PEFT):
◦ Adapter:在Transformer层中插入小型神经网络模块,仅训练新增参数。
◦ LoRA(Low-Rank Adaptation):对权重矩阵进行低秩分解,优化低秩增量矩阵:
$$ W = W_0 + \Delta W = W_0 + BA^T \quad (B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times d}) $$ 其中 $ r \ll d $,参数量减少至 $ 2rd $。
LoRA的代码实现
class LoRALayer(nn.Module): def __init__(self, in_dim, out_dim, rank=8): super().__init__() self.A = nn.Parameter(torch.randn(in_dim, rank)) self.B = nn.Parameter(torch.zeros(rank, out_dim)) self.original_weight = nn.Parameter(torch.Tensor(out_dim, in_dim)) # 预训练权重 def forward(self, x): delta_W = torch.matmul(self.A, self.B) # (in_dim, out_dim) return F.linear(x, self.original_weight + delta_W.T)
优势:冻结原始参数,仅优化 A 和 B,显存占用降低90%以上。