激活函数
sigmod
-
梯度消失问题:
- sigmoid函数的导数在输入值较大或较小时接近于0。
- 在反向传播过程中,这些小梯度会相乘,导致深层网络的梯度变得非常小。
- 结果是,深层网络的参数几乎不会更新,训练变得非常困难。
- 这就是为什么在5层以上的网络中,sigmoid函数容易导致梯度消失。
-
非零中心化:
- sigmoid函数的输出范围是(0, 1),均值不是0。
- 这会导致后续层的神经元接收到的输入总是正的,影响梯度下降的效率。
-
在实践中的使用限制:
- 由于上述问题,sigmoid在隐藏层中很少使用。
- 现代神经网络更常用ReLU等其他激活函数。
-
在二分类输出层的应用:
- sigmoid函数输出范围(0,1),可以解释为概率。
- 这使它非常适合二分类问题的输出层,где输出可以直接解释为属于某类的概率。
梯度消失
想象一下sigmoid函数就像一个S形的滑梯:
滑梯的特点:
- 滑梯中间部分比较陡。
- 两端(顶部和底部)非常平缓,几乎是水平的。
梯度就像球在滑梯上滚动的速度:
- 在中间部分,球滚动得快(梯度大)。
- 在两端,球几乎不动(梯度接近零)。
反向传播过程:
- 想象你有多个这样的滑梯连在一起(多层网络)。
- 你从最后一个滑梯开始往回推球。
梯度消失现象:
- 如果球落在任何一个滑梯的平缓部分,它就几乎停止了。
- 当你试图把这个几乎不动的球推回前面的滑梯时,它在每个滑梯上都几乎不动。
对深层网络的影响:
- 在5层以上的网络中,球(梯度)经过多个滑梯后,速度变得极其缓慢。
- 这意味着网络的前面几层几乎收不到任何"推力"来更新它们的参数。
训练困难:
- 如果前面的层不能有效更新,整个网络就难以学习和改进。
- 这就像你试图教一个团队,但只有最后几个人能听到你的指令,而前面的人几乎听不到任何东西。
梯度的作用:
- 指导方向:梯度指示了函数值下降最快的方向。
- 更新参数:在训练过程中,我们使用梯度来更新网络的权重和偏置。
- 评估影响:梯度大小表示输入变化对输出的影响程度。
为什么要相乘: 在深度神经网络中,我们使用链式法则来计算梯度。这就需要相乘多个局部梯度。
举个简单的例子: 假设有一个两层网络:输入 x,通过函数 f 到中间层,再通过函数 g 到输出 y。
y = g(f(x))
要计算 dy/dx(输入x对输出y的影响),我们需要:
dy/dx = dy/df * df/dx
这里:
- dy/df 是 g 的导数
- df/dx 是 f 的导数
在更深的网络中,这种相乘会一直延续到输入层。
实际应用:
反向传播:计算每一层参数的梯度,需要从输出层向输入层传播误差。这个过程中会连续相乘多个局部梯度。
参数更新: 新参数 = 旧参数 - 学习率 * 梯度
如果梯度接近零(由于多次相乘变得很小),参数几乎不会更新。
理解网络:通过观察梯度,我们可以理解输入的微小变化如何影响最终输出。
为什么要进行反向传播:
反向传播是训练神经网络的核心算法,主要有以下几个原因:
a) 效率:
- 正向计算每个参数的梯度会非常耗时。
- 反向传播利用了中间计算结果,大大提高了效率。
b) 更新参数:
- 我们需要知道如何调整每一层的权重和偏置。
- 反向传播能精确计算每个参数对最终损失的影响。
c) 处理复杂网络:
- 对于深层网络,正向计算梯度几乎不可能。
- 反向传播使得训练深层网络成为可能。
d) 实现反馈机制:
- 类似于人类学习过程中的纠错。
- 从输出的误差开始,逐层调整网络参数。
e) 梯度下降优化:
- 反向传播提供了准确的梯度信息。
- 这些梯度用于梯度下降算法,优化网络参数。
f) 理解网络行为:
- 通过观察梯度流动,我们可以理解网络各部分的重要性。
- 有助于网络结构的设计和优化。
反向传播通俗化解释
a) 效率:
想象你在爬一座有100层的大楼,每层都有不同的密码锁。
- 正向计算就像你每次都从1楼开始,一层层爬上去,尝试每一层的密码。每次只改动一个密码,就得重新从头爬一遍。
- 反向传播则像是你先爬到顶楼,然后在下楼的过程中记录每层的情况。这样,你只需爬一次楼,就能获得所有楼层的信息。
反向传播通过聪明地利用已经计算过的信息,大大减少了重复工作。
b) 更新参数:
把神经网络想象成一个复杂的音响系统,有很多旋钮可以调节。
- 我们的目标是调出最好的音效(最小化损失)。
- 但是,直接调整旋钮很难知道对最终音效的影响。
- 反向传播就像是一个精确的测量工具,告诉你每个旋钮对最终音效的具体影响。
- 有了这个工具,你就知道该扭哪个旋钮,扭多少,来改善音效。
c) 处理复杂网络:
想象你在指挥一个有1000人的大合唱团。
- 正向计算就像你要单独告诉每个人如何调整他们的声音,然后每次只调整一个人,再听整体效果。这几乎是不可能完成的任务。
- 反向传播就像你先听整体效果,然后从后排开始,逐排给出调整建议。每一排都基于后面几排的反馈来调整。这样,即使是1000人的合唱团,你也能有效地进行指导。
反向传播使得我们能够有效地"指挥"非常深和复杂的神经网络,即使它们有成百上千的层次。
总的来说,反向传播就像是一个聪明的"信息传递系统",它让我们能够高效地了解复杂网络中每个小部分的作用,从而进行精确的调整。这在处理大规模、多层次的神经网络时特别重要。
tanh激活函数
与 Sigmoid 相比,它是以 0 为中心的,使得其收敛速度要比 Sigmoid 快,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成梯度消失。
在隐藏层使用tanh函数,在输出层使用sigmoid函数
隐藏层使用 tanh 函数:
a) 中心化输出:tanh 函数的输出范围是 (-1, 1),均值为 0。这种中心化的特性有助于后续层的学习。
b) 梯度更强:tanh 的导数范围是 (0, 1],比 sigmoid 的导数范围 (0, 0.25] 更大,有助于减轻梯度消失问题。
c) 非线性:tanh 提供了必要的非线性,允许网络学习复杂的模式。
输出层使用 sigmoid 函数:
a) 二元分类:sigmoid 函数的输出范围是 (0, 1),可以直接解释为概率,特别适合二元分类问题。
b) 多标签分类:在多标签分类中,我们需要每个输出节点独立地表示一个类别的概率,sigmoid 很适合这种情况。
c) 概率输出:在需要概率输出的回归问题中,sigmoid 也很有用。
为什么不在所有层都使用 tanh:
a) 输出需求:很多任务需要 0 到 1 之间的输出,这正是 sigmoid 的范围。
b) 解释性:在分类问题中,sigmoid 的输出更容易解释为概率。
为什么不在所有层都使用 sigmoid:
a) 梯度消失:sigmoid 在两端的梯度非常小,容易导致梯度消失问题。
b) 非零中心:sigmoid 的输出不是零中心化的,可能会导致后续层的输入偏移。
激活函数输出的中心化特性为什么有助于后续层的学习
中心化的含义: 中心化意味着数据的平均值接近于0。tanh函数的输出范围是(-1, 1),其平均值趋近于0,这就是所谓的"中心化"。
为什么中心化有帮助:
a) 减少偏置偏移(Bias Shift):
- 如果输入总是正的(如sigmoid的输出),会导致下一层神经元的偏置项总是朝一个方向更新。
- 中心化的输入使得正负值大致平衡,减少了这种系统性的偏移。
b) 加速学习:
- 中心化的数据通常能让优化算法(如梯度下降)更快地收敛。
- 这是因为损失函数的等高线在中心化数据上往往更圆,更容易优化。
c) 改善梯度流动:
- 在反向传播中,中心化的激活值有助于梯度更均匀地流向网络的不同部分。
- 这可以减轻梯度消失或爆炸的问题。
d) 增强特征的表达能力:
- 中心化的输出允许后续层更容易地学习到正负两种模式。
- 这增加了网络表达复杂函数的能力。
具体例子: 假设下一层的某个神经元计算 w * x + b:
- 如果x总是正的(如sigmoid输出),那么w和b的调整会有一定的关联性。
- 如果x是中心化的(如tanh输出),w和b可以更独立地调整,提供更大的灵活性。
对比sigmoid: sigmoid的输出范围是(0, 1),不是中心化的。这可能导致:
- 后续层的输入有一个正的偏移。
- 梯度更新时可能会出现某些系统性的偏差。
-
非中心化数据的情况:
- 这就像在一个狭长的山谷里。
- 山谷的一边可能很陡,另一边可能很缓。
- 你在这里行走时,可能会反复横跳:在陡峭的一侧迈大步,在平缓的一侧迈小步。
- 这样走起来很不顺畅,需要很多次调整才能到达最低点。
-
中心化数据的情况:
- 这更像是在一个圆形的碗状山谷里。
- 四周的坡度大致相同。
- 你可以更直接地朝着中心(最低点)走去。
- 不需要太多的左右摇摆,你的路径会更直接、更高效。
-
在机器学习中:
- "走路"就是优化算法(如梯度下降)调整参数的过程。
- "山谷的形状"就是损失函数的等高线。
- 中心化的数据tends to创造更"圆"的等高线,使得优化过程更顺畅。
-
为什么会这样:
- 非中心化数据可能在某些维度上有很大的值,在其他维度上有很小的值。
- 这会导致损失函数在不同维度上的变化速率差异很大。
- 中心化后,数据在各个维度上的尺度更接近,使得损失函数的行为更均匀。
-
实际效果:
- 使用中心化数据,优化算法通常能更快地找到最优解。
- 需要的迭代次数可能会减少。
- 最终得到的解可能会更好(更接近全局最优)。
Relu激活函数
从上述函数图像可知,ReLU 激活函数将小于 0 的值映射为 0,而大于 0 的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率。
从图中可以看到,当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”。
ReLU是目前最常用的激活函数。与sigmoid相比,RELU的优势是:
采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。 sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
ReLU的确引入了非线性: 虽然ReLU在正半轴是线性的,但它在整体上是非线性的。这是因为: f(x) = max(0, x)
这个函数在x=0处有一个"拐点",这就引入了非线性。
分段线性函数: ReLU实际上是一个分段线性函数。它在不同的输入范围有不同的行为:
- 当x > 0时,f(x) = x
- 当x ≤ 0时,f(x) = 0
非线性的重要性: 这种非线性是至关重要的。如果没有这种非线性:
- 整个神经网络将退化为一个线性模型
- 网络将失去学习复杂模式的能力
ReLU的非线性效果:
- 它能够有选择地激活神经元(当输入为正时)
- 这种"开关"行为使网络能够学习复杂的非线性决策边界
与其他激活函数的比较:
- 相比sigmoid或tanh,ReLU的非线性可能不那么明显
- 但它的简单性和有效性使它在许多情况下表现更好
实际应用中的非线性: 在深度网络中,多层ReLU的组合可以近似任何复杂的非线性函数
ReLU的优势:
- 计算简单,有利于快速训练
- 在正区间梯度恒为1,有助于缓解梯度消失问题
- 产生稀疏激活,可能带来一些正则化效果
softmax
Softmax 作为激活函数:
- 在神经网络的输出层使用,将原始输出转换为概率分布。
- 引入非线性,允许网络学习复杂的决策边界。
Softmax 作为归一化方法:
- 确实,Softmax 可以被视为一种特殊的归一化技术。
- 它将任意实数值的向量转换为和为 1 的概率分布。
归一化特性:
- 输出总和为 1:Σᵢ softmax(xᵢ) = 1
- 保持相对大小关系:较大的输入对应较大的输出概率。
与其他归一化方法的比较:
- Min-Max 归一化:将值缩放到 [0,1] 范围,但和不必为 1。
- L2 归一化:缩放向量使其 L2 范数为 1。
- Softmax:不仅将值映射到 (0,1),还确保和为 1。
Softmax 的指数特性:
- 使用指数函数 (exp) 放大了输入之间的差异。
- 这使得最大值更加"突出",有利于分类任务。
在机器学习中的广泛应用:
- 多类分类问题中的标准选择。
- 在注意力机制、强化学习等领域也有重要应用。
温度参数:
- Softmax 可以引入温度参数来调整输出分布的"软硬度"。
- softmax(xᵢ/T),其中 T 是温度。
- 较低的温度使分布更"尖锐",较高的温度使分布更均匀。
计算稳定性考虑:
- 在实践中,常常会减去输入的最大值以提高数值稳定性。
- 这不会改变 Softmax 的结果,但可以防止指数计算中的溢出。
Softmax 的主要用途:
- 主要用在神经网络的输出层,特别是在多类分类问题中。
- 不常用作隐藏层的激活函数。
为什么不常用于隐藏层:
- 计算成本高:需要计算所有神经元的总和,对大型网络来说可能效率低下。
- 全局依赖性:每个输出都依赖于所有输入,这可能不适合某些网络结构。
- 可能引入不必要的约束:强制输出和为1可能限制网络的表达能力。
常用的隐藏层激活函数:
- ReLU 及其变体(如 Leaky ReLU, ELU)
- tanh
- Sigmoid(在某些特定情况下)
Softmax 的特殊地位:
- 在输出层中几乎是多类分类问题的标准选择。
- 提供了直接可解释为概率的输出。
其他常见用途:
- 在注意力机制中用于计算注意力权重。
- 在某些强化学习算法中用于动作选择。
Softmax 的变体:
- Hierarchical Softmax:用于大规模分类问题,提高计算效率。
- Sparsemax:产生稀疏的概率分布,在某些情况下更有优势。
与其他输出层激活函数的比较:
- 二元分类:常用 Sigmoid
- 多标签分类:可能使用多个 Sigmoid
- 回归问题:通常不使用 Softmax,可能直接使用线性输出
在深度学习框架中的实现:
- 通常,Softmax 与交叉熵损失函数结合使用,为了数值稳定性,常常将两者合并实现。