重练AI小号:大模型小白的重修日记(二.激活函数)
前言
在深度学习领域,神经网络常被比作模拟人类大脑的复杂系统。然而,其核心能力的来源并非仅仅在于“神经元”的叠加,而在于隐藏在每个神经元之后的激活函数。
一 .激活函数
激活函数的目的是为了引入非线性,但是到是什么是非线性,不引入激活函数会怎么样呢?
假设我们有一个极其深度的神经网络,有 100 层。为了方便推演,我们先看两层,并且故意去掉激活函数 f f f。在没有激活函数的情况下,前向传播的公式变成了纯粹的线性映射:隐藏层 1: a ( 1 ) = W ( 1 ) x + b ( 1 ) a^{(1)} = W^{(1)}x + b^{(1)} a(1)=W(1)x+b(1)隐藏层 2: a ( 2 ) = W ( 2 ) a ( 1 ) + b ( 2 ) a^{(2)} = W^{(2)}a^{(1)} + b^{(2)} a(2)=W(2)a(1)+b(2)我们把第一层的公式直接代入到第二层中: a ( 2 ) = W ( 2 ) ( W ( 1 ) x + b ( 1 ) ) + b ( 2 ) a^{(2)} = W^{(2)}(W^{(1)}x + b^{(1)}) + b^{(2)} a(2)=W(2)(W(1)x+b(1))+b(2)根据矩阵乘法分配律,把它展开: a ( 2 ) = ( W ( 2 ) W ( 1 ) ) x + ( W ( 2 ) b ( 1 ) + b ( 2 ) ) a^{(2)} = (W^{(2)}W^{(1)})x + (W^{(2)}b^{(1)} + b^{(2)}) a(2)=(W(2)W(1))x+(W(2)b(1)+b(2))仔细观察这个展开后的式子! W ( 2 ) W^{(2)} W(2) 是个矩阵, W ( 1 ) W^{(1)} W(1) 也是个矩阵。两个矩阵相乘,结果依然只是一个全新的矩阵。 我们把它记作 W n e w W_{new} Wnew。 W ( 2 ) b ( 1 ) W^{(2)}b^{(1)} W(2)b(1) 是个向量, b ( 2 ) b^{(2)} b(2) 也是个向量。两个向量相加,结果依然只是一个全新的向量。 我们把它记作 b n e w b_{new} bnew。所以,这个两层网络的最终数学形态变成了: a ( 2 ) = W n e w x + b n e w a^{(2)} = W_{new}x + b_{new} a(2)=Wnewx+bnew核心结论: 只要你不用激活函数,无论你叠 10 层、100 层还是 10000 层隐藏层,由于矩阵乘法的结合律,它们在数学上等价于极其平凡的一层线性网络。
1.1.激活函数带来的非线性变化(一维)

如上图所示,这是一个简单的神经网络。它通过具体的数学算式证明了,如果神经元之间只进行线性的加权求和,而不使用任何非线性激活函数,那么无论经过多少层计算,最终的输出 y = 5 x + 22 y = 5x + 22 y=5x+22 依然只是输入 x x x 的一个简单线性组合(即一条直线)。
但是当数据出现如下图所示的复杂情况时,没有激活函数的模型无论怎么变换,始终是一条直线,无法拟合下面的数据。

现在我们添加上激活函数,如上图,在每个神经元上添加ReLu激活函数。此时我们可以神奇的发现,原本的直线,现在由于激活函数的“打断”,变成了“弯折”的曲线,拟合成功!
1.2.激活函数带来的非线性变化(二维)

底面(X轴和Y轴):原本的二维特征空间看第一张图左侧的螺旋数据,每个点都有两个坐标(比如 x 1 x_1 x1 和 x 2 x_2 x2)。在 3D 图中,底部的那个“地基”就是这个原始的 ( x 1 , x 2 ) (x_1, x_2) (x1,x2) 坐标系。你可以把那些彩色的螺旋点想象成平铺在地板上。高度(Z轴):神经元的纯线性输出图一中展示了一个有 4 个神经元的隐藏层。在没有加激活函数时,第一个神经元的计算公式就是纯粹的加权求和: z 1 = w 11 x 1 + w 12 x 2 + b 1 z_1 = w_{11} x_1 + w_{12} x_2 + b_1 z1=w11x1+w12x2+b1。在数学几何中, Z = A ⋅ X + B ⋅ Y + C Z = A\cdot X + B\cdot Y + C Z=A⋅X+B⋅Y+C 这是什么?这就是一个标准的三维空间平面方程。

