首页 > 其他分享 >深度学习梯度与反向传播

深度学习梯度与反向传播

时间:2023-10-02 17:33:26浏览次数:48  
标签:frac 梯度 nabla 反向 深度 mathbf data

梯度与反向传播

1、梯度(方向向量)

1.1 什么是梯度

梯度:是一个向量,导数+变化最快的方向(学习的前进方向)

目标:通过梯度调整(学习)参数$$w$$,尽可能的降低$$loss$$

一般的,随机初始一个$$w0$$,通过优化器在学习率和梯度的调整下,让$$loss$$函数取到最小值。

1.2 $$w$$的更新方法

1.计算$$w$$的梯度
$$
\nabla w=\frac{f(w+0.000001)-f(w-0.000001)}{2*0.000001}
$$
2.更新$$w$$
$$
w=w-\alpha\nabla w
$$
其中,$$\nabla w < 0$$意味着w将增大,$$\nabla w > 0$$意味着w将减小

总结:梯度就是多元函数参数的变化趋势(参数学习的方向),只有一个自变量时称为导数

1.3 偏导数与梯度计算

我们可以连结⼀个多元函数对其所有变量的偏导数,以得到该函数的梯度(gradient)向量。设函数为:
$$
f:\mathbb{R}n\to\mathbb{R},\mathbf{x}=[x_1,x_2,\ldots,x_n]\top
$$
其输⼊是⼀个 n 维向量 x,并且输出是一个标量。函数f(x)相对于x的梯度是⼀个包含n个偏导数的向量:
$$
\nabla_{\mathbf{x}}f(\mathbf{x})=\left[\frac{\partial f(\mathbf{x})}{\partial x_1},\frac{\partial f(\mathbf{x})}{\partial x_2},\ldots,\frac{\partial f(\mathbf{x})}{\partial x_n}\right]^\top
$$
假设x为n维向量,在微分多元函数时经常使⽤以下规则:
$$
\bullet\text{ 对于所有}\mathbf{A}\in\mathbb{R}^{m\times n},\text{ 都有 }\nabla_{\mathbf{x}}\mathbf{A}\mathbf{x}=\mathbf{A}^\top
$$

$$
\bullet\text{ 对于所有}\mathbf{A}\in\mathbb{R}^{n\times m}\text{,都有 }\nabla_\mathbf{x}\mathbf{x}^\top\mathbf{A}=\mathbf{A}
$$

$$
\bullet\text{ 对于所有}\mathbf{A}\in\mathbb{R}^{n\times n}\text{,都有 }\nabla_\mathbf{x}\mathbf{x}\top\mathbf{A}\mathbf{x}=(\mathbf{A}+\mathbf{A}\top)\mathbf{x}
$$

$$
\bullet\nabla_{\mathbf{x}}|\mathbf{x}|2=\nabla_{\mathbf{x}}\mathbf{x}\top\mathbf{x}=2\mathbf{x}
$$

公式证明:矩阵求导公式的数学推导(矩阵求导——基础篇) - 知乎 (zhihu.com)

1.4、链式法则

然而,上⾯⽅法可能很难找到梯度。这是因为在深度学习中,多元函数通常是 复合(composite)的,所以我们可能没法应⽤上述任何规则来微分这些函数。幸运的是,链式法则使我们能够微分复合函数。让我们先考虑单变量函数。假设函数$$ y = f(u)$$ 和$$ u = g(x)$$ 都是可微的,根据链式法则:
$$
\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}.
$$
现在让我们把注意力转向一个更一般的场景, 即函数具有任意数量的变量的情况。假设可微分函数 $y$ 有变量$u_1,u_2,\ldots,u_m$,其中每个可微分函数$u_i$ 都有变量$x_1,x_2,\ldots,x_n$。注意, $y$是$x_1,x_2\mathbb{Q}\ldots,x_n$ 的函数。对于任意$i=1,2,\ldots,n$, 链式法则给出:

$$
\frac{dy}{dx_i}=\frac{dy}{du_1}\frac{du_1}{dx_i}+\frac{dy}{du_2}\frac{du_2}{dx_i}+\cdots+\frac{dy}{du_m}\frac{du_m}{dx_i}
$$

2、反向传播算法

2.1 反向传播解释

假设有函数为:
$$
J(a,b,c)=3(a+bc),\text{合}u=a+v,v=bc
$$
梯度计算图为:

反向传播计算:

那么反向传播的过程就是一个上图的从右往左的过程,自变量$a,b,c$各自的偏导就是连线上的梯度的乘积。
$$
\begin{aligned}
&\frac{dJ}{da} =3\times1 \
&\frac{dJ}{db} =3\times1\times c \
&\begin{aligned}\frac{dJ}{dc}\end{aligned} =3\times1\times b
\end{aligned}
$$

2.1 神经网络中的反向传播距举例

反向传播的思想就是对其中的某一个参数单独求梯度,之后更新。更新参数之后,继续反向传播。

3、线性回归举例

下面,我们使用一个自定义的数据,来使用torch实现一个简单的线性回归

假设我们的基础模型就是y = wx+b,其中w和b均为参数,我们使用y = 3x+0.8来构造数据x、y,所以最后通过模型应该能够得出w和b应该分别接近3和0.8

  1. 准备数据
  2. 计算预测值
  3. 计算损失,把参数的梯度置为0,进行反向传播
  4. 更新参数
import torch
from matplotlib import pyplot as plt


#1. 准备数据 y = 3x+0.8,准备参数
x = torch.rand([50])
y = 3*x + 0.8

w = torch.rand(1,requires_grad=True)
b = torch.rand(1,requires_grad=True)
print('初始w={},b={}'.format(w,b))

