常见激活函数概览
1. Sigmoid 函数
Sigmoid 函数将任意实数输入压缩到 区间,常用于早期的神经网络或作为二元分类任务的输出层。
-
公式:
-
特性: 输出值可以被解释为概率;函数平滑且易于求导。
-
缺点: 当输入值过大或过小时,函数梯度趋近于0,容易导致梯度消失(Vanishing Gradients)问题,使得深层网络难以训练。
2. Tanh 函数 (双曲正切函数)
Tanh 函数是 Sigmoid 函数的变体,将输入压缩到 区间。
-
公式:
-
特性: 输出以0为中心(zero-centered),这使得它在某些场景下比 Sigmoid 函数收敛更快。
-
缺点: 与 Sigmoid 类似,它在两端也存在饱和区,同样面临梯度消失的问题。
3. ReLU 函数 (Rectified Linear Unit, 修正线性单元)
ReLU 是目前深度学习中最流行的激活函数,因为它在计算上高效且有效缓解了梯度消失问题。
-
公式:
-
特性:
- 当 时,梯度恒为1,不会饱和,有效缓解梯度消失。
- 计算极其简单,只需一次比较操作。
- 会使部分神经元的输出为0,造成网络的稀疏性,可能提高学习效率。
-
缺点:
- 输出不是以0为中心。
- 当 时,梯度为0,可能导致神经元“死亡”(Dying ReLU),即神经元在训练中永久失活。
分析几个问题
现在,我们来对动手学深度学习提出的四个问题进行详细、严谨的分析。
问题一 计算pReLU激活函数的导数
1. PReLU 函数定义
首先,我们必须明确 PReLU(Parametric ReLU)的数学定义。它是 ReLU 的一个变种,为负数输入区引入了一个可学习的参数 。
其中, 是一个很小的正常数,它通常在反向传播过程中像网络权重一样被学习。当 是一个固定的超参数时(例如0.01),这个函数被称为 Leaky ReLU。
2. 导数计算
为了计算导数 ,我们需要分段进行讨论:
-
当 时: 函数是 。这是一个简单的线性函数,其导数是常数 1。
-
当 时: 函数是 。这同样是一个线性函数,其导数是常数 。
-
当 时: 在这个点上,函数是不可导的,因为左导数 () 和右导数 (1) 不相等(除非 ,那样就退化成线性函数了)。这是一个“拐点”。在深度学习的实践中,我们不关心单点的不可导性,会使用次梯度(subgradient)的概念。我们可以简单地将该点的梯度定义为左导数或右导数中的任意一个,通常选择为1。
3. 最终导数表达式
综合以上分析,pReLU 的导数(或次梯度)可以表示为一个分段函数:
在实际实现中,当 时,梯度通常被归入 的情况处理。
问题二 证明一个仅使用ReLU的多层感知机构造了连续的分段线性函数
这是一个非常深刻的性质,揭示了 ReLU 系列激活函数网络的本质。我们将通过归纳法来证明这个结论。
1. 基础知识
- 线性函数: 形如 。
- 分段线性函数: 一个函数,其定义域可以被划分为多个区域,在每个区域内,该函数都是线性的。
- 连续函数: 函数图形没有中断。
- 关键引理:
- 两个连续函数的和、积、复合仍然是连续函数。
- 两个(分段)线性函数的和与复合仍然是(分段)线性函数。
- 是一个连续的分段线性函数。
2. 归纳法证明
我们将证明,对于一个 层的 ReLU 网络,其输出是输入的连续分段线性函数。
-
基础步骤 (L=1) 考虑一个单层的 ReLU 网络。其计算过程为:
- 线性部分: 是一个线性变换,因此它既是线性的也是连续的。
- 应用 ReLU: 我们对 的每个元素应用 函数。由于 本身是连续且分段线性的,而 是输入的线性函数,那么复合函数 就是一个连续的分段线性函数。
- 直观上,超平面 将输入空间 分割成了多个区域。在每个区域内,ReLU 的行为是固定的(要么是恒等函数,要么是零函数),因此整个网络在每个区域内都是线性的。在区域边界处,由于 ReLU 的连续性,整个函数也是连续的。
-
归纳假设 假设对于一个 层的 ReLU 网络,其输出 是输入的连续分段线性函数。
-
归纳步骤 (从 L=k 到 L=k+1) 现在我们考虑一个 层的网络。第 层的计算过程是:
- 根据我们的归纳假设, 是一个连续的分段线性函数。
- 那么, 是一个连续分段线性函数(一个线性函数复合一个连续分段线性函数)。
- 最后,对 应用 函数。由于 是连续分段线性的,而它的输入 也是一个连续分段线性函数,那么最终的输出 仍然是一个连续的分段线性函数。
结论 通过数学归纳法,我们证明了任何深度的、仅使用 ReLU (或 PReLU) 激活函数的多层感知机,其所代表的函数都是一个连续的分段线性函数。网络越深,参数越多,这个函数就拥有越多的“分段”,从而能够以任意精度逼近任何复杂的非线性函数(这与通用逼近定理有关)。
问题三 证明
这是一个纯粹的数学恒等式证明,我们可以从函数定义入手。
1. 写出函数定义
2. 处理等式左边 (LHS)
通分,将 1 写为 :
3. 处理等式右边 (RHS)
4. 统一两边的形式 现在我们有 LHS 和 RHS 的两个表达式,需要证明它们相等。我们可以选择任意一边进行变形。让我们来变形 LHS 的表达式,在分子和分母上同时乘以 :
此时,我们发现:
证明完毕。这个关系式揭示了 Tanh 和 Sigmoid 在数学上的内在联系:Tanh 本质上是 Sigmoid 函数在尺度和平移上的一个变换。
问题四 假设我们有一个非线性单元 将它一次应用于一个小批量的数据 这会导致什么样的问题
这是一个关于模型表示能力的问题。我们将这个问题解读为:如果我们构建一个只有一个非线性层的浅层网络(即 ),而不是一个深度网络,会有什么局限性?
核心问题:缺乏层次化的特征学习能力
深度学习之所以强大,其根本原因在于层次化特征表示(Hierarchical Feature Representation)。每一层网络都在前一层学习到的特征基础上,进行组合和抽象,从而学习到越来越复杂和高级的特征。
- 以图像识别为例:
- 第一层(浅层):可能会学习到非常基础的特征,比如边缘、角点、颜色块。
- 第二层:将第一层的边缘和角点组合起来,可能学习到更复杂的形状,如眼睛、鼻子、轮廓。
- 第三层:将第二层的眼睛、鼻子等组合起来,可能学习到人脸、猫脸的部件。
- 更高层:组合部件,识别出完整的人或物体。
单一非线性单元的局限性
当我们只有一个非线性单元(即一个非线性层)时,我们相当于只进行了第一步的特征提取。模型可以将原始输入特征(如像素值)映射到一个新的非线性特征空间,但它无法对这些新特征进行再次的组合与抽象。
具体会导致以下问题:
-
表示能力严重受限: 模型只能学习输入特征的“一次性”非线性组合。对于需要多层次抽象才能解决的复杂问题(如图像分类、自然语言理解),这种浅层结构完全不够用。它无法捕捉到数据中存在的复杂的、层级嵌套的模式。
-
无法学习特征的组合逻辑: 模型可以将“有轮子”和“有车灯”作为特征,但它无法学习到“轮子和车灯同时出现,且位置关系正确,才更可能是一辆车”这种更高阶的组合逻辑。这种组合逻辑的构建,正是深度网络逐层抽象的过程。
-
效率低下: 为了用浅层网络达到深层网络的效果,我们可能需要一个神经元数量指数级增长的隐藏层,这在计算和参数存储上都是不现实的。深度结构提供了一种更高效的、利用特征重组来构建复杂函数的方式。
总结 只应用一次非线性单元,就好比只允许一位工匠用原始材料(木头、钉子)制作零件(桌腿、桌面),但禁止他将这些零件组装成最终的桌子。这个模型能够完成从“原材料”到“初级零件”的转换,但完全丧失了从“初级零件”到“高级组合/最终产品”的构建能力。这就是深度(Depth)在神经网络中至关重要的原因。