Interactive DualChecker for Mitigating Hallucinations in Distilling Large Language Models

本文是LLM系列文章,针对《Interactive DualChecker for Mitigating Hallucinations in Distilling Large Language Models》的翻译。

交互式 DualChecker,用于减轻蒸馏大型语言模型时的幻觉

摘要

大型语言模型 (LLM) 在各种机器学习 (ML) 任务中展示了卓越的功能。鉴于为监督学习创建带注释的数据集的成本很高,LLM 通过实现有效的小样本上下文学习提供了一种有价值的替代方案。然而,这些模型会产生幻觉,尤其是在知识不完整的领域。此外,当前使用 LLM 进行知识蒸馏的方法通常难以提高教师和学生模型的有效性。为了应对这些挑战,我们引入了 DualChecker,这是一个创新框架,旨在减轻幻觉并提高教师和学生模型在知识蒸馏过程中的表现。DualChecker 使用 ContextAligner 来确保教师模型提供的上下文与人工标记标准保持一致。它还具有一个动态检查器系统,可增强模型交互:当教师模型显示置信度较低时,一个组件会用更详细的内容重新提示教师模型,另一个组件会从学生模型中识别边缘案例以优化教学模板。此交互式过程可促进模型之间的持续改进和有效知识传递。我们使用绿色创新文本数据集评估 DualChecker,其中包括二进制、多类和标记分类任务。实验结果表明,DualChecker 的性能明显优于现有的最先进的方法,教师模型的 F1 分数提高了 17%,学生模型的 F1 分数提高了 10%。值得注意的是,即使在具有挑战性的领域,使用 LLM 预测进行微调的学生模型的性能也与使用实际数据进行微调的学生模型相当。我们公开了这项研究的所有数据集、模型和代码。

1 引言

2 相关工作

3 方法

4 实验

5 结论

在关系抽取中,实体偏差(entity bias)是指模型对某些实体的过度依赖,从而导致在新实体或少见实体上的泛化能力下降。这种偏差可能源于训练数据中的实体分布不平衡,或者模型本身在学习关系表示时未能有效解耦实体特征与关系特征[^4]。 为了解决这一问题,研究人员提出了基于变分方法(Variational Method)的框架来减少实体偏差的影响。该方法的核心思想是通过引入潜在变量建模实体表示中的不确定性,并在训练过程中鼓励模型对不同实体的鲁棒性[^1]。 具体来说,这种方法通常包括以下步骤: 1. **构建实体嵌入的不确定性表示**:使用变分推断的方法,将实体嵌入表示为一个概率分布(如高斯分布),而不是固定的向量。这样可以通过采样不同的实体表示来增强模型对实体变化的适应能力。 2. **优化目标函数**:在传统的关系分类损失函数基础上,加入 KL 散度项以约束实体嵌入的概率分布接近一个先验分布(通常是标准正态分布)。这有助于防止模型对特定实体表示的过度依赖。 3. **多任务学习策略**:有时会结合辅助任务(如实体类型预测)来进一步引导模型学习去偏的实体表示。 这种方法的优势在于其理论基础扎实,并且在多个基准数据集上展示了对实体偏差的有效缓解效果[^1]。 以下是一个简单的伪代码示例,展示如何实现变分方法的基本结构: ```python import torch import torch.nn as nn import torch.distributions as dist class VariationalEntityEncoder(nn.Module): def __init__(self, input_dim, latent_dim): super(VariationalEntityEncoder, self).__init__() self.fc_mu = nn.Linear(input_dim, latent_dim) self.fc_logvar = nn.Linear(input_dim, latent_dim) def reparameterize(self, mu, logvar): std = torch.exp(0.5 * logvar) eps = torch.randn_like(std) return mu + eps * std def forward(self, x): mu = self.fc_mu(x) logvar = self.fc_logvar(x) z = self.reparameterize(mu, logvar) return z, mu, logvar class RelationClassifier(nn.Module): def __init__(self, latent_dim, num_relations): super(RelationClassifier, self).__init__() self.classifier = nn.Sequential( nn.Linear(latent_dim * 2, 512), nn.ReLU(), nn.Linear(512, num_relations) ) def forward(self, h_head, h_tail): combined = torch.cat((h_head, h_tail), dim=1) logits = self.classifier(combined) return logits # 损失函数 def vae_loss(z_head, mu_head, logvar_head, z_tail, mu_tail, logvar_tail, relation_logits, labels): # KL散度损失 kl_div_head = -0.5 * torch.sum(1 + logvar_head - mu_head.pow(2) - logvar_head.exp()) kl_div_tail = -0.5 * torch.sum(1 + logvar_tail - mu_tail.pow(2) - logvar_tail.exp()) kl_loss = kl_div_head + kl_div_tail # 分类损失 class_loss = nn.CrossEntropyLoss()(relation_logits, labels) # 总损失 total_loss = class_loss + 0.1 * kl_loss # 系数可调 return total_loss # 示例用法 entity_encoder_head = VariationalEntityEncoder(input_dim=300, latent_dim=100) entity_encoder_tail = VariationalEntityEncoder(input_dim=300, latent_dim=100) relation_classifier = RelationClassifier(latent_dim=100, num_relations=50) # 假设输入实体表示 head_emb = torch.randn(32, 300) # batch_size x embedding_dim tail_emb = torch.randn(32, 300) z_head, mu_head, logvar_head = entity_encoder_head(head_emb) z_tail, mu_tail, logvar_tail = entity_encoder_tail(tail_emb) logits = relation_classifier(z_head, z_tail) labels = torch.randint(0, 50, (32,)) loss = vae_loss(z_head, mu_head, logvar_head, z_tail, mu_tail, logvar_tail, logits, labels) loss.backward() ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

UnknownBody

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值