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