趋近智
神经网络的每一层都会计算线性组合 ,它表示每个神经元的加权输入和偏置的和。在此之后,一个主要步骤是应用激活函数。如果忽略这一步,直接将线性组合 传递给下一层,那么整个网络,无论有多少层,都将表现为一个单一的、大型的线性变换。线性函数的堆叠会产生另一个线性函数。这样的网络将无法对图像、文本或复杂的表格数据集等数据中常见的非线性关系进行建模。
激活函数为网络引入非线性,使其能够学习更复杂的模式和函数。这种非线性变换是逐元素地应用于线性步骤 () 的输出。这意味着激活函数对矩阵 中的每个元素独立作用。
如果 是包含某一层所有神经元线性组合的矩阵(其中每列可能代表批量中的一个样本,每行代表一个神经元),并且 代表所选的激活函数,那么激活步骤的输出,记作 ,计算方式如下:
矩阵 中的每个元素 是通过将函数 应用于矩阵 中对应的元素 而获得的:
此操作发生在每个隐藏层以及可能在输出层中。
回想第1章中常见的激活函数,如Sigmoid、双曲正切(Tanh)和修正线性单元(ReLU)。每个函数都应用特定的非线性变换:
激活函数的选择影响网络的学习方式和表现。由于其简单性以及在深层网络中与Sigmoid或Tanh相比能够缓解梯度消失问题,ReLU是隐藏层的常用默认选项。
我们来可视化一个层内的变换:输入 (或来自前一层的激活 )经过线性变换产生 ,然后 再通过逐元素的激活函数 产生该层的输出激活 。
数据从输入流经线性组合计算,然后通过逐元素激活函数产生该层的输出。
考虑ReLU激活函数的效果。它将线性组合 中的所有负值裁剪为零,只允许正值通过。
ReLU函数 逐元素应用于线性变换的输出 。
这种两步过程(线性组合后跟非线性激活)定义了网络单层内的计算。在前向传播过程中,层 的输出激活 成为下一层 的输入 。
这里, 代表初始输入数据 。这个序列在所有隐藏层中重复,直到达到最终输出层。
在实际操作中,使用NumPy等库可以高效地将激活函数一次性逐元素应用于整个矩阵 。例如,应用ReLU:
import numpy as np
# 假设 Z 是包含线性层输出的 NumPy 数组
# Z = np.dot(W, A_prev) + b
# 逐元素应用 ReLU 激活
A = np.maximum(0, Z)
# 现在 A 包含此层的激活值
这种向量化操作比单独迭代每个元素快很多。
虽然ReLU、Sigmoid和Tanh等激活函数在隐藏层中很常见,但输出层中使用的激活函数通常根据特定任务选择(例如,回归任务使用线性函数,二分类使用Sigmoid,多分类使用Softmax)。这确保了网络的输出处于适当的格式,以便计算损失和进行预测。在讨论最终预测计算时,我们将对此进行进一步说明。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造