人工智能深度学习--Softmax激活函数

595 阅读4分钟

前言

在前一篇文章中,笔者为大家讲解了人工智能深度学习中最常用的激活函数--ReluRelu激活函数,那么今天笔者就带大家来学习认识一下最后一个在各种算法模型中较为常见的激活函数--SoftmaxSoftmax激活函数 ( 该函数在目前最新的TransformerTransformer注意力模型中也有运用 ) 。

一、定义和简介

1.定义

Softmax 激活函数是一种常用于多分类问题的激活函数,特别是在神经网络的输出层中。它将输入的向量转换成一个概率分布,使得输出的各个元素的值位于0到1之间,并且所有元素的和为1。这使得 Softmax 非常适合用于分类任务。

2.函数表达式

给定一个实数向量 xx ,其中第 ii 个元素是 xix_i ,那么我们的softmax 函数 σ(x)\sigma(x) 定义为:

σ(x)i=exiiexi\sigma(x)_i = \frac{e^{x_i}}{\sum_{i} e^{x_i}}

对于整个向量 xx ,softmax 函数的输出是一个概率分布,其中每个元素 σ(x)i\sigma(x)_i 表示第 ii 个类别的预测概率。

3.函数特点

  1. 归一化:softmax 函数的输出是一个概率分布,所有输出值都在 0 到 1 之间,并且所有输出值的总和为 1 。
  2. 不同性:对于任意两个不同的类别 iijj ,如果xi>xjx_i > x_j ,则 σ(x)i>σ(x)j\sigma(x)_i > \sigma(x)_j 。这意味着 softmax 函数能够保留原始 logits 的顺序关系(其实也就是一个等价关系的传递性)。
  3. 可微分:softmax 函数是连续且可微的,这使得它可以在深度学习模型中使用梯度下降等优化算法进行训练。

这个激活函数的函数图像大家可以参考指数函数的图像,这里我们就不做过多赘述了。看到这里,大家理解了这个激活函数了吗 ? 如果不太理解,老规矩,上例子!

例子:

假设我们有一个三分类问题,输入向量为 z=[2.0,1.0,0.1]\mathbf{z} = [2.0, 1.0, 0.1]。应用Softmax函数:

1. 计算每个输入值的指数:

ez1=e2.07.389e^{z_1} = e^{2.0} \approx 7.389

ez2=e1.02.718e^{z_2} = e^{1.0} \approx 2.718

ez3=e0.11.105e^{z_3} = e^{0.1} \approx 1.105

2. 计算所有指数值的和:

j=13ezj7.389+2.718+1.105=11.212\sum_{j=1}^{3} e^{z_j} \approx 7.389 + 2.718 + 1.105 = 11.212

3. 计算每个类别的概率:

y1=e2.011.2120.659y_1 = \frac{e^{2.0}}{11.212} \approx 0.659

y2=e1.011.2120.242y_2 = \frac{e^{1.0}}{11.212} \approx 0.242

y3=e0.111.2120.099y_3 = \frac{e^{0.1}}{11.212} \approx 0.099

因此,Softmax函数的输出是 [0.659,0.242,0.099][0.659, 0.242, 0.099]

二、函数核心作用--归一化详解

1.概率解释

归一化确保了softmax函数的输出可以被解释为概率分布。在多类分类问题中,每个类别的预测值(logit)经过我们的softmax激活函数转换后,输出值会落在0到1之间,并且所有类别的输出值之和为1,这正是概率分布的定义,便于我们更好地得出分类结果。并且,在分类任务中,我们通常选择概率最高的类别作为预测结果。也就是说,输出值提供了一个直接的指标,用于我们比较不同类别的预测置信度。

2.数值稳定性

在计算指数函数 exie^{x_i} 时,如果 xix_i 的值较大,可能会导致数值溢出(超过计算机浮点数的最大表示范围)。Softmax函数通过从每个logit中减去最大值 max(z)\max(z) 来提高数值稳定性,这有助于防止在计算过程中出现无穷大或NaN值。

3.梯度下降优化

在训练过程中,归一化的概率输出使得梯度下降算法能够更稳定地更新权重。如果没有归一化,某些类别的预测值可能会远远大于其他类别,导致梯度爆炸或消失,从而使得学习过程变得困难。

总之,softmax函数的归一化是实现多类分类、保证数值稳定性、优化模型训练和提高模型性能等等的关键。既然都讲到了softmax激活函数的梯度,那么我们就来讲一讲该激活函数在反向传播过程中的原理以及运用吧。

三、反向传播中的导数

在反向传播过程中,Softmax 函数的导数涉及到雅可比矩阵(Jacobian Matrix)。假设 y\mathbf{y} 是Softmax函数的输出,z\mathbf{z} 是输入向量,那么Softmax函数的导数可以表示为:

yizj=yi(δijyj)\frac{\partial y_i}{\partial z_j} = y_i (\delta_{ij} - y_j)

其中,δij\delta_{ij} 是克罗内克δδ函数,当 i=ji = j 时,δij=1\delta_{ij} = 1,否则 δij=0\delta_{ij} = 0

这个过程牵扯到公式推导,笔者也不好展开讲,如果大家有不懂的就跳过吧,,大概看一下就行,整体的过程其实和sigmoid的原理是差不多一样的。

四、函数的实现

下面是我用python写的一个简单的softmax函数的例子,大家可以参考来加深理解,因为在实际的运用中我们往往也不会像这样把这个激活函数体单独写出来:

import numpy as np

def softmax(z):
    # 减去最大的logit以提高数值稳定性
    z = z - np.max(z)
    # 计算e^z
    exp_z = np.exp(z)
    # 归一化得到概率分布
    return exp_z / exp_z.sum(axis=0, keepdims=True)

五、总结

softmax激活函数是我们深度学习中处理多类分类问题的关键组件,它将模型的原始输出转换为概率分布,使得模型的输出可以被解释为对每个类别的预测概率。对于这个函数,笔者只能说,会用者无上限。

以上就是笔者关于Softmax激活函数的讲解,欢迎大家点赞,收藏,交流和关注,O(∩_∩)O谢谢!