Transformer——Q91 温度缩放(Temperature Scaling)对概率分布熵的影响证明

该问题归类到Transformer架构问题集——解码策略——采样与可控性。请参考LLM数学推导——Transformer架构问题集

1. 引言

在大语言模型(LLM)的文本生成领域,温度缩放(Temperature Scaling)是一项看似简单却蕴含深刻数学原理的核心技术。它通过一个名为 温度 T 的参数,像调节水龙头一样控制着模型输出的 “确定性” 与 “多样性”—— 低温让生成如精密钟表般严谨,高温则让创意如喷泉般迸发。而这一切的本质,在于温度对概率分布 ** 熵(Entropy)** 的精准调控。本文将从技术本质、数学推导、实战应用到优化策略,逐层揭开温度缩放的神秘面纱,帮助读者深入理解这一技术如何重塑 LLM 的生成逻辑。

2. 技术原理:温度如何重塑概率分布的 “灵魂”

2.1 从 logits 到概率:一场关于 “选择” 的数学魔法

LLM 在生成每个词时,会输出一个名为 logits 的向量 \mathbf{z} = [z_1, z_2, \dots, z_n],其中 z_i 表示模型对第 i 个词的 “偏好得分”。原始 logits 通过 softmax 函数 转化为概率分布:p_i = \frac{\exp(z_i)}{\sum_{j=1}^n \exp(z_j)}

但直接使用原始 logits 会导致分布 “两极分化”:高得分词的概率趋近于 1,低得分词被边缘化。温度缩放的介入,相当于给 logits 加上一个 “放大镜” 或 “缩小镜”:将 logits 除以温度 T 后再输入 softmax:p_i(T) = \frac{\exp(z_i / T)}{\sum_{j=1}^n \exp(z_j / T)}

温度的三种 “魔法形态”:
  1. 低温(T \to 0^+,如 T=0.5):聚焦确定性

    • 数学表现z_i / T 的差异被放大。例如,若 z_1=5z_2=3,T=0.1,缩放后变为 50 和 30,\exp(50) 远大于 \exp(30),概率集中在第一个词(p_1 \approx 1)。
    • 分布形态:如 “激光束” 般锐利,熵值 H \to 0,模型生成高度确定,适合法律文书、技术文档等需要精准性的场景。
  2. 常温(T=1):平衡的中点

    • 数学表现:直接使用原始 logits,概率分布反映模型的 “原生偏好”。
    • 分布形态:介于确定与随机之间,适合大多数常规生成任务(如对话回复、新闻摘要)。
  3. 高温(T \to +\infty,如 T=2):拥抱多样性

    • 数学表现z_i / T \to 0,所有词的指数值趋近于 1,概率分布趋于均匀(p_i \approx 1/n)。
    • 分布形态:如 “平铺的水彩” 般均匀,熵值 H \to \log n,模型生成充满随机性,适合故事创作、诗歌生成等创意任务。

2.2 熵:衡量分布 “不确定性” 的数学标尺

熵的计算公式为:

### Transformer 模型中的特征缩放 在构建和训练 Transformer 模型时,特征缩放是一个重要的预处理步骤。尽管 Transformer 架构本身并不像某些传统机器学习算法那样严格依赖于输入数据的尺度特性,但在实际应用中适当的数据标准化仍然有助于加速收敛并提高模型性能。 #### 数据标准化的重要性 对于大多数深度学习任务来说,尤其是当使用梯度下降法优化参数时,如果不同维度上的数值范围差异过大,则可能导致损失函数表面变得非常扁平或陡峭,在这种情况下权重更新会不稳定,进而影响到最终的学习效果[^1]。 因此,在将原始数据送入 Transformer 前通常会对连续型变量执行某种形式的标准变换操作来缩小其分布差距: - **均值归一化**:使每列特征具有零均值单位方差; - **最大最小规范化**:把所有样本映射至特定区间内(如\[0, 1\]),这可以通过线性比例因子完成; 具体采用哪种方式取决于应用场景和个人偏好,但无论选择哪一种方法都应该保持一致性——即在整个项目周期里始终沿用相同的策略对待相同类型的属性。 #### PyTorch 中实现特征缩放的例子 下面给出一段基于 `scikit-learn` 库来进行简单标准化的 Python 代码片段,并将其应用于准备好的批次数据上再传递给 Transformer 进行后续计算: ```python from sklearn.preprocessing import StandardScaler import numpy as np # 创建StandardScaler对象 scaler = StandardScaler() # 训练集fit_transform train_data_normalized = scaler.fit_transform(train_dataset) # 测试集transform (注意这里只做 transform 不重新 fit) test_data_normalized = scaler.transform(test_dataset) class TransformerModel(nn.Module): def __init__(self, input_dim=1): super(TransformerModel, self).__init__() # 定义模型结构... def forward(self, x): # 正向传播逻辑... pass model = TransformerModel(input_dim=train_data_normalized.shape[1]) criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 在这个例子中,先利用 `sklearn.preprocessing.StandardScaler()` 对训练集合进行了拟合(`fit`)转换(`transform`)得到标准化后的版本;而对于验证/测试部分仅需调用 `transform()` 函数即可因为它们共享同一套统计信息。之后调整了传入 `TransformerModel` 的 `input_dim` 参数以匹配新的输入尺寸。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨顿

唵嘛呢叭咪吽

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值