【机器学习】梯度下降的基本概念和如何使用梯度下降自动化优化w和b

引言

梯度下降是一种用于寻找函数最小值的优化算法,它在机器学习中广泛用于训练模型,如线性回归、神经网络等

一、梯度下降的基本概念

1.1 目标函数

在机器学习中,这通常是损失函数(如均方误差、交叉熵等),我们希望最小化它以训练模型

1.2 梯度

目标函数相对于每个参数的偏导数向量。它指向目标函数增长最快的方向

1.3 学习率(步长)

决定了在梯度下降过程中每一步移动的距离大小

二、梯度下降的步骤

2.1 初始化参数

随机选择一个参数的初始值或者基于某些启发式方法

2.2 计算梯度

计算目标函数在当前参数值处的梯度

2.3 更新参数

根据梯度和学习率来更新参数
θ θ θ= θ θ θ α α α ∇ θ ∇_θ θ J ( θ ) J(θ) J(θ)
其中, θ θ θ是参数向量, α α α是学习率, J ( θ ) J(θ) J(θ)是目标函数, ∇ θ ∇_θ θ J ( θ ) J(θ) J(θ)是目标函数的梯度

2.4 重复步骤2和3

重复计算梯度并更新参数,直到满足停止条件(如梯度变得非常小或者达到预设的迭代次数)

三、梯度下降的变体

3.1 批量梯度下降(Batch Gradient Descent)

使用所有样本来计算梯度

3.2 随机梯度下降(Stochastic Gradient Descent, SGD)

每次迭代使用一个样本来计算梯度

3.3 小批量梯度下降(Mini-batch Gradient Descent)

每次迭代使用一部分样本来计算梯度

四、注意事项

4.1 学习率的选择

学习率太大可能导致算法无法收敛,太小则收敛速度过慢。

4.2 局部最小值和鞍点

梯度下降可能会陷入局部最小值或鞍点,尤其是在非凸优化问题中

4.3 梯度消失/爆炸

在深度学习中,梯度可能会在反向传播过程中变得非常小(消失)或非常大(爆炸),影响训练

在实现梯度下降时,可能需要调整多个超参数(如学习率、迭代次数等)以获得最佳性能。此外,还有一些高级的梯度下降变种和优化技术,如动量(Momentum)、自适应学习率(如AdaGrad、RMSprop、Adam等),它们可以帮助算法更快地收敛

五、如何使用梯度下降自动化优化 w w w b b b

5.1 工具

在本次实验中,我们将使用以下工具:

  • NumPy,一个流行的科学计算库
  • Matplotlib,一个流行的绘图数据库
  • 在本地目录的lab_utils.py文件中的绘图例程
import math, copy
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('./deeplearning.mplstyle')
from lab_utils_uni import plt_house_x, plt_contour_wgrad, plt_divergence, plt_gradients

5.2 问题陈述

让我们使用之前相同的两个数据点 :一个1000平方英尺的房子以30万美元的价格售出,一个2000平方英尺的房子以50万美元的价格售出。

尺寸(1000平方英尺)价格(以千美元计)
1300
2500
# 加载数据集
x_train = np.array([1.0, 2.0])   # 特征
y_train = np.array([300.0, 500.0])   # 目标值

5.3 计算成本

# 计算成本的函数
def compute_cost(x, y, w, b):m = x.shape[0] cost = 0for i in range(m):f_wb = w * x[i] + bcost = cost + (f_wb - y[i])**2total_cost = 1 / (2 * m) * costreturn total_cost

5.4 梯度下降概述

