一、输入层
- 初始化权重
- 对于较深的网络,Xavier 初始化和 Kaiming 初始化是常用的方法。
- Xavier 假设输入和输出的方差相等,它特别适用于 sigmoid 和 tanh 激活函数,因为它能帮助保持信号在这些激活函数中传播时的方差不变,防止梯度消失或爆炸。
- Kaiming 特别设计用于 ReLU 及其变体的激活函数。这是因为 ReLU 会截断负值输出,因此权重需要更大一些才能在正区间内避免梯度消失。
二、隐藏层
-
激活函数
- ReLU 及其变体(如 Leaky ReLU):ReLU 避免了梯度在正区间的消失问题。同时,变体可以缓解 ReLU 的“死亡”问题。
- SELU:具有自归一化性质,有助于稳定网络训练,减少梯度消失和爆炸的可能性。SELU 的自归一化特性特别适合深度全连接网络,并且网络架构中需要严格遵守一些条件(如层数不能太深,输入需要标准化)。
-
批归一化(Batch Normalization)
- 作用于每个小批量数据,对输入进行归一化处理,使得数据分布更加稳定。
- 可以加速网络训练,减少内部协变量偏移,从而降低梯度消失和爆炸的风险。
- 批归一化也能起到一定的正则化作用,因为它引入了一定的噪声,有助于防止过拟合。
-
残差连接(Residual Connections)
- 在深度网络中,通过将输入直接与后面的层相加,使得梯度可以更直接地反向传播,缓解梯度消失问题。
- 例如在 ResNet 中广泛使用残差连接,使得网络可以非常深而不会出现严重的梯度问题。
- 残差连接不但有效缓解梯度消失,还能增强梯度的流动,允许信息跨多个层次传播,从而使得深层特征的学习变得更有效。
-
密集连接(Dense Connections)
- 类似于残差连接,在 DenseNet 中,每个层都与前面所有层直接连接,增强了信息传播和梯度反向传播的路径。
三、输出层
-
选择合适的损失函数
- 对于一些问题,可以选择合适的损失函数来缓解梯度问题。例如,在处理不平衡分类问题时,可以使用 Focal Loss 等损失函数,它可以动态调整样本的权重,使得模型更加关注难分类的样本,有助于稳定训练和减少梯度问题。
-
正则化
- L1 和 L2 正则化可以约束模型的权重,防止权重过大,从而降低梯度爆炸的风险。
- Dropout 在训练过程中随机丢弃一些神经元的输出,增加了模型的泛化能力,也可以在一定程度上缓解梯度问题。同时 Dropout 通过随机丢弃神经元的输出来改变梯度流动路径,从而为网络训练增加噪声和冗余性,有助于防止过拟合。