文章目录
- 第一周:深度学习的实用层面
- 训练、开发、测试集
- 偏差、方差
- 机器学习基本步骤
- L2正则化
- Dropout(随机失活)正则化
- 其它正则化方法
- 正则化输入
- 神经网络的权重初始化
- 梯度检验
- 第二周:优化算法
- Mini-Batch梯度下降法
- 指数加权平均
- 指数加权平均的偏差修正
- 动量梯度下降法
- RMSprop
- Adam优化算法
- 学习率衰减
- 第三周:超参数调试、Batch正则化、程序框架
- 调试处理
- 为超参数选择合适的范围
- Batch Norm/z的归一化处理
- Batch Norm作用的原理
- SoftMax回归
第一周:深度学习的实用层面
训练、开发、测试集
应用深度学习是一个典型的迭代过程,因为不可能一开始就确定最优的超参数,需要多次循环往复,才能设计优秀的神经网络,因此循环该过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集,验证集和测试集也有助于提高循环效率。如果不需要无偏估计,也可以不设置测试集。
数据规模较小时,开发和测试集占总数据的30%~40%;数据量较大时验证集和测试集占数据总量的比例会趋于变得更小。
建议确保验证集和测试集的数据来自同一分布。
偏差、方差
假设已有一个识别猫的分类器。已知人眼识别的错误率接近0%
训练集错误率:15% 测试集错误率:16% 拟合结果的偏差较大
训练集错误率:5% 测试集错误率:20% 拟合结果方差较大
训练集错误率:20% 测试集错误率:40% 拟合结果偏差和方差都较大
训练集错误率:0.1% 测试集错误率:1% 拟合结果的误差和方差合理
机器学习基本步骤
L2正则化
解决高方差通常采用增加数据量(如果可行)、正则化的方法。
假设采用tanh作为激活函数,当λ很大而w接近0的时候,z的范围非常接近0,而对于tanh,接近0的部分约等于线性函数,因此将神经网络的各个层向线性靠近,使得多层的神经网络计算结果更简单(参考前面课程中介绍的,为什么要使用非线性激活函数),减轻过拟合的情况。
Dropout(随机失活)正则化
对于神经网络的每个隐层,对每个节点设定其失活的概率,被设置为失活的节点其激活后的值设置为0,不参与神经网络的计算。在测试时不使用dropout方法。
假设有一L=3的神经网络,d3是一个布尔类型的矩阵,d3.shape=(第3层节点数, 样本数)
在Python的运算中,将d3中的True解析为1,False解析为0,其中每个元素为True或False的概率由输入 keep-prob决定。
a3 =np.multiply(a3,d3),让d3中 0 元素与a3中相对元素归零。
a3 /= keep-prob,以保证a3的期望值不变。
可以为不同层设置不同的keep-prob值,将易发生过拟合的层keep-prob值设置得更低;也可以将某些不会发生过拟合的层的keep-prob值设置为1,即不使用dropout阻塞节点。
使用dropout的一个缺点是,代价函数J无法明确定义,不便观察训练效果。
其它正则化方法
①数据扩增:将原输入的图片进行对称、裁剪、旋转处理,以较小的代价得到更大的数据集。
②提前终止训练:当神经网络在迭代到某时刻时,其表现已满足要求,提前终止。
early stopping 的主要缺点就是不能独立地处理这两个问题,因为提早停止梯度下降,也就是停止了优化代价函数J,因为终止后不再尝试降低代价函数J,所以代价函数J的值可能不够小,同时又希望不出现过拟合,没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题,这样做的结果是要考虑的东西变得更复杂。
注意:正则化有损于训练集的表现,因为它会限制网络过度拟合训练集的能力,但是它最终会提高测试集的表现。
正则化输入
神经网络的权重初始化
为了避免深层神经网络中,梯度爆炸和梯度消失的现象,需要对各层节点的权值进行合理初始化。
梯度检验
注意:
①不要在训练中使用梯度检验,它只用于调试。
②如果𝑑𝜃approx[𝑖]与𝑑𝜃[𝑖]的值相差很大,查找不同的𝑖值,找出是哪个导致𝑑𝜃approx[𝑖]与𝑑𝜃[𝑖]的值相差这么多。如果你发现,相对某些层或某层的𝜃或𝑑𝜃的值相差很大,但是dw[𝑙]的各项非常接近,(𝜃的各项与𝑏和𝑤的各项都是一一对应的)这时可能在计算参数𝑏的导数𝑑𝑏的过程中存在 bug。反过来也是一样。
③在实施梯度检验时,如果使用正则化,注意包括正则项。
④梯度检验不能与 dropout 同时使用。
第二周:优化算法
Mini-Batch梯度下降法
将大规模的输入集合切分成子集,并进行梯度下降的处理。如:X具有5,000,000样本数,minibatch_size=1000,则X可划分为X{1}…X{5000},对每个子集进行向量化的正向传播、反向传播、更新参数。
采用Mini-Batch梯度下降法时,cost值并非随着迭代次数单调下降,但整体趋势是下降的。
MiniBatch_Size的选择:
①当MiniBatch_Size=1时,每次迭代仅输入一个样本,本质上是随机梯度下降算法。
②当MiniBatch_Size=m时,本质上是Batch梯度下降法。
因此要在1~m的范围内选择合适的值,使得每次迭代都能快速进行,且迭代次数不至于过多。
batch梯度下降法从某处开始,相对噪声低些,幅度也大一些。
在随机梯度下降法中,每次迭代只对一个样本进行梯度下降,大部分时候向着全局最小值靠近。有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此。
指数加权平均
基本公式
当β较小时,1-β较大,θt的权重较高,能更快适应变化,但受噪声影响更大。
反之,θt的权重较低,适应变化更慢,但受噪声影响小,整体趋于稳定。
第100天的数据是θ[1-100]的权值和,此时β=0.9,θ[90]及其之前的数据的权值很小,因此V100约为最近10天的温度平均情况。
指数加权平均的偏差修正
按照上述公式,初始时期对温度的估计会明显偏小。
如果关心初始时期的偏差,可以在第t天时用Vt/(1-β^t)估计当天的温度。
随着t的增加,偏差修正的效果逐渐下降。因此只有在初期的时候偏差修正起作用。
动量梯度下降法
在梯度下降的过程中,希望纵轴的摆动尽量小,横轴的跨度尽量大。
注意!右侧Vdw并非上一层的Vdw,而是该层上次更新参数时的Vdw
RMSprop
Adam优化算法
本质上是动量法和RMSprop的结合。
学习率衰减
当训练结果接近最优值时,继续训练会使参数值在其附近摆动,此时可以尝试减小学习率使其逼近最优解。
第三周:超参数调试、Batch正则化、程序框架
调试处理
在神经网络中,超参数的重要程度存在差异。如:α是最重要的超参数,而Adam方法中的ε重要性很低。
在搜索超参数时,采用随机取样而不是网格取样,效果更好。(因为超参数的重要性存在差异)
在最优样本附近进行细粒度搜索,以确定更好的超参数值。
为超参数选择合适的范围
例如,对α在[0.0001, 1]进行取值时,用对数标尺(而非线性标尺)搜索超参数的方式会更合理。
在 Python 中,使 r=-4*np.random.rand(),α = 10r
当选择β时,可以考察1-β的值。当β接近1时,其对变化的灵敏度会显著提高,因此不能使用线性标尺。
Batch Norm/z的归一化处理
Batch Norm一次只能处理一个 mini-batch 数据
默认对每层的z进行归一化,而非a。
时刻记住:每层网络的每个单元的输出z,都是下层网络的输入,类比输入层的一个(或多个样本的同一位置的)特征。
将Batch Norm拟合进神经网络中,对每个batch第k层的z[k],根据γ[k]和β[k]计算得归一化后的值,再进行激活。
因为归一化的操作,所以z[k]=w[k]*a[k-1]+b[k]中的b[k]可以删去。
操作流程:
for k in batch_num:
前向传播计算z{k},并用BN计算z~{k}
反向传播计算dw{k},dγ{k},dβ{k}
更新参数w,γ,β # 可以使用梯度法,Adam方法,动量法等
Batch Norm作用的原理
当神经网络在之前层中更新参数,Batch Norm可以确保无论其怎样变化,得到z的均值和方差保持不变,所以即使z的值改变,至少他们的均值和方差是由β和γ决定的值。
Batch Norm减少了输入值改变的问题,使这些值变得更稳定,神经网络后层会有更坚实的基础。即使输入分布改变了一些,后层网络的值会改变得更少,即使后层适应的程度减小了。它减弱了前层参数的作用与后层参数的作用之间的联系,使得网络每层都可以自己学习,稍稍独立于其它层,这有助于加速整个网络的学习。
SoftMax回归
Loss(y, y_hat) = -ylog(y_hat)
Cost(Y, Y_hat) = ΣLoss(Y, Y_hat) / m
dz[l] = y_hat - y
有关tensorflow的用法的章节不在此记录。