def loss_fn(y,y_predict):
    loss = (y_predict-y).pow(2).mean()
    # 下述同等写法:[i.grad.data.zero_() for i in [w,b] if i.grad is not None]
    for i in [w,b]:
        # 每次反向传播前把梯度置为0
        # 在默认情况下, PyTorch会累积梯度,我们需要清除之前的值
        if i.grad is not None:
            i.grad.data.zero_()
    # 根据损失,反向传播计算梯度
    loss.backward()
    return loss.data

def optimize(learning_rate):
    # print(w.grad.data,w.data,b.data)
    # 由梯度与学习率,优化参数w,b的值
    w.data -= learning_rate* w.grad.data
    b.data -= learning_rate* b.grad.data

# 3000次epoch训练
for epoch in range(3000):
    #2. 计算预测值
    y_predict = x*w + b

    #3.计算损失,把参数的梯度置为0,进行反向传播
    loss = loss_fn(y,y_predict)

    if epoch%500 == 0:
        print(epoch,loss)
    #4. 更新参数w和b
    optimize(0.01)

# 绘制图形,观察训练结束的预测值和真实值
predict =  x*w + b

#使用训练后的w和b计算预测值
plt.scatter(x.data.numpy(), y.data.numpy(),c = "r")
plt.plot(x.data.numpy(), predict.data.numpy())
plt.show()

print("w",w)
print("b",b)

标签:frac,梯度,nabla,反向,深度,mathbf,data
From: https://www.cnblogs.com/jzYe/p/17740259.html

相关文章

  • 【研究生学习】深度学习中几种常用的卷积形式的原理以及其Pytorch调用
    本篇博客主要记录一下在深度学习中几种常用的卷积形式的基本原理、输入输出维度,以及如何在Pytorch中调用这些卷积形式卷积卷积实际上是对图像的不同区域进行特征提取,一般认为输入图像的维度为H×W×C,如下图所示:图像具有颜色通道,一般是RGB,需要理解的是不同通道数的图像和不同的......
  • 小批量梯度下降
    在小批量梯度下降中,试分析为什么学习率要和批量大小成正比在标准的梯度下降中,参数的更新公式是:θ=θ−η∇θJL(θ)\theta=\theta-\eta\nabla_\thetaJL(\theta)θ=θ−η∇θ​JL(θ)其中,η\etaη是学习率,∇θJL(θ)\nabla_\thetaJL(\theta)∇θ​JL(θ)是损失函数JL......
  • 嵌入式深度学习1-引言
    嵌入式深度学习-引言博主序这一系列博客,是以BertMoons的《EmbeddedDeepLearning》为蓝本进行翻译得到的。考虑到中文互联网上资源较少,才决定写成公开博客发布至互联网的。此系列博客选择性地做了一些翻译和梳理的工作。书中涉及的部分实例可能不会被摘录,过于基础的内容也会......
  • Pytorch环境深度学习环境
    Pytorch环境深度学习环境1、安装minicoda下载地址:Miniconda—minicondadocumentation设置环境变量:安装路径\Miniconda3安装路径\Miniconda3\Scripts安装路径\Miniconda3\Library\bin测试:打开cmd,输入conda测试指令是否有效。2、配置base环境国内镜像(1)conda镜像......
  • 动手学深度学习_4 多层感知机
    frompixiv多层感知机原理隐藏层严格一点来讲:我们需要隐藏层是因为线性是一个很强的假设,线性模型在有些情况会不适用或者出错。一个形象的例子:就如同上面图片中展示的XOR问题,如果我们现在想要将绿和红球分开,如果只用一条"线性",我们会发现我们是做不到的,起码要两条及以......
  • Go结构体深度探索:从基础到应用
    在Go语言中,结构体是核心的数据组织工具,提供了灵活的手段来处理复杂数据。本文深入探讨了结构体的定义、类型、字面量表示和使用方法,旨在为读者呈现Go结构体的全面视角。通过结构体,开发者可以实现更加模块化、高效的代码设计。这篇文章旨在为您提供关于结构体的深入理解,助您更好地......
  • 【搭建yolox深度学习环境】
    (这里写目录标题)一、环境配置首先进行yolox模型的下载:YOLOX(gitcode)或者YOLOX(github)并选择自己所需的权重模型,如-s-m-l等(.pth文件)如果需要进行labview的使用,需要onnx模型则:YOLOX-onnx(github)二、安装所需库文件网上多数为直接进行pip-rrequirements.txt,但执行完成后,......
  • 深度学习在图像识别领域还有哪些应用?
    深度学习在图像识别领域的应用非常广泛,除了之前提到的图像分类、目标检测、语义分割和图像生成,还有其他一些应用。图像超分辨率重建:深度学习技术可以用于提高图像的分辨率,例如通过使用生成对抗网络(GAN)和变分自编码器(VAE)等技术,可以将低分辨率的图像转换为高分辨率的图像,从而提高......
  • 运维 | Nginx Proxy Manager反向代理工具
    运维|NginxProxyManager反向代理工具简介NginxProxyManager(以下简称NPM)就是一个Nginx的代理管理器,它最大的特点是简单方便。即使是没有Nginx基础的小伙伴,也能轻松地用它来完成反向代理的操作,不需要自己写复杂的nginx配置,而且因为自带面板,操作极其简单。NginxProxy......
  • QRes v1.1是由Anders Kjersem开发的一个工具,用于在Windows上更改分辨率。它提供了一些
    QResv1.1是由AndersKjersem开发的一个工具,用于在Windows上更改分辨率。它提供了一些命令行选项来控制分辨率、颜色深度和刷新率等参数。协助用户更改桌面分辨率,颜色深度和刷新率。具有命令行工具,无需启动GUI界面即可更改所有这些设置。显示使用情况信息并自动将配置保存在注册......