关于softmax

Softmax

softmax函数

Softmax函数是logistic函数的一种泛化。Softmax - 用于多分类神经网络输出。二类分类当然也可以用,但是如果只输出一个神经元可以使用sigmod函数。

假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的Softmax值就是 

也就是说,是该元素的指数,与所有元素指数和的比值。

举个例子来看公式的意思:

就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。

为什么要取指数?

第一个原因是要模拟 max 的行为,所以要让大的更大;第二个原因是需要一个可导的函数。

被称为 softmax 函数,因为它表示“ max ”函数的一个平滑版本。这是因为,如果对于所有的 j != k 都有 a_k ≫ a_j ,那么 p(C k | x) ≃ 1 且 p(C j | x) ≃ 0 。

通过softmax函数,可以使得P(i)的范围在[0,1]之间。在回归和分类问题中,通常θ是待求参数,通过寻找使得P(i)最大的θi作为最佳参数。

此外Softmax函数同样可用于非线性估计,此时参数θ可根据现实意义使用其他列向量替代。

Softmax函数得到的是一个[0,1]之间的值,且∑Kk=1P(i)=1,这个softmax求出的概率就是真正的概率,换句话说,这个概率等于期望。

[Softmax 函数及其作用(含推导)]

带温度T的softmax概率

比之前的softmax多了一个参数T(temperature),T越大产生的概率分布越平滑。

[深度学习:蒸馏Distill]

softmax代码实现

1 torch实现

输入输出是tensor

torch实现
torch.softmax(tensor0, dim=-1)
torch.nn.Softmax(dim=-1)(tensor0)

当然tensorflow中也有这个函数。

2 scipy实现

from scipy.special import softmax

a = [1,2,3,4,-3,-4,-2, -10000]
b = softmax(a)

[scipy.special.softmax]

3 tf实现

tf.nn.softmax

算softmax计算溢出怎么办?

 C′ 通常取 −max(ai) 。自己去算softmax,容易出现溢出等问题,最好用官方的实现:如sampled_softmax_loss_v2

基于softmax的各种loss

softmax loss

softmax loss

Softmax loss

Softmax loss是由softmax和交叉熵(cross-entropy loss)loss组合而成,所以全称是softmax with cross-entropy loss。即softmax是激活函数,交叉熵是损失函数,softmax loss是使用了softmax funciton的交叉熵损失。当cross entropy的输入P是softmax的输出时,cross entropy等于softmax loss。即假如log loss中的p的表现形式是softmax概率的形式,那么交叉熵loss就是softmax loss,所以说softmax loss只是交叉熵的一个特例。

在caffe,tensorflow等开源框架的实现中,直接将两者放在一个层中,而不是分开不同层,可以让数值计算更加稳定,因为正指数概率可能会有非常大的值。

令z是softmax层的输入,f(z)是softmax的输出,则

batch形式softmax loss

softmax loss的变种和改进

soft softmax

当T=1时,就是softmax的定义,当T>1,就称之为soft softmax,T越大,因为Zk产生的概率差异就会越小。文【2】中提出这个是为了迁移学习,生成软标签,然后将软标签和硬标签同时用于新网络的学习。

Large-Margin Softmax Loss

softmax loss擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。

举个例子吧。假设一个5分类问题,然后一个样本I的标签y=[0,0,0,1,0],也就是说样本I的真实标签是4,假设模型预测的结果概率(softmax的输出)p=[0.1,0.15,0.05,0.6,0.1],可以看出这个预测是对的,那么对应的损失L=-log(0.6),也就是当这个样本经过这样的网络参数产生这样的预测p时,它的损失是-log(0.6)。那么假设p=[0.15,0.2,0.4,0.1,0.15],这个预测结果就很离谱了,因为真实标签是4,而你觉得这个样本是4的概率只有0.1(远不如其他概率高,如果是在测试阶段,那么模型就会预测该样本属于类别3),对应损失L=-log(0.1)。那么假设p=[0.05,0.15,0.4,0.3,0.1],这个预测结果虽然也错了,但是没有前面那个那么离谱,对应的损失L=-log(0.3)。

作者的实现是通过一个LargeMargin全连接层+softmax loss来共同实现,可参考代码。

softmax loss的各种实现

同样,multi-label是一定不能使用交叉熵作为loss函数的。因为如果是多目标问题,经过softmax就不会得到多个和为1的概率,而且label有多个1也无法计算交叉熵,因此这个函数只适合单目标的二分类或者多分类问题。并且它只计算了某个类别标签为1时的loss及梯度,而忽略了为0时的loss,而每个输出又相互独立,不像softmax函数那样有归一化的限制。

TensorFlow:交叉熵损失函数
PyTorch:输出层和损失函数loss function

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值