深度学习基础
感知机 (Perceptron)
通俗例子: 想象一个非常简单的**“决策机器人”**,它要根据一些输入信息来做一个二选一的决定(比如“去”或“不去”,“是”或“否”)。
-
收集信息 (输入 Inputs): 机器人收集多个信息片段,比如:
- 天气好不好?(x₁)
- 朋友去不去?(x₂)
- 今天心情如何?(x₃) 这些信息可以是数值(比如天气评分1-10)或者0/1的布尔值。
-
给信息赋予权重 (Weights): 机器人对每个信息的重要性有不同的看法:
- 天气可能很重要 (w₁ = 0.5)
- 朋友去不去非常重要 (w₂ = 0.8)
- 心情一般重要 (w₃ = 0.3) 这些权重表示了每个输入对最终决策的影响程度。
-
加权求和并加上偏好 (Weighted Sum + Bias): 机器人把每个信息和它的权重相乘,然后加起来,得到一个总分。它可能还有一个固有的“偏好”或“门槛”(偏置项 bias,b)。
z = (x₁ * w₁) + (x₂ * w₂) + (x₃ * w₃) + b
-
做决策 (激活函数 Activation Function - 阶跃函数):
- 如果总分
z
大于某个阈值(或者简单地说,如果z > 0
),机器人就决定“去”(输出1)。 - 如果总分
z
小于或等于某个阈值(或者z ≤ 0
),机器人就决定“不去”(输出0或-1)。 这个决策过程就像一个开关,要么开要么关。
- 如果总分
感知机就是这样一个简单的二分类模型。
结合技术点:
- 核心思想 (Core Idea):
- 由 Frank Rosenblatt 于1957年提出,是最早的人工神经网络模型之一。
- 一个线性二分类器。它试图找到一个超平面 (hyperplane) 来分隔两种不同类别的数据点。
- 模拟了单个神经元的基本行为:接收多个输入信号,根据这些信号的加权和以及一个激活函数来决定是否“激活”(输出)。
- 数学表示 (Mathematical Representation):
- 输入 (Inputs):
x = (x₁, x₂, ..., xₙ)
(一个特征向量) - 权重 (Weights):
w = (w₁, w₂, ..., wₙ)
(一个权重向量) - 偏置 (Bias):
b
(一个标量) - 加权和 (Weighted Sum / Net Input):
z = w · x + b = Σ(wᵢ * xᵢ) + b
- 激活函数 (Activation Function): 通常是符号函数 (sign function) 或 阶跃函数 (step function)。
output = 1
ifz > θ
(或z > 0
如果θ
被吸收到b
中)output = 0
(或-1
) ifz ≤ θ
(或z ≤ 0
)
- 模型的输出是一个离散的类别标签。
- 输入 (Inputs):
- 学习算法 (Perceptron Learning Algorithm):
- 一种迭代算法,用于调整权重
w
和偏置b
。 - 过程:
- 初始化权重
w
和偏置b
(通常为0或小的随机数)。 - 对于训练集中的每个样本
(x, y_true)
(其中y_true
是真实标签): a. 计算模型的预测输出y_pred
。 b. 如果y_pred ≠ y_true
(预测错误): * 更新权重:w := w + η * (y_true - y_pred) * x
* 更新偏置:b := b + η * (y_true - y_pred)
(其中η
是学习率,y_true
和y_pred
通常取 +1 和 -1) - 重复步骤2,直到所有样本都被正确分类,或者达到最大迭代次数。
- 初始化权重
- 一种迭代算法,用于调整权重
- 目的/用途 (Purpose / Use Cases):
- 解决线性可分 (linearly separable) 的二分类问题。
- 例如,逻辑门 AND、OR 的实现。
- 优点:
- 简单,易于理解和实现。
- 如果数据是线性可分的,感知机学习算法保证在有限次迭代后收敛到一个解。
- 缺点:
- 只能解决线性可分问题。 对于线性不可分的问题(如异或 XOR 问题),它无法找到一个有效的超平面来分隔数据。这是感知机的一个重大局限。
- 如果数据不是严格线性可分的,算法可能不会收敛,权重会持续振荡。
- 输出是离散的,不能提供概率信息。
- 阶跃激活函数不可导(或导数为0),不适用于基于梯度的优化方法(如反向传播)。
多层感知机 (Multilayer Perceptron, MLP)
通俗例子: 想象之前的“决策机器人”变得更聪明了,它不再是简单地把所有信息加权求和然后做一次决策,而是组建了一个“决策委员会”。
多层感知机就是通过引入一个或多个“隐藏层”来克服单个感知机的线性限制。
结合技术点:
- 核心思想 (Core Idea):
- 一种前馈神经网络 (Feedforward Neural Network),由至少三层节点组成:一个输入层 (Input Layer),一个或多个隐藏层 (Hidden Layer(s)),以及一个输出层 (Output Layer)。
- 每个节点(除了输入节点)都是一个带有非线性激活函数的神经元(通常不再是阶跃函数,而是如 Sigmoid, Tanh, ReLU 等平滑可导的函数)。
- 通过在层与层之间引入非线性激活函数,MLP 能够学习和表示非线性关系,从而解决线性不可分的问题(如XOR问题)。
- 信息从输入层单向流向输出层,没有反馈环路(与循环神经网络RNN不同)。
- 数学表示 (Mathematical Representation - 简化版,一个隐藏层):
- 输入层到隐藏层:
- 隐藏层第
j
个神经元的净输入:z_j^(h) = w_j^(h) · x + b_j^(h)
- 隐藏层第
j
个神经元的激活输出:a_j^(h) = g(z_j^(h))
(其中g
是非线性激活函数,如Sigmoid, ReLU)
- 隐藏层第
- 隐藏层到输出层:
- 输出层第
k
个神经元的净输入:z_k^(o) = w_k^(o) · a^(h) + b_k^(o)
(其中a^(h)
是隐藏层所有神经元的激活输出向量) - 输出层第
k
个神经元的激活输出:y_k_pred = f(z_k^(o))
(其中f
是输出层的激活函数,如Sigmoid用于二分类概率,Softmax用于多分类概率,线性函数用于回归)
- 输出层第
- 输入层到隐藏层:
- 学习算法 (反向传播 Backpropagation):
- MLP通常使用反向传播算法结合梯度下降 (Gradient Descent) 及其变种(如Adam, SGD with momentum)来训练。
- 过程:
- 前向传播 (Forward Pass): 将输入数据通过网络,计算每一层的输出,直到得到最终的预测结果。
- 计算损失 (Loss Calculation): 将预测结果与真实标签进行比较,计算损失函数的值(如交叉熵损失、均方误差)。
- 反向传播 (Backward Pass): 从输出层开始,将损失逐层向后传播,利用链式法则计算损失函数对网络中每个权重和偏置的梯度。
- 参数更新 (Parameter Update): 根据计算出的梯度和选择的优化算法,更新网络中的权重和偏置,以减小损失。
- 重复以上步骤,直到损失收敛或达到预设的训练轮数。
- 目的/用途 (Purpose / Use Cases):
- 分类任务: 图像识别、文本分类、情感分析等。
- 回归任务: 预测房价、股票价格等。
- 能够学习复杂的非线性映射。
- 优点:
- 通用近似定理 (Universal Approximation Theorem): 理论上,具有一个足够宽的隐藏层(或多个隐藏层)的MLP可以以任意精度近似任何连续函数。这意味着它具有强大的表示能力。
- 能够解决线性不可分的问题。
- 是许多更复杂深度学习模型的基础。
- 缺点:
- 容易过拟合: 如果模型过于复杂或训练数据不足,MLP可能会在训练数据上表现很好,但在未见过的数据上表现差。需要正则化技术(如L1/L2正则化、Dropout)来缓解。
- 需要调整的超参数多: 网络结构(层数、每层神经元数量)、激活函数的选择、学习率、优化器选择等。
- 可能陷入局部最优: 梯度下降算法可能会陷入损失函数的局部最小值而不是全局最小值(尽管在实践中,对于高维度的神经网络,这通常不是主要问题)。
- 训练可能较慢: 尤其是对于深层和宽层的网络。
- “黑箱”模型: 对于复杂的MLP,其内部决策过程可能难以解释。
理解感知机是理解MLP的起点,而MLP则是通往更复杂的神经网络结构(如卷积神经网络CNN、循环神经网络RNN、Transformer等)的重要桥梁。、
好的,我们来简单介绍一下几种常见的激活函数,并重点讨论如何根据不同情况挑选它们。
激活函数 (Activation Function)
在神经网络中,激活函数被应用到神经元的加权和(z = w·x + b
)之后,引入非线性因素。没有非线性激活函数,无论神经网络有多少层,它本质上都只是一个线性模型,无法学习复杂的数据模式。
常见的激活函数:
-
Sigmoid 函数
- 公式:
σ(z) = 1 / (1 + e^(-z))
- 输出范围:
(0, 1)
- 形状: S 型曲线。
- 优点:
- 输出在 (0, 1) 之间,可以解释为概率(尤其是在二分类问题的输出层)。
- 平滑可导。
- 缺点:
- 梯度消失 (Vanishing Gradient): 当输入
z
非常大或非常小时,Sigmoid 的导数(梯度)接近于0。在深层网络中,这会导致反向传播时梯度逐层衰减,使得靠近输入层的权重更新非常缓慢,甚至停止学习。 - 输出非零中心 (Not zero-centered): 输出恒为正,这可能导致后续层输入的非零中心化,可能影响梯度下降的效率。
- 计算相对复杂(指数运算)。
- 梯度消失 (Vanishing Gradient): 当输入
- 公式:
-
Tanh (双曲正切) 函数
- 公式:
tanh(z) = (e^z - e^(-z)) / (e^z + e^(-z))
(也可以表示为2 * sigmoid(2z) - 1
) - 输出范围:
(-1, 1)
- 形状: S 型曲线,但中心在0。
- 优点:
- 输出零中心 (Zero-centered): 相比 Sigmoid,这通常能使模型收敛更快。
- 平滑可导。
- 缺点:
- 梯度消失: 仍然存在梯度消失问题,只是程度比 Sigmoid 略轻(因为梯度范围比 Sigmoid 稍大)。
- 计算相对复杂(指数运算)。
- 公式:
-
ReLU (Rectified Linear Unit, 修正线性单元)
- 公式:
ReLU(z) = max(0, z)
- 输出范围:
[0, +∞)
- 形状: 输入为负时输出0,输入为正时输出等于输入。
- 优点:
- 有效缓解梯度消失: 当输入
z > 0
时,导数为1,梯度可以很好地传播。 - 计算非常高效: 只需要一个简单的比较和赋值操作。
- 收敛速度快: 在实践中,使用 ReLU 的网络通常比使用 Sigmoid 或 Tanh 的网络收敛更快。
- 稀疏性: 会使一部分神经元的输出为0,这可以引入网络的稀疏性,可能有助于特征提取。
- 有效缓解梯度消失: 当输入
- 缺点:
- Dying ReLU (神经元死亡): 如果一个神经元的输入在训练过程中持续为负,那么它的输出将一直是0,梯度也将一直是0,导致该神经元不再学习(“死亡”)。这通常发生在学习率设置过大或初始化不当时。
- 输出非零中心。
- 公式:
-
Leaky ReLU (带泄露的 ReLU)
- 公式:
LeakyReLU(z) = max(αz, z)
或者写成:z
ifz > 0
αz
ifz ≤ 0
(其中α
是一个小的正常数,如 0.01 或 0.2)
- 输出范围:
(-∞, +∞)
(如果α > 0
) - 形状: 类似于 ReLU,但在负输入区域有一个小的非零斜率。
- 优点:
- 解决了 Dying ReLU 问题: 即使输入为负,神经元仍然会有非零梯度,允许学习继续。
- 保留了 ReLU 的大部分优点(如计算效率、缓解梯度消失)。
- 缺点:
- 引入了一个新的超参数
α
需要调整(尽管通常对α
的选择不那么敏感)。 - 表现不一定总是优于 ReLU。
- 引入了一个新的超参数
- 变种:PReLU (Parametric ReLU),其中
α
不是固定的超参数,而是作为模型参数通过学习得到。
- 公式:
-
Softmax 函数
- 公式:
Softmax(zᵢ) = e^(zᵢ) / Σ e^(zⱼ)
(对向量z
中的每个元素zᵢ
计算) - 输出范围: 每个输出元素在
(0, 1)
之间,且所有输出元素之和为 1。 - 形状: 将一个实数向量转换为概率分布。
- 用途:
- 专门用于多分类问题的输出层。
- 它将网络的原始输出(logits)转换为每个类别的概率。
- 优点:
- 输出可以直观地解释为概率。
- 与交叉熵损失函数(Cross-Entropy Loss)结合使用效果很好。
- 缺点:
- 通常不用于隐藏层。
- 如果 logits 之间的差异很大,可能会导致输出概率非常接近0或1,可能影响数值稳定性(但通常有数值稳定的实现)。
- 公式:
如何挑选激活函数?
选择激活函数没有绝对的“黄金法则”,但可以遵循一些通用的指导原则和经验:
-
输出层 (Output Layer):
- 二分类问题 (Binary Classification):
- 通常使用 Sigmoid 函数,因为它的输出 (0, 1) 可以直接解释为属于正类的概率。
- 多分类问题 (Multi-class Classification):
- 通常使用 Softmax 函数,它会输出一个概率分布,表示样本属于每个类别的概率。
- 回归问题 (Regression):
- 通常不使用激活函数(或者说使用一个线性激活函数
f(z) = z
),因为目标是预测任意连续值,而不是限制在特定范围内或解释为概率。 - 如果回归目标值有特定范围(如非负),可以在输出层使用相应的激活函数(如 ReLU 用于非负输出)。
- 通常不使用激活函数(或者说使用一个线性激活函数
- 二分类问题 (Binary Classification):
-
隐藏层 (Hidden Layers):
- 首选通常是 ReLU:
- 由于其简单性、计算效率以及在实践中通常能带来更快的收敛速度和更好的性能(尤其是在较深的网络中,能有效缓解梯度消失)。
- 从 ReLU 开始尝试是一个好的起点。
- 如果遇到 Dying ReLU 问题:
- 可以尝试 Leaky ReLU 或其变体 (如 PReLU, ELU)。
- 检查学习率是否过大,或者尝试更好的权重初始化方法 (如 He 初始化)。
- Tanh:
- 在某些特定场景下(例如一些循环神经网络 RNN 的变体,如 LSTM、GRU 的门控单元中)仍然被使用,因为它输出零中心。
- 有时在 ReLU 表现不佳时,可以尝试 Tanh 作为备选。
- Sigmoid:
- 在现代深度神经网络的隐藏层中已经很少使用,主要是因为梯度消失和非零中心问题。
- 它仍然可能出现在一些旧的网络结构中,或者在需要将输出压缩到 (0,1) 范围的特定门控机制中(如 LSTM 中的某些门)。
- 首选通常是 ReLU:
-
实验和经验:
- 没有免费午餐定理: 没有哪个激活函数在所有情况下都是最优的。最好的选择往往取决于具体的数据集、网络架构和任务。
- 进行实验: 尝试不同的激活函数,并通过验证集的性能来评估哪种最适合你的问题。
- 关注研究进展: 新的激活函数不断被提出和研究 (如 Swish, GELU 等,常用于 Transformer 模型)。了解最新的研究成果可能有助于你做出更好的选择。
总结挑选策略:
- 输出层: 根据任务类型(二分类用 Sigmoid,多分类用 Softmax,回归用线性或无激活)。
- 隐藏层:
- 默认尝试 ReLU。
- 如果 ReLU 出现神经元死亡问题,尝试 Leaky ReLU / PReLU / ELU。
- Tanh 可以作为 ReLU 表现不佳时的备选,或者在需要零中心输出的特定结构中使用。
- 尽量避免在深层网络的隐藏层中使用 Sigmoid。
- 始终通过实验验证你的选择。
记住,激活函数的选择是神经网络设计中的一个重要超参数,合理的选择可以显著影响模型的训练效率和最终性能。