机器学习--梯度下降法(Gradient Descent)

1.梯度

1.1.梯度的定义

梯度被定义为一维函数的导数在多维函数f上的泛化,表示为函数f的n个偏导教的向量。这对优化很有用,因为在该函数最大增长率方向上的梯度值相当于图中该方向上的斜率。

梯度下降使用导数计算损失函数的斜率,读者应该很熟悉“导数”这个微积分概念。在二维损失函数上,导数是抛物线上任意点的正切,也就是y的变化除以x的变化,上升除以前进。

正如从三角学中所知,正切是一个比率,它等于直角三角形的对边(它测量垂直变化)除以邻边(它测量水平变化)。

曲线的一个定义是一条斜率不断变化的线,线上每个点的斜率等于紧贴该点的正切。由于斜率是由两个点求出的,那么如何精确地找到曲线上一个点的斜率呢?通过计算曲线.上距离很小的两点之间连线的斜率,然后慢慢缩小距离直到接近零来求导数。在微积分运算中,这叫作极限。

不断重复计算误差并在低误差的方向修改权重的过程,直至权重到达误差最低的点,即准确度最高的点。使用凸损失函数(通常在线性建模)时,损失函数只有一个全局最小值。可以从求参数向量x的三个组件的角度来思考线性建模。

1.2.梯度的数学表示

设二元函数 z = f ( x , y ) z=f(x, y) z=f(x,y)在平面区域D上具有一阶连续偏导数,则对于每一个点P(x,y)都可定出一个向量 { ∂ f ∂ x , ∂ f ∂ y } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ \left\{\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right\}=f_{x}(x, y) \bar{i}+f_{y}(x, y) \bar{j} {xf,yf}=fx(x,y)iˉ+fy(x,y)jˉ ,该函数就称为函数 z = f ( x , y ) z=f(x, y) z=f(x,y) 在点P(x,y)的梯度,记作gradf(x,y)或 ∇ f ( x , y ) \nabla f(x, y) f(x,y) ,即有:gradf ( x , y ) = ∇ f ( x , y ) = { ∂ f ∂ x , ∂ f ∂ y } = f x ( x , y ) i ˉ + f y ( x , y ) j ˉ (\mathrm{x}, \mathrm{y})=\nabla f(x, y)=\left\{\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right\}=f_{x}(x, y) \bar{i}+f_{y}(x, y) \bar{j} (x,y)=f(x,y)={xf,yf}=fx(x,y)iˉ+fy(x,y)jˉ,其中 ∇ = ∂ ∂ x i ˉ + ∂ ∂ y j ˉ \nabla=\frac{\partial}{\partial x} \bar{i}+\frac{\partial}{\partial y} \bar{j} =xiˉ+yjˉ称为(二维的)向量微分算子或Nabla算子, ∇ f = ∂ f ∂ x i ˉ + ∂ f ∂ y j ˉ \nabla f=\frac{\partial f}{\partial x} \bar{i}+\frac{\partial f}{\partial y} \bar{j} f=xfiˉ+yfjˉ

2.梯度法的分类

根据目的是寻找最小值还是最大值,梯度法的叫法有所不同,严格来讲,寻找最小值的梯度法叫做梯度下降法(Gradient Descent Method),寻找最大值的梯度法叫做梯度上升法(Gradient Ascent Method)。但是通过反转损失函数的符号,二者会变成相同的问题,因此上升还是下降本质上并不重要。

3.梯度下降法

3.1.概述

梯度下降是一种非常通用的优化算法,能够为大范围的问题找到最优解。梯度下降的中心思想就是迭代地调整参数从而使成本函数最小化。

假设你迷失在山上的浓雾之中,你能感觉到的只有你脚下路面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。这就是梯度下降的做法:通过测量参数向量θ相关的误差函数的局部梯度,并不断沿着降低梯度的方向调整,直到梯度降为0,到达最小值。

具体来说,首先使用一个随机的θ值(这被称为随机初始化),然后逐步改进,每次踏出一步,每一步都尝试降低一点成本函数(如MSE), 直到算法收敛出一个最小值(如下图)。
在这里插入图片描述

3.2.梯度下降法直观解释

在梯度下降的场景中,可以把网络预测的质量(权重/参数值的函数)想象为一幅风景画。小山代表预测误差很大的位置( 参数值或权重),山谷表示误差较小的位置。我们选择风景画上的一个点作为初始权重。可以基于领域知识选择初始权重(如果正在训练-一个对花卉进行分类的网络,那么花瓣的长度重要,但颜色不重要)。假如让网络做所有工作,我们就可以随机选择初始权重。

我们的目的是尽可能快地把权重降到误差较小的区域,像梯度下降这样的优化算法可以计算出山坡对于每个权重的实际坡度,即它知道哪个方向向下。梯度下降法测量坡度(由权重变化引起的误差变化),并将权重朝山谷底部移动一步。它通过求损失函数的导数来求梯度。在优化算法中,梯度给出算法下一步移动的方向。
因此,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
在这里插入图片描述

