谈谈激活函数以零为中心的问题

今天在讨论神经网络中的激活函数时,陆同学提出 Sigmoid 函数的输出不是以零为中心的(non-zero-centered),这会导致神经网络收敛较慢。关于这一点,过去我只是将其记下,却并未理解背后的原因。此篇谈谈背后的原因。

神经元

图片来自:https://zhuanlan.zhihu.com/p/25110450

如图是神经网络中一个典型的神经元设计,它完全仿照人类大脑中神经元之间传递数据的模式设计。大脑中,神经元通过若干树突(dendrite)的突触(synapse),接受其他神经元的轴突(axon)或树突传递来的消息,而后经过处理再由轴突输出。

在这里,诸 xi 是其他神经元的轴突传来的消息,诸 wi 是突触对消息的影响,诸 wixi 则是神经元树突上传递的消息。这些消息经由神经元整合后(z(x→;w→,b)=∑iwixi+b)再激活输出(f(z))。这里,整合的过程是线性加权的过程,各输入特征 xi 之间没有相互作用。激活函数(active function)一般来说则是非线性的,各输入特征 xi 在此处相互作用。

Sigmoid 与 tanh

此篇集中讨论激活函数输出是否以零为中心的问题,因而不对激活函数做过多的介绍,而只讨论 Sigmoid 与 tanh 两个激活函数。

Sigmoid 函数

Sigmoid 函数的一般形式是

σ(x;a)=11+e−ax.

这里,参数 a 控制 Sigmoid 函数的形状,对函数基本性质没有太大的影响。在神经网络中,一般设置 a=1,直接省略。

Sigmoid 函数的导数很好求

σ′(x)=σ(x)(1−σ(x)).

 

图片来自:https://zhuanlan.zhihu.com/p/25110450

tanh 函数

tanh 函数全称 Hyperbolic Tangent,即双曲正切函数。它的表达式是

tanh⁡(x)=2σ(2x)−1=ex−e−xex+e−x.

双曲正切函数的导数也很好求

tanh′⁡(x)=1−tanh2⁡(x).

 

图片来自:https://zhuanlan.zhihu.com/p/25110450

一些性质

Sigmoid 和 tanh 两个函数非常相似,具有不少相同的性质。简单罗列如下

  • 优点:平滑
  • 优点:易于求导
  • 缺点:幂运算相对耗时
  • 缺点:导数值小于 1,反向传播易导致梯度消失(Gradient Vanishing)

对于 Sigmoid 函数来说,它的值域是 (0,1),因此又有如下特点

  • 优点:可以作为概率,辅助模型解释
  • 缺点:输出值不以零为中心,可能导致模型收敛速度慢

此篇重点讲 Sigmoid 函数输出值不以零为中心的这一缺点。

收敛速度

这里首先需要给收敛速度做一个诠释。模型的最优解即是模型参数的最优解。通过逐轮迭代,模型参数会被更新到接近其最优解。这一过程中,迭代轮次多,则我们说模型收敛速度慢;反之,迭代轮次少,则我们说模型收敛速度快。

参数更新

深度学习一般的学习方法是反向传播。简单来说,就是通过链式法则,求解全局损失函数 L(x→) 对某一参数 w 的偏导数(梯度);而后辅以学习率 η,向梯度的反方向更新参数 w。

w←w−η⋅∂L∂w.

考虑学习率 η 是全局设置的超参数,参数更新的核心步骤即是计算 ∂L∂w。再考虑到对于某个神经元来说,其输入与输出的关系是

f(x→;w→,b)=f(z)=f(∑iwixi+b).

因此,对于参数 wi 来说,

∂L∂wi=∂L∂f∂f∂z∂z∂wi=xi⋅∂L∂f∂f∂z.

因此,参数的更新步骤变为

wi←wi−ηxi⋅∂L∂f∂f∂z.

更新方向

由于 wi 是上一轮迭代的结果,此处可视为常数,而 η 是模型超参数,参数 wi 的更新方向实际上由 xi⋅∂L∂f∂f∂z 决定。

又考虑到 ∂L∂f∂f∂z 对于所有的 wi 来说是常数,因此各个 wi 更新方向之间的差异,完全由对应的输入值 xi 的符号决定。

以零为中心的影响

至此,为了描述方便,我们以二维的情况为例。亦即,神经元描述为

f(x→;w→,b)=f(w0x0+w1x1+b).

现在假设,参数 w0, w1 的最优解 w0∗, w1∗ 满足条件

