1 符号定义
数据标记与上下标
- x x x:表示输入数据,维度为 n x n_x nx;
- y y y:表示输出结果,维度(或者说类别数)为 n y n_y ny;
- 下边 i _i i :代表样本第 i i i个维度。
- 上标 ( i ) ^{(i)} (i) (小括号):代表第 i i i个训练样本, x ( i ) x^{(i)} x(i)和 x i x_i xi 存在混用的情况,注意识别;
- ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)):表示第 i i i组数据,可能是训练数据,也可能是测试数据;
- m m m:数据集的样本数。有时候为了强调,会使用 M t r a i n M_{train} Mtrain表示训练集的样本数,用 M t e s t M_{test} Mtest表示测试集的样本数;
- 上标 [ l ] ^{[l]} [l] (方括号):代表第 l l l 层
- n h [ l ] n^{[l]}_h nh[l]:代表第 l l l 层的隐藏单元数
模型参数
对神经网络进行编程时经常会让参数 w w w 和参数 b b b分开,这里 w w w 表示 特征权重, b b b对应 偏置。在其它的符号惯例中,有用 θ \theta θ来统一表示模型参数的。
神经网络模型
为了能把训练集表示得更紧凑一点,我们会定义一个矩阵用大写
X
X
X 的表示,batch_first=True
时,它由输入向量
x
(
1
)
、
x
(
2
)
x^{(1)}、x^{(2)}
x(1)、x(2)等按行堆叠而成叠。所以这个矩阵有
m
m
m 行,是训练集的样本数量,然后这个矩阵的维度记为
n
x
n_x
nx,即 X.shape 为
(
m
,
n
x
)
(m,n_x)
(m,nx)。在实现神经网络推导的时候,使用按单个样本
x
(
i
)
∈
R
n
x
×
1
x^{(i)}\in\mathbb{R}^{n_x \times 1}
x(i)∈Rnx×1进行推导,会让整个实现的过程变得更加简单。
对于输出标签
y
y
y,我们同样按行堆叠,即
Y
Y
Y =
[
y
(
1
)
,
y
(
2
)
,
.
.
.
,
y
(
m
)
]
T
[y^{(1)},y^{(2)},...,y^{(m)}]^T
[y(1),y(2),...,y(m)]T,以便后续计算,
Y
.
s
h
a
p
e
Y.shape
Y.shape等于
(
m
,
1
)
(m,1)
(m,1)。
X
=
[
x
(
1
)
T
x
(
2
)
T
.
.
.
x
(
m
)
T
]
=
[
x
1
(
1
)
x
2
(
1
)
.
.
.
x
n
x
(
1
)
x
1
(
2
)
x
2
(
2
)
.
.
.
x
n
x
(
2
)
.
.
.
.
.
.
.
.
.
.
.
.
x
1
(
m
)
x
2
(
m
)
.
.
.
x
n
x
(
m
)
]
Y
=
[
y
1
(
1
)
y
2
(
1
)
.
.
.
y
n
y
(
1
)
y
1
(
2
)
y
2
(
2
)
.
.
.
y
n
y
(
2
)
.
.
.
.
.
.
.
.
.
.
.
.
y
1
(
m
)
y
2
(
m
)
.
.
.
y
n
y
(
m
)
]
X=\left [ \begin{matrix}{x^{(1)}}^T\\{x^{(2)}}^T\\...\\{x^{(m)}}^T \end{matrix} \right ] =\left [ \begin{matrix} x_1^{(1)} & x_2^{(1)}& ... & x_{n_x}^{(1)}\\ x_1^{(2)} & x_2^{(2)}& ... & x_{n_x}^{(2)}\\ ... & ... & ...&...\\ x_{1}^{(m)} & x_{2}^{(m) }&... & x_{n_x}^{(m)} \end{matrix} \right ] {Y}=\left [ \begin{matrix} y_1^{(1)} & y_2^{(1)}& ... & y_{n_y}^{(1)}\\ y_1^{(2)} & y_2^{(2)}& ... & y_{n_y}^{(2)}\\ ... & ... & ...&...\\ y_{1}^{(m)} & y_{2}^{(m) }&... & y_{n_y}^{(m)} \end{matrix} \right ]
X=
x(1)Tx(2)T...x(m)T
=
x1(1)x1(2)...x1(m)x2(1)x2(2)...x2(m)............xnx(1)xnx(2)...xnx(m)
Y=
y1(1)y1(2)...y1(m)y2(1)y2(2)...y2(m)............yny(1)yny(2)...yny(m)
-
X ∈ R m × n x X \in \R ^{m \times n_x } X∈Rm×nx:代表输入矩阵
-
x ( i ) ∈ R n x × 1 x^{(i)}\in\mathbb{R}^{n_x \times 1} x(i)∈Rnx×1:代表第 i i i 个样本的列向量
-
Y ∈ R m × n y Y\in\mathbb{R}^{m \times n_y } Y∈Rm×ny:代表标注矩阵
-
y ( i ) ∈ R n y y^{(i)}\in\mathbb{R}^{n_y} y(i)∈Rny:代表第 i i i 个样本的标签
-
W [ l ] ∈ R n h [ l − 1 ] × n h [ l ] W^{[l]}\in\mathbb{R}^{n^{[l-1]}_h×n^{[l]}_h} W[l]∈Rnh[l−1]×nh[l]:代表第 l l l 层的权重矩阵
-
b [ l ] ∈ R n h [ l ] × 1 b^{[l]}\in\mathbb{R}^{n^{[l]}_h\times1} b[l]∈Rnh[l]×1:代表第 l l l 层的权重矩阵
-
a [ l ] ∈ R n h [ l ] × 1 a^{[l]} \in \R ^{n_h^{[l]}\times1} a[l]∈Rnh[l]×1:代表第 l l l层输出矩阵
-
y ^ \hat {y} y^ :表示模型预测输出向量
神经网络示意图
- 节点:代表输入、激活或者输出
- 边:代表权重或者误差
简单前馈网络
单个神经元单个样本(用于公式推导)
a
[
1
]
=
x
,
x
∈
R
n
x
×
1
a
[
l
]
=
σ
(
z
[
l
]
)
=
σ
(
W
[
l
]
T
a
[
l
−
1
]
+
b
[
l
]
)
,
l
>
1
,
a
[
l
]
∈
R
n
h
[
l
]
×
1
,
b
[
l
]
∈
R
n
h
[
l
]
×
1
a^{[1]}=x,x\in\mathbb{R}^{n_x \times 1}\\ a^{[l]}=\sigma(z^{[l]})=\sigma({W^{[l]}}^Ta^{[l-1]}+b^{[l]}),l>1,a^{[l]} \in \R ^{n_h^{[l]}\times1},b^{[l]}\in\mathbb{R}^{n^{[l]}_h\times1}
a[1]=x,x∈Rnx×1a[l]=σ(z[l])=σ(W[l]Ta[l−1]+b[l]),l>1,a[l]∈Rnh[l]×1,b[l]∈Rnh[l]×1
单个神经元多样本(用于代码程序计算)
a
[
1
]
=
X
,
X
∈
R
m
×
n
x
,
a
[
1
]
∈
R
m
×
n
x
a
[
l
]
=
σ
(
z
[
l
]
)
=
σ
(
a
[
l
−
1
]
W
[
l
]
+
b
[
l
]
)
,
l
>
1
,
a
[
l
]
∈
R
m
×
n
h
[
l
]
,
b
[
l
]
∈
R
m
×
n
h
[
l
]
a^{[1]}=X,X \in \R ^{m \times n_x },a^{[1]} \in \R ^{m \times n_x }\\ a^{[l]}=\sigma(z^{[l]})=\sigma({a^{[l-1]}W^{[l]}}+b^{[l]}),l>1,a^{[l]} \in \R ^{m\times n_h^{[l]}},b^{[l]}\in\mathbb{R}^{m\times n^{[l]}_h}
a[1]=X,X∈Rm×nx,a[1]∈Rm×nxa[l]=σ(z[l])=σ(a[l−1]W[l]+b[l]),l>1,a[l]∈Rm×nh[l],b[l]∈Rm×nh[l]
2 常见的优化算法介绍
2.1 批量梯度下降算法(batch gradient descent,BGD)
使用整个训练集的优化算法被称为批量(batch)或确定性(deterministic)梯度算法,因为它们会在一个大批量中同时处理所有样本。 批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。
优点:
- (1)在训练过程中,使用固定的学习率,不必担心学习率衰退现象的出现。
- (2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,一定能收敛到全局最小值,如果目标函数非凸则收敛到局部最小值。
- (3)它对梯度的估计是无偏的。样例越多,标准差越低。
- (4)一次迭代是对所有样本进行计算,此时利用向量化进行操作,实现了并行。
缺点:
- (1)尽管在计算过程中,使用了向量化计算,但是遍历全部样本仍需要大量时间,尤其是当数据集很大时(几百万甚至上亿),就有点力不从心了。
- (2)每次的更新都是在遍历全部样例之后发生的,这时才会发现一些例子可能是多余的且对参数更新没有太大的作用。
从迭代的次数上来看,BGD迭代的次数相对较少。
2.2 随机梯度下降算法(Stochastic gradient descent ,SGD)
随机梯度下降法不同于批量梯度下降,随机梯度下降是在每次迭代时使用一个样本来对参数进行更新(mini-batch size =1)。
针对梯度下降算法训练速度过慢的缺点,提出随机梯度下降算法,从样本中随机抽取一组,遍历后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。
优点:
- (1)在学习过程中加入了噪声,提高了泛化误差。
- (2)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
缺点:
- (1)不收敛,在最小值附近波动。
- (2)不能在一个样本中使用向量化计算,学习过程变得很慢。
- (3)单个样本并不能代表全体样本的趋势。
- (4)当遇到局部极小值或鞍点时,SGD会卡在梯度为0处。
从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。
2.3 小批量梯度下降法(Mini-batch gradient descent,MBGD)
大多数用于深度学习的梯度下降算法介于以上两者之间,使用一个以上而又不是全部的训练样本。传统上,这些会被称为小批量(mini-batch)或小批量随机(mini-batch stochastic)方法,现在通常将它们简单地成为随机(stochastic)方法。对于深度学习模型而言,人们所说的“随机梯度下降, SGD”,其实就是基于小批量(mini-batch)的随机梯度下降。
什么是小批量梯度下降?具体的说:在算法的每一步,我们从具有 m m m个样本的训练集(已经打乱样本的顺序)中随机抽出一小批量(mini-batch)样本 X = ( x ( 1 ) , . . . , x ( m ′ ) ) X=(x^{(1)},...,x^{(m')}) X=(x(1),...,x(m′))。小批量的数目 m ′ m' m′通常是一个相对较小的数(从1到几百)。重要的是,当训练集大小 m m m增长时, m ′ m' m′通常是固定的。我们可能在拟合几十亿的样本时,每次更新计算只用到几百个样本。
SGD相对较快,但由于单个样本的训练可能带来很多噪声,使得SGD并不是每次迭代都向着整体最优化方向,因此在刚开始训练时可能收敛很快,但训练一段时间后就变得很慢,因此提出小批量梯度下降法,每次从样本中随机抽取一小批进行训练,而不是一组,既保证了效果由保证了速度。
小批量大小(mini-batch size)通常由以下几个因素决定:
- (1)更大的批量会计算更精确的梯度,但是回报却是小于线性的。
- (2)极小的批量通常难以充分利用多核结构。当批量低于某个数值时,计算时间不会减少。
- (3)批量处理中的所有样本可以并行处理,内存消耗和批量大小会成正比。对于很多硬件设备,这是批量大小的限制因素。
- (4)在使用GPU时,通常使用2的幂数作为批量大小可以获得更少的运行时间。一般,2的幂数取值范围是32~256。16有时在尝试大模型时使用。
在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快,但是要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。当Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化,也可能会超出内存容量。
优点:
- (1)计算速度比Batch Gradient Descent快,因为只遍历部分样例就可执行更新。
- (2)随机选择样例有利于避免重复多余的样例和对参数更新较少贡献的样例。
- (3)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
缺点:
- (1)在迭代的过程中,因为噪音的存在,学习过程会出现波动。因此,它在最小值的区域徘徊,不会收敛。
- (2)学习过程会有更多的振荡,为更接近最小值,需要增加学习率衰减项,以降低学习率,避免过度振荡。
- (3)batch_size的不当选择可能会带来一些问题。
mini-batch的SGD算法中一个关键参数是学习率。在实践中,有必要随着时间的推移逐渐降低学习率—学习率衰减(learning rate decay)。
为什么要进行学习率衰减呢?
在梯度下降初期,能接受较大的步长(学习率),以较快的速度进行梯度下降。当收敛时,我们希望步长小一点,并且在最小值附近小幅摆动。假设模型已经接近梯度较小的区域,若保持原来的学习率,只能在最优点附近徘徊。如果降低学习率,目标函数能够进一步降低,有助于算法的收敛,更容易接近最优解。
2.4 动量法
Mini-batch gradient descent算法虽然能带来训练速度,但在到达最优点的时候并不能总争真正到达最优点,而是在最优点附近徘徊。另外Mini-batch gradient descent需要挑选一个合适的学习率,过小会导致网络训练收敛慢,过大会导致训练中优化的幅度跳过函数的范围,也就是最优点。
因此希望在希望有一个很好网络收敛速度同时摆动幅度不大,提出Momentum优化器刚好可以解决,主要基于梯度的移动指数平均加权,对网络中的参数进行平滑处理,让梯度的摆动幅度更小。
v
t
=
γ
v
t
−
1
+
α
g
t
(
θ
)
θ
t
=
θ
t
−
1
−
v
t
v_t =\gamma v_{t-1}+\alpha g_t(\theta) \\ \theta_{t}=\theta_{t-1}- v_t
vt=γvt−1+αgt(θ)θt=θt−1−vt
g
t
(
θ
)
g_t(\theta)
gt(θ) 表示前一次的梯度 ,
v
t
v_t
vt是当前速度,
γ
\gamma
γ是动量参数(推荐取0.9),是一个小于1的正数,
α
\alpha
α表示学习率
2.5 AdaGrad
AdaGrad算法是讲每一个参数的每一次迭代的梯度取平方累加后再开方,用全局学习率除以这个数,作为学习率的动态更新,从而达到自适应学习率的效果。
起到的效果是在参数空间更为平缓的方向,会取得更大的进步(因为平缓,所以历史梯度平方和较小,对应学习下降的幅度较小),并且能够使得陡峭的方向变得平缓,从而加快训练速度。
σ
t
=
1
2
∑
i
=
0
t
(
g
i
)
2
θ
t
+
1
=
θ
t
−
α
σ
t
g
t
\sigma_t =\sqrt{\frac{1}{2}\sum_{i=0}^t(g_i)^2} \\ \theta_{t+1}= \theta_t-\frac{\alpha}{\sigma_t}g_t
σt=21i=0∑t(gi)2θt+1=θt−σtαgt
σ
t
\sigma_t
σt是每个参数的所有偏微分(梯度)的均方根,
α
\alpha
α是学习率。
2.6 RMSProp
Momentum算法虽然初步解决了优化摆动幅度大的问题,为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且加快函数收敛,AdaGrad 算法每个元素的学习率在迭代过程中一直在降低(或不变),在迭代后期由于学习率过小,可能较难找到一个有用的解。 RMSProp对算法参数的梯度使用了平方加权平均数。
AdaGrad算法里状态变量
S
t
S_t
St是截至时间步
t
t
t所有小批量随机梯度
g
t
g_t
gt按元素平方和,RMSProp算法将这些梯度按元素平方做指数加权移动平均。具体来说,给定超参数
0
≤
γ
<
1
0 ≤ γ < 1
0≤γ<1,RMSProp 算法在时间步
t
>
0
t > 0
t>0 计算
S
t
=
γ
S
t
−
1
+
(
1
−
γ
)
(
g
t
)
2
S_t =\gamma S_{t-1} + (1-\gamma)(g_t)^2
St=γSt−1+(1−γ)(gt)2
和AdaGrad算法一样,RMSProp算法将目标函数自变量中每个元素的学习率通过按元素运算重新调整,然后更新自变量
θ
t
=
θ
t
−
1
−
α
S
t
+
ε
g
t
\theta_{t} = \theta_{t-1}- \frac{\alpha}{\sqrt{S_t+\varepsilon}}g_t
θt=θt−1−St+εαgt
其中
α
\alpha
α是学习率,
ε
\varepsilon
ε是为了维持数值稳定性而添加的常数,如
1
0
−
6
10^{-6}
10−6。
2.7 Adam
Adam(Adaptive Moment Estimation)是一种自适应学习率的优化算法,是在动量梯度下降(Momentum)和自适应学习率算法(RMSProp算法)的基础上发展而来的。Adam算法将不同的梯度给予不同的权重,使得神经网络在学习率稳定时,能快速、稳定的收敛到最佳点。 能够达到防止梯度摆幅过大,同时还能够加快收敛速度。
-
初始化各参数的一阶梯度的指数加权平均数 m 0 m_0 m0、二阶梯度的指数加权平均数 v 0 v_0 v0均为0,偏差校正系数为
m ^ 0 = 0 , v ^ 0 = 0 \hat{m}_{0}=0,\hat{v}_{0}=0 m^0=0,v^0=0 -
对于第 t t t个时间步的小批量样本 B t B_t Bt,计算其梯度 g t g_t gt。
g t = ∇ θ L ( θ t ; x ( i ) , y ( i ) ) g_t=∇_{\theta}L(\theta_t;x^{(i)},y^{(i)}) gt=∇θL(θt;x(i),y(i)) -
在第 t t t轮训练中,更新一阶和二阶梯度的指数加权平均值,
首先可以以计算得到Momentum算法和RMSProp的参数更新:
m t = β 1 m ^ t − 1 + ( 1 − β 1 ) g t , M o m e n t u m 计算的梯度 v t = β 2 v ^ t − 1 + ( 1 − β 2 ) g t 2 , R M S P r o p 计算的梯度 m_{t}=\beta_1 \hat{m}_{t-1}+(1-\beta_1) g_t,Momentum计算的梯度 \\ v_{t}=\beta_2\hat{v}_{t-1}+(1-\beta_2)g_t^2, RMSProp计算的梯度 mt=β1m^t−1+(1−β1)gt,Momentum计算的梯度vt=β2v^t−1+(1−β2)gt2,RMSProp计算的梯度
其中 β 1 \beta_1 β1和 β 2 \beta_2 β2是平均系数,一般设置为0.9和 0.999。 -
计算 m ^ t \hat{m}_{t} m^t 和 v ^ t \hat{v}_{t} v^t 偏差校正后的梯度的估计值:
m ^ t = m t 1 − β 1 t , v ^ t = v t 1 − β 2 t \hat{m}_{t}=\frac{m_t}{1-\beta^t_1}, \hat{v}_{t}=\frac{v_t}{1-\beta^t_2} m^t=1−β1tmt,v^t=1−β2tvt
其中 β 1 t \beta_1^t β1t和 β 2 t \beta_2^t β2t 分别是 β 1 \beta_1 β1和 β 2 \beta_2 β2的 t t t次方。 -
对其中的值进行处理后,得到:
θ t = θ t − 1 − α v ^ t + ϵ m ^ t \\ \theta_t =\theta_{t-1}- \frac{\alpha }{\sqrt{\hat{v}_t}+\epsilon}\hat{m}_t θt=θt−1−v^t+ϵαm^t
其中 α \alpha α是学习率, ϵ \epsilon ϵ 是为了增加数值稳定性而添加的常数,一般取 1 0 − 8 10^{-8} 10−8。 Adam算法中,梯度范数较大时,梯度估计占比较大,此时动量项占比就会减小。而梯度范数小时,动量项占比会增大,从而可以避免杂讯对优化过程所带来的影响。 -
torch中的API为
torch.optim.Adam()
。
Adam算法的优点在于:
- 具有自适应学习率,可以自动调整学习率。
- 能够处理稀疏梯度,对参数的更新不受梯度的大小影响。
- 在参数空间比较大、数据分布较分散和梯度的方向和大小较不一致时,性能较好。
总的来说,Adam算法是一种高效、自适应的优化算法,在各类深度学习问题中表现出色,被广泛应用。
3 机器学习和深度学习的关系
机器学习:
简而言之,ML是使用统计(或数学)技术从观察到的数据中构建模型(或系统)的一个计算机科学领域,而不是让用户输入一组定义该数据模型的特定指令。有时ML可以做的非常简单,如线性回归问题,一个更复杂的示例是邮箱中的垃圾邮件检测器,它可以“学习”哪些电子邮件是垃圾邮件,尽管从未针对每种电子邮件给出说明。(这个在吴恩达的ML课程中有所阐述)
概括来说,大多数情况下,这些ML算法会处理从原始数据中提取的精确特征集。特征可能非常简单,例如图像的像素值,信号的时间值,或复杂的特征(例如文字的特征表示就会复杂一些)。大多数已知的ML算法仅在要素表示数据时才能发挥作用。 正确的功能标识是至关重要的一步,它可以紧密代表当前所有数据状态。
ML中特征提取器的重要性:
制作正确的特征提取器本身就是一门学问, 这些特征提取器(从数据中)中的大多数在功能和实用性方面非常特定。 例如:对于人脸检测,需要一个特征提取器,该特征提取器可以正确表示人脸的一部分,可以抵抗空间像差等。每种类型的数据和任务都可以具有自己的一类特征提取。 (例如:语音识别,视频识别,图像识别等)
然后,这些特征提取器可用于提取给定样本的正确数据特征,并将此信息传递给分类器/预测器。
深度学习:
深度学习本质上是一组技术,可以用来帮助你参数化深度神经网络结构,也就是具有许多层和参数的神经网络。
虽然深度学习已经存在了一段时间,但由于广泛的适应,现在它正受到越来越多的关注。它是机器学习的一个子集,还提供监督学习、非监督学习和强化学习等。
深度学习是机器学习方法的更广泛的系列,它试图从给定的数据中学习高级功能。 因此,它解决的问题减少了为每种数据类型(语音,图像等)制作新的特征提取器的任务。
例如,对于ML中的图像识别来说,深度学习算法将在向他们呈现图像识别任务时尝试学习诸如眼睛之间的距离,鼻子的长度,或者目前无法解释的一些特征。 他们可以使用这些信息进行分类,预测等任务。 因此,这是与以前的“浅层学习算法”(ML学习)相比迈出的重要一步,也可以称为是更“智能”的一种机制。