3.3.基本概念

3.2.1.步长(Learning Rate)

又叫学习率,它决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

3.3.2.特征(Feature)

指的是样本中输入部分,比如2个单特征的样本 ( x ( 0 ) , y ( 0 ) ) , ( x ( 1 ) , y ( 1 ) ) \left(x^{(0)}, y^{(0)}\right),\left(x^{(1)}, y^{(1)}\right) (x(0),y(0)),(x(1),y(1)),则第一个样本特征为 x ( 0 ) x^{(0)} x(0),第一个样本输出为 y ( 0 ) y^{(0)} y(0)

3.3.3.假设函数(Hypothesis Function)

在监督学习中,为了拟合输入样本,而使用的假设函数,记为 h θ ( x ) h_{\theta}(x) hθ(x)。比如对于单个特征的m个样本( ( x ( i ) , y ( i ) ) ( i = 1 , 2 , … m ) \left(x^{(i)}, y^{(i)}\right)(i=1,2, \ldots m) (x(i),y(i))(i=1,2,m),可以采用拟合函数如下: h θ ( x ) = θ 0 + θ 1 x ∘ h_{\theta}(x)=\theta_{0}+\theta_{1} x_{\circ} hθ(x)=θ0+θ1x

3.3.4.损失函数(Loss Function)

为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本 ( x ( i ) , y ( i ) ) ( i = 1 , 2 , … m ) \left(x^{(i)}, y^{(i)}\right)(i=1,2, \ldots m) (x(i),y(i))(i=1,2,m),采用线性回归,损失函数为: J ( θ 0 , θ 1 ) = ∑ i = 1 m ( h θ ( x i ) − y i ) 2 J\left(\theta_{0}, \theta_{1}\right)=\sum_{i=1}^{m}\left(h_{\theta}\left(x_{i}\right)-y_{i}\right)^{2} J(θ0,θ1)=i=1m(hθ(xi)yi)2
 其中 x ( i ) x^{(i)} x(i)表示第i个样本特征, y ( i ) y^{(i)} y(i)表示第i个样本对应的输出, h θ ( x ) h_{\theta}(x) hθ(x)为假设函数。

3.4.学习率的影响

梯度下降中一个重要参数是每一步的步长, 这取决于超参数 学习率,如果学习率太低,算法需要经过大量迭代才能收敛,这将耗费很长时间(参见下图)。
在这里插入图片描述

反过来说,如果学习率太高,那你可能会越过山谷直接到达山的另一边, 甚至有可能比之前的起点还要高。这会导致算法发散,值越来越大,最后无法找到好的解决方案(参见下图)。
在这里插入图片描述
最后,并不是所有的成本函数看起来都像一个漂亮的碗。有的可能看着像洞、像山脉、像高原或者是各种不规则的地形,导致很难收敛到最小值。下图显示了梯度下降的两个主要挑战:如果随机初始化,算法从左侧起步,那么会收敛到一个局部最小值,而不是全局最小值。如果算法从右侧起步,那么需要经过很长时间才能越过整片高原,如果你停下得太早,将永远达不到全局最小值。

幸好,线性回归模型的MSE成本函数恰好是个凸函数,这意味着连接曲线上任意两个点的线段永远不会跟曲线相交。也就是说不存在局部最小,只有一个全局最小值。它同时也是一个连续函数,所以斜率不会产生陡峭的变化。这两件事保证的结论是:即便是乱走,梯度下降都可以趋近到全局最小值(只要等待时间足够长,学习率也不是太高)。
在这里插入图片描述

3.5.特征值缩放与否的影响

成本函数虽然是碗状的,但如果不同特征的尺寸差别巨大,那它可能是一个非常细长的碗。如下两幅图所示的梯度下降,上边的训练集上,特征1和特征2具有相同的数值规模,而下边的训练集上,特征1的值则比特征2要小得多。

在这里插入图片描述
在这里插入图片描述
正如你所见,上放图的梯度下降算法直接走向最小值,可以快速到达。而在下方图中,先是沿着与全局最小值方向近乎垂直的方向前进,接下来是一段几乎平坦的长长的山谷。最终还是会抵达最小值,但是这需要花费大量的时间。这两张图也说明,训练模型就是寻找使成本函数(在训练集上)最小化的参数组合。这是模型参数空间层面上的搜索:模型的参数越多,这个空间的维度就越多,搜索就越难。幸运的是,线性回归模型的成本函数是个凸函数,最小值就在碗底

4.算法过程

1、确认优化模型的假设函数和损失函数(以线性回归为例),假设函数为: h θ ( x 1 , x 2 , … x n ) = θ 0 + θ 1 x 1 + … + θ n x n ′ h_{\theta}\left(x_{1}, x_{2}, \ldots x_{n}\right)=\theta_{0}+\theta_{1} x_{1}+\ldots+\theta_{n} x_{n_{\prime}} hθ(x1,x2,xn)=θ0+θ1x1++θnxn,其中 θ i ( i = 0 , 1 , 2 … n ) \theta_{i}(\mathrm{i}=0,1,2 \ldots \mathrm{n}) θi(i=0,1,2n)为模型参数, x i ( i = 0 , 1 , 2 … n ) x_{i}(\mathrm{i}=0,1,2 \ldots \mathrm{n}) xi(i=0,1,2n)为每个样本的n个特征值。相应的,损失函数为:
J ( θ 0 , θ 1 … , θ n ) = 1 2 m ∑ j = 1 m ( h θ ( x 0 ( j ) , x 1 ( j ) , … x n ( j ) ) − y j ) 2 J\left(\theta_{0}, \theta_{1} \ldots, \theta_{n}\right)=\frac{1}{2 m} \sum_{j=1}^{m}\left(h_{\theta}\left(x_{0}^{(j)}, x_{1}^{(j)}, \ldots x_{n}^{(j)}\right)-y_{j}\right)^{2} J(θ0,θ1,θn)=2m1j=1m(hθ(x0(j),x1(j),xn(j))yj)2
2、算法相关参数初始化:主要是初始化 θ 0 , θ 1 … , θ n \theta_{0}, \theta_{1} \ldots, \theta_{n} θ0,θ1,θn,算法终止距离 ε 以及步长 α 。

5.执行算法

1、确定当前位置的损失函数的梯度,对于 θ i \theta_{i} θi,其梯度表达式如下: ∂ ∂ θ i J ( θ 0 , θ 1 … , θ n ) \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1} \ldots, \theta_{n}\right) θiJ(θ0,θ1,θn)
2、用步长乘以损失函数的梯度,得到当前位置下降的距离,即 α ∂ ∂ θ i J ( θ 0 , θ 1 … , θ n ) \alpha \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1} \ldots, \theta_{n}\right) αθiJ(θ0,θ1,θn),对应于前面登山例子中的一步。
3、确定是否所有的 θ i \theta_{i} θi,梯度下降的距离都小于ε,如果小于ε则算法终止,当前所有的 θ i ( i = 0 , 1 , 2 … n ) \theta_{i}(\mathrm{i}=0,1,2 \ldots \mathrm{n}) θi(i=0,1,2n)即为最终结果。否则进入步骤4.
4、更新所有的θ,对于 θ i \theta_{i} θi,其更新表达式为:$\theta_{i}=\theta_{i}-\alpha \frac{\partial}{\partial \theta_{i}} ,更新完毕后继续转入步骤 1。

