大模型熵-控制模型探索or利用
目录
香农熵:
1. 核心定义:什么是香农熵?
基于策略梯度的方法,如 PPO、AC 等)中,加入熵项的意义:
1. 熵项的本质:衡量策略的随机性
2. 熵项的计算方式(分场景)
(1)离散动作空间(如 Atari 游戏、多分类动作)
(2)连续动作空间(如机器人控制、自动驾驶)
3. 熵项在损失函数中的作用
4. 常见变种:自适应熵系数
总结
代码-基于大模型的输出输出计算熵:
为什么要mask掉熵更大的token,背后的原理是什么?
1. 核心:熵值与模型不确定性的关系
2. 为什么要 mask 高熵 token?典型场景与原理
(1)半监督学习 / 自训练:筛选 “可靠样本” 减少噪声干扰
(2)主动学习:优先标注 “模型不确定的样本”
(3)模型压缩 / 知识蒸馏:保留关键信息,简化模型
(4)对抗训练 / 噪声鲁棒性:减少对 “不稳定 token” 的依赖
3. 反例:何时需要保留高熵 token?
总结
香农熵:
香农熵是信息论的核心概念,用来量化随机事件的不确定性或信息量大小,不确定性越高,香农熵的值越大。
这个概念由克劳德・香农在 1948 年提出,它不仅奠定了现代通信的理论基础,还广泛应用于数据压缩、机器学习(如决策树特征选择)、密码学等领域。
1. 核心定义:什么是香农熵?
对于一个离散的随机变量 X,它的可能取值为 \(x_1, x_2, ..., x_n\),每个取值的概率为 \(p(x_1), p(x_2), ..., p(x_n)\)(满足 \(\sum_{i=1}^n p(x_i) = 1\)),则其香农熵 \(H(X)\) 的计算公式为:
- 单位:公式中若使用以 2 为底的对数(\(\log_2\)),熵的单位为 “比特(bit)”;若用自然对数(\(\ln\)),单位为 “奈特(nat)”,日常场景中 “比特” 最常用。
- 特殊情况:当某一事件的概率为 1(必然发生),其他为 0 时,\(H(X) = 0\)(完全确定,无不确定性);当所有事件概率相等(\(p(x_i) = 1/n\))时,熵达到最大值(不确定性最高)。
基于策略梯度的方法,如 PPO、AC 等)中,加入熵项的意义:
在强化学习(尤其是基于策略梯度的方法,如 PPO、A2C 等)中,加入熵项(entropy term) 的核心目的是鼓励策略探索(exploration),避免策略过早收敛到局部最优的确定性策略(确定性策略缺乏探索性)。熵项的计算通常基于策略输出的概率分布,具体方式如下:
1. 熵项的本质:衡量策略的随机性
强化学习中,策略(policy)通常被建模为一个概率分布 \(\pi(a|s)\),表示在状态 s 下选择动作 a 的概率。策略的熵 定义为:
- 若策略是确定性的(某个动作概率为 1,其他为 0),熵为 0(无随机性,探索性差)。
- 若策略是随机的(动作概率分布分散),熵值较高(探索性强)。
因此,在损失函数中加入熵项(通常为负系数,即 - 熵值),可通过梯度下降 “惩罚” 低熵策略,迫使策略保持一定随机性。
2. 熵项的计算方式(分场景)
(1)离散动作空间(如 Atari 游戏、多分类动作)
动作空间 \(\mathcal{A}\) 是有限离散集合(如上下左右),策略 \(\pi(a|s)\) 通常由神经网络输出的类别分布(categorical distribution) 表示(通过 softmax 激活)。
熵项计算为:在代码中,给定神经网络输出的 logits(未归一化的概率),可先通过 softmax 得到概率分布,再计算熵:
import torch
import torch.nn.functional as F# 假设logits是模型输出的未归一化概率,shape=(batch_size, num_actions)
logits = model(state) # (batch_size, num_actions)
probs = F.softmax(logits, dim=-1) # 动作概率分布,(batch_size, num_actions)
log_probs = F.log_softmax(logits, dim=-1) # 对数概率,(batch_size, num_actions)# 计算每个样本的熵:-sum(p * log p)
entropy = -torch.sum(probs * log_probs, dim=-1) # (batch_size,)# 整个批次的平均熵(用于损失函数)
mean_entropy = entropy.mean()
(2)连续动作空间(如机器人控制、自动驾驶)
动作空间 \(\mathcal{A}\) 是连续区间(如力度、角度),策略 \(\pi(a|s)\) 通常由高斯分布(Gaussian distribution) 表示,即 ,其中 \(\mu\) 是均值,\(\sigma\) 是标准差(由神经网络输出)。
高斯分布的熵解析解为:(与均值 \(\mu\) 无关,仅取决于标准差 \(\sigma\))
import torch# 假设模型输出均值mu和对数标准差log_sigma(避免sigma为负)
mu = model_mu(state) # (batch_size, action_dim)
log_sigma = model_log_sigma(state) # (batch_size, action_dim)
sigma = torch.exp(log_sigma) # 标准差# 高斯分布的熵:0.5 * log(2πeσ²),对每个动作维度计算后求和
entropy = 0.5 * (1 + 2 * log_sigma + torch.log(2 * torch.tensor(torch.pi)))
# 对动作维度求和,得到每个样本的熵
entropy = entropy.sum(dim=-1) # (batch_size,)# 整个批次的平均熵
mean_entropy = entropy.mean()
3. 熵项在损失函数中的作用
强化学习的策略梯度损失通常由两部分组成:
- 第一项是策略梯度项(利用优势函数 \(A(s,a)\) 鼓励高回报动作)。
- 第二项是熵正则项,其中 \(\beta > 0\) 是熵系数(控制探索强度):
- \(\beta\) 越大,熵项权重越高,策略越倾向于随机(探索性强)。
- \(\beta\) 越小,策略越倾向于贪婪(利用性强)。
4. 常见变种:自适应熵系数
为了动态平衡探索与利用,一些算法(如 SAC)会使用自适应熵系数,让熵项自动调整到目标值(如 ,即均匀分布的熵)。此时熵项的损失变为:
通过梯度下降调整 \(\beta\),使实际熵接近目标值。
总结
强化学习中熵项的计算核心是衡量策略概率分布的随机性:
- 离散动作:基于类别分布的熵
。
- 连续动作:基于高斯分布的解析熵(与标准差相关)。其作用是通过正则化策略,在 “利用已知高回报动作” 和 “探索未知动作” 之间取得平衡。
代码-基于大模型的输出输出计算熵:
计算香农熵代码:
基于每个样本的所有输出计算,值代表输出的分布稳定性:
https://github.com/huggingface/trl/blob/main/trl/trainer/utils.py#L1480
entropies = []
for chunk in flat_logits.split(chunk_size, dim=0):logps = F.log_softmax(chunk, dim=-1)chunk_entropy = -(torch.exp(logps) * logps).sum(-1)entropies.append(chunk_entropy)
计算熵的分布,将熵超出阈值范围的样本过滤掉:
https://github.com/huggingface/trl/blob/main/trl/trainer/grpo_trainer.py#L1797
def get_high_entropy_mask(self, entropies: torch.Tensor, mask: torch.Tensor, threshold: float) -> torch.Tensor:"""Returns a binary mask identifying tokens whose entropy exceeds a given quantile threshold.Args:entropies (`torch.Tensor`):Tensor of shape (batch_size, seq_len) with per-token entropy values.mask (`torch.Tensor`):Binary mask of the same shape as `entropies`, where `1` indicates valid tokens and `0` padding.threshold (`float`):Quantile threshold between `0.0` and `1.0` to select high-entropy tokens.Returns:`torch.Tensor`:Boolean mask of shape (batch_size, seq_len), where `True` indicates tokens with entropy >= thresholdand `False` otherwise."""local = entropies[mask.bool()].float()# Use a negative pad_value as a sentinel because entropy values are always >= 0.# This guarantees that the sentinel cannot collide with any real entropy value.pad_value = -1e9# Pad across processes so that every rank has the same tensor lengthpadded = self.accelerator.pad_across_processes(local, dim=0, pad_index=pad_value)gathered = self.accelerator.gather(padded)# Drop sentinel values (safe because no entropy can be negative)gathered = gathered[gathered != pad_value]if gathered.numel() == 0:return torch.zeros_like(entropies, dtype=torch.bool)entropy_threshold = torch.quantile(gathered, threshold)masked_entropies = entropies * mask.float()entropy_mask = masked_entropies >= entropy_thresholdreturn entropy_mask & mask.bool() # ensure padding tokens are always masked out
为什么要mask掉熵更大的token,背后的原理是什么?
在模型训练或推理中,“mask 掉熵更大的 token” 是一种基于不确定性量化的策略,其核心原理与模型对 token 的 “置信度” 密切相关。具体来说,熵值越高的 token,代表模型对该 token 的预测不确定性越大(或输出分布越分散)。mask 掉这些 token 的背后逻辑,需要结合具体任务场景(如半监督学习、自训练、模型压缩等)来理解,常见动机如下:
1. 核心:熵值与模型不确定性的关系
首先明确熵值在 token 层面的含义:对于模型输出的 token 概率分布 \(P = [p_1, p_2, ..., p_k]\)(k 为词汇表大小),其熵值衡量了分布的 “混乱程度”:
- 熵值高:概率分布分散(如 \(p_1=0.2, p_2=0.3, p_3=0.5\)),模型对该 token 的预测没有明确倾向,不确定性大(可能是难样本、噪声或模型未学好的部分)。
- 熵值低:概率分布集中(如 \(p_1=0.95, p_2=0.03, ...\)),模型对该 token 的预测置信度高,不确定性小。
2. 为什么要 mask 高熵 token?典型场景与原理
(1)半监督学习 / 自训练:筛选 “可靠样本” 减少噪声干扰
在半监督学习中,模型常利用未标注数据生成伪标签(pseudo-label)辅助训练。但高熵 token 的伪标签可靠性低(模型自己都不确定),若直接用于训练,可能引入噪声,导致模型性能下降。
- 策略:mask 掉高熵 token 的伪标签(或不使用这些 token 参与损失计算),只保留低熵、高置信度的 token 作为有效监督信号。
- 原理:通过过滤低质量信息,让模型专注于学习 “确定的知识”,避免被噪声带偏。
(2)主动学习:优先标注 “模型不确定的样本”
主动学习的目标是用最少的标注成本提升模型性能,核心是筛选 “最有价值” 的样本让人类标注。此时,高熵 token 对应的样本往往是模型知识的薄弱点。
- 策略:mask 掉低熵 token(模型已掌握),只关注高熵 token 所在的样本,优先标注这些样本。
- 原理:高熵 token 包含更多模型 “未知” 的信息,标注后能最大程度弥补模型缺陷,提升效率。
(3)模型压缩 / 知识蒸馏:保留关键信息,简化模型
在知识蒸馏中,教师模型向学生模型传递知识时,高熵 token 可能是冗余信息(如无关的修饰词、重复内容),或因教师模型自身不确定而传递错误知识。
- 策略:mask 掉高熵 token,只让学生模型学习教师模型高置信度(低熵)的输出。
- 原理:过滤冗余或不可靠的信息,让学生模型聚焦核心知识,提升压缩效率。
(4)对抗训练 / 噪声鲁棒性:减少对 “不稳定 token” 的依赖
在含噪声的数据中(如拼写错误、模糊文本),高熵 token 可能是噪声导致的 “异常值”,模型过度关注这些 token 会降低鲁棒性。
- 策略:mask 高熵 token,强制模型学习文本中更稳定、低熵的核心语义(如关键词、主体词)。
- 原理:提升模型对噪声的抗干扰能力,让决策依赖更可靠的特征。
3. 反例:何时需要保留高熵 token?
并非所有场景都要 mask 高熵 token,需根据目标灵活调整:
- 若目标是发现模型缺陷(如测试集分析),高熵 token 是重要线索(提示模型在哪些 token 上表现差)。
- 若任务是生成多样化内容(如创意写作),高熵 token 可能对应更多样的选择,需保留以增加输出丰富度。
总结
“mask 高熵 token” 的核心逻辑是:通过过滤模型不确定性高的信息,提升训练效率、减少噪声干扰或聚焦关键知识。其本质是一种 “基于置信度的信息筛选策略”,具体效果依赖于任务目标和数据特性。