softmax单元_关于Softmax的数值稳定性和梯度反向传播

本文探讨了在计算机视觉作业中遇到的softmax数值稳定性和梯度反向传播问题。直接应用softmax可能导致数值爆炸,解决方案是进行均值迁移。同时,通过链式法则计算softmax输入的梯度,非对角和对角单元的处理方式不同,并给出了相应的矩阵乘积公式和代码实现。
摘要由CSDN通过智能技术生成

00156fa129e5e1fde3bfa60dc8bba59c.png

写这篇文章的动机来源于计算机视觉课最近的一次编程作业,要手写CNN的前向传播和反向传播。特地准备把用到的一些技巧以及数学推导都记录下来。该篇此属系列文章之一。另一篇请见:

清流:卷积加速im2col和梯度反向传播​zhuanlan.zhihu.com
d0025b24027fc388ea84a240abf8c425.png

Softmax的数值稳定性

Softmax函数

定义为

其输入是一个

维向量,
,输出是一个取值为
的离散概率分布,
Softmax函数通常用于多分类问题神经网络的最后一层。把全连接的输出映射为网络表征下该样本属于各个类的概率。用Softmax做映射把一个经典多分类问题变为一个非线性多项式回归问题:把类别的真值预测转换为概率分布的匹配。

交叉熵损失函数(Cross Entropy Loss)经常和Softmax一起使用,定义如下:

在编程实现的时候容易发现直接用Softmax容易出现各种损失函数爆炸、梯度爆炸的问题,这是因为浮点数的范围是有限的。在做指数运算

的时候,如果指数过大,就直接上溢(overflow)了。为了避免上溢的问题,需要对所有的指数项
做一次均值迁移,减去其中的最大项。

然后简单验证一下这个均值迁移操作不影响Softmax后的概率分布。

由此可见,对输入

做均值迁移前后Softmax的概率不变。而且不会发生上溢了,因为迁移后有
.

但是迁移会带来另外一个问题,如果

特别大,迁移后的
会特别小,记此最小值为
。对于Softmax的计算虽然没啥问题,但是在算交叉熵的时候就会带来问题。注意到交叉熵公式里有一个对数项
,当
无限小的时候,Softmax对应的概率
将无限接近于
。从而使
,造成下溢(underflow)。为了修正下溢,可以直接添加补偿项

Softmax的梯度反向传播

计算损失函数(Cross Entropy Loss)相对于Softmax输入的梯度。

直接算导数需要分情况讨论后半部分导数的问题,所以考虑直接把两部分都别写成Jacobian形式然后直接算矩阵乘积即可,具体地,由链式法则

其中

的单元分两种情况:对角单元(
)和非对角单元(
)。

若为对角单元(

)

若为非对角单元(

)

有了上面的公式,

就很好算了

算出

两个Jacobian之后,就可以算出
了。

实现代码:

def loss_cross_entropy_softmax(x, y):
    # TO DO
    '''
    Compute the cross entropy loss.
    Args:
        x: The input to the softmax layer, of size [m,1]
        y: The ground truth

    Returns:
        l: The loss
        dl_dx: The loss derivative with respect to x
    '''
    x_shift = x - np.max(x) # [m,1]
    x_exp = np.exp(x_shift) # [m,1]
    y_tilde = x_exp / np.sum(x_exp) # [m,1]
    y_log = np.log(y_tilde+1e-9)    # [m,1]
    l = -np.sum(np.multiply(y_log, y))  # [1,1]
    dl_dy_tilde = -np.multiply(1/(y_tilde+1e-9), y) # [m,1]
    dy_dx = -np.dot(y_tilde, y_tilde.T) + np.diag(y_tilde.flatten())  # [m,m]
    dl_dx = np.dot(dl_dy_tilde.T, dy_dx)

    return l, dl_dx

本篇完结 _(:з」∠)_

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值