论文:https://arxiv.org/abs/2106.14448
代码:https://github.com/dropreg/R-Drop
转载:又是Dropout两次!这次它做到了有监督任务的SOTA - 科学空间|Scientific Spaces
原理
SimCSE将dropout两次的想法应用在无监督任务上,而R-drop将dropout两次的想法应用在有监督文本分类任务上。
论文:https://arxiv.org/abs/2106.14448
代码:https://github.com/dropreg/R-Drop
转载:又是Dropout两次!这次它做到了有监督任务的SOTA - 科学空间|Scientific Spaces
原理
SimCSE将dropout两次的想法应用在无监督任务上,而R-drop将dropout两次的想法应用在有监督文本分类任务上。
训练数据为 {��,��}�=1� ,模型为 ��(�|�) ,每个样本的loss一般是交叉熵:
��=−�����(��|��)
在dropout两次的情况下,其实我们可以认为样本已经通过了两个略有不同的模型,分别记为 ��1(�|�) 和 ��2(�|�) 。这时候R-drop的loss分为两部分,一部分是常规的交叉熵:
����=−�����1(��|��)−�����2(��|��)
另一部分则是两个模型之间的对称KL散度,它希望不同dropout的模型输出尽可能一致:
����=12[��(��2(�|��)||��1(�|��))+��(��1(�|��)||��2(�|��))]
最终loss就是两个loss的加权和:
��=����+�����
也就是说,他在常规交叉熵的基础上加了一项强化模型鲁棒性的正则项。
分析
1、R-drop对dropout的改进
dropout使得模型存在训练和预测不一致问题。具体来说,dropout在训练阶段随机mask全连接层,这样每次预测时的模型是不同的,所以dropout的操作一定程度上使得训练后的模型是多个子模型的组合。但预测时直接关闭dropout,此时模型只有一个,但使用的是全部全连接层,这等价于预测模型由“模型平均”变成了“权重平均”。
R-drop通过增加一个正则项来强化模型对dropout的鲁棒性,使得不同的dropout下模型的输出基本一致,促进“模型平均”与“权重平均”的相似性,从而使得简单关闭dropout的效果等价于多dropout模型融合的结果,提升模型最终性能。
2、损失函数的解释
一个比较直接的疑问是,如果我的模型够复杂,单靠交叉熵这一项,不能使得模型对dropout鲁邦吗?事实上还真不能。交叉熵的训练目标是:让目标类的得分大于非目标类的得分。也就是说,如果只有交叉熵这一项,模型的训练效果顶多是不同的dropout下,目标类的得分都大于非目标类的得分,而不能做到不同的dropout下每个类的得分一直,所以也就没有解决训练预测不一致的问题。从公式上来看,交叉熵和目标类有关,不关心非目标类的分布,加入目标类为第一个类,那么预测结果是 [0.5, 0.2, 0.3] 或 [0.5, 0.3, 0.2],对他来说没有区别。但对于KL散度就不一样了,每个类的得分都要参与计算,[0.5, 0.2, 0.3] 或 [0.5, 0.3, 0.2]是有非零损失的。
分析
1、R-drop对dropout的改进
dropout使得模型存在训练和预测不一致问题。具体来说,dropout在训练阶段随机mask全连接层,这样每次预测时的模型是不同的,所以dropout的操作一定程度上使得训练后的模型是多个子模型的组合。但预测时直接关闭dropout,此时模型只有一个,但使用的是全部全连接层,这等价于预测模型由“模型平均”变成了“权重平均”。
R-drop通过增加一个正则项来强化模型对dropout的鲁棒性,使得不同的dropout下模型的输出基本一致,促进“模型平均”与“权重平均”的相似性,从而使得简单关闭dropout的效果等价于多dropout模型融合的结果,提升模型最终性能。
2、损失函数的解释
一个比较直接的疑问是,如果我的模型够复杂,单靠交叉熵这一项,不能使得模型对dropout鲁邦吗?事实上还真不能。交叉熵的训练目标是:让目标类的得分大于非目标类的得分。也就是说,如果只有交叉熵这一项,模型的训练效果顶多是不同的dropout下,目标类的得分都大于非目标类的得分,而不能做到不同的dropout下每个类的得分一直,所以也就没有解决训练预测不一致的问题。从公式上来看,交叉熵和目标类有关,不关心非目标类的分布,加入目标类为第一个类,那么预测结果是 [0.5, 0.2, 0.3] 或 [0.5, 0.3, 0.2],对他来说没有区别。但对于KL散度就不一样了,每个类的得分都要参与计算,[0.5, 0.2, 0.3] 或 [0.5, 0.3, 0.2]是有非零损失的。