softmax & sigmoid & log softmax 辨析

原文链接:

sigmoid和softmax总结_老哥的专栏-CSDN博客_sigmoid和softmax区别

浅谈sigmoid函数和softmax函数_甘如荠-CSDN博客_sigmoid函数与softmax函数

机器学习(六)Sigmoid函数和Softmax函数 - 简书

相关博客

NLLLoss & cross-entropy比较:pytorch - loss function - summary 

softmax & sigmoid 第一层理解:

Sigmoid 又叫Logistic 激活函数。将实数值压缩进 0 到 1 的区间内。

softmax is a generalization of logistic function that “squashes” (maps) a K-dimensional vector z of arbitrary real values to a K-dimensional vector σ(z) of real values in the range (0, 1) that add up to 1.

 

总结:

sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。

softmax把一个k维的real value向量(a1,a2,a3,a4…)映射成一个(b1,b2,b3,b4…)其中bi是一个0-1的常数,然后可以根据bi的大小来进行多分类的任务,如取权重最大的一维。

可见在二元分类的情况下,Softmax 退化为了 Sigmoid.

import numpy as np
import matplotlib.pyplot as plt


def softmax(x):
    orig_shape=x.shape
    if len(x.shape)>1:
        #Matrix
        #shift max whithin each row
        constant_shift=np.max(x,axis=1).reshape(1,-1)
        x-=constant_shift
        x=np.exp(x)
        normlize=np.sum(x,axis=1).reshape(1,-1)
        x/=normlize
    else:
        #vector
        constant_shift=np.max(x)
        x-=constant_shift
        x=np.exp(x)
        normlize=np.sum(x)
        x/=normlize
    assert x.shape==orig_shape
    return x


softmax_inputs = np.arange(-3, 4)
inputs = softmax_inputs.tolist()
print(softmax_inputs)

softmax_outputs = softmax(softmax_inputs)
print("Sigmoid Function Output :: {}".format(softmax_outputs))
# 画图像
plt.plot(inputs, softmax_outputs)
plt.xlabel("Softmax Inputs")
plt.ylabel("Softmax Outputs")
plt.show()

softmax & sigmoid 第二层理解:

sigmoid函数针对两点分布提出。神经网络的输出经过它的转换,可以将数值压缩到(0,1)之间,得到的结果可以理解成“分类成目标类别的概率P”。而不分类到该类别的概率,就是(1 - P),这也是典型的两点分布的形式;

softmax本身针对多项分布提出,当类别数是2时,它退化为二项分布。

神经网络在做二分类时,使用softmax还是sigmoid,做法其实有明显差别。

由于softmax是对两个类别(正反两类,通常定义为0/1label)建模,所以对于NLP模型而言(比如泛BERT模型),Bert输出层需要通过一个nn.Linear()全连接层压缩至2维,然后接softmax

sigmoid只对一个类别建模(通常就是正确的那个类别),所以Bert输出层需要通过一个nn.Linear()全连接层压缩至1维,然后接sigmoid。

总而言之,sotfmax和sigmoid确实在二分类的情况下可以化为相同的数学表达形式,但并不意味着二者有一样的含义,而且二者的输入输出都是不同的。

一种常见的错法(其实就是我自己的错法),即,错误地将softmax和sigmoid混为一谈,在把BERT输出 层压缩至2维的情况下,却用sigmoid对结果进行计算。

softmax & log softmax

tf.nn.log_softmax - 知乎

softmax溢出:

softmax上溢和下溢问题_张欣的博客-CSDN博客_softmax上溢

在计算机里面数据都是以二进制的形式存储的,如果数据超过了计算机所能存储的最大范围,就会发生溢出

softmax公式里面因为存在指数函数,所以有可能会出现上溢或下溢的问题

当指数函数里面传入的值很大时,就会出现上溢,爆出OverflowError.

当指数函数里面传入的值是很小的负数时,就会出现下溢,输出结果就是0 这样就有可能导致分母的值为0

log softmax

log_softmax 在数学上等价于log(softmax(x))

问题:

理论上对于单标签多分类问题,直接经过softmax求出概率分布,然后把这个概率分布用cross entropy做一个似然估计误差。但是softmax求出来的概率分布,每一个概率都是(0,1)的,这就会导致有些概率过小,导致下溢。

解决办法:

考虑到这个概率分布总归是要经过cross entropy的,而cross entropy的计算是把概率分布外面套一个 负log 来似然,那么直接在计算概率分布的时候加上log, 把概率从(0,1)变为(-∞,0),这样就防止中间会有下溢出。

所以log_softmax说白了就是将本来应该由cross entropy做的套log的工作提到预测概率分布来,跳过了中间的存储步骤,防止中间数值会有下溢出,使得数据更加稳定。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值