Keras中自定义复杂的Loss函数(调优用)

参考博客:https://spaces.ac.cn/archives/4493

输入-输出设计 #

Keras的模型是函数式的,即有输入,也有输出,而loss即为预测值与真实值的某种误差函数。Keras本身也自带了很多Loss函数,如mse、交叉熵等,直接调用即可。而要自定义loss,最自然的方法就是仿照Keras自带的loss进行改写。

比如,我们做分类问题时,经常用的就是softmax输出,然后用交叉熵作为loss。然而这种做法也有不少缺点,其中之一就是分类太自信,哪怕输入噪音,分类的结果也几乎是非1即0,这通常会导致过拟合的风险,还会使得我们在实际应用中没法很好地确定置信区间、设置阈值。因此很多时候我们也会想办法使得分类别太自信,而修改loss也是手段之一。

如果不修改loss,我们就是使用交叉熵去拟合一个one hot的分布。交叉熵的公式是

S(q|p)=−∑ qi logpi

其中pi是预测的分布,而qi是真实的分布,比如输出为[z1,z2,z3],目标为[1,0,0],那么

loss=−log(ez1/Z),Z=ez1+ez2+ez3
只要z1已经是[z1,z2,z3]的最大值,那么我们总可以“变本加厉”——通过增大训练参数,使得z1,z2,z3增加足够大的比例(等价地,即增大向量[z1,z2,z3]的模长),从而ez1/Z足够接近1(等价地,loss足够接近0)。这就是通常softmax过于自信的来源:只要盲目增大模长,就可以降低loss,训练器肯定是很乐意了,这代价太低了。

为了使得分类不至于太自信,一个方案就是不要单纯地去拟合one hot分布,分一点力气去拟合一下均匀分布,即改为新loss:

loss=−(1−ε)log(ez1/Z)−ε∑1/3log(ezi/Z),Z=ez1+ez2+ez3(增加均匀分布)

这样,盲目地增大比例使得ez1/Z接近于1,就不再是最优解了,从而可以缓解softmax过于自信的情况,不少情况下,这种策略还可以增加测试准确率(防止过拟合)。

猜你喜欢

转载自blog.csdn.net/xiaomifanhxx/article/details/83615981