wordpress+私信/上海网站营销seo方案
标签平滑的作用:就是小幅度的改变原有标签值的值域
原因:因为在理论上即使是人工的标注数据也可能并非完全正确, 会受到一些外界因素的影响而产生一些微小的偏差
因此使用标签平滑来弥补这种偏差, 减少模型对某一条规律的绝对认知, 以防止过拟合. 通过下面示例了解更多.
标签平滑理论:
在2016年,Szegedy等人提出了inception v2的模型(论文:Rethinking the inception architecture for computer vision.)。其中提到了Label Smoothing技术,用以减轻这个问题。
transformer中,可以直接导入标签平滑工具包, 该工具用于标签平滑,代码如下:
# -*- coding: utf-8 -*-
from pyitcast.transformer_utils import LabelSmoothing
from torch.autograd import Variable
import torch
import matplotlib.pyplot as plt# 使用LabelSmoothing实例化一个crit对象.
# 第一个参数size代表目标数据的词汇总数, 也是模型最后一层得到张量的最后一维大小
# 这里是5说明目标词汇总数是5个. 第二个参数padding_idx表示要将那些tensor中的数字
# 替换成0, 一般padding_idx=0表示不进行替换. 第三个参数smoothing, 表示标签的平滑程度
# 如原来标签的表示值为1, 则平滑后它的值域变为[1-smoothing, 1+smoothing].
crit = LabelSmoothing(size=5, padding_idx=0, smoothing=0.5)# 假定一个任意的模型最后输出预测结果和真实结果
predict = Variable(torch.FloatTensor([[0, 0.2, 0.7, 0.1, 0],[0, 0.2, 0.7, 0.1, 0],[0, 0.2, 0.7, 0.1, 0]]))
# torch.FloatTensor([[0, 0.2, 0.7, 0.1, 0],
# [0, 0.2, 0.7, 0.1, 0],
# [0, 0.2, 0.7, 0.1, 0]]))
# 标签的表示值是0,1,2;值域:[0,2]
target = Variable(torch.LongTensor([2, 1, 0]))
# print(target.shape)# 将predict, target传入到对象中
print("损失值:",crit(predict, target))
print("-------------")# true_dist:源码中定义的参数,平滑后的标签结果,值域:[-0.5,2.5]
# 即就是:值域:[0,2]-->值域:[-0.5,2.5]
# 满足公式:0-smoothing=0.5,2+smoothing=0.5
print(crit.true_dist)
# tensor([[0.0000, 0.1667, 0.5000, 0.1667, 0.1667],
# [0.0000, 0.5000, 0.1667, 0.1667, 0.1667],
# [0.0000, 0.0000, 0.0000, 0.0000, 0.0000]])
# 绘制标签平滑图像
plt.imshow(crit.true_dist)
plt.show()
# 标签平滑图像分析:
# 我们目光集中在黄色小方块上, 它相对于横坐标横跨的值域就是标签平滑后的正向平滑值域, 我们可以看到大致是从0.5到2.5.
# 它相对于纵坐标横跨的值域就是标签平滑后的负向平滑值域, 我们可以看到大致是从-0.5到1.5, 总的值域空间由原来的[0, 2]变成了[-0.5, 2.5].
我们先来看一下原理。假设我们的分类只有两个,一个是猫一个不是猫,分别用1和0表示。Label Smoothing的工作原理是对原来的[0 1]这种标注做一个改动,假设我们给定Label Smoothing的值为0.1:
可以看到,原来的[0,1]编码变成了[0.05,0.95]了。这个label_smoothing的值假设为ϵ,那么就是说,原来分类准确的时候,p=1,不准确为p=0,现在变成了p=1−ϵ和ϵ,也就是说对分类准确做了一点惩罚。
Label Smoothing在很多问题上对模型都有一定的提升。
在Tensorflow中使用方法时候只要在损失函数中加上label_smoothing的值即可,如下:
tf.losses.softmax_cross_entropy(onehot_labels,logits,weights=1.0,label_smoothing=0,scope=None,loss_collection=tf.GraphKeys.LOSSES,reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)