学习大数据集
一、随机梯度下降
首先来看批量梯度下降:
然后对所有样本同时进行更新参数(注意求和的标记),
对于随机梯度下降定义:
过程:
1、随机打乱数据集
2、遍历每个样本1…m,分别对每个样本进行参数更新
(后面部分是每个样本cost对
Θ
\Theta
Θ的偏导,不是总体训练误差的偏导)
【注意】这里和批量梯度下降不同,这里是对每个样本进行更新,而不是所有样本同时更新。就避免爆内存。也就是用第一个样本进行参数更新,然后再利用第二个样本去更新参数,使得
Θ
\Theta
Θ一直在拟合每一个样本,从而达到拟合全部样本的目的。
因此在迭代过程中,批量梯度下降是始终朝着最优解的方向去的;而随机梯度下降,由于是拟合每一个样本,因此会出现:拟合第一个样本时,朝着最优解方向去;拟合第二个样本时,又反方向了;第三个时,又好了…这样随机迂回的,但是总体趋势还是朝着最优解方向去的。
可以发现随机梯度下降比批量梯度下降更快(当训练集很大很大时),因为一般来说只需对整个训练集遍历一次就差不多可以到达全局最小,如果不够就再遍历一次;但是对于批量梯度下降,每次更新参数都要所有样本一起,因此数量一大就很慢。
二、mini-batch梯度下降
批量梯度下降:每次更新参数需要所有样本
随机梯度下降:每次更新参数只需一个样本
mini-batch梯度下降:每个更新需要b个参数,b就是mini-batch大小。
例如,b=10,那么,
可以发现,更新参数需要有几个样本,式子里就有求和以及平均。
同样的,我们可以知道mini-batch会比批量梯度下降更快(因为每次只需要b个样本就可以更新参数)。而对于随机梯度下降,mini-batch会更好的原因是向量化。有向量化的存在,可以使b个样本同时运行,而速度和一个样本是一样的,但是总体遍历次数减少了(批量梯度下降不太能用向量化,因为样本数量太多太多时,向量维度没有这么大)。
三、随机梯度下降收敛 + 选择合适的学习率
批量梯度下降检查收敛:
1、计算
J
t
r
a
i
n
(
Θ
)
J_{train}(\Theta)
Jtrain(Θ)
2、绘制随着迭代轮数,
J
t
r
a
i
n
(
Θ
)
J_{train}(\Theta)
Jtrain(Θ)的变化曲线
随机梯度下降检查收敛:
1、在学习过程中,在更新
Θ
\Theta
Θ前计算cost
2、每1000次迭代,记录这1000个样本cost平均值,然后绘制曲线
(红色表示更小的学习率)图中所示就体现了,随机梯度下降是震荡式下降的,有一些噪声,并且震荡逐渐变小。
对于有噪声的曲线,可以使用5000样本求平均,这样使得曲线变得平滑一点(因为是每5000求一次值,这样可以略过一些噪声点)。
(红色表示取5000个样本来求平均)这种情况是因为噪声太大,而1000个样本取值太小,因此需要加大样本数。
这种发散的情况,则需要使用更小的学习率。
选择学习率:
通常学习率会是一个定值,那么我们希望学习率是随着迭代次数增大而减小(这样就是一开始收敛快一点,后面慢慢来)。
例如,
α
=
常
数
1
迭
代
次
数
+
常
数
2
\alpha=\frac{常数1}{迭代次数+常数2}
α=迭代次数+常数2常数1,实现了随着迭代次数↑,学习率↓。
四、在线学习
在线学习就是,当有新用户进来时,学习新用户的行为,来更新参数,从而预测概率。这样不断的新用户,就是不断的训练样本。
在线学习,可以适应用户变化的偏好。随着时间、经济环境的变化,用户偏好也发生变化,这样在线学习可以实时更新参数,来拟合变化的用户偏好。
五、Map-reduce
应用于规模更大的数据集,在多台电脑上运行。
思想:
1、假设有m=400个样本,平均划分为4个子集(有几台电脑对应几个子集)。
2、此时每台电脑分别训练对应的子集
3、然后把计算好的temp送到一个中心服务器,由中心服务器来进行参数更新
Θ
j
i
=
Θ
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
)
)
{\Theta}_{ji}={\Theta}_j -{\alpha}\frac{1}{400}(temp_j^{(1)}+temp_j^{(2)}+temp_j^{(3)}+temp_j^{(4)})
Θji=Θj−α4001(tempj(1)+tempj(2)+tempj(3)+tempj(4))
其实这个过程和下面是一样的,只是把任务分给了若干个机器,来加快速度。
总体示意图:
如果想要使用其他的学习算法,首先应该考虑该学习算法能否表示为训练集求和,这样才能划分训练集到各个机器上去运行。