144 lines
5.6 KiB
Markdown
144 lines
5.6 KiB
Markdown
|
# 机器学习与深度学习
|
|||
|
|
|||
|
## 机器学习
|
|||
|
|
|||
|
### 监督学习
|
|||
|
|
|||
|
**监督学习(Supervised Learning)**
|
|||
|
|
|||
|
- 定义:所有训练数据都具有明确的标签,模型通过这些标签进行学习。
|
|||
|
- 特点:模型训练相对直接,性能受限于标注数据的质量和数量。
|
|||
|
- 示例:传统的分类问题,如手写数字识别、垃圾邮件检测等。
|
|||
|
|
|||
|
**无监督学习(Unsupervised Learning)**
|
|||
|
|
|||
|
- 定义:训练数据完全没有标签,模型需要自己去发现数据中的模式或结构。
|
|||
|
- 特点:常用于聚类、降维、关联规则挖掘等任务,难以直接用于分类任务。
|
|||
|
- 示例:聚类算法(如K-means)和主成分分析(PCA)。
|
|||
|
|
|||
|
**半监督学习(Semi‑supervised Learning)**
|
|||
|
|
|||
|
- **定义**:介于监督学习和无监督学习之间,使用少量带标签的数据和大量未标签的数据共同训练模型,以在标注数据稀缺时提升分类性能。
|
|||
|
- **特点**:结合标签信息与数据分布结构,通过利用未标签数据的内在聚类或流形结构降低对标注数据的依赖,从而提高模型泛化能力并降低标注成本;通常依赖平滑假设和聚类假设等前提。
|
|||
|
- **示例**:在猫狗图像分类任务中,先使用少量已标记的猫狗图片训练初始模型,再用该模型为大量未标记图片生成“伪标签”,将这些伪标签数据与原有标记数据合并重新训练,从而获得比仅使用有标签数据更高的分类准确率。
|
|||
|
- 在半监督学习中,为了避免将错误的模型预测“伪标签”纳入训练,必须对每个未标注样本的预测结果进行可信度评估,**只保留高置信度、准确率更高的伪标签**作为新增训练数据。
|
|||
|
|
|||
|
## 深度学习
|
|||
|
|
|||
|
### 前向传播
|
|||
|
|
|||
|
#### **Mini Batch梯度下降**
|
|||
|
|
|||
|
**Batch Size(批大小)**
|
|||
|
|
|||
|
- 定义
|
|||
|
|
|||
|
Batch Size 指在深度学习模型训练过程中,每次迭代送入网络进行前向传播和反向传播的样本数量。
|
|||
|
|
|||
|
- 特点
|
|||
|
|
|||
|
Batch Size 决定了梯度更新的频率和稳定性;较大的 Batch Size 能更好地利用 GPU 并行计算、减少迭代次数、加快训练速度,但会显著增加显存占用且可能降低模型泛化能力;较小的 Batch Size 则带来更大的梯度噪声,有助于跳出局部最优、提高泛化性能,但训练过程更不稳定且耗时更长。
|
|||
|
|
|||
|
- 示例:在 PyTorch 中,使用 `DataLoader(dataset, batch_size=32, shuffle=True)` 表示每次迭代从数据集中抽取 32 个样本进行训练。一个batch的所有样本会被**打包成一个张量**,一次性并行送入网络进行计算
|
|||
|
|
|||
|
将完整训练集分割成若干大小相同的小批量(mini‑batch),每次迭代仅使用一个 mini‑batch 来计算梯度并更新模型参数,结合了批量梯度下降(Batch GD)和随机梯度下降(SGD)的优势。
|
|||
|
|
|||
|
- 当 `batch_size=1` 时退化为随机梯度下降;当 `batch_size=m`(训练集总样本数)时退化为批量梯度下降。
|
|||
|
- 通常选择 2 的幂(如32、64、128、256)以匹配 GPU/CPU 内存布局并提升运算效率。
|
|||
|
|
|||
|
**算法流程**
|
|||
|
|
|||
|
1. 将训练数据随机打乱并按 `batch_size` 划分成多个 mini‑batch。
|
|||
|
|
|||
|
2. 对每个 mini‑batch 执行:
|
|||
|
|
|||
|
- 前向传播计算输出。
|
|||
|
|
|||
|
- 计算 mini‑batch 上的平均损失。
|
|||
|
|
|||
|
- 反向传播计算梯度。
|
|||
|
|
|||
|
- 按公式更新参数:
|
|||
|
$$
|
|||
|
\theta \leftarrow \theta - \eta \frac{1}{|\text{batch}|}\sum_{i\in \text{batch}} \nabla_\theta \mathcal{L}(x_i,y_i)
|
|||
|
$$
|
|||
|
|
|||
|
3. 遍历所有 mini‑batch 即完成一个 epoch,可重复多轮直到收敛。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### Softmax 公式
|
|||
|
|
|||
|
假设有一个输入向量
|
|||
|
$$
|
|||
|
z = [z_1, z_2, \dots, z_K],
|
|||
|
$$
|
|||
|
则 softmax 函数的输出为:
|
|||
|
$$
|
|||
|
\sigma(z)_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}},
|
|||
|
$$
|
|||
|
其中 $i = 1, 2, \dots, K$。
|
|||
|
|
|||
|
- **分子**:对每个 $z_i$ 取自然指数 $e^{z_i}$,目的是将原始的实数扩展到正数范围。
|
|||
|
- **分母**:对所有 $e^{z_j}$ 求和,从而实现归一化,使得所有输出概率和为 1。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#### 交叉熵损失
|
|||
|
|
|||
|
假设有三个类别,真实标签为第二类,因此用 one-hot 编码表示为:
|
|||
|
$$
|
|||
|
y = [0,\; 1,\; 0].
|
|||
|
$$
|
|||
|
|
|||
|
假设模型经过 softmax 后输出的预测概率为:
|
|||
|
$$
|
|||
|
\hat{y} = [0.2,\; 0.7,\; 0.1].
|
|||
|
$$
|
|||
|
|
|||
|
交叉熵损失函数的定义为:
|
|||
|
$$
|
|||
|
L = -\sum_{i=1}^{3} y_i \log \hat{y}_i.
|
|||
|
$$
|
|||
|
|
|||
|
将 $y$ 和 $\hat{y}$ 的对应元素代入公式中:
|
|||
|
$$
|
|||
|
L = -(0 \cdot \log 0.2 + 1 \cdot \log 0.7 + 0 \cdot \log 0.1) = -\log 0.7.
|
|||
|
$$
|
|||
|
|
|||
|
计算 $-\log 0.7$(以自然对数为例):
|
|||
|
$$
|
|||
|
-\log 0.7 \approx -(-0.3567) \approx 0.3567.
|
|||
|
$$
|
|||
|
|
|||
|
因此,这个样本的交叉熵损失大约为 **0.3567**。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
### **残差连接**
|
|||
|
|
|||
|
假设一个神经网络层(或一组层)的输入为 $x$,传统的设计会期望该层直接学习一个映射 $F(x)$。而采用残差连接的设计,则将输出定义为:
|
|||
|
$$
|
|||
|
\text{Output} = F(x) + x.
|
|||
|
$$
|
|||
|
这里:
|
|||
|
|
|||
|
- $F(x)$ 表示经过几层变换(比如卷积、激活等)后所学到的“残差”部分,
|
|||
|
- $x$ 则是直接通过捷径传递过来的输入。
|
|||
|
|
|||
|
**为什么使用残差连接**
|
|||
|
|
|||
|
1. **缓解梯度消失问题**
|
|||
|
在深层网络中,梯度往往会在反向传播过程中逐层衰减,而残差连接为梯度提供了一条捷径,使得梯度可以直接从后面的层传递到前面的层,从而使得网络更容易训练。
|
|||
|
|
|||
|
2. **简化学习任务**
|
|||
|
网络不必学习从零开始构造一个完整的映射,而只需要学习输入与目标之间的残差。这样可以使得学习任务变得更简单,更易收敛。
|
|||
|
|
|||
|
3. **提高网络性能**
|
|||
|
在很多实际应用中(例如图像识别中的 ResNet),引入残差连接的网络能训练得更深,并在多个任务上取得更好的效果。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|