6.算法优化方式

1、算法的步长选择

步长得到取值通常取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。如果步长太大,会导致迭代过快,甚至有可能错过最优解;步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。数据科学就是反复进行假设和检验的一种科学方法,并不是通过一次计算就可以得出正确的结论
2、算法参数的初始值选择

再次强调,初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,比较损失函数的最小值,选择损失函数最小化的初值。
3、特征数据归一化

由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,归一化之后的特征数据的新期望为0,新方差为1,迭代速度可以大大加快。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性回归是机器学习中的一种基本算法,梯度下降法是线性回归中常用的优化算法。下面是线性回归梯度下降法的实现步骤: 1.读取数据集,包括自变量和因变量。 2.初始化相关参数,包括学习率、迭代次数、截距和斜率等。 3.定义计算代价函数,常用的代价函数是均方误差(MSE)。 4.梯度下降,通过不断迭代更新截距和斜率,使得代价函数最小化。 5.执行梯度下降算法,得到最优的截距和斜率。 下面是Python代码实现: ```python import numpy as np # 读取数据集 def load_data(file_path): data = np.loadtxt(file_path, delimiter=',') x_data = data[:, :-1] y_data = data[:, -1] return x_data, y_data # 初始化相关参数 def init_params(): b = 0 k = 0 learning_rate = 0.01 num_iterations = 1000 return b, k, learning_rate, num_iterations # 定义计算代价函数 def compute_cost(b, k, x_data, y_data): total_error = 0 for i in range(len(x_data)): total_error += (y_data[i] - (k * x_data[i] + b)) ** 2 cost = total_error / float(len(x_data)) return cost # 梯度下降 def gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations): m = float(len(x_data)) for i in range(num_iterations): b_gradient = 0 k_gradient = 0 for j in range(len(x_data)): b_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) k_gradient += (1/m) * ((k * x_data[j] + b) - y_data[j]) * x_data[j] b = b - (learning_rate * b_gradient) k = k - (learning_rate * k_gradient) return b, k # 执行梯度下降算法 def linear_regression(file_path): x_data, y_data = load_data(file_path) b, k, learning_rate, num_iterations = init_params() print("Starting parameters: b = {0}, k = {1}, cost = {2}".format(b, k, compute_cost(b, k, x_data, y_data))) b, k = gradient_descent(b, k, x_data, y_data, learning_rate, num_iterations) print("After {0} iterations: b = {1}, k = {2}, cost = {3}".format(num_iterations, b, k, compute_cost(b, k, x_data, y_data))) # 调用线性回归函数 linear_regression('data.csv') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值