到目前为止,已经开发了一个线性模型,用于预测 f w , b ( x ( i ) ) f_{w,b}(x(i)) fw,b(x(i))
f w , b ( x ( i ) ) = w ⋅ x ( i ) + b f_{w,b}(x(i)) = w \cdot x(i) + b fw,b(x(i))=wx(i)+b
在线性回归中,利用输入训练数据来拟合参数 w w w b b b
通过最小化预测 f w , b ( x ( i ) ) f_{w,b}(x(i)) fw,b(x(i)) 和实际数据 y ( i ) y(i) y(i) 之间的误差来衡量
这个度量被称为成本 J ( w , b ) J(w, b) J(w,b)
在训练中,需要衡量所有训练样本 x ( i ) , y ( i ) x(i), y(i) x(i),y(i) 的成本:
J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 J(w, b) = \frac{1}{2m} \sum_{i=0}^{m-1} (f_{w,b}(x(i)) - y(i))^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2

梯度下降被描述为:

  1. 重复 w , b w, b w,b 直到收敛:
  2. w = w − α ∂ J ( w , b ) ∂ w w = w - \alpha \frac{\partial J(w, b)}{\partial w} w=wαwJ(w,b)
  3. b = b − α ∂ J ( w , b ) ∂ b b = b - \alpha \frac{\partial J(w, b)}{\partial b} b=bαbJ(w,b)
  • 其中,参数 w w w b b b 同时更新

梯度定义为:

∂ J ( w , b ) ∂ w = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) \frac{\partial J(w, b)}{\partial w} = \frac{1}{m} \sum_{i=0}^{m-1} (f_{w,b}(x(i)) - y(i)) x(i) wJ(w,b)=m1i=0m1(fw,b(x(i))y(i))x(i)
∂ J ( w , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) \frac{\partial J(w, b)}{\partial b} = \frac{1}{m} \sum_{i=0}^{m-1} (f_{w,b}(x(i)) - y(i)) bJ(w,b)=m1i=0m1(fw,b(x(i))y(i))

5.5 实现梯度下降

实现一个特征的梯度下降算法,需要以下三个函数:

  • compute_gradient 实现定义的方程式
  • compute_cost 实现上面的方程式
  • gradient_descent,使用compute_gradientcompute_cost
    以下是对这些函数的实现和如何使用它们来找到最优的 w w w b b b 值的详细说明:
  • 包含偏导数的Python变量的命名遵循这种模式,∂𝐽(𝑤,𝑏)∂𝑏 将被称为 d j d b dj_db djdb
  • w.r.t 是 With Respect To 的缩写,例如偏导数 𝐽(𝑤𝑏) 关于 𝑏 的偏导数。

5.6 计算梯度

计算梯度实现了上面的方程式,并返回 ∂𝐽(𝑤,𝑏)∂𝑤 和 ∂𝐽(𝑤,𝑏)∂𝑏。内嵌的注释描述了操作

# compute_gradient函数的实现
def compute_gradient(x, y, w, b): """Computes the gradient for linear regression Args:x (ndarray (m,)): Data, m examples y (ndarray (m,)): target valuesw,b (scalar)    : model parameters  Returnsdj_dw (scalar): The gradient of the cost w.r.t. the parameters wdj_db (scalar): The gradient of the cost w.r.t. the parameter b     """# 训练样本的数量m = x.shape[0]    dj_dw = 0dj_db = 0for i in range(m):  f_wb = w * x[i] + b dj_dw_i = (f_wb - y[i]) * x[i] dj_db_i = f_wb - y[i] dj_db += dj_db_idj_dw += dj_dw_i dj_dw = dj_dw / m dj_db = dj_db / m return dj_dw, dj_db

在这里插入图片描述
文章中描述了梯度下降如何利用目标函数相对于参数在某个点的偏导数来更新该参数

使用compute_gradient函数来找到并绘制我们成本函数相对于其中一个参数的偏导数,比如 w 0 w_0 w0

plt_gradients(x_train,y_train, compute_cost, compute_gradient)
plt.show()

