batch。。。
⼀个简单的线性回归模型,有两种不同的训练⽅法来得到模型的最优解:
使⽤迭代优化⽅法:梯度下降(GD),在训练集上,它可以逐渐调整模型参数以获得最⼩的损失函数,最终,参数会收敛到和第⼀种⽅法相同的的值。梯度下降的变体形式:批量梯度下降(Batch GD)、⼩批量梯度下降(Mini-batch GD)、随机梯度下降(Stochastic GD)。
梯度下降法
梯度下降是⼀种⾮常通⽤的优化算法,它能够很好地解决⼀系列问题。梯度下降的整体思路是通过的迭代来逐渐调整参数使得损失函数达到最⼩值。
假设浓雾下,你迷失在了⼤⼭中,你只能感受到⾃⼰脚下的坡度。为了最快到达⼭底,⼀个最好的⽅法就是沿着坡度最陡的地⽅下⼭。这其实就是梯度下降所做的:它计算误差函数关于参数向量的局部梯度,同时它沿着梯度下降的⽅向进⾏下⼀次迭代。当梯度值为零的时候,就达到了误差函数最⼩值。
具体来说,开始时,需要选定⼀个随机的 (这个值称为随机初始值),然后逐渐去改进它, 每⼀次变化⼀⼩步,每⼀步都试着降低损失函数(例如:均⽅差损失函数),直到算法收敛到⼀个最⼩值。
在梯度下降中⼀个重要的参数是步长,超参数学习率的值决定了步长的⼤⼩。如果学习率太⼩,必须经过多次迭代,算法才能收敛,这是⾮常耗时的。
另⼀⽅⾯,如果学习率太⼤,你将跳过最低点,到达⼭⾕的另⼀⾯,可能下⼀次的值⽐上⼀次还要⼤。这可能使的算法是发散的,函数值变得越来越⼤,永远不可能到⼀个好的答案。
最后,并不是所有的损失函数看起来都像⼀个规则的碗。它们可能是洞,⼭脊,⾼原和各种不规则的地形,使它们收敛到最⼩值⾮常的困难。下图显⽰了梯度下降的两个主要挑战: 如果随机初始值选在了图像的左侧,则它将收敛到局部最⼩值,这个值要⽐全局最⼩值要⼤。 如果它从右侧开始,那么跨越⾼原将需要很长时间,如果你早早地结束训练,你将永远到不了全局最⼩值。
幸运的是线性回归模型的均⽅差损失函数是⼀个凸函数,这意味着如果你选择曲线上的任意两点,它们的连线段不会与曲线发⽣交叉(该线段不会与曲线有第三个交点)。这意味着这个损失函数没有局部最⼩值,仅仅只有⼀个全局最⼩值。同时它也是⼀个斜率不能突变的连续函数。这两个因素导致了⼀个好的结果:梯度下降可以⽆限接近全局最⼩值。 (只要你训练时间⾜够长,同时学习率不是太⼤ )。
事实上,损失函数的图像呈现碗状,但是不同特征的取值范围相差较⼤的时,这个碗可能是细长的。
下图展⽰了梯度下降在不同训练集上的
事实上,损失函数的图像呈现碗状,但是不同特征的取值范围相差较⼤的时,这个碗可能是细长的。下图展⽰了梯度下降在不同训练集上的表现。在左图中,特征 1 和特征 2 有着相同的数值尺度。在右图中,特征 1 ⽐特征2的取值要⼩的多,由于特征 1 较⼩,因此损失函数改
变时, 会有较⼤的变化,于是这个图像会在轴⽅向变得细长。
正如你看到的,左⾯的梯度下降可以直接快速地到达最⼩值,然⽽在右⾯的梯度下降第⼀次前进的⽅向⼏乎和全局最⼩值的⽅向垂直,并且最后到达⼀个⼏乎平坦的⼭⾕,在平坦的⼭⾕⾛了很长时间。它最终会达到最⼩值,但它需要很长时间。
当我们使⽤梯度下降的时候,应该确保所有的特征有着相近的尺度范围(例如:使⽤
Scikit Learn 的 StandardScaler 类),否则它将需要很长的时间才能够收敛。
奔驰slk200改装这幅图也表明了⼀个事实:训练模型意味着到⼀组模型参数,这组参数可以在训练集上使得损失函数最⼩。这是对于模型参数空间的搜索,模型的参数越多,参数空间的维度越多,到合适的参数越困难。例如在300维的空间到⼀枚针要⽐在三维空间⾥到⼀枚针复杂的多。幸运的是线性回归模型的损失函数是凸函数,这个最优参数⼀定在碗的底部。
1.批量梯度下降
使⽤梯度下降的过程中,你需要计算每⼀个下损失函数的梯度。换句话说,你需要计算当变化⼀点点时,损失函数改变了多少。这称为偏导数,它就像当你⾯对东⽅的时候问:“我 脚下的坡度是多少?”。然后⾯向北⽅的时候问同样的问题(如果你能想象⼀个超过三维的宇
宙,可以对所有的⽅向都这样做).计算关于的损失函数的偏导数,记为.
损失函数的偏导数为
为了避免单独计算每⼀个梯度,你也可以使⽤下⾯的来⼀起计算它们。梯度向量记为,其包含了损失函数所有的偏导数(每个模型参数只出现⼀次)。
损失函数的梯度向量为
在这个⽅程中每⼀步计算时都包含了整个训练集X ,这也是为什么这个算法称为批量梯度下降:每⼀次训练过程都使⽤所有的的训练数据。因此,在⼤数据集上,其会变得相当的慢(但是我们接下来将会介绍更快的梯度下降算法)。然⽽,梯度下降的运算规模和特征的数量成正⽐。训练⼀个数千数量特征的线性回归模型使⽤梯度下降要⽐使⽤正态⽅程快的多。
θj θj θj MSE (θ)∂θj ∂MSE (θ)=∂θj ∂(θ⋅x −m 2i =1∑m
T (i )y )x (i )j (i )ΔMSE (θ)θΔMSE (θ)=θ=⎝⎜⎜⎜⎛MSE (θ)∂θ0∂MSE (θ)
∂θ1∂⋮MSE (θ)∂θn ∂⎠⎟⎟⎟⎞X (X ⋅θ−m 2
nissan suvT y )
⼀旦求得了⽅向是上⼭的梯度向量,你就可以向着相反的⽅向去下⼭。这意味着从中减去。学习率和梯度向量的积决定了下⼭时每⼀步的⼤⼩.瑞纳论坛
梯度下降步长为
让我们看⼀下这个算法的应⽤:
eta = 0.1 # 学习率
n_iterations = 1000
m = 100
theta = np .random .randn (2,1) # 随机初始值
for iteration in range (n_iterations ):
gradients = 2/m * X_b .T .dot (X_b .dot (theta ) - y )
theta = theta - eta * gradients
让我们看⼀下最后的结果 :
>>> theta
array ([[4.21509616],
[2.77011339]])
>>> X_new_b .dot (theta )
array ([[4.21509616],
长安汽车多少钱[9.75532293]])
theta_path_bgd = []
def plot_gradient_descent (theta , eta , theta_path =None ):
m = len (X_b )
长安福特smaxplt .plot (X , y , "b.")
n_iterations = 1000
for iteration in range (n_iterations ):
if iteration < 10:
y_predict = X_new_b .dot (theta )
style = "b-" if iteration > 0 else "r--"
plt .plot (X_new , y_predict , style )
gradients = 2/m * X_b .T .dot (X_b .dot (theta ) - y )
theta = theta - eta * gradients
if theta_path is not None :
theta_path .append (theta )
plt .xlabel ("$x_1$", fontsize =18)
plt .axis ([0, 2, 0, 15])
plt .title (r "$\eta = {}$".format (eta ), fontsize =16)
np .random .seed (42)
theta = np .random .randn (2,1) # random initialization
plt .figure (figsize =(10,4))
plt .subplot (131); plot_gradient_descent (theta , eta =0.02)
plt .ylabel ("$y$", rotation =0, fontsize =18)
plt .subplot (132); plot_gradient_descent (theta , eta =0.1, theta_path =theta_path_bgd )
plt .subplot (133); plot_gradient_descent (theta , eta =0.5)
save_fig ("gradient_descent_plot")
plt .show ()
凯美瑞双擎θΔMSE (θ)θηθ=(nextstep )θ−ηΔMSE (θ)
θθ
看!正态⽅程的表现⾮常好。完美地求出了梯度下降的参数。但是当你换⼀个学习率会发⽣什么?上图展⽰了使⽤了三个不同的学习率进⾏梯度下降的前10步运算(虚线代表起始位置)。
在左⾯的那副图中,学习率是最⼩的,算法⼏乎不能求出最后的结果,⽽且还会花费⼤量的 时间。在中间的这幅图中,学习率的表现看起来不错,仅仅⼏次迭代后,它就收敛到了最后的结果。在右⾯的那副图中,学习率太⼤了,算法是发散的,跳过了所有的训练样本,同时每⼀步都离正确的结果越来越远。
为了到⼀个好的学习率,你可以使⽤⽹格搜索。当然,你⼀般会限制迭代的次数,以便⽹格搜索可
以消除模型需要很长时间才能收敛这⼀个问题。
你可能想知道如何选取迭代的次数。如果它太⼩了,当算法停⽌的时候,你依然没有到最优解。如果它太⼤了,算法会⾮常的耗时同时后来的迭代参数也不会发⽣改变。⼀个简单的解决⽅法是:设置⼀个⾮常⼤的迭代次数,但是当梯度向量变得⾮常⼩的时候,结束迭代。 ⾮常⼩指的是:梯度向量⼩于⼀个值 (称为容差)。这时候可以认为梯度下降⼏乎已经达到了最⼩值。
收敛速率:
当损失函数是凸函数,同时它的斜率不能突变(就像均⽅差损失函数那样),那么它的
批量梯度下降算法固定学习率之后,它的收敛速率是 。换句话说,如果你将容差缩⼩10倍后(这样可以得到⼀个更精确的结果),这个算法的迭代次数⼤约会变成原来的 10 倍。2.随机梯度下降O ()iterations 1
发布评论