# 因果语言建模(Causal Language Modeling)

# 直观理解

因果语言建模就像是在写作时,根据已经写出的内容来预测下一个词。这种训练方式模拟了人类的语言生成过程,每次只能看到前面的内容,而不能看到后面的内容,就像我们在写作时一样。

# 技术原理

# 1. 自回归生成

因果语言建模的核心特点:

  • 单向注意力:只能看到当前位置之前的内容
  • 逐词生成:每次预测下一个词
  • 概率链式分解:P(x1,...,xn)=i=1nP(xix<i)P(x_1, ..., x_n) = \prod_{i=1}^n P(x_i|x_{<i})

# 2. 训练目标

模型需要最大化序列的联合概率:

LCLM=i=1nlogP(xix<i)L_{CLM} = -\sum_{i=1}^n \log P(x_i|x_{<i})

其中:

  • xix_i 是序列中的第i个词元
  • x<ix_{<i} 表示第i个词元之前的所有词元

# 数学推导

# 1. 概率计算

对于每个位置,模型输出下一个词的概率分布:

P(xix<i)=softmax(Wohi+bo)P(x_i|x_{<i}) = softmax(W_o h_i + b_o)

其中:

  • hih_i 是Transformer解码器最后一层对应位置的隐藏状态
  • WoW_obob_o 是输出层的参数

# 2. 注意力掩码

为确保模型只能看到当前位置之前的信息:

maskij={0ifi<jifijmask_{ij} = \begin{cases} 0 & \text{if } i < j \\ -\infty & \text{if } i \geq j \end{cases}

# 实现细节

class CausalLanguageModel(nn.Module):
    def __init__(self, vocab_size, hidden_size):
        super().__init__()
        self.transformer = nn.TransformerDecoder(...)
        self.lm_head = nn.Linear(hidden_size, vocab_size)
        
    def forward(self, input_ids, attention_mask=None):
        # 创建因果注意力掩码
        seq_length = input_ids.size(1)
        causal_mask = torch.triu(
            torch.ones(seq_length, seq_length),
            diagonal=1
        ).bool()
        
        # 前向传播
        hidden_states = self.transformer(
            input_ids,
            attention_mask=attention_mask,
            causal_mask=causal_mask
        )
        
        # 预测下一个词
        lm_logits = self.lm_head(hidden_states)
        return lm_logits

# 优化技巧

# 1. 训练策略

  1. 序列长度控制

    • 动态批处理
    • 梯度累积
  2. 学习率调整

    • 余弦退火
    • 学习率预热

# 2. 生成优化

  1. 采样策略

    • 温度采样
    • Top-k采样
    • 核采样(Top-p)
  2. 生成控制

    • 长度惩罚
    • 重复惩罚
    • 主题引导

# 应用场景

  1. 文本生成

    • 故事创作
    • 代码生成
    • 对话生成
  2. 语言理解

    • 文本补全
    • 上下文预测
    • 语言建模

# 注意事项

  1. 训练数据

    • 数据质量控制
    • 领域适配性
    • 数据清洗
  2. 模型设计

    • 注意力机制优化
    • 参数效率
    • 推理速度
  3. 生成控制

    • 避免重复
    • 保持连贯性
    • 控制生成长度