目录

摘要

Abstract

1 深度学习

1.1 激活函数

1.2 优化器

2 过拟合的应对方法

2.1 正则化(Regularization)

2.2 Dropout

2.3 Early Stopping

3 批标准化(Batch Normalization)

4 卷积神经网络(CNN)

4.1 CNN的作用

4.2 卷积层

4.3 池化层

4.4 Keras 搭建 CNN 

5 总结

摘要

本周学习了深度学习、过拟合改进方法与卷积神经网络。具体了解了激活函数和优化器方面的演变与改进;了解了过拟合应对策略与正则化的必要性。

Abstract

This week, I studied deep learning, methods for improving overfitting, and convolutional neural networks. Specifically, I learned about the evolution and improvements in activation functions and optimizers, as well as strategies for addressing overfitting and the necessity of regularization.

1 深度学习

1.1 激活函数

上周我们用 Sigmoid 作为激活函数,但它有致命弱点——梯度消失。当输入绝对值较大时,Sigmoid 的输出接近 0 或 1,导数 \sigma'(z) \approx 0,深层网络几乎无法更新。

ReLU(Rectified Linear Unit)计算简单,不饱和,缓解梯度消失,但负半轴梯度为 0,神经元一旦落入负区就会“死掉”

\text{ReLU}(z) = \max(0, z)

正半轴恒为 1,负半轴为 0

Leaky ReLU

\text{LeakyReLU}(z) = \max(0.01z, z)

给负半轴一个很小的斜率(如 0.01),让神经元即使输出负值也能有微弱梯度,避免“死亡”。

ELU(Exponential Linear Unit)

\text{ELU}(z) = \begin{cases} z & z > 0 \\ \alpha(e^z - 1) & z \le 0 \end{cases}

负半轴平滑且保留非线性,但计算稍复杂。

我的理解:激活函数就像神经元的“开关模式”。Sigmoid 是软开关但容易卡死;ReLU 简单粗暴,能开就开,不能开就关,反而让信号传得更远。后来出现的变体都是给“关”的状态留一点门缝,让网络保留恢复的机会。

1.2 优化器

之前只用了朴素的 SGD 或 Adagrad,课程第八讲介绍了动量法和 Adam。

动量(Momentum)
模拟物理惯性,让更新方向不只依赖当前梯度,还包含历史速度:

\mathbf{v}_{t} = \beta \mathbf{v}_{t-1} + \eta \nabla L(\theta_t)

\theta_{t+1} = \theta_t - \mathbf{v}_t

\beta 通常取 0.9。当连续下降方向一致时,速度累加,加速收敛;遇到局部震荡,动量能平滑路径,不易被困在鞍点。

RMSProp
改进 Adagrad 的分母,用指数移动平均代替全部历史梯度平方和:

G_t = \beta G_{t-1} + (1-\beta) g_t^2

\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} g_t

分母不会单调递增,避免后期学习率趋于 0。

Adam
结合动量与 RMSProp,是当前最常用优化器:

m_t = \beta_1 m_{t-1} + (1-\beta_1) g_t

v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2

经偏差修正后:

\hat{m}_t = \frac{m_t}{1-\beta_1^t},\quad \hat{v}_t = \frac{v_t}{1-\beta_2^t}

\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t

默认参数\beta_1=0.9, \beta_2=0.999, \epsilon=10^{-8}

我的理解:SGD 像一个人在黑暗中摸索下山,Adagrad 给每个人穿了不同底的鞋以适应地形,动量像是加了助跑,Adam 则是既有助跑又自动调节步幅。现在训练几乎都用 Adam,省心省力。

2 过拟合的应对方法

课程第八讲专门讨论如何对抗过拟合。

2.1 正则化(Regularization)

在损失函数中加入参数的大小惩罚:

 L2 正则化:\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{loss}} + \lambda \sum \|\mathbf{w}\|_2^2
  权重衰减,使参数值变得稀疏且均匀,降低模型复杂度。