假设我们看第一个神经元。它接收了 x 1 x_1 x1 和 x 2 x_2 x2,进行计算: z 1 = w 11 x 1 + w 12 x 2 + b 1 z_1 = w_{11}x_1 + w_{12}x_2 + b_1 z1=w11x1+w12x2+b1。这个算出来的 z 1 z_1 z1,在图里就变成了 Z轴(也就是你说的 y 轴/高度)。此时,原本纸面上的一个二维点 ( x 1 , x 2 ) (x_1, x_2) (x1,x2),被赋予了一个高度,变成了三维空间里的一个点 ( x 1 , x 2 , z 1 ) (x_1, x_2, z_1) (x1,x2,z1)。对于同一个神经元来说,它的权重 w 11 , w 12 w_{11}, w_{12} w11,w12 和偏置 b 1 b_1 b1 是固定不变的。
数学上, z 1 = w 11 x 1 + w 12 x 2 + b 1 z_1 = w_{11}x_1 + w_{12}x_2 + b_1 z1=w11x1+w12x2+b1 就是一个标准的三维空间平面方程。因此,无论你有多少个输入点,只要它们经过这同一个神经元的同一套公式计算,算出来的高度 z 1 z_1 z1 绝对会整整齐齐地排列在这块倾斜的“玻璃板”(平面)上。
1.3 梯度消失与梯度爆炸
在深度学习的反向传播过程中,我们要计算损失函数 L L L 对某一层权重 w w w 的偏导。假设一个 n n n 层的简易网络,每一层的输出为 a i = σ ( z i ) a_i = \sigma(z_i) ai=σ(zi),其中 z i = w i a i − 1 + b i z_i = w_i a_{i-1} + b_i zi=wiai−1+bi。当我们计算第一层权重 w 1 w_1 w1 的梯度时,根据链式法则:
∂ L ∂ w 1 = ∂ L ∂ a n ⋅ ∂ a n ∂ z n ⋅ ∂ z n ∂ a n − 1 ⋅ ∂ a n − 1 ∂ z n − 1 … ∂ z 2 ∂ a 1 ⋅ ∂ a 1 ∂ z 1 ⋅ ∂ z 1 ∂ w 1 \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial a_n} \cdot \frac{\partial a_n}{\partial z_n} \cdot \frac{\partial z_n}{\partial a_{n-1}} \cdot \frac{\partial a_{n-1}}{\partial z_{n-1}} \dots \frac{\partial z_2}{\partial a_1} \cdot \frac{\partial a_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1} ∂w1∂L=∂an∂L⋅∂zn∂an⋅∂an−1∂zn⋅∂zn−1∂an−1…∂a1∂z2⋅∂z1∂a1⋅∂w1∂z1我们可以把这些中间项成对地看:激活函数的导数: ∂ a i ∂ z i = σ ′ ( z i ) \frac{\partial a_i}{\partial z_i} = \sigma'(z_i) ∂zi∂ai=σ′(zi)权重的乘积: ∂ z i ∂ a i − 1 = w i \frac{\partial z_i}{\partial a_{i-1}} = w_i ∂ai−1∂zi=wi (因为 z i = w i a i − 1 + b i z_i = w_i a_{i-1} + b_i zi=wiai−1+bi,对 a i − 1 a_{i-1} ai−1 求导只剩 w i w_i wi)当你把上面的对应关系代入长等式时,你会发现从第 2 层到第 n n n 层,每一层都贡献了一个 σ ′ ( z i ) ⋅ w i \sigma'(z_i) \cdot w_i σ′(zi)⋅wi。对于第 n n n 层:有 ∂ a n ∂ z n ⋅ ∂ z n ∂ a n − 1 = σ ′ ( z n ) ⋅ w n \frac{\partial a_n}{\partial z_n} \cdot \frac{\partial z_n}{\partial a_{n-1}} = \sigma'(z_n) \cdot w_n ∂zn∂an⋅∂an−1∂zn=σ′(zn)⋅wn对于第 n − 1 n-1 n−1 层:有 σ ′ ( z n − 1 ) ⋅ w n − 1 \sigma'(z_{n-1}) \cdot w_{n-1} σ′(zn−1)⋅wn−1…以此类推,直到第 2 层。因此, ∂ L ∂ w 1 \frac{\partial L}{\partial w_1} ∂w1∂L 的大小主要取决于这些中间项的连乘: ∂ L ∂ w 1 ∝ ∏ i = 2 n ( σ ′ ( z i ) ⋅ w i ) \frac{\partial L}{\partial w_1} \propto \prod_{i=2}^{n} (\sigma'(z_i) \cdot w_i) ∂w1∂L∝i=2∏n(σ′(zi)⋅wi)注: ∝ \propto ∝ 符号表示“正比于”,因为这里省略了首尾的 ∂ L ∂ a n \frac{\partial L}{\partial a_n} ∂an∂L 和 ∂ z 1 ∂ w 1 \frac{\partial z_1}{\partial w_1} ∂w1∂z1 等项,但核心影响因素是这个连乘积。这个连乘项是神经网络不稳定的根源:梯度消失:如果 ∣ σ ′ ( z i ) ⋅ w i ∣ < 1 |\sigma'(z_i) \cdot w_i| < 1 ∣σ′(zi)⋅wi∣<1,当层数 n n n 很大时,多项小于 1 的数相乘会迅速趋近于 0。这导致深层网络的梯度传不到浅层,模型无法训练。典型例子:Sigmoid 激活函数的导数最大才 0.25,极易导致消失。梯度爆炸:如果 ∣ σ ′ ( z i ) ⋅ w i ∣ > 1 |\sigma'(z_i) \cdot w_i| > 1 ∣σ′(zi)⋅wi∣>1,连乘积会呈指数级增长,变得非常巨大,导致模型权重更新过大而崩坏。
以 Sigmoid 函数为例: σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1其导数为: σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x)(1 - \sigma(x)) σ′(x)=σ(x)(1−σ(x))数学瓶颈: σ ′ ( x ) \sigma'(x) σ′(x) 的最大值仅为 0.25(当 x = 0 x=0 x=0 时)。连乘效应:在反向传播时,每一层都要乘以一个 ≤ 0.25 \le 0.25 ≤0.25 的数。如果网络有 20 层,梯度就会乘以 ( 0.25 ) 20 (0.25)^{20} (0.25)20,这个值趋近于 0。后果:靠近输入层的权重更新极慢,甚至完全停止学习,导致深层网络无法收敛。
1.4激活函数的使用
在现代神经网络中,网络的不同部分承担着不同的任务,因此需要不同特性的激活函数。我们通常把网络分为隐藏层(Hidden Layers)和输出层(Output Layer)。
隐藏层:追求训练效率和梯度稳定隐藏层的任务是特征提取。这里神经元数量庞大,计算密集,且极易发生我们上一节提到的梯度消失或爆炸。首选方案:通常整个网络的隐藏层会统一使用一种非饱和激活函数,如 ReLU、Leaky ReLU、GeLU(在 Transformer 模型中常用)或 Swish。原因:计算速度极快(只需判断是否大于 0),且能保持梯度稳定传导到浅层。
输出层:根据具体的任务“量身定制”输出层的任务是将提取好的特征转化为最终的业务结果(比如概率、具体的数值),所以必须根据任务类型选择特定的激活函数:二分类任务(如判断肿瘤是良性还是恶性):使用 Sigmoid。把它压缩到 ( 0 , 1 ) (0, 1) (0,1) 区间,代表概率。多分类任务(如识别猫、狗、鸟):使用 Softmax。它不仅把输出压缩到 ( 0 , 1 ) (0, 1) (0,1),还保证所有类别的概率总和为 1。回归任务(如预测房价、预测目标的坐标):通常不使用任何激活函数(即线性输出),或者偶尔使用特定的函数来限制输出范围。
总结
激活函数是神经网络能够处理现实世界复杂任务的根本。它不仅是实现万能近似能力的关键钥匙,更是调控模型训练动态平衡(避免梯度消失或爆炸)的核心开关。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)