Coursera - Hyperparameter tuning, Regularization and Optimization - Andrew Ng 学习随笔
Part 1 Practical Aspects of Deep Learning
1.1 Train / Dev (Hold-out Cross Validation) / Test Sets:
- 由于ML是个高度迭代的过程,需要数据集的配合;传统小样本机器学习(i.e.1w)常常采用7:3或6:2:2划分数据集构成训练-测试 或 训练-验证-测试, 而大数据情况下, 可能只需要1w样本测试或者验证, 98:1:1 (100w), 或者99.5:0.25:0.25
- Train/test Distribution mismatch: 如网站上高清图训练(网络爬虫), 用户手机自拍图. 建议确保dev和test数据集的分布是一致的
- 注意, test集合是Optional的, 因为只是一个Unbias estimation of algorithm. 只需训练完用开发集评估反馈迭代. 当数据集划分为两类, 通常就是Train/dev set, 注意有人会将dev认为是test, 自己清楚就行
1.2 Bias/Variance:
- Bias-variance trade off: High bias <—> underfitting; High variance <—> Overfitting
- 通过在train/dev上识别具体的情况: 假设Homan level误差(base error)为零, 好/坏: Overfitting; 坏/坏: Underfitting; 坏/更坏: high bias & Variance; 好/好: Good
- 根据bias/variance调试算法: train set, High bias -> Bigger network / longer training time / Proper architecture of Network / ; dev set, High variance -> More data / Regularization / Proper architecture of Network /
- Trade off: 传统的hand engineer机器学习算法, bias和variance不能单纯减少一个而不影响另一个, 而DNN时代, 只要够大的网络充足的数据配合合适的正则化方法, 单纯减少一项也不是不可能, 这也是NN如此受欢迎的原因
1.3 Regularization
- L1/L2 Norm - lambda 调参
- L2又叫参数衰减(weight decay), 因为在loss函数的梯度中多了待优化变量(如网络权重)的一项, 这样梯度下降就在每步迭代中减去权重
- 缓解过拟合问题: 1) 对于网络来说, 正则项降低了网路权重, 变相的降低了某些节点的影响力, 类似于减少了网路的节点数目, 而简单的网路不容易过拟合 2) 从激活函数来说, 比如tanh函数, 当权重小, 激活函数近似于线性, 而线性在复杂度意义上基本不可能过拟合
- 注意加了正则项后, 目标函数的下降图注意计算考虑进正则项.
- Dropout Regularization: 随机失活网络中的部分节点. 常用方法: Inverted Dropout technique, 注意第三步为了不减少layer1权重在dropout前后的期望值, keep probability 又叫留存率:
1) a = np.random.rand(layer1.shape) < keep probalility; 2) layer1 = np.multiply(layer1, a); 3) layer1 /= keep probability
- 注意在test阶段不用dropout
- Dropout好用的原因: Intuition: Can’t rely on any one feature, have to spread out weights, 有利于shrink weight, 这和范数正则项有相同作用, 其实Dropout应该被视为Adaptive form而不是regularization.
- 设置每层的留存率, 对于参数多且容易过拟合的层应该设小的留存率
- 注意dropout这类通常是在过拟合的情况下使用, 而对于CV, 对应其复杂的任务却经常性的缺少数据, 极易过拟合, 所以经常用
- 注意dropout让BP的具体过程不可预测, 因此可能从目标函数值随迭代过程变化的图不能发现什么, Andrew 建议先将各层留存率设为1, 看到正常下降后再加入dropout, 期待其能正常工作
- 其他防止过拟合的技术: Data Augumentation / Early Stopping
- Early stopping, 观察dev和train上目标函数训练的结果, 随着迭代过程, 可训练变量值会越来越复杂, train error持续减小而dev error先增再减, 取中间值最好.
- Early Stopping缺点: 优化过程和防止过拟合应该是两个任务, 从Orthogonalization角度(同时间只考虑一个任务), 而early stopping二合一的方式, 不够独立不够灵活; 当然范数正则化也不是完美的, 其多了一步调参的过程.
1.4 优化问题设置中的注意事项:
- 数据归一化: 去中心化和方差归一化
- Vanishing / Exploding Gradient: 由于链式法则
- Weight Initialization for deep network: 按照激活函数不同, 随机初始化的过程不同这里还不太理解!
初始化较完整介绍
-
- 好的初始值可以:
-
-
- Speed up the convergence of gradient descent
-
-
-
- Increase the odds of gradient descent converging to a lower training (and generalization) error
-
-
- 权重初始化的break symmetry问题: 各层权重的对称性要打破
- 0初始化:
- 随机初始化 0~1 * 10:
- He初始化 0~1 * sqrt(2/层维度):
- Numerical Approximation of Gradients and Gradient Checking
Part 2 Optimization Algorithm
- Mini-batch Gradient Descent: Vectorization allows you to efficiently compute on m examples!所有每次迭代过程是基于一个小批次数据构成的向量进行训练反向传播. Shuffle + Partition
- 不同于Batch GD(每次迭代, 遍历整个训练集)的平滑下降, Mini-Batch GD是含噪声的抖动下降(小批次没有完全的代表性, 其中含有一些错误等); 挑选Mini-batch size (=m batch GD 慢 适合小数据集 <2k ;; =1 Stochastic GD 需要小学习率减少噪声 失去向量化运算的效率), 2的幂次数 64~512, 超参. 注意一个批的数据是可以放的进GPU/CPU中, 内存要够!
- Exponentially Weighted Averages(对内存要求小): V_t = beta x V_t-1 + (1-beta) x theta_t
-
- V_t = beta x V_t-1 + (1-beta) x theta_t = 关于beta的幂指数加权
-
- (1-a)^(1/a) = 1/2.718… = 1/e, 将近1/3, 所有说约等于1/(1-beta)个值的均值.
- Bias Correlation in Exponentially Weighted Average: V0=0,前几个值加权太狠了,会导致普遍低于理想值. Bias Correlation: 使用Vt / (1-beta^t) 替代Vt输出 (加速了EWA的warm-up, 但是不常用)
- GD with Momentum: GD困境: 小学习率慢, 大学习率震荡:
-
- 其实就是GD + EWA, 加权的行为能平滑掉震荡(震荡方向在梯度正交的方向, 有正有负), 使得更准确的向最小值移动. 这里不用Bias Correlation, 因为大约10次之后就不会有偏差了
- 其实就是GD + EWA, 加权的行为能平滑掉震荡(震荡方向在梯度正交的方向, 有正有负), 使得更准确的向最小值移动. 这里不用Bias Correlation, 因为大约10次之后就不会有偏差了
- RMSprop (Root Mean Square prop):
- Adam (Adaptive Moment Estimation) Optimization Algorithm: Momentum + RMSprop:
- 超参数alpha, beta1=0.9(first moment), beta2=0.999(second moment), e=1e-8
- Learning rate decay:
-
- alpha = alpha0 / (1 + decay_rate * epoch_num)
-
- exponential decay: alpha = alpha0 * (rate ^ epoch_num)
-
- alpha = alpha0 * const_k / sqrt(epoch_num)
-
- alpha = alpha0 * const_k / sqrt(mini_batch_num)
-
- diecrete staircase
- diecrete staircase
-
- 手调
- Local optima, Saddle Point (高维下部分维度上变量极小,而部分则不是最小甚至是最大),
-
- 真正降低学习速度的是Plateaus, 导数成片接近0的区域, 也是Adam之类算法真正加速最大的地方,
- 真正降低学习速度的是Plateaus, 导数成片接近0的区域, 也是Adam之类算法真正加速最大的地方,
Part 3 Hyperparameter Tuning, Batch Normalization and Programming Framworks
3.1 Hyperparameter tuning
- Tuning process: Andrew建议的参数重要性排序: 学习率 / RMSprop-beta 隐层节点数 最小批尺寸 / 层数 学习率衰减率 / Adam参数;
- 调参方法: 不要使用grid, 而是在参数可选区间内随机;
- Coarse to fine: 不断减小调参范围
- 选择选参的合适尺度: 比如学习率选择更适合在log-scale上挑选; 指数加权平均的beta建议在log(1-beta)尺度下选参, 因为指数情况下, 1/(1-beta), 当beta接近1时候是非常敏感的! 而节点数层数等采用均匀随机(Uniform Scale)也是个不错的选择!
- 调参方式: Pandas vs. Caviar
3.2 Batch Normalization
- 实际中会在激活只后面接一个Batch Normalization
- 在
当前层的神经元上当前批上进行 1) 均值0方差1, 得到Z, 2) 计算Z‘ = gamma * Z + beta, 3) 在BP过程中使用GD去更新gamma和beta, Z’输出到下一层PS: 数据白化是指转换为均值0方差1的正态分布
- 注意接在BN前的卷积层之类的层, 其偏置b都会被去均值减去, 所以基本上可以不要, 其作用可被beta代替.
- “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift”
困惑! Andrew说的是对某层的所有神经元归一化, 而上面的论文是对一个批次的数据归一化再加gamma和beta. 解释 当BN和mini-batches方法结合的时候是采用了前者?? 是不是?可能是我理解错了一直是前者 -
- BN有效的原因: 减小了前面层对后面层的影响; 虽然BN是一种归一化隐藏层单元激活函数用于加速学习的方法, 而不是正则化方法, 但是它却附带了正则化的效果:
- BN有效的原因: 减小了前面层对后面层的影响; 虽然BN是一种归一化隐藏层单元激活函数用于加速学习的方法, 而不是正则化方法, 但是它却附带了正则化的效果:
-
-
PS: Dropout有个奇怪的特征, 当mini-batch size大了, 比如512, 减少了噪声的同时也减少了正则化的效果
-
-
- 测试阶段的BN: 因为均值方差之类在训练阶段都是在批上进行的, 那测试的时候需要估算均值和方差: 通常做法是在训练过程中记录指数加权的方法记录均值和方差, 测试阶段使用他们去归一化测试数据, 在用训练得到的gamma和beta计算得到BN层的输出值
3.3 Multi-class classifization
- Softmax Regression - Classification
- “Hardmax” 直接截断0或1
- Softmax的标配损失函数是交叉熵
3.4 编程框架的介绍
- 框架总览
- TensoFlow
-
- 注意TF已经重载了运算符, 只要变量被申明成tf.Variable(…)
- 注意TF已经重载了运算符, 只要变量被申明成tf.Variable(…)