{w0<w0∗,w1⩾w1∗.

这也就是说,我们希望 w0 适当增大,但希望 w1 适当减小。考虑到上一小节提到的更新方向的问题,这就必然要求 x0 和 x1 符号相反。

但在 Sigmoid 函数中,输出值恒为正。这也就是说,如果上一级神经元采用 Sigmoid 函数作为激活函数,那么我们无法做到 x0 和 x1 符号相反。此时,模型为了收敛,不得不向逆风前行的风助力帆船一样,走 Z 字形逼近最优解。

 

如图,模型参数走绿色箭头能够最快收敛,但由于输入值的符号总是为正,所以模型参数可能走类似红色折线的箭头。如此一来,使用 Sigmoid 函数作为激活函数的神经网络,收敛速度就会慢上不少了。

<think>嗯,用户想了解Softmax层或者Softmax激活函数。首先,我得回顾一下自己对这个概念的理解。Softmax通常用在神经网络输出层,特别是在多分类问题中。它的作用是将输入的原始分数(logits)转化为概率分布,这样每个类别的概率都在0到1之间,并且所有类别的概率之和为1。 那我要怎么组织这个回答呢?可能需要分几个步骤来讲解。首先解释Softmax的定义,然后说明它的数学表达式。接下来可以谈谈它的应用场景,比如多分类任务中的常见用法。还要提到它的特性,比如指数函数的作用是放大差异,使得概率分布更明显。另外,可能需要注意它的数值稳定性问题,比如指数可能导致数值溢出,这时候通常会引入一些技巧,比如减去最大值来处理。 用户可能想知道为什么使用Softmax而不是其他归一化方法。这时候需要对比,比如和sigmoid的区别,Softmax处理的是互斥的多分类,而sigmoid可能用于多标签分类。另外,Softmax与交叉熵损失函数的关系也很重要,通常结合使用,这样可以简化梯度计算。 还要注意一些细节,比如Softmax的导数特性,这在反向传播中很关键。可能还要提到在实际框架中的实现,比如TensorFlow或PyTorch中的使用方式,以及处理数值稳定性的常用方法。 有没有可能用户是刚开始学习机器学习,所以需要避免使用过于复杂的术语?可能需要用简单的例子来说明,比如有三个类别的分类问题,输入logits经过Softmax后变成概率。或者举一个具体的计算例子,让用户更直观地理解。 另外,用户可能对Softmax的缺点感兴趣,比如对极端值敏感,或者计算量较大的问题。这时候可以提一下替代方案,比如使用LogSoftmax结合NLLLoss来提升数值稳定性。 需要确保回答的结构清晰,分点说明。可能的结构是:定义、数学公式、作用、应用场景、优缺点、实际应用中的注意事项,以及与其他激活函数的对比。这样用户能逐步了解Softmax的各个方面。 检查一下数学公式是否正确。Softmax的公式应该是对于每个元素i,输出是e的z_i次方除以所有元素e的z_j次方的和。写成LaTeX的话,独立公式要用$$...$$,行内用$...$。比如,独立公式: $$ S(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} $$ 确保这个部分正确,并且按照用户给的系统级指令来格式化。 还要确认是否提到了梯度计算,比如Softmax的导数在反向传播中的简化形式,特别是在结合交叉熵损失时的优势。这部分可能对于理解为什么Softmax被广泛使用很重要。 总结一下,回答应该包括以下几个部分: 1. Softmax的定义和作用 2. 数学表达式 3. 应用场景 4. 特性(如概率转换,指数放大差异) 5. 数值稳定性处理 6. 与交叉熵损失的关系 7. 优缺点 8. 实际使用中的例子或注意事项 这样结构清晰,用户能一步步理解。同时,要注意用中文,避免术语过于晦涩,适当举例说明。现在把这些点组织成连贯的内容,确保符合用户的格式要求,特别是数学表达式的正确使用。</think>### Softmax激活函数介绍 #### 1. **定义与作用** Softmax是一种常用的激活函数,通常用于神经网络的**输出层**,特别是在**多分类任务**中。它的核心作用是将一组实数(称为**logits**)转化为**概率分布**,使得每个输出值的范围在$[0, 1]$之间,且所有输出之和为1。 --- #### 2. **数学公式** 对于输入向量$z = [z_1, z_2, ..., z_C]$($C$为类别数),Softmax的计算公式为: $$ S(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} $$ - **$e^{z_i}$**:对输入值取指数,放大数值差异。 - **分母**:所有类别指数的总和,用于归一化。 --- #### 3. **直观解释** - **指数函数的作用**:通过指数运算,将较大的输入值对应到更高的概率,增强模型对“明显类别”的置信度。 - **概率化输出**:例如,输入为$z = [3, 1, -2]$,Softmax输出可能为$[0.88, 0.12, 0]$,表示模型认为第一类的概率最高。 --- #### 4. **应用场景** - **多分类任务**:如手写数字识别(10分类)、图像分类(1000类)等。 - **输出层设计**:通常与**交叉熵损失(Cross-Entropy Loss)**结合使用,简化梯度计算。 --- #### 5. **特性与优势** - **概率解释性**:输出可直接视为类别概率,便于决策。 - **梯度优化**:当Softmax与交叉熵损失联合使用时,反向传播的梯度计算更高效。 - **数值稳定性处理**:实际实现时,为避免指数爆炸(如$e^{1000}$),会对输入做平移($z_i \leftarrow z_i - \max(z)$),确保数值稳定。 --- #### 6. **局限性** - **对异常值敏感**:若某个输入$z_i$极大,Softmax会赋予它接近1的概率,其他类别接近0(“赢者通吃”)。 - **计算开销**:指数运算在大规模分类时可能较慢。 --- #### 7. **代码示例(伪代码)** ```python def softmax(z): shifted_z = z - np.max(z) # 数值稳定性处理 exp_z = np.exp(shifted_z) return exp_z / np.sum(exp_z) ``` --- #### 8. **与其他函数的对比** - **Sigmoid**:适用于二分类,输出独立概率;Softmax适用于多分类,输出互斥概率。 - **LogSoftmax**:对Softmax取对数,常与负对数似然损失(NLLLoss)结合,进一步提升数值稳定性。 --- #### 9. **实际应用建议** - **分类任务**:优先使用`Softmax + 交叉熵损失`组合。 - **多标签分类**:需改用多个Sigmoid输出。 - **框架实现**:在PyTorch中为`torch.nn.Softmax(dim=1)`,TensorFlow中为`tf.keras.activations.softmax`。 --- 通过Softmax,神经网络能够以概率形式输出分类结果,为后续的决策(如取最大概率类别)提供直观依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值