在机器学习领域,通常不是最好的算法胜出,而是最多的数据胜出。
但较大的训练数据集存在计算量大的问题。
是选择使用较大的训练集还是随机抽取一些样本组成小训练集,可以采用画学习曲线的方式决定:
- 如果为高方差的学习算法,使用较大训练集效果较好;
- 如果为高偏差的学习算法,使用两种训练集的效果相差不大,应增加特征量,小训练集可以减小计算量。
批量梯度下降 VS V S 随机梯度下降(以线性回归为例):
批量梯度下降:
Jtrain(θ)=12m∑i=1m(hθ(x(i))−y(i))2
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
Repeat until convergence
R
e
p
e
a
t
u
n
t
i
l
c
o
n
v
e
r
g
e
n
c
e
{
随机梯度下降:
cost(θ,(x(i),y(i)))=12(hθ(x(i))−y(i))2
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
=
1
2
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
Jtrain(θ)=1m∑i=1mcost(θ,(x(i),y(i)))
J
t
r
a
i
n
(
θ
)
=
1
m
∑
i
=
1
m
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
1.随机重排训练样本
2.
Repeat{
R
e
p
e
a
t
{
for i:=1,⋯,m{
f
o
r
i
:=
1
,
⋯
,
m
{
θj:=θj−α(hθ(x(i))−y(i))x(i)j
θ
j
:=
θ
j
−
α
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
(for every j=0,⋯,n)
(
f
o
r
e
v
e
r
y
j
=
0
,
⋯
,
n
)
}
}
}
}
算法对比:
迭代过程
- 批量梯度下降:每次下降迭代都要考虑所有的样本;
- 随机梯度下降:扫描所有训练样本,每次下降迭代只考虑一个样本。在数据预处理时随机重排训练样本可以使梯度下降更快收敛。
收敛过程
- 批量梯度下降:收敛过程倾向于一条近似的直线,一直找到全局最小值;
- 随机梯度下降:每次迭代很快,只需保证对一个训练样本拟合就可以,以某个比较随机、迂回的路径朝全局最小值逼近,在某个靠近全局最小值的区域内徘徊。外层循环通常设置为 1∼10 1 ∼ 10 次,视训练集规模而定。
小批量梯度下降:
批量梯度下降:每次迭代用所有的
m
m
个样本;
随机梯度下降:每次迭代用个样本;
小批量梯度下降:每次迭代用
b
b
个样本,的标准取值为
10
10
,也可以是
2∼100
2
∼
100
之间的任何一个数。
设
b=10,m=1000
b
=
10
,
m
=
1000
Repeat{
R
e
p
e
a
t
{
for i=1,11,21,31,⋯,991{
f
o
r
i
=
1
,
11
,
21
,
31
,
⋯
,
991
{
θj:=θj−α110∑k=ii+9(hθ(x(k))−y(k))x(k)j
θ
j
:=
θ
j
−
α
1
10
∑
k
=
i
i
+
9
(
h
θ
(
x
(
k
)
)
−
y
(
k
)
)
x
j
(
k
)
(for every j=0,⋯,n)
(
f
o
r
e
v
e
r
y
j
=
0
,
⋯
,
n
)
}
}
}
}
小批量梯度下降
VS
V
S
批量梯度下降:
每次迭代处理
b
b
个样本而不是全集,比批量梯度下降快。
小批量梯度下降随机梯度下降:
当有好的向量化实现时,小批量梯度下降更快,因为允许部分并行计算
b
b
个样本的和。
小批量梯度下降算法的一个缺点是有一个额外的参数,需要调试其大小。
如何判断是否收敛?
批量梯度下降算法是否收敛的标准判定方法:
Jtrain(θ)=12m∑i=1m(hθ(x(i))−y(i))2
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
画出代价函数随着迭代次数增加的取值变化,确保在每次迭代后都是下降的。
随机梯度下降算法是否收敛的判定方法:
cost(θ,(x(i),y(i)))=12(hθ(x(i))−y(i))2
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
=
1
2
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
在随机梯度下降算法学习时,当我们使用样本
(x(i),y(i))
(
x
(
i
)
,
y
(
i
)
)
进行训练来更新
θ
θ
之前,可以算出该样本对应的
cost(θ,(x(i),y(i)))
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
;
为了验证算法的收敛性,每进行
1000
1000
次迭代,画出这
1000
1000
个
cost(θ,(x(i),y(i)))
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
的平均值,观察画出来的图,可以检查随机梯度下降是否在收敛。
如果曲线看起来噪声较大或总是上下振动,可以尝试增大要平均的样本数量;
如果曲线在上升,就换一个小一点的
α
α
值。
关于随机梯度下降算法的学习速率
α
α
:
当运行随机梯度下降算法时,不会真的收敛,而是一直在最小值的附近徘徊,最终得到的参数只是接近全局最小值,而不是真正的全局最小值。
在随机梯度下降算法的典型应用中,学习速率
α
α
一般保持不变,如果想让随机梯度下降收敛到全局最小值,可以随着时间减小
α
α
的取值,如:
iterationNumber i t e r a t i o n N u m b e r :指运行随机梯度下降的迭代次数;
const1 c o n s t 1 和 const2 c o n s t 2 :是两个额外参数,需要选择。
注:很少采用逐渐减小 α α 值的方法,因为确定 const1 c o n s t 1 和 const2 c o n s t 2 需要更多工作量,而且通常接近全局最小值的参数已经满足需求。在随机梯度下降算法中,还是更多地选择 α α 为常数。
在线学习:
当拥有连续数据流时,需要一个算法从中学习来模型化问题。
许多网站使用不用版本的在线学习算法从大量登录网站又离开的用户身上进行学习,学习用户偏好,使用这些信息优化网站决策。
举例:物流网站,用户输入包裹类型、始发地和目的地,网站给出价格,用户选择是否邮寄( y=1 y = 1 或 0 0 )。
抽象出问题原型,特征值包括包裹类型、始发地、目的地、网站价格,我们要学习 p(y=1|x;θ) p ( y = 1 | x ; θ ) 来调整价格。
利用逻辑回归算法:
Repeat forever{
R
e
p
e
a
t
f
o
r
e
v
e
r
{
获取特定用户对应的
(x,y)
(
x
,
y
)
利用
(x,y)
(
x
,
y
)
更新
θ
θ
θj:=θj−α(hθ(x)−y)xj(j=0,⋯,n)
θ
j
:=
θ
j
−
α
(
h
θ
(
x
)
−
y
)
x
j
(
j
=
0
,
⋯
,
n
)
}
}
}
}
在线学习中,我们获取一个样本,利用样本进行学习,然后丢弃样本。
针对此类网站,数据本质是自由且无限的,在线学习算法可以对正在变化的用户偏好进行调适。
map−reduce
m
a
p
−
r
e
d
u
c
e
(映射约减):
设存在
400
400
个样本
{(x(1),y(1)),⋯,(x(400),y(400))}
{
(
x
(
1
)
,
y
(
1
)
)
,
⋯
,
(
x
(
400
)
,
y
(
400
)
)
}
批量梯度下降算法为:
θj:=θj−α1400∑i=1400(hθ(x(i))−y(i))x(i)j
θ
j
:=
θ
j
−
α
1
400
∑
i
=
1
400
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
设有4台计算机,一种解决方案是将训练集划分为4个子集,每台计算机处理四分之一的训练数据,如下图所示:
Computer1:Use(x(1),y(1)),⋯,(x(100),y(100))
C
o
m
p
u
t
e
r
1
:
U
s
e
(
x
(
1
)
,
y
(
1
)
)
,
⋯
,
(
x
(
100
)
,
y
(
100
)
)
temp(1)j=∑i=1100(hθ(x(i))−y(i))x(i)j
t
e
m
p
j
(
1
)
=
∑
i
=
1
100
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
Computer2:Use(x(101),y(101)),⋯,(x(200),y(200))
C
o
m
p
u
t
e
r
2
:
U
s
e
(
x
(
101
)
,
y
(
101
)
)
,
⋯
,
(
x
(
200
)
,
y
(
200
)
)
temp(2)j=∑i=101200(hθ(x(i))−y(i))x(i)j
t
e
m
p
j
(
2
)
=
∑
i
=
101
200
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
Computer3:Use(x(201),y(201)),⋯,(x(300),y(300))
C
o
m
p
u
t
e
r
3
:
U
s
e
(
x
(
201
)
,
y
(
201
)
)
,
⋯
,
(
x
(
300
)
,
y
(
300
)
)
temp(3)j=∑i=201300(hθ(x(i))−y(i))x(i)j
t
e
m
p
j
(
3
)
=
∑
i
=
201
300
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
Computer4:Use(x(301),y(301)),⋯,(x(400),y(400))
C
o
m
p
u
t
e
r
4
:
U
s
e
(
x
(
301
)
,
y
(
301
)
)
,
⋯
,
(
x
(
400
)
,
y
(
400
)
)
temp(4)j=∑i=301400(hθ(x(i))−y(i))x(i)j
t
e
m
p
j
(
4
)
=
∑
i
=
301
400
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
当各计算机完成运算,将结果送到一台中心计算服务器,把这些临时变量结合起来:
θj:=θj−α1400(temp(1)j+temp(2)j+temp(3)j+temp(4)j) (j=0,⋯,n)
θ
j
:=
θ
j
−
α
1
400
(
t
e
m
p
j
(
1
)
+
t
e
m
p
j
(
2
)
+
t
e
m
p
j
(
3
)
+
t
e
m
p
j
(
4
)
)
(
j
=
0
,
⋯
,
n
)
如果机器学习算法可以表示为训练样本的某种求和,则可以考虑使用 map−reduce m a p − r e d u c e 将运算并行化。
除了计算机集群,如果一台计算机有多核
CPU
C
P
U
,也可以使用
map−reduce
m
a
p
−
r
e
d
u
c
e
,如下图:
某些线性代数函数库会自动利用多个核并行完成线性代数运算。