有监督机器学习笔记(Super Machine Learning Revision Notes)
前注:本文是笔记Super Machine Learning Revision Notes(https://createmomo.github.io/2018/01/23/Super-Machine-Learning-Revision-Notes/#tableofcontents)的个人汉化版,主要是为了复习机器学习中的基础概念,以及练练英语:)
本文总结
- 本文主要涉及机器学习的基础概念(如梯度下降、反向传播)
- 本文会涉及不同的算法和不同的模型
- 训练例子来自于原文作者的实践和网络资源(如deep learning AI)
If you a student who is studying machine learning, hope this article could help you to shorten your revision time and bring you useful inspiration. If you are not a student, hope this article would be helpful when you cannot recall some models or algorithms.
目录
激活函数
| 函数名称 | 函数表达式 | 导数 |
|---|---|---|
| sigmod | g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1 | g ( z ) ( 1 − g ( z ) ) g(z)(1-g(z)) g(z)(1−g(z)) |
| tanh | t a n h ( z ) tanh(z) tanh(z) |
1
−
(
t
a
n
h
(
z
)
)
2
1-(tanh(z))^2
1−(tanh(z))2. 0, 如果 z < 0 z<0 z<0 |
| relu | m a x ( 0 , z ) max(0,z) max(0,z) | 1, if
z
>
0
z>0
z>0, undefined, 如果 z = 0 z=0 z=0, 0.01, 如果 z < 0 z<0 z<0 |
| Leaky relu | m a x ( 0.01 z , z ) max(0.01z,z) max(0.01z,z) | 1, if
z
>
0
z>0
z>0, undefined, 如果 z = 0 z=0 z=0 |
梯度下降
梯度下降是一种迭代方法,其目的是为了寻找目标函数(比如loss function)的局部最小值(最优解)。
Repeat{
W := W - learning_rate * dJ(W)/dW
}
上述代码展示了对某个参数
W
W
W的优化方式。
通常,我们使用
α
\alpha
α 来表示学习率(learning rate)。学习率是神经网络训练中常见的超参,
J
(
W
)
J(W)
J(W)一般用以表示模型中的损失函数(loss function),
d
J
(
W
)
d
W
\frac{dJ(W)}{dW}
dWdJ(W)是针对
W
W
W的梯度。如果
W
W
W是一个参数矩阵(也就是权重),
d
J
(
W
)
d
W
\frac{dJ(W)}{dW}
dWdJ(W)就是矩阵中的任意参数的梯度。
那么问题来了:为什么在最小化损失函数时减去梯度而不加上梯度?
回答:
举个例子,我们的损失函数是
J
(
W
)
=
0.1
(
W
−
5
)
2
J(W)=0.1(W-5)^2
J(W)=0.1(W−5)2,它基本长这个样子:
当
W
=
10
W=10
W=10, 梯度
d
J
(
W
)
d
W
=
0.1
∗
2
(
10
−
5
)
=
1
\frac{dJ(W)}{dW}=0.1*2(10-5)=1
dWdJ(W)=0.1∗2(10−5)=1.显然,当我们想去找
J
(
W
)
J(W)
J(W)的最小值的时候,梯度的反方向(
−
d
J
(
W
)
d
W
-\frac{dJ(W)}{dW}
−dWdJ(W)))是能找到局部最小值的最快的方向(i.e.
J
(
W
=
5
)
=
0
J(W=5)=0
J(W=5)=0)。
但有时梯度下降也会受限于优化方案。
(译者注:梯度下降的相关理论均有严格证明,这里原作者为了形象,用图片给了较为生动的展示,对这方面有兴趣的读者可以参考《最优化导论》了解梯度下降的数学原理及证明)
·计算图
本文的计算图实例来自于Deep Learing AI的第一个公开课程。
假设我们现在有三个可学的参数,
a
a
a,
b
b
b 和
c
c
c。损失函数
J
=
3
(
a
+
b
c
)
J=3(a+bc)
J=3(a+bc)。那么,我们需要计算三个梯度:
d
J
d
a
\frac{dJ}{da}
dadJ,
d
J
d
b
\frac{dJ}{db}
dbdJ and
d
J
d
c
\frac{dJ}{dc}
dcdJ。我们同时定义
u
=
b
c
u=bc
u=bc,
v
=
a
+
u
v=a+u
v=a+u and
J
=
3
v
J=3v
J=3v,那么这个计算过程可以转化为如下的计算图:

