共计 1631 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
传统 NLP 模型(如 RNN、LSTM)在长文本生成中存在两个主要缺陷:

-
上下文遗忘问题 :循环神经网络依靠隐藏状态传递历史信息,随着序列长度增加,早期输入的细节逐渐丢失。实验表明,当文本超过 200 词时,LSTM 对开头内容的记忆准确率下降 40% 以上。
-
逻辑连贯性差 :基于 n -gram 的生成模型缺乏全局语义理解,容易产生前后矛盾的输出。例如在问答场景中,传统模型对同一问题的多次回答可能出现事实不一致。
核心架构
Transformer 的自注意力机制
Self-attention 通过三个核心矩阵实现上下文建模:
- Q(Query):当前词的查询向量,维度通常为 dk
- K(Key):所有词的键向量矩阵,维度为 [n_seq, dk]
- V(Value):所有词的值向量矩阵,维度为 [n_seq, dv]
计算公式为:
Attention(Q,K,V) = softmax(QK^T/√dk)V
其中除以√dk 是为了防止点积结果过大导致梯度消失。下图展示了一个 3 词序列的注意力权重可视化(建议配简图):
[0.1, 0.7, 0.2]
[0.3, 0.4, 0.3]
[0.2, 0.5, 0.3]
RLHF 训练流程对比
- GPT-3:仅使用无监督预训练(语言建模目标)
- ChatGPT:三阶段训练
- 监督微调(SFT):人工编写问答对训练
- 奖励模型训练:人类标注员对多个输出排序
- PPO 强化学习:根据奖励模型优化策略
代码实践
简化版 Attention 实现
import torch
import torch.nn.functional as F
def scaled_dot_product_attention(q, k, v, mask=None):
# q,k,v shape: [batch, n_heads, seq_len, d_k]
attn_logits = torch.matmul(q, k.transpose(-2, -1)) / torch.sqrt(torch.tensor(q.size(-1)))
if mask is not None:
attn_logits = attn_logits.masked_fill(mask == 0, -1e9)
attn_weights = F.softmax(attn_logits, dim=-1)
output = torch.matmul(attn_weights, v)
return output
关键参数说明:
– mask:用于 decoder 的三角矩阵,防止看到未来信息
– d_k:通常设为 64,与原始论文保持一致
Temperature 调节示例
def sample_with_temperature(logits, temperature=1.0):
logits = logits / temperature
probs = F.softmax(logits, dim=-1)
return torch.multinomial(probs, num_samples=1)
调节效果:
– temperature > 1.0:增加多样性
– temperature < 1.0:提高确定性
生产考量
显存占用估算
对于 L 层的 Transformer 模型:
显存 (B) ≈ 4 * (n_params + 2 * batch * n_layers * seq_len^2)
典型场景:
– 175B 参数模型
– 序列长度 2048
– 需要约 350GB 显存
常见 Bad Case 处理
- 重复生成 :通过惩罚重复 token 的概率(repetition_penalty 参数)
- 事实性错误 :结合检索增强生成(RAG)引入外部知识
避坑指南
Prompt 设计原则
- 明确指令格式:” 请用不超过 50 字回答 ”
- 提供示例:” 例如:输入 ’ 天气 ’,输出 ’ 今天晴转多云 '”
- 角色设定:” 你是一个专业的医疗顾问 ”
过拟合预防
- 早停机制(验证集 loss 连续 3 次不下降终止)
- 限制可训练参数:如仅微调 attention 层的偏置项
开放问题
如果要用 LoRA(低秩适配)微调 ChatGPT,下列哪些参数最值得优先优化?
– Attention 层的 Q / K 投影矩阵
– FFN 中间层权重
– LayerNorm 的参数
– 词嵌入矩阵
正文完
发表至: 人工智能
近两天内
