这篇教程keras:binary_crossentropy和categorical_crossentropy的区别写得很实用,希望能帮到您。
关于binary_crossentropy和categorical_crossentropy的区别
1.CE
%20,%20f(xi)->y_hat
二分类举例而言,y=[[0,1],[1,0]]%20(两个样本,一个标签1,一个0)
y_hat%20=[[0.5,0.5],%20[0.8,0.2]]
第一个样本的CE=-[0,1]*ln([0.5,0.5])=-ln(0.5)
第二个样本的CE=-[1,0]*ln([0.8,%200.2])=-ln(0.8)
总CE=两个样本的平均
keras里面的CE是均值的CE,所以上面两个样本需要除以2,所以在keras下面敲代码
CE(y,y_hat)输出是0.458
需要注意的是,keras里面的CE会自动帮你归一化
y_hat=[0.2,0.8] 和 y_hat=[2.,8.]结果是完全一样的
2.BCE
之前没有听过这个loss,因为觉得CE可以兼容二分类的情况,今天看到keras里面特意实现了这个,想搞明白,于是找了些资料,这一找,可算是把自己绕了进去,主要来自这篇blog
https://zhuanlan.zhihu.com/p/48078990 ,我一度觉得这篇文章是错的,但是最后明白,这篇文章基本还是对的。
还是用二分类举例而言,y=[[0,1],[1,0]] (两个样本,一个标签1,一个0)
y_hat =[[0.5,0.5], [0.8,0.2]]
第一个样本的BCE=-([0, 1]*ln([0.5,0.5]) + (1-[0,1])*ln([0.5,0.5]))/2=-ln(0.5)
第二个样本的BCE=-([1,0]*ln([0.8, 0.2]) + (1-[1,0])*ln([0.2,0.8]))/2=-ln(0.8)
这个例子和CE得例子结果一样,是因为两个预测向量的reduce_sum=1,所以BCE的前后两项loss相等,所以CE=BCE,如果reduce_sum!=1,那么输出就不同了。
所以BCE相对于CE加入了一项对非1预测部分的惩罚,CE最大化onehot向量中1那个位置的预测值,而BCE在最大化那个位置的值得同时,降低onehot其他位置值得预测值。
所以直观上,BCE是比CE更好的loss(有待检验)
另外,BCE的代码不会做clip操作
[8,2] and [0.8,0.2]是不同的,在BCE里面,会严格执行1-yi操作,所以[8,2]经过1-yi之后是【-7,-1】keras里面小于eplison的值都会被标成eplison,这时候会发现loss=-7.66,这是bce的极值,输出这个值说明有一个样本的y大于1了
写blog之前觉得,BCE完全可以由CE取代,写的过程中大概明白了,bce每个样本的loss都由两部分组成,在增大1对应预测值的同时,减少非1位置的值,CE只关心1位置的预测值。
对于一个真实类别为[1,0,0]的样本BCE认为[0.8,0.1,0.1]的预测比[0.8,0.2,0]的预测要好,而CE认为他们是一样的。
总结:
二分类问题中,仅当reduce_sum(y_pred)=1的时候,BCE=CE
BCE比CE多一项,这一项希望在预测类别上预测值大的前提下,其他类别上,预测值均匀。CE不考虑其他预测值。
keras里面,BCE没有归一化操作,CE有。 CE里面[8,2]==[0.8,0.2] BCE不等价
BCE的预测值,不要大于1,否则会被置为eplison,从而获得最大loss keras中两种交叉熵损失函数的探讨 Keras中自定义目标函数(损失函数) |