输出结果:
在这里插入图片描述
在上图中,左边的图显示了 ∂𝐽(𝑤,𝑏)∂𝑤 或成本曲线相对于 𝑤 在三个点的斜率。在图的右边,导数是正的,而在左边则是负的。由于“碗形”的形状,偏导数将总是引导梯度下降向成本为零的底部
左边的图固定了 𝑏=100。梯度下降将利用 ∂𝐽(𝑤,𝑏)∂𝑤 和 ∂𝐽(𝑤,𝑏)∂𝑏 来更新参数。右边的“箭头图”提供了一种查看两个参数梯度的方法。箭头的大小反映了该点的梯度大小。箭头的方向和斜率反映了该点处 ∂𝐽(𝑤,𝑏)∂𝑤 和 ∂𝐽(𝑤,𝑏)∂𝑏 的比率

请注意,梯度指向最小值之外。回顾上面的方程式。缩放的梯度被从当前的 𝑤 或 𝑏 值中减去。这会使参数移动到将减少成本的方向

5.7 梯度下降

现在可以计算梯度,就可以在下方的gradient_descent中实现梯度下降,实现细节在注释中进行了描述。下面,使用这个函数在训练数据上找到 𝑤 和 𝑏 的最优值

def gradient_descent(x, y, w_in, b_in, alpha, num_iters, cost_function, gradient_function): """执行梯度下降来拟合 w,b。通过使用学习率 alpha 进行 num_iters 步的梯度下降来更新 w,b。参数:x (ndarray (m,))  : 数据集,包含 m 个样本y (ndarray (m,))  : 目标值w_in,b_in (标量): 模型参数的初始值alpha (float): 学习率num_iters (int): 运行梯度下降的迭代次数cost_function: 用于产生成本的函数gradient_function: 用于产生梯度的函数返回:w (标量): 运行梯度下降后更新的参数值b (标量): 运行梯度下降后更新的参数值J_history (列表): 成本值的历史记录p_history (列表): 参数 [w,b] 历史记录"""w = copy.deepcopy(w_in) # 避免修改全局 w_in# 用于存储每个迭代周期的成本 J 和 w 的数组,主要用于后续的图形化展示J_history = []p_history = []b = b_inw = w_infor i in range(num_iters):# 计算梯度并使用 gradient_function 更新参数dj_dw, dj_db = gradient_function(x, y, w , b)     # 使用方程 (3) 更新参数b = b - alpha * dj_db                            w = w - alpha * dj_dw                            # 保存每个迭代周期的成本 Jif i<100000:      # 防止资源耗尽J_history.append( cost_function(x, y, w , b))p_history.append([w,b])# 每隔一定迭代次数打印成本if i% math.ceil(num_iters/10) == 0:print(f"迭代 {i:4}: 成本 {J_history[-1]:0.2e} ",f"dj_dw: {dj_dw: 0.3e}, dj_db: {dj_db: 0.3e}  ",f"w: {w: 0.3e}, b:{b: 0.5e}")return w, b, J_history, p_history # 返回 w 和 J,w 历史记录用于图形化展示
# 初始化参数
w_init = 0
b_init = 0
# 一些梯度下降设置
iterations = 10000 # 设置梯度下降的迭代次数
tmp_alpha = 1.0e-2 # 设置初始学习率
# 运行梯度下降
w_final, b_final, J_hist, p_hist = gradient_descent(x_train ,y_train, w_init, b_init, tmp_alpha, iterations, compute_cost, compute_gradient)
print(f"(w,b) 由梯度下降找到的值: ({w_final:8.4f},{b_final:8.4f})")

输出结果:
在这里插入图片描述
在这里插入图片描述

仔细观察上述打印的梯度下降过程,注意其一些特点:

  • 成本开始时很大,然后迅速下降,这与讲座中的幻灯片描述一致
  • 部分导数 ( dj_dw ) 和 ( dj_db ) 也变小,起初很快,然后逐渐变慢。如图所示,随着过程接近“碗底”,由于该点的导数值较小,进展变得较慢
  • 尽管学习率 ( \alpha ) 保持固定,但进展仍然变慢

5.8 梯度下降过程中的成本与迭代次数

成本与迭代次数的图表是梯度下降过程中进度的一个有用的衡量指标。在成功的运行中,成本应该始终下降。初始时,成本的变化非常迅速,因此将初始下降放在不同的尺度上与最终下降相比是有用的。在下面的图表中,请注意成本轴上的尺度以及迭代步骤

