企业招聘网站大全免费宁波设计网站公司
news/
2025/10/7 6:06:19/
文章来源:
企业招聘网站大全免费,宁波设计网站公司,大人和小孩做系列网站,公司网站后台怎么添加内容文 | 苏剑林编 | 智商掉了一地单位 | 追一科技思想朴素却不平凡的分类问题后处理技巧#xff0c;浅显易懂的讲解#xff0c;拿来吧你#xff01;顾名思义#xff0c;本文将会介绍一种用于分类问题的后处理技巧——CAN#xff08;Classification with Alternating Normaliz… 文 | 苏剑林编 | 智商掉了一地单位 | 追一科技思想朴素却不平凡的分类问题后处理技巧浅显易懂的讲解拿来吧你顾名思义本文将会介绍一种用于分类问题的后处理技巧——CANClassification with Alternating Normalization。经过笔者的实测CAN确实多数情况下能提升多分类问题的效果而且几乎没有增加预测成本因为它仅仅是对预测结果的简单重新归一化操作。有趣的是其实CAN的思想是非常朴素的朴素到每个人在生活中都应该用过同样的思想。然而CAN的论文却没有很好地说清楚这个思想只是纯粹形式化地介绍和实验这个方法。本文的分享中将会尽量将算法思想介绍清楚。论文标题When in Doubt: Improving Classification Performance with Alternating Normalization论文链接https://arxiv.org/abs/2109.13449思想例子假设有一个二分类问题模型对于输入给出的预测结果是那么我们就可以给出预测类别为接下来对于输入模型给出的预测结果是这时候处于最不确定的状态我们也不知道输出哪个类别好。但是假如我告诉你类别必然是0或1其中之一两个类别的出现概率各为0.5。在这两点先验信息之下由于前一个样本预测结果为1那么基于朴素的均匀思想我们是否更倾向于将后一个样本预测为0以得到一个满足第二点先验的预测结果这样的例子还有很多比如做10道选择题前9道你都比较有信心第10题完全不会只能瞎蒙然后你一看发现前9题选A、B、C的都有就是没有一个选D的那么第10题在蒙的时候你会不会更倾向于选D这些简单例子的背后有着跟CAN同样的思想它其实就是用先验分布来校正低置信度的预测结果使得新的预测结果的分布更接近先验分布。2 不确定性准确来说CAN是针对低置信度预测结果的后处理手段所以我们首先要有一个衡量预测结果不确定性的指标。常见的度量是“熵”[1]对于定义为然而虽然熵是一个常见选择但其实它得出的结果并不总是符合我们的直观理解。比如对于和直接套用公式得到但就我们的分类场景而言显然我们会认为比更不确定所以直接用熵还不够合理。一个简单的修正是只用前top-个概率值来算熵不失一般性假设是概率最高的个值那么其中。为了得到一个01范围内的结果我们取为最终的不确定性指标。算法步骤现在假设我们有个样本需要预测类别模型直接的预测结果是个概率分布假设测试样本和训练样本是同分布的那么完美的预测结果应该有其中是类别的先验分布我们可以直接从训练集估计。也就是说全体预测结果应该跟先验分布是一致的但受限于模型性能等原因实际的预测结果可能明显偏离上式这时候我们就可以人为修正这部分。具体来说我们选定一个阈值将指标小于的预测结果视为高置信度的而大于等于的则是低置信度的不失一般性我们假设前个结果属于高置信度的而剩下的个属于低置信度的。我们认为高置信度部分是更加可靠的所以它们不用修正并且可以用它们来作为“标准参考系”来修正低置信度部分。具体来说对于我们将与高置信度的一起执行一次 “行间标准化 这里的其中乘除法都是element-wise的。不难发现这个标准化的目的是使得所有新的的平均向量等于先验分布也就是促使式(3)的成立。然而这样标准化之后每个就未必满足归一化了所以我们还要执行一次 行内标准化 理论上这两步可以交替迭代几次不过实验结果显示一次的效果就挺好了。最后我们只保留最新的作为原来第个样本的预测结果其余的均弃之不用。注意这个过程需要我们遍历每个低置信度结果执行也就是说是逐个样本进行修正而不是一次性修正的每个都借助原始的高置信度结果组合来按照上述步骤迭代虽然迭代过程中对应的都会随之更新但那只是临时结果最后都是弃之不用的每次修正都是用原始的。参考实现这是笔者给出的参考实现代码# 预测结果计算修正前准确率
y_pred model.predict(valid_generator.fortest(), stepslen(valid_generator), verboseTrue
)
y_true np.array([d[1] for d in valid_data])
acc_original np.mean([y_pred.argmax(1) y_true])
print(original acc: %s % acc_original)# 评价每个预测结果的不确定性
k 3
y_pred_topk np.sort(y_pred, axis1)[:, -k:]
y_pred_topk / y_pred_topk.sum(axis1, keepdimsTrue)
y_pred_uncertainty -(y_pred_topk * np.log(y_pred_topk)).sum(1) / np.log(k)# 选择阈值划分高、低置信度两部分
threshold 0.9
y_pred_confident y_pred[y_pred_uncertainty threshold]
y_pred_unconfident y_pred[y_pred_uncertainty threshold]
y_true_confident y_true[y_pred_uncertainty threshold]
y_true_unconfident y_true[y_pred_uncertainty threshold]# 显示两部分各自的准确率
# 一般而言高置信度集准确率会远高于低置信度的
acc_confident (y_pred_confident.argmax(1) y_true_confident).mean()
acc_unconfident (y_pred_unconfident.argmax(1) y_true_unconfident).mean()
print(confident acc: %s % acc_confident)
print(unconfident acc: %s % acc_unconfident)# 从训练集统计先验分布
prior np.zeros(num_classes)
for d in train_data:prior[d[1]] 1.prior / prior.sum()# 逐个修改低置信度样本并重新评价准确率
right, alpha, iters 0, 1, 1
for i, y in enumerate(y_pred_unconfident):Y np.concatenate([y_pred_confident, y[None]], axis0)for j in range(iters):Y Y**alphaY / Y.sum(axis0, keepdimsTrue)Y * prior[None]Y / Y.sum(axis1, keepdimsTrue)y Y[-1]if y.argmax() y_true_unconfident[i]:right 1# 输出修正后的准确率
acc_final (acc_confident * len(y_pred_confident) right) / len(y_pred)
print(new unconfident acc: %s % (right / (i 1.)))
print(final acc: %s % acc_final)实验结果那么这样的简单后处理究竟能带来多大的提升呢原论文给出的实验结果是相当可观的▲原论文的实验结果之一笔者也在CLUE上的两个中文文本分类任务上做了实验显示基本也有点提升但没那么可观验证集结果IFLYTEK(类别数:119)TNEWS(类别数:15)BERT60.06%56.80%BERT CAN60.52%56.86%RoBERTa60.64%58.06%RoBERTa CAN60.95%58.00%大体上来说类别数目越多效果提升越明显如果类别数目比较少那么可能提升比较微弱甚至会下降当然就算下降也是微弱的所以这算是一个“几乎免费的午餐”了。超参数选择方面上面给出的中文结果只迭代了1次的选择为3、的选择为0.9经过简单的调试发现这基本上已经是比较优的参数组合了。还有的读者可能想问前面说的“高置信度那部分结果更可靠”这个情况是否真的成立至少在笔者的两个中文实验上它是明显成立的比如IFLYTEK任务筛选出来的高置信度集准确率为0.63而低置信度集的准确率只有0.22TNEWS任务类似高置信度集准确率为0.58而低置信度集的准确率只有0.23。个人评价最后再来综合地思考和评价一下CAN。首先一个很自然的疑问是为什么不直接将所有低置信度结果跟高置信度结果拼在一起进行修正而是要逐个进行修正笔者不知道原论文作者有没有对比过但笔者确实实验过这个想法结果是批量修正有时跟逐个修正持平但有时也会下降。其实也可以理解CAN本意应该是借助先验分布结合高置信度结果来修正低置信度的在这个过程中如果掺入越多的低置信度结果那么最终的偏差可能就越大因此理论上逐个修正会比批量修正更为可靠。说到原论文读过CAN论文的读者应该能发现本文介绍与CAN原论文大致有三点不同不确定性指标的计算方法不同。按照原论文的描述它最终的不确定性指标计算方式应该是也就是说它也是top-个概率算熵的形式但是它没有对这个概率值重新归一化并且它将其压缩到01之间的因子是而不是因为它没有重新归一化所以只有除才能保证01之间。经过笔者测试原论文的这种方式计算出来的结果通常明显小于1这不利于我们对阈值的感知和调试。对CAN的介绍方式不同。原论文是纯粹数学化、矩阵化地陈述CAN的算法步骤而且没有介绍算法的思想来源这对理解CAN是相当不友好的。如果读者没有自行深入思考算法原理是很难理解为什么这样的后处理手段就能提升分类效果的而在彻底弄懂之后则会有一种故弄玄虚之感。CAN的算法流程略有不同。原论文在迭代过程中还引入了参数使得式(4)变为也就是对每个结果进行次方后再迭代。当然原论文也没有对此进行解释而在笔者看来该参数纯粹是为了调参而引入的参数多了总能把效果调到有所提升没有太多实际意义。而且笔者自己在实验中发现基本已经是最优选择了精调也很难获得是实质收益。文章小结本文介绍了一种名为CAN的简单后处理技巧它借助先验分布来将预测结果重新归一化几乎没有增加多少计算成本就能提高分类性能。经过笔者的实验CAN确实能给分类效果带来一定提升并且通常来说类别数越多效果越明显。后台回复关键词【入群】加入卖萌屋NLP/IR/Rec与求职讨论群后台回复关键词【顶会】获取ACL、CIKM等各大顶会论文集 [1] 苏剑林. (Dec. 1, 2015). 《“熵”不起从熵、最大熵原理到最大熵模型一》[Blog post]. Retrieved from https://kexue.fm/archives/3534
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929997.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!