本文基本上是 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization 的知识点大纲。
具体的公式和理论,可以看Bin Weber的博客。
训练/开发/测试集(Train/dev/test)
- 数据量10000之内:70/30(免去dev)或60/20/20
- 更多数据:保证dev/test足够(~10000)即可
过拟合
- 引入更多训练样本
- 正则化(Normalization1)
- 目的:减小||W|| ←此时熵最大,可能性最高
- L2正则化:在cost function上附加一个W,使W最小
- dropout:随机关闭一些节点
欠拟合
- 增加神经网络的隐含层数
- 隐含层中的节点数
- 训练更长时间
初始化输入数据和参数
- 输入数据标准化(Normalization1):使每个维度在(-1,1)之间
- 权重(W,b)初始化:应保证经多级网络后总值基本不变(类比1.0001^n和0.9999^n)
- 即Xavier初始化的变种,He初始化
提高梯度下降速度:mini-batch
由于内存/计算单元不够(always),每次计算部分数据
提高mini-batch的稳定性,减小摆动
- 将每个batch的优化结果进行指数加权平均(Momentum)
- RMSPROP
- Adam:综合以上两种方法
- 学习率衰减
超参数的选择
需要的超参数
- α,学习率/learning rate
- β1
0.9,β20.999,ε~1e-8(Adam中的参数) - 层数
- 每层单元
- 学习率衰减
- mini-batch 尺寸(2的整数次方,大概是512之内?)
选择方案
- 随机
- 对于α和β,以对数形式随机
r=-4*np.random.rand()
a=10**r
Batch-Norm
- 对每一层的线性计算结果Z进行标准化
- 每层标准化的参数γ和β通过学习得到
- 提高收敛速度(与对初始值X的操作类似)
采用批标准化之后,尽管每一层的z还是在不断变化,但是它们的均值和方差将基本保持不变,这就使得后面的数据更加稳定,减少前面层与后面层的耦合 (via Bin Weber)
Softmax
当分类器需要分出更多类时使用
检验方程的梯度计算是否存在问题:梯度检验
用计算斜率的方式近似梯度
深度学习是否会陷入局部最优问题?
- 由于参数很多,对所有参数都为峰值基本上不可能
- 相比而言,鞍点更加普遍