激活函数与对应的损失函数选择(binary与multi-class如何选择损失函数)

之前一段时间,对激活函数和损失函数一直是懵懂的状态,只知道最后一层常用的激活函数是sigmoid或者softmax,而损失函数一般用的是cross-entropy或者dice loss(我看的都是分割方向的)。但是有几个点一直弄不清为什么:
1、为什么有时候二值分割问题还进行了one-hot编码?
2、sigmoid和softmax是可以任意切换的吗?

下面是我理解的东西,但不一定正确,仅供参考。

首先要知道,一般说到cross-entropy,都指的是categorical cross-entropy。
binary cross-entropy是需要特意说明为binary的。
那么,categorical cross-entropy的定义是什么呢?
就是对与输出的score,先进行softmax变换,再计算cross-entropy。
重点就在这儿,是进行了softmax变换!原因后面会说到。

而binary cross-entropy的定义则是,对于对于输出的scroe,先进行sigmoid变换,再计算binary cross entropy。
看,这儿又是sigmoid!

原因就在于,cross entropy本身的定义就是在概率分布上,而概率分布则要求两个或两个以上的值加起来等于1。如果去看softmax函数,会发现,这个函数就有这个作用:使每一个样本的输出结果在所有的类上加起来等于1。而sigmoid函数,去看它的形状就可以发现,它只是单纯的将输出结果压缩到了0-1之间。

那么现在,我们想计算binary的cross-entropy怎么办呢?
有两种解决方案
第一,就是利用现有的专门针对binary的cross-entropy公式
在这里插入图片描述
可以发现,其实这儿的1-p(yi)就是做了与softmax类似的事,!!将输出的结果相加可以为1。
所以说,已经可以发现,它们之间那紧密的联系了。
第二,就是将binary转化为categorical的问题。
也就是直接利用cross-entropy的公式
在这里插入图片描述
可是上面也提到过,用这个公式的前提就是输出结果在所有的类上加起来为1。
那么,我们使用softmax激活函数就行了,但是别忘记,对于categorical cross entropy的问题,默认的label都是需要one-hot编码的。

注意,上一句说的使用softmax函数,前提也是把数据先转化成了对应的格式,如下:

conv6 = Conv2D(2, (1, 1), activation='relu',padding='same')(conv5)
conv6 = core.Reshape((2,patch_height*patch_width))(conv6)
conv6 = core.Permute((2,1))(conv6)
# conv6最后的shape:(batch_size,height*width,2)
conv7 = core.Activation('softmax')(conv6)

举一个小例子:
典型的categorical问题:
红灯:(1,0,0) 绿灯(0,1,0) 黄灯(0,0,1)
输出的结果(注:已经经过激活函数)preds=(0.25,0.6,0.15),所以预测结果为绿灯。
那么最后的cross-entropy loss=-1*[ln(0.25)*0 + ln(0.6)*1 + ln(0.15)*0]
若是二值问题,例如,男女预测,男为1,女为0,输出结果为0.6,
我们可以对其进行变化:
男(1,0) 女(0,1),输出(0.6, 0.4)

最后提一下dice loss,这个只需要最后出来的是概率值即可,所以说一般选择为sigmoid激活函数。

猜你喜欢

转载自blog.csdn.net/normol/article/details/88775800