【本文将持续更新深度学习的一些基础知识】
1. 深度学习介绍 #
深度学习(Deep Learning)是机器学习的一个分支,它利用多层神经网络来自动地从数据中提取特征和进行预测。
1.1. 多层感知机 #
- 感知机是最简单的神经网络单元,它包括输入层、权重和偏置,通过一个激活函数输出结果。

- 多层感知机(MLP, Multi-Layer Perceptron)由多个感知机层组成,包括输入层、隐藏层和输出层。 每一层中的节点与下一层中的每个节点相连。

1.2. 激活函数 #
-
激活函数用于引入非线性,使神经网络能够学习和表示复杂的关系。
-
常用激活函数包括ReLU(Rectified Linear Unit)、Sigmoid和Tanh等。
-
公式:
$$ \text{ReLU}(x) = \max(0, x) $$
$$ \text{sigmoid}(x) = \sigma(x) = \frac{1}{1 + e^{-x}} $$
$$ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} $$
2. 损失函数 #
2.1. 均方误差 #
- 均方误差(Mean Squared Error, MSE)通常用于回归问题,它计算预测值与真实值之间的平均平方差。
- 公式如下:
$$
\text{MSE} = \frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2
$$
- 其中:
- \( n \) 是样本的数量
- \( y_i \) 是第 \( i \) 个样本的真实值
- \( \hat{y}_i \) 是第 \( i \) 个样本的预测值
- 其中:
- MSE 的优点是简单直观,缺点是对异常值比较敏感,因为平方项会放大异常值的影响。
2.2. 交叉熵损失 #
- 交叉熵损失(Cross-Entropy Loss)通常用于分类问题,特别是多分类问题。它衡量的是预测的概率分布与真实分布之间的差异。
- 公式如下:
- 二分类问题:
$$
\text{Cross-Entropy Loss} = -\frac{1}{n} \sum_{i=1}^n [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]
$$
- 其中:
- \( n \) 是样本的数量
- \( y_i \) 是第 \( i \) 个样本的真实标签(0 或 1)
- \( \hat{y}_i \) 是第 \( i \) 个样本预测为正类的概率
- 其中:
- 多分类问题:
$$
\text{Cross-Entropy Loss} = -\frac{1}{n} \sum_{i=1}^n \sum_{c=1}^C y_{i,c} \log(\hat{y}_{i,c})
$$
- 其中:
- \( n \) 是样本的数量
- \( C \) 是类别的数量
- \( y_{i,c} \) 是第 \( i \) 个样本在类别 \( c \) 上的真实标签(one-hot 编码)
- \( \hat{y}_{i,c} \) 是第 \( i \) 个样本预测为类别 \( c \) 的概率
- 其中:
- 二分类问题:
$$
\text{Cross-Entropy Loss} = -\frac{1}{n} \sum_{i=1}^n [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]
$$
3. 反向传播 #
反向传播(Backpropagation)是训练神经网络的核心算法,用于计算每个参数的梯度,以更新模型参数,使损失函数最小化。反向传播通过链式法则逐层传播误差,调整每一层的权重和偏置。
假设激活函数是 sigmoid,损失函数是均方误差(MSE),并且是一个简单的三层神经网络,包括输入层、隐藏层和输出层。我们来详细推导反向传播的全过程。
3.1. 前向传播 #
-
我们定义以下变量:
- 输入:\( \mathbf{x} \)
- 隐藏层权重:\( \mathbf{W}_1 \)
- 隐藏层偏置:\( \mathbf{b}_1 \)
- 输出层权重:\( \mathbf{W}_2 \)
- 输出层偏置:\( \mathbf{b}_2 \)
-
隐藏层
- 计算隐藏层的输入(未激活值): $$ \mathbf{z}_1 = \mathbf{W}_1 \mathbf{x} + \mathbf{b}_1 $$
- 应用激活函数(sigmoid): $$ \mathbf{a}_1 = \sigma(\mathbf{z}_1) = \frac{1}{1 + e^{-\mathbf{z}_1}} $$
-
输出层
- 计算输出层的输入(未激活值): $$ \mathbf{z}_2 = \mathbf{W}_2 \mathbf{a}_1 + \mathbf{b}_2 $$
- 应用激活函数(sigmoid): $$ \hat{\mathbf{y}} = \mathbf{a}_2 = \sigma(\mathbf{z}_2) = \frac{1}{1 + e^{-\mathbf{z}_2}} $$
-
损失函数
- 使用均方误差(MSE)作为损失函数: $$ L = \frac{1}{2} \sum_{i=1}^n (\hat{y}_i - y_i)^2 $$
3.2. 反向传播 #
反向传播的目标是计算损失函数对每个参数的梯度。我们从输出层开始,逐层向后计算。
-
输出层
- 计算损失函数对输出层激活值的梯度: $$ \frac{\partial L}{\partial \mathbf{a}_2} = \frac{\partial}{\partial \mathbf{a}_2} \left( \frac{1}{2} (\hat{\mathbf{y}} - \mathbf{y})^2 \right) = \hat{\mathbf{y}} - \mathbf{y} $$
- 计算损失函数对输出层未激活值的梯度
- (利用 sigmoid 的导数 \( \sigma{\prime}(z) = \sigma(z) (1 - \sigma(z)) \)): $$ \frac{\partial L}{\partial \mathbf{z}_2} = \frac{\partial L}{\partial \mathbf{a}_2} \cdot \frac{\partial \mathbf{a}_2}{\partial \mathbf{z}_2} = (\hat{\mathbf{y}} - \mathbf{y}) \odot (\mathbf{a}_2 (1 - \mathbf{a}_2)) $$
- 计算损失函数对输出层权重的梯度: $$ \frac{\partial L}{\partial \mathbf{W}_2} = \frac{\partial L}{\partial \mathbf{z}_2} \cdot \mathbf{a}_1^T $$
- 计算损失函数对输出层偏置的梯度: $$ \frac{\partial L}{\partial \mathbf{b}_2} = \frac{\partial L}{\partial \mathbf{z}_2} $$
-
隐藏层
- 计算损失函数对隐藏层激活值的梯度(传播回去): $$ \frac{\partial L}{\partial \mathbf{a}_1} = \mathbf{W}_2^T \cdot \frac{\partial L}{\partial \mathbf{z}_2} $$
- 计算损失函数对隐藏层未激活值的梯度(利用 sigmoid 的导数):
$$
\frac{\partial L}{\partial \mathbf{z}_1} = \frac{\partial L}{\partial \mathbf{a}_1} \odot (\mathbf{a}_1 (1 - \mathbf{a}_1))
$$
- 其中,\( \odot \) 表示逐元素相乘
- 计算损失函数对隐藏层权重的梯度: $$ \frac{\partial L}{\partial \mathbf{W}_1} = \frac{\partial L}{\partial \mathbf{z}_1} \cdot \mathbf{x}^T $$
- 计算损失函数对隐藏层偏置的梯度: $$ \frac{\partial L}{\partial \mathbf{b}_1} = \frac{\partial L}{\partial \mathbf{z}_1} $$
3.3. 参数更新 #
使用梯度下降算法更新参数:
- 更新输出层参数: $$ \mathbf{W}_2 := \mathbf{W}_2 - \eta \frac{\partial L}{\partial \mathbf{W}_2} $$ $$ \mathbf{b}_2 := \mathbf{b}_2 - \eta \frac{\partial L}{\partial \mathbf{b}_2} $$
- 更新隐藏层参数: $$ \mathbf{W}_1 := \mathbf{W}_1 - \eta \frac{\partial L}{\partial \mathbf{W}_1} $$ $$ \mathbf{b}_1 := \mathbf{b}_1 - \eta \frac{\partial L}{\partial \mathbf{b}_1} $$
其中,\( \eta \) 是学习率。