·反向传播
基于上述的计算图,显然各个参数的梯度为
d
J
d
a
=
d
J
d
v
d
v
d
a
\frac{dJ}{da}=\frac{dJ}{dv}\frac{dv}{da}
dadJ=dvdJdadv,
d
J
d
b
=
d
J
d
v
d
v
d
u
d
u
d
b
\frac{dJ}{db}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{db}
dbdJ=dvdJdudvdbdu,
d
J
d
c
=
d
J
d
v
d
v
d
u
d
u
d
c
\frac{dJ}{dc}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{dc}
dcdJ=dvdJdudvdcdu.
计算每个节点的梯度可以非常简单的展示如下(提示:实际上,如果要实现自己的算法,则可以在正向过程中计算梯度,以节省计算资源和训练时间。 因此,在进行反向传播时,无需再次计算每个节点的梯度。):

通过组合上述节点的梯度,我们可以简单的算出每个参数的梯度:

d
J
d
a
=
d
J
d
v
d
v
d
a
=
3
×
1
=
3
\frac{dJ}{da}=\frac{dJ}{dv}\frac{dv}{da}=3\times1=3
dadJ=dvdJdadv=3×1=3
d
J
d
b
=
d
J
d
v
d
v
d
u
d
u
d
b
=
3
×
1
×
2
=
6
\frac{dJ}{db}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{db}=3\times1\times2=6
dbdJ=dvdJdudvdbdu=3×1×2=6
d
J
d
c
=
d
J
d
v
d
v
d
u
d
u
d
c
=
3
×
1
×
3
=
9
\frac{dJ}{dc}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{dc}=3\times1\times3=9
dcdJ=dvdJdudvdcdu=3×1×3=9
·L2正则化(L2 Regularizaation)的梯度计算
稍微修改一下之前的梯度下降公式:
Repeat{
W := W - (lambda/m) * W - learning_rate * dJ(W)/dW
}
·梯度消失/爆炸(Vanishing/Exploding Gradients)
如果我们有一个层数很多的神经网络,并且我们还没有很好的初始化权重,我们也许会遇到梯度消失和梯度爆炸问题(更详细的介绍见Parameter Initialization)。
为了介绍什么是梯度爆炸和梯度消失,我们再次举一个简单的深度学习网络例子(本实例依旧来源于Deep Learing AI)。
这个神经网络拥有
L
L
L层,为了便于展示,每一层的参数
b
[
l
]
b^{[l]}
b[l]均被设置为0,并且激活函数为
g
(
z
)
=
z
g(z)=z
g(z)=z,除此之外,我们定义每一层的
W
[
l
]
W^{[l]}
W[l]都是一样的。
基于上述网卡了哟,我们最终可以获得的输出如下所示:
y
=
W
[
l
]
W
[
l
−
1
]
W
[
l
−
2
]
…
W
[
3
]
W
[
2
]
W
[
1
]
X
y=W^{[l]}W^{[l-1]}W^{[l-2]}…W^{[3]}W^{[2]}W^{[1]}X
y=W[l]W[l−1]W[l−2]…W[3]W[2]W[1]X
如果某个权重为
1.5
>
1
1.5>1
1.5>1,我们最终会在某几个位置上获得一个
1.
5
L
1.5^L
1.5L的爆炸性参数,同样,如果某个权重值比1小,那么这个参数的梯度在某一层就会趋近于0,也就是消失了。
梯度爆炸和梯度消失都会造成训练的极度困难,所以小心初始化神经网络权重是必要的。
·mini-batch Gradient Descent
注:这句话不太好翻译,大致意思就是设置个batch
如果我们有一个巨大的训练集,那么我们训练一个epoch就可能需要很久。如此一来追踪整体的训练进度就很困难。因此我们提出mini-batch gradient descent,损失和梯度都是由当前的一个batch的训练实例计算的。
假设 X X X代表整个训练集,并且被分割为若干个batch, m m m是batch中训练数据的数量。mini-batch的训练方式如下:
For t= (1, ... , #Batches):
基于第t个batch的数据进行前向计算
计算基于第t个batch的损失
基于第t个batch进行反向传播,更新损失函数和参数
在训练过程中,应用mini-batch的模型的损失趋势会更加平滑。

·随机梯度下降(Stochastic Gradient Descent)
batch_size = 1,此时的梯度下降被称为随机梯度下降。
·选择mini-batch的规模
- 如果规模为 M M M,其中 M M M是整个训练集的规模,那么这种梯度下降就完整的Batch Gradient Descent。
- 如果规模为1,则称为随机梯度下降。
在实际实现中,如果数据集比较小,当然直接选择使用Batch Gradient Descent。否则应该应用mini-batch。mini-batch的大小可以是64,128,256等等。

本文深入探讨了机器学习中的核心概念,包括激活函数的选择、梯度下降算法的运作原理、计算图的应用、L2正则化的梯度计算、梯度消失与爆炸的问题,以及mini-batch和随机梯度下降等优化技巧。适合初学者和希望巩固基础知识的学习者。
9万+

被折叠的 条评论
为什么被折叠?