L1 正则化:\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{loss}} + \lambda \sum |\mathbf{w}|
  产生稀疏解,可用于特征选择。

2.2 Dropout

训练时随机丢弃一部分神经元,每次迭代相当于在训练一个子网络。测试时恢复全部神经元,但输出要乘以保留概率 p,或训练时除以 p,测试时不变。通过强迫神经元不依赖特定同伴,学习更鲁棒的特征,等效于集成大量子网络的预测平均防止过拟合。

课程中演示了 Dropout 在 Keras 中的应用:

from tensorflow.keras.layers import Dropout
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))  # 50% 神经元被丢弃

2.3 Early Stopping

监控验证集损失,当它不再下降甚至回升时停止训练。本质是限制优化路径的长度,等效于较小的有效模型复杂度。这三种方法像是三种不同的约束方式实践中通常会组合使用。

3 批标准化(Batch Normalization)

课程第九讲前后介绍了 BN,它是深度网络的标配。训练过程中,各层输入分布会随前一层参数更新而变化(内部协变量偏移),导致深层网络不得不不断适应新分布,学习率不能大,参数初始化敏感。对每个 mini-batch 的每一个维度进行标准化:

\mu_B = \frac{1}{m}\sum_{i=1}^{m} x_i,\quad \sigma_B^2 = \frac{1}{m}\sum_{i=1}^{m} (x_i - \mu_B)^2

\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}

再引入可学习的缩放 \gamma 和平移 \beta,恢复网络的表达能力:

y_i = \gamma \hat{x}_i + \beta

训练时用 mini-batch 统计量,测试时用总体均值/方差的无偏估计(通常移动平均)。所以这种方法允许更大学习率,加速收敛;降低对初始化的敏感度,有一定正则化效果(mini-batch 统计量带有噪声)

Keras 中使用 BN:

from tensorflow.keras.layers import BatchNormalization
model.add(Dense(256))
model.add(BatchNormalization())
model.add(Activation('relu'))

4 卷积神经网络(CNN)

4.1 CNN的作用

专门处理图像等具有空间结构的数据,全连接网络处理图像时,会把每张 100\times100 的图像展平成 10000 维向量,不仅参数量爆炸,而且完全忽略了像素之间的空间局部关联。

CNN 的三个核心思想:

1. 局部感受野:每个神经元只连接输入的一个小区域(如 3\times3
2. 权重共享:整张图用同一组卷积核滑动,大幅减少参数
3. 池化:降采样,减少计算量并提供平移不变性

4.2 卷积层

一个卷积核(filter)在输入上滑动,计算内积,产生特征图(feature map)。若有 K 个卷积核,则输出 K 个通道。

公式:输出位置 (i,j) 的值

s_{ij} = \sum_{p=0}^{k-1}\sum_{q=0}^{k-1} w_{pq} \, x_{i+p, j+q} + b

其中 k 是卷积核大小,\mathbf{w} 是权重,\mathbf{x} 是输入区域。

4.3 池化层

通常使用最大池化(Max Pooling):在一个 2\times2 窗口内取最大值,步长为 2,特征图尺寸减半。它保留最强信号,减少参数,引入轻微平移不变性。

4.4 Keras 搭建 CNN 

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

model = Sequential()
# 卷积层1
model.add(Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)))
model.add(MaxPooling2D((2,2)))
# 卷积层2
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D((2,2)))
# 全连接分类层
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

CNN 的本质是把“图像是由局部边缘、纹理等组成”这个先验知识硬编码到网络结构里。卷积相当于用一个可学习的探测器扫描整张图,哪里出现特定模式,特征图就在哪里亮。池化则是表示如果某个模式在某个区域出现了,只需关心它最强的信号,位置细小的改变不会影响结果。

5 总结

本周学习使我对神经网络训练全流程建立了系统性认知。通过学习我发现各技术并非孤立技巧,而是针对特定问题提出的结构化解决方案。理解其设计动机与适用范围,是后续进行模型选型与调优的基础。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