# 绘制成本与迭代次数
fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True, figsize=(12,4))
ax1.plot(J_hist[:100])
ax2.plot(1000 + np.arange(len(J_hist[1000:])), J_hist[1000:])
ax1.set_title("成本与迭代(开始)");  ax2.set_title("成本与迭代 (结束)")
ax1.set_ylabel('成本')            ;  ax2.set_ylabel('成本') 
ax1.set_xlabel('迭代步骤')  ;  ax2.set_xlabel('迭代步骤') 
plt.show()

输出结果:
在这里插入图片描述
预测
现在已经发现了参数 w w w b b b 的最优值,可以使用学到的参数来预测房价。如预期,预测值与同一住房的训练值几乎相同。此外,不在预测中的值与预期值一致。

print(f"1000平方英尺房子的预测 {w_final*1.0 + b_final:0.1f} 千美元")
print(f"1200平方英尺房子的预测 {w_final*1.2 + b_final:0.1f} 千美元")
print(f"2000平方英尺房子的预测 {w_final*2.0 + b_final:0.1f} 千美元")

输出结果

在这里插入图片描述

5.9 绘图

可以通过在成本 ( w , b ) ( w, b ) (w,b的等高线图上绘制成本来展示梯度下降在其执行过程中的进度。

fig, ax = plt.subplots(1,1, figsize=(12, 6))
plt_contour_wgrad(x_train, y_train, p_hist, ax)

输出结果
在这里插入图片描述

在上面的等高线图中,显示了 w w w b b b 范围内的 J ( w , b ) J(w, b) J(w,b)。成本水平由环形表示。覆盖在上面的,使用红色箭头,是梯度下降的路径。这里有一些需要注意的事情:

  • 路径稳步(单调)地朝着其目标前进。
  • 初始步骤比接近目标时的步骤要大得多。
  • 放大,我们可以看到梯度下降的最终步骤。注意,随着梯度接近零,步骤之间的距离缩小了。
fig, ax = plt.subplots(1,1, figsize=(12, 4))
plt_contour_wgrad(x_train, y_train, p_hist, ax, w_range=[180, 220, 0.5], b_range=[80, 120, 0.5],contours=[1,5,10,20],resolution=0.5)

输出结果:
在这里插入图片描述

增加学习率
在讲座中,有关学习率 α \alpha α 的适当值的讨论与方程式有关。较大的 α \alpha α 会使梯度下降更快地收敛到解决方案。但是,如果它太大,梯度下降将会发散。在上面的例子中,有一个收敛良好的解决方案。
让我们尝试增加 α \alpha α 的值,看看会发生什么:

# 初始化参数
w_init = 0
b_init = 0
# 将alpha设置为一个大值
iterations = 10
tmp_alpha = 8.0e-1
# 运行梯度下降
w_final, b_final, J_hist, p_hist = gradient_descent(x_train ,y_train, w_init, b_init, tmp_alpha, iterations, compute_cost, compute_gradient)

在这里插入图片描述

在上面的图中, w w w b b b 在每次迭代中都在正负之间弹跳,其绝对值随着每次迭代而增加。此外,每次迭代中 ∂ J ( w , b ) / ∂ w \partial J(w,b)/\partial w J(w,b)/w 的符号都会改变,而成本却在增加而不是减少。这是一个明显的迹象,表明学习率太大,解决方案正在发散

六、总结

  • 深入了解单变量梯度下降的细节
  • 开发一个计算梯度的例行程序
  • 可视化梯度的本质
  • 完成一个梯度下降例行程序
  • 利用梯度下降找到参数
  • 检查学习率大小的影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习趋同性的量化探索:以多模态学习与联合嵌入为例

深度学习趋同性的量化探索&#xff1a;以多模态学习与联合嵌入为例 参考文献 据说是2024年最好的人工智能论文&#xff0c;是否有划时代的意义&#xff1f; [2405.07987] The Platonic Representation Hypothesis (arxiv.org) ​arxiv.org/abs/2405.07987 趋同性的量化表达 …

Pytorch使用教学7-张量的广播

PyTorch中的张量具有和NumPy相同的广播特性&#xff0c;允许不同形状的张量之间进行计算。 广播的实质特性&#xff0c;其实是低维向量映射到高维之后&#xff0c;相同位置再进行相加。我们重点要学会的就是低维向量如何向高维向量进行映射。 相同形状的张量计算 虽然我们觉…

JAW:一款针对客户端JavaScript的图形化安全分析框架

关于JAW JAW是一款针对客户端JavaScript的图形化安全分析框架&#xff0c;该工具基于esprima解析器和EsTree SpiderMonkey Spec实现其功能&#xff0c;广大研究人员可以使用该工具分析Web应用程序和基于JavaScript的客户端程序的安全性。 工具特性 1、动态可扩展的框架&#x…

模拟ADG主库归档文件丢失,备库出现gap(增量备份解决)

文章目录 一、说明二、环境信息2.1.主备库环境信息2.2.检查主备是否同步正常 三、模拟日志断档3.1.模拟主库归档文件丢失3.2 查看主库状态出现GAP 四、RMAN增量备份恢复备库同步4.1 RMAN增量恢复备库4.2 开启备库redo同步4.3 主备库验证同步 一、说明 模拟Oracle主库归档文件丢…

Git基本原理讲解、常见命令、Git版本回退、Git抛弃本地分支拉取仓库最新分支

借此机会写篇博客汇总一下自己去公司实习之后遇到的一些常见关于Git的操作。 Git基本认识 Git把数据看作是对小型文件系统的一组快照&#xff0c;每次提交更新&#xff0c;或在Git中保存项目状态时&#xff0c;Git主要对当时的全部文件制作一个快照并保存这个快照的索引。同时…

【C++】选择结构案例-三只小猪称体重

案例问题 假设有三只小猪A、B、C&#xff0c;在输入三者体重后希望能输出他们各自的体重并测出谁最重 思路 先让A与B相比较&#xff0c;如果A重&#xff0c;则让A和C相比较&#xff0c;如果A重则输出A最重&#xff0c;否则输出C最重 在最开始的条件&#xff08;AB相比较&am…

浅谈Devops

1.什么是Devops DevopsDev&#xff08;Development&#xff09;Ops&#xff08;Operation&#xff09; DevOps&#xff08;Development和Operations的混合词&#xff09;是一种重视“软件开发人员&#xff08;Dev&#xff09;”和“IT运维技术人员&#xff08;Ops&#xff09;”…

通过限制访问,实现纯私有Docker镜像

怎么会不过审呢?没有敏感信息呀。 For obvious reasons,Many Docker image repositories are inaccessible,The official warehouse has also been filtered by the firewall,So write about how to build a self use Docker image using CloudFlares Workers and Pages. …

WPF MVVM使用遇见问题

一、遇见问题 1.使用Dictionary绑定ListBox的ItsSource问题 过程&#xff1a; 需要再界面动态显示字典&#xff0c;在循环中添加两条数据时&#xff0c;绑定的字典断点查看有两条&#xff0c;界面上只显示一条&#xff0c;后面再其他数量的都动态不显示&#xff0c;鼠标滚动后…

BUUCTF [安洵杯 2019]easy_serialize_php

这道题题目说easy但是对我来说极其不友好&#xff01;看了很多wp讲的模棱两可&#xff0c;我尽量来说清楚点 代码解析&#xff1a; 这里$function $_GET[f]&#xff0c;是我们通过get方式传递的&#xff0c;因为注释提示有东西先传fphpinfo看看 找到了一个东西&#xff0c;很…

IPD推行成功的核心要素(十五)项目管理提升IPD相关项目交付效率和用户体验

研发项目往往包含很多复杂的流程和具体的细节。因此&#xff0c;一套完整且标准的研发项目管理制度和流程对项目的推进至关重要。研发项目管理是成功推动创新和技术发展的关键因素。然而在实际管理中&#xff0c;研发项目管理常常面临着需求不确定、技术风险、人员素质、成本和…

STM32-寄存器DMA配置指南

配置步骤 在STM32F0xx中文参考手册中的DMA部分在开头给出了配置步骤 每个通道都可以在外设寄存器固定地址和存储器地址之间执行 DMA 传输。DMA 传输的数据 量是可编程的&#xff0c;最大达到 65535。每次传输之后相应的计数寄存器都做一次递减操作&#xff0c;直到 计数为&am…

电脑屏幕录制软件,分享4款(2024最新)

在今天&#xff0c;我们的电脑屏幕成为了一个多彩多姿的窗口。通过它我们可以浏览网页、观看视频、处理文档、进行游戏……有时&#xff0c;我们想要记录下这些精彩瞬间&#xff0c;与朋友分享&#xff0c;或者作为教程留存&#xff0c;这时&#xff0c;电脑屏幕录制就显得尤为…

亚信安慧AntDB亮相PostgreSQL中国技术大会,获“数据库最佳应用奖”并分享数据库应用实践

7月12日&#xff0c;第13届PostgreSQL中国技术大会在杭州顺利举办&#xff0c;亚信安慧AntDB数据库荣获“数据库最佳应用奖”。大会上&#xff0c;亚信安慧AntDB数据库同事带来《基于AntDB的CRM系统全域数据库替换实践》和《亚信安慧AntDB数据库运维之路》两场精彩演讲&#xf…

【网络】网络编程套接字——UDP、TCP、UDP接口使用、TCP接口使用、UDP程序实例、TCP程序实例

文章目录 Linux网络1. UDP1.1 UDP接口使用1.1 UDP程序实例 2. TCP2.1 TCP接口使用2.2 TCP程序实例 Linux网络 1. UDP 在使用我们的UDP和TCP函数的时候&#xff0c;我们需要理解一些预备的知识&#xff1a; 源 IP 地址和目的 IP 地址&#xff1a; 在网络通信中&#xff0c;IP …

电脑软件:推荐一款非常好用的图片编辑软件——Photo Pos Pro

目录 一、软件简介 二、功能介绍 三、使用说明 四、软件特点 一、软件简介 Photo Pos Pro 4是一款非常实用的图像编辑软件&#xff0c;专为需要修图的用户量身打造而成。软件拥有简洁的用户界面&#xff0c;操作起来也比较简单&#xff0c;能够帮助用户轻松处理图片。软件具…

蚂蚁集团Android一面凉经(2024)

蚂蚁集团Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《蚂蚁集团Android一面凉经(2024)》。 面试职位: 蚂蚁集团-Android/iOS开发工程师-支…

MySQL练手 --- 1174. 即时食物配送 II

题目链接&#xff1a;1174. 即时食物配送 II 思路&#xff1a; 题目要求&#xff1a;即时订单在所有用户的首次订单中的比例。保留两位小数 其实也就是 即时订单 / 首次订单 所以&#xff0c;先求出首次订单&#xff0c;在首次订单的基础上寻找即时订单即可 解题过程&#x…

介绍下PolarDB

业务中用的是阿里云自研的PolarDB&#xff0c;分析下PolarDB的架构。 认识PolarDB 介绍 PolarDB是阿里云自研的&#xff0c;兼容MySQL、PostageSQL以及支持MPP的PolarDB-X的高可用、高扩展性的数据库。 架构 部署 云起实验室 - 阿里云开发者社区 - 阿里云 (aliyun.com) 数…

IDEA新建module后变为普通文件夹

问题描述&#xff1a; 在父项目中创建module并构建子父关系&#xff0c;但在创建module并配置后出现未生效问题 在父项目中的pom.xml文件中添加 <modules><module>***</module></modules>在新建Module中添加 <parent><groupId>com.***&l…