http://www.ai-start.com/dl2017/
第一门课 Neural Networks and Deep Learning神经网络和深度学习
第一周 Introduction to Deep Learning 深度学习引言
- ReLU激活函数,全称Rectified Linear Unit修正线性单元 f(x)=max(0,x)f(x) = max(0,x)f(x)=max(0,x)
- 为什么深度学习会兴起?有时间回看一遍
- 传统的SVM等算法无法有效利用海量数据提升性能,而深度网络可以
第二周 Basics of Neural Network programming神经网络编程基础
- sigmoid函数f(z)=11+e−zf(z) = \frac{1}{1+e^{-z}}f(z)=1+e−z1
- 实现神经网络时,将权重www和偏置bbb分开比较好
- 损失函数(loss function):衡量算法在单个样本的表现如何;代价函数(cost function):衡量算法在全部训练样本上的表现,损失函数求和取均值。
- 计算图计算梯度核心:从右向左执行链式法则
- 2.9-2.18 可以再看一遍视频,有时间的话
第三周 Shallow neural networks 浅层神经网络
- [m]^{[m]}[m] 表示第mmm层网络中节点相关的数,这些节点的集合被称为第mmm层网络
- (i)^{(i)}(i) 表示单个训练样本iii,第iii个训练样本
- 传统惯例上输入层作为第0层,我们可将输入层的特征x1,x2,x3x_1,x_2,x_3x1,x2,x3等标记为a[0]a^{[0]}a[0],即输入层的激活值
- ak[m]a^{[m]}_{k}ak[m]表示第mmm层的第kkk个神经单元
- 向量化 3.3-3.5
激活函数
- tanh函数是zero-mean的,所以效果比sigmoid好
- 二分类问题中,由于输出层y的值是0或1,希望预测是\hat{y}也介于0和1之间,所以使用sigmoid函数
- sigmoid函数和tanh函数共同缺点,在z很大或很小时,导数梯度会变得很小,发生梯度弥散现象
- 经验法则:如果是二分类输出0和1,输出层选择sigmoid函数,其它所有单元都选择ReLU函数
- ReLU和leakly ReLU优点:计算速度快;不会产生梯度弥散
- Leakly Relu不会产生所谓的稀疏性
- 线性激活函数(恒等激励函数,把输入值输出),a=za = za=z,即g(z)=zg(z) = zg(z)=z
反向传播
3.10 看视频
随机初始化
- 如果将权重WWW全都初始化为0,梯度下降将不起作用。因为初始化为0后,隐含单元所做的工作都是一样的,它们完全对称
- 随机初始化WWW,可以使用
np.random.randn(2,2)
生成高斯分布,再乘上一个很小的数,使得WWW初始化为很小对的随机数。 - bbb不存在对称问题(symmetry breaking problem),可以初始化为0
- 为什么倾向于初始化很小的随机数呢?因为WWW如果过大,计算激活值时,z=Wx+bz=Wx+bz=Wx+b很容易过大或过小,梯度消失,学习很慢
第二门课 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization 改善深层神经网络:超参数调试、正则化、及优化
第一周 Practical aspects of Deep Learning 深度学习的实践层面
- 训练数据分为三部分,训练集+简单交叉验证集(dev set/val set)+测试集
- 验证集目的在于验证不同的算法,检验哪种算法更有效
- 测试集的目的在于正确评估分类器性能,对最终选定的神经网络系统做无偏估计
- 小数据量时代(一般一万以下),常见做法是所有数据三七分,三分测试集,七分训练集;或者60%训练集,20%验证集,20%测试集
- 大数据量时代(一百万以上),验证集和测试集各占1%;或者训练集可以占99.5%,验证和测试集各0.25%;或者验证集0.4%,测试集0.1%
- 尽量确保验证集和测试集来自统一分布
- 没有测试集也不要紧。只有验证集,通过验证集迭代选出适用的模型,不是无偏估计。这里验证集可以改称为“训练验证集”。
偏差 方差
- 高偏差(high bias),欠拟合(underfitting)
- 高方差(high variance),过拟合(overfitting)
- 适度拟合(just right)
- 可以通过几个指标研究bias和variance,训练集误差(train set error),测试集误差(dev set error)和最优误差(贝叶斯误差)。偏差和方差要基于最优误差来考虑
- 偏差和方差都高的情况在高维数据比较常见,就是会过度拟合部分数据,而欠拟合另一部分数据。
- 一般先分析偏差,再降方差。
- 偏差高,需要评估训练集或训练数据的性能。尝试新的网络架构,选择新的优化算法等等;高偏差问题增加训练书句作用不大。
- 方差高,正则化。
正则化
- 逻辑回归。
- L2正则。www欧几里得范数的平方。欧几里得法线,向量参数www的L2范数
- 参数www通常为一个高维参数矢量,已可表达高偏差问题;bbb可以不加
- L1正则,使用的是www的L1范数,www最终是稀疏的
- 人们更多倾向于使用L2正则。
- 神经网络
- ∣∣W[l]∣∣F2||W^{[l]}||_F^2∣∣W[l]∣∣F2 矩阵的WWW的范数平方,被称为"弗罗贝尼乌斯范数",用下标F标注,表示矩阵中所有元素平方和
- L2正则,权重衰减
- 正则化预防过拟合原因:避免WWW矩阵过大。如果λ\lambdaλ足够大,WWW中很多元素会接近0,很多隐藏单元的影响被消除,神经网络简化,网络会从过度拟合状态更接近高偏差状态。这个状态转化过程中中间有一个just right的状态,就是我们要的
- 另一种想法,如果zzz跟小,激活函数的那一段是线性状态,网络会十分简单
dropout正则化
- dropout遍历网络的每一层,并设置消除神经网络中节点的概率
- 设置完节点概率,我们会消除节点和节点相关的连线。最后得到一个节点更少,规模更小的网络,然后用backprop方法训练。
- 常用的dropout方法为inverted dropout,反向随机失活
- keep-prob参数,保留节点概率
- 消除节点后,需要向外扩展,除以keep-prob参数 == 》为了不影响下一层的均值(期望),简化计算
- 测试阶段不使用dropout函数
- dropout使得神经元尽量不依赖与任一特征,更加平均地分布权重,因此权重的平方范数会被收缩。与L2正则类似
- 每层的keep-prob可以不同。当某层过拟合现象严重时,可以降低keep-prob。或者可以某层使用dropout,某层不用,应用dropout层的keep-prob值相同。第一种方法缺点是超参数较多,第二种方法缺点是没有第一种灵活
- dropout在视觉领域应用较多
- 除非算法过拟合,一般不用dropout。
- dropout的另一个缺点,代价函数JJJ不再明确定义,很难复查和调试。一般要先关闭dropout,保证JJJ单调递减;再打开dropout,调试。
其它正则化方法
-
数据扩增:水平翻转、裁剪
-
早停法(early stopping):
- 绘制验证集误差,在验证集误差的最小值停止训练,得到中等www大小的FANSHU1
- 缺点是:同时处理了代价函数JJJ的优化问题和过拟合问题,没有“正交化”(一个时间做一个任务)。使得要处理的问题变复杂。
- 优点:一次梯度下降即可找到www的较小值,中间值和较大值。无需尝试L2正则化超参数KaTeX parse error: Undefined control sequence: \lamda at position 1: \̲l̲a̲m̲d̲a̲的很多值
- 归一化输入:
- 计算均值μ\muμ和方差σ2\sigma^2σ2,实现零均值和归一化方差。
- 测试集使用训练集已经计算好的均值μ\muμ和方差σ2\sigma^2σ2
- 使用原因是:在输入特征处于不同范围内时,归一化使得代价函数更容易优化;若处于相似范围内,则效果不大。
-
在深度神经网络中,激活函数将以指数级递增或递减,引发梯度消失和梯度爆炸问题
1.11-1.14间看视频
神经网络的权重初始化
- 如果神经网络中的神经元数量nnn越大,希望wiw_iwi越小。因为我们希望最终的zzz小
- 减小wiw_iwi的方法可以乘以1nl−1\sqrt {\frac{1}{n^{l-1}}}nl−11
- 如果用Relu,可以将方差设置为2n\frac{2}{n}n2
- 如果用tanh,可以将方差设置为1nl−1\frac{1}{n^{l-1}}nl−11
第二周 Optimization algorithms 优化算法
mini-batch梯度下降
- batch设为训练集大小mmm,就是批梯度下降算法(batch gradient descent)
- batch设为1,就是随机梯度下降(stochastic gradient descent),不会收敛,会在最小值附近波动。
- 实践中最好选择不大不小的mini-batch尺寸,一般为2n2^n2n,且要符合cpu/gpu内存,64-512,
- 好处有二:
- 大量向量化,提升速度。batch=1会失去向量化的优势,效率底下。
- 无需等待整个训练集被处理完。
指数加权平均 Exponentially weighted averages
vt=βvt−1+(1−β)θt v_t = \beta v_{t-1} + (1-\beta) \theta_t vt=βvt−1+(1−β)θt
- 计算时可将vt−1v_{t-1}vt−1视为11−β\frac{1}{1-\beta}1−β1天的平均温度
- β\betaβ值较高时,曲线较平坦,波动更小;缺点是曲线适应缓慢,会延迟,在图像上表现是曲线右移
- β\betaβ值较低时,曲线有更多噪声,但能更快适应温度变化
假设β=0.9\beta=0.9β=0.9,将v100v_{100}v100展开
v100=0.1θ100+0.1×(0.9)×θ99+0.1×(0.9)2×θ98+0.1×(0.9)3×θ97v_100 = 0.1\theta_{100} +0.1 \times (0.9) \times \theta_{99} + 0.1 \times (0.9)^2 \times \theta_{98} + 0.1 \times (0.9)^3 \times \theta_{97}v100=0.1θ100+0.1×(0.9)×θ99+0.1×(0.9)2×θ98+0.1×(0.9)3×θ97
-
这些系数想加起来逼近1,称之为偏差修正
-
计算平均多少天的温度,可以通过计算(1−ϵ)1ϵ(1-\epsilon)^{\frac{1}{\epsilon}}(1−ϵ)ϵ1是否等于1e\frac{1}{e}e1得到
-
指数加权平均的优势在于占用极少内存
-
如果初始化v0=0v_0=0v0=0,加权平均地前几天的估测都会较低。可以使用vt1−βt\frac{v_t}{1-\beta^t}1−βtvt进行偏差修正。随着t的增加,βt\beta^tβt接近0,所以在初期偏差修正才起作用。
Momentum 动量梯度下降法
- 计算梯度的指数加权平均,并利用该梯度更新你的权重
- 在每次迭代ttt中
- 正常计算dWdWdW和dbdbdb
- vdW=βvdW+(1−β)dWv_{dW} = \beta v_{dW} + (1-\beta) dWvdW=βvdW+(1−β)dW
- vdb=βvdb+(1−β)dbv_{db} = \beta v_{db} + (1-\beta) dbvdb=βvdb+(1−β)db
- W=W−αvdWW = W- \alpha v_{dW}W=W−αvdW
- b=b−αvdbb = b- \alpha v_{db}b=b−αvdb
β\betaβ常用0.9
RMSprop 均方根prop算法
-
root mean square prop算法
-
在每次迭代ttt中
- 正常计算dWdWdW和dbdbdb
- SdW=βSdW+(1−β)(dW)2S_{dW} = \beta S_{dW} + (1-\beta) (dW)^2SdW=βSdW+(1−β)(dW)2
- Sdb=βSdb+(1−β)(db)2S_{db} = \beta S_{db} + (1-\beta) (db)^2Sdb=βSdb+(1−β)(db)2
- W=W−αdWSdWW = W- \alpha \frac{dW}{\sqrt{S_{dW}}}W=W−αSdWdW
- b=b−αdbSdbb = b- \alpha \frac{db}{\sqrt{S_{db}}}b=b−αSdbdb
-
它可以帮助我们消除不同方向的摆动,可以使用更大的学习率,而无需担心在维度方向上的偏离
-
实际操作中,为了避免除以0,会在分母上加一个很小的ϵ=10−8\epsilon = 10^{-8}ϵ=10−8,保证数值稳定
Adam
-
Adaptive Moment Estimation 适应性动量估计法,基本上是结合了Momentum和RMSprop算法
-
初始化vdW=0,SdW=0v_{dW}=0,S_{dW}=0vdW=0,SdW=0,b同理
-
在每次迭代ttt中
正常计算dWdWdW -
vdW=β1vdW+(1−β1)dWv_{dW} = \beta_1 v_{dW} + (1-\beta_1) dWvdW=β1vdW+(1−β1)dW
-
SdW=β2SdW+(1−β2)(dW)2S_{dW} = \beta_2 S_{dW} + (1-\beta_2)(dW)^2SdW=β2SdW+(1−β2)(dW)2
-
vdWcor=vdW1−β1tv_{dW}^{cor} = \frac{v_{dW}}{1-\beta_1^{t}}vdWcor=1−β1tvdW
-
SdWcor=SdW1−β2tS_{dW}^{cor} = \frac{S_{dW}}{1-\beta_2^{t}}SdWcor=1−β2tSdW
-
W=W−αvdWcorSdWcor+ϵW = W - \alpha \frac{v_{dW}^{cor}}{\sqrt{S_{dW}^{cor}} + \epsilon}W=W−αSdWcor+ϵvdWcor
β1=0.9,β2=0.999,ϵ=10−8\beta_1 = 0.9, \beta_2 = 0.999, \epsilon = 10^{-8}β1=0.9,β2=0.999,ϵ=10−8
学习率衰减
-
随时间减少学习率,加快学习算法收敛
-
衰减方法
- α=11+衰减率∗epochα0\alpha = \frac{1}{1+衰减率*epoch}\alpha_0α=1+衰减率∗epoch1α0
- 指数衰减 α=0.95epochα0\alpha = 0.95^{epoch} \alpha_0α=0.95epochα0
- 离散下降(discrete stair cease),一段时间学习率降一半
- α=kepochα0\alpha = \frac{k}{\sqrt{epoch}} \alpha_0α=epochkα0
-
鞍点,梯度为0的点。高维学习常常碰到鞍点,而非局部最优点。
第三周 Hyperparameter tuning
-
超参数取值两个策略:
- 随机取点
- 粗糙到精细
-
随机取值并非在有效范围内随机均匀取值,而是选择合适的标尺来探究这些超参数
-
使用对数标尺搜索超参数
-
指数加权平均值β\betaβ可通过给1−β1-\beta1−β取值得到
两种超参数调试方法:
- Babysitting one model,照看一个模型,观察表现,并耐心调试学习率。适用于:有庞大数据,但是计算资源不足 (pandas 熊猫方式)
- Training many models in parallel:同时实验多种模型,设置超参数让它自己运行。适用于:计算资源足够(鱼子酱方式 caviar)
Batch Normalization
对每个隐藏层,真正归一化的是zzz而非激活aaa
μ=1m∑iz(i)\mu = \frac{1}{m} \sum_i z^{(i)}μ=m1i∑z(i)
σ2=1m∑i(z(i)−μ)2\sigma^2 = \frac{1}{m} \sum_i (z^{(i)-\mu)^2}σ2=m1i∑(z(i)−μ)2
znorm(i)=z(i)−μσ2+ϵz_{norm}^{(i)} = \frac{z_{(i)-\mu}}{\sqrt{\sigma}^2+\epsilon}znorm(i)=σ2+ϵz(i)−μ
z^norm(i)=γznorm(i)+β\hat{z}_{norm}^{(i)} = \gamma z_{norm}^{(i)} + \betaz^norm(i)=γznorm(i)+β
若γ=σ2+ϵ,β=μ\gamma = \sqrt{\sigma}^2+\epsilon, \beta=\muγ=σ2+ϵ,β=μ,相当于最后归一化得到的zzz与原zzz恒等。通过调节γ\gammaγ和β\betaβ,可以调节隐藏单元值得分布。
将BN拟合进神经网络,神经网络反向更新参数时会更新每层的γ\gammaγ和β\betaβ
由于要进算均值,所以bbb没有用了,必须去掉它,由β[l]\beta^{[l]}β[l]代替
BN有用的原因
- 和先前归一化一样,可以使不同维度的特征有类似的范围
- 使深层的权重更能经受住变化。如果前层数据的分布改变(covariate shift,协变量转移),后层的数据也要改变以适应变化的分布。由于BN限制了前层分布的均值和方差,使得后层更容易适应前层的变化。
- 它减弱了前层参数的作用与后层参数作用之间的联系,使得每层网络都可以自己学习,稍稍独立与其它层,加速整个网络的学习
- 增加噪声,轻微正则化。
【较大的mini-batch,会减小正则化效果】
测试时的BN得到μ\muμ和σ2\sigma^2σ2的方法是指数加权平均。利用每次mini-batch得到的μ\muμ和σ2\sigma^2σ2来做加权平均。
softmax,线性决策边界???