神经网络多分类中为什么用softmax函数归一化而不用其它归一化方法

本文解析了Softmax函数在多类分类中的应用原理,通过数学推导说明了它如何避免梯度爆炸问题,并解释了为何在多类分类任务中选择Softmax而非其他归一化方法。

直观的解释是为了平衡概率分布,同时避免出现概率为0的情况(使得模型可以不用再做平滑化处理)。
从反向传播的角度推导一波:
softmax函数的形式为:

P(y=i)=eWiXNj=1eWjX P ( y = i ) = e W i X ∑ j = 1 N e W j X

目标函数为:
L=ktklogP(y=k)  (tk10) L = − ∑ k t k l o g P ( y = k )     ( t k 表 示 目 标 类 为 1 , 其 它 类 为 0 )

Vi=WiX V i = W i X ,则:
LVi=tk1P(y=k)P(y=k)Vi=tk1P(y=k)eWiXNj=1eWjXeWiXeWiX(Nj=1eWjX)2=tk1P(y=k)[P(y=k)(P(y=k))2]=tk(1P(y=k))(452)(453)(454)(455) (452) ∂ L ∂ V i = − t k 1 P ( y = k ) ⋅ ∂ P ( y = k ) ∂ V i (453) = − t k 1 P ( y = k ) ⋅ e W i X ⋅ ∑ j = 1 N e W j X − e W i X ⋅ e W i X ( ∑ j = 1 N e W j X ) 2 (454) = − t k 1 P ( y = k ) ⋅ [ P ( y = k ) − ( P ( y = k ) ) 2 ] (455) = − t k ∗ ( 1 − P ( y = k ) )

由上式第一个等式可以知道,当我们使用一般的归一化方法时(如min_max归一化),当 P(y=k) P ( y = k ) 很小时,梯度将变得很大(梯度爆炸),而softmax函数把它约去了,因此不会出现这个问题。
参考:多类分类下为什么用softmax而不是用其他归一化方法?
如何理解softmax(柔性最大),为什么不用别的归一化的函数?

### Softmax函数的性质及其归一化与激活函数的区别 Softmax函数在机器学习中具有多重角色,它既可以被视为一种**归一化函数**,也可以被视为一种**激活函数**,但其具体用途取决于上下文环境。以下是关于Softmax函数性质的详细分析: #### 1. Softmax作为归一化函数 Softmax函数的核心作用是将输入向量转换为一个概率分布[^2]。它的公式如下: ```python import numpy as np def softmax(x): exp_x = np.exp(x - np.max(x)) # 防止数值溢出 return exp_x / np.sum(exp_x) ``` 通过上述公式可以看出,Softmax函数将任意实数范围的输入值映射到(0,1)之间,并且所有输出值的总和为1。这一特性使其成为一种有效的归一化方法,尤其适用于需要将模型输出解释为概率分布的场景,例如分类任务中的多类预测。 #### 2. Softmax作为激活函数 尽管Softmax函数主要用于输出层以生成概率分布,但它仍然可以被看作是一种激活函数[^1]。这是因为激活函数的定义是将神经网络中的输入映射为某种非线性输出,而Softmax函数正是通过指数运算实现了这种非线性映射。然而,与传统激活函数(如ReLU、Sigmoid等)不同的是,Softmax的作用更倾向于对整个向量进行处理,而不是单独作用于每个神经元。 #### 3. 归一化函数与激活函数的区别 - **归一化函数**:主要目的是调整数据的尺度或分布,确保模型输入或输出符合特定要求。例如,Softmax通过归一化操作将输出限制在(0,1)范围内并保证总和为1。 - **激活函数**:用于引入非线性,使得神经网络能够逼近复杂的函数关系。激活函数通常应用于隐藏层,例如ReLU、Tanh等,而Softmax更多地出现在输出层。 #### 4. Softmax与其他函数的对比 - **非线性**:Softmax函数是非线性的,因此满足激活函数的一个重要性质。 - **可微性**:Softmax函数是可微的,这使得基于梯度的优化方法可以有效工作。 - **输出范围**:Softmax的输出范围为(0,1),并且所有输出值的总和为1,这使其特别适合分类问题中的概率估计。 综上所述,Softmax函数兼具归一化和激活的功能,但在实际应用中更常被视作一种归一化工具,尤其是在分类任务中。 ### 示例代码 以下是一个简单的Softmax实现及其性质验证: ```python import numpy as np # 定义Softmax函数 def softmax(x): exp_x = np.exp(x - np.max(x)) # 防止数值溢出 return exp_x / np.sum(exp_x) # 测试输入 x = np.array([2.0, 1.0, 0.1]) output = softmax(x) print("Softmax输出:", output) print("输出总和:", np.sum(output)) ``` #### 输出结果 ``` Softmax输出: [0.65900114 0.24243297 0.09856589] 输出总和: 1.0 ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值