一次性设置:
激活函数、预处理、权重初始化、正则化、梯度检查
训练动态:
监控学习过程、参数更新、超参数优化
评估:
模型集成、测试时增强、迁移学习
激活函数
sigmoid激活函数
- 将数字压缩到范围 [0, 1]
- 在历史上很受欢迎,因为它们具有作为神经元饱和“放电率”的良好解释。
但有三个问题:无梯度、输出y不是以0为中心,可能会影响原始数据分布、梯度大tanh(x)
- 将数字压缩到范围 [-1, 1]
- 零居中(好)
- 仍会在饱和时破坏梯度relu
- 不饱和(在正区域)
- 计算效率非常高
- 在实践中比sigmoid/tanh收敛速度快得多(例如,6倍)
但是,输出不是零居中,一个烦恼:leaky relu
- 不会饱和
- 计算效率高
- 在实践中收敛速度比sigmoid/tanh快得多!(例如,6倍)
- 不会“死亡”。elu
- 具有ReLU的所有优势
- 输出更接近零均值
- 与Leaky ReLU相比具有负饱和区域
- 对噪声具有一定的鲁棒性selu
- ELU的缩放版本,对深度网络效果更好
- 具有“自标准化”特性;
- 可以在没有批标准化的情况下训练深度SELU网络Maxout “Neuron”
- 没有基本的点积形式 -> 非线性
- 推广了ReLU和Leaky ReLU
- 线性区域!不饱和!不死!
问题:每个神经元的参数数量翻倍
数据处理
在实践中,你可能还会看到对数据进行中心化、标准化、主成分分析(PCA)和白化(Whitening)的方法。
权重优化:怎样选择好的权重?
当使用 \( W = \text{constant} \) 初始化权重时会发生什么?
使用常量初始化 \( W \) 意味着所有的权重都将被初始化为相同的常量值。这会导致神经网络中的所有神经元在初始时具有相似的输出,因为它们所拥有的权重相同。
这种初始化可能导致以下问题:
1. **对称性问题:** 如果所有的权重都相同,每个神经元在反向传播时将收到相同的梯度信号。这可能导致网络在训练过程中很难破坏对称性,使得每个神经元学到的特征都是相似的。
2. **信息瓶颈:** 如果初始时所有神经元都输出相似的值,那么在网络的后续层中,这些相似的值将传播,可能导致信息的瓶颈。
3. **训练困难:** 对称性和信息瓶颈可能导致网络在训练时收敛缓慢,甚至无法训练。
因此,通常建议使用一些随机的初始化策略,如高斯分布或均匀分布,以打破对称性,促使网络学到更丰富的特征。
正则化:怎样去减少训练误差?
1、多个结果合在取平均值。
2、正则化
3、dropout:怎么去解释为什么有效?在测试时dropout会使我们的结果随机,那我们怎么去得到结果,用平均?显然不行因为平均会得到下面这个式子,带有概率积分。怎么解决?At test time, multiply by dropout probability
output at test time = expected output at training time
比较下面两个dropout的不同:
数据增强!
数据增强的例子:
- 平移
- 旋转
- 拉伸
- 剪切
- 镜头失真,...(尽情发挥)
正则化 - 在实践中
训练:添加随机噪声
测试:在噪声上进行边缘化
例子:
Dropout(随机失活)
Batch Normalization(批归一化)
数据增强
DropConnect
Fractional Max Pooling
Stochastic Depth
Cutout / Random Crop
Mixup
- 考虑在大的全连接层中使用dropout
- 批归一化和数据增强几乎总是一个好主意
- 尝试在小的分类数据集中特别使用cutout和mixup
选择超参数步骤:
步骤1:检查初始损失
关闭权重衰减,在初始化时检查损失,例如 softmax 分类的 log(C),其中 C 是类别数。步骤2:过拟合小样本
尝试在少量训练数据(约5-10个小批次)上训练至100%的训练准确度;调整架构、学习率和权重初始化。
损失没有下降?学习率可能太低,初始化不好。
损失爆炸到无穷大或 NaN?学习率可能太高,初始化不好。步骤3:找到使损失下降的学习率
使用前一步的架构,使用所有训练数据,打开小的权重衰减,找到在约100次迭代内显著降低损失的学习率。
可以尝试的良好学习率:1e-1、1e-2、1e-3、1e-4。步骤5:细化网格,延长训练时间
从步骤4中选择最佳模型,延长它们的训练时间(约10-20个时期),不进行学习率衰减。Step 6: Look at loss and accuracy curves
Step 7: GOTO step 5
Transfer learning
总结
We looked in detail at:
- Activation Functions (use ReLU)
- Data Preprocessing (images: subtract mean)
- Weight Initialization (use Xavier/Kaiming init)
- Batch Normalization (use this!)
- Transfer learning (use this if you can!)