PyTorch中特殊函数梯度的计算

PyTorch中特殊函数梯度的计算

普通函数

对于简单的多元函数,对自变量求梯度很容易,例如:
f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2

则有:
{ ∇ x f ( x , y ) = 2 x ∇ y f ( x , y ) = 2 y \left\{ \begin{aligned} \nabla_xf(x,y)&=2x\\ \nabla_yf(x,y)&=2y \end{aligned} \right . {∇xf(x,y)∇yf(x,y)=2x=2y

python 复制代码
import torch
x = torch.tensor([1, 1, 1.0], requires_grad=True)
y = torch.tensor([2, 2, 2.0], requires_grad=True)
z = torch.pow(x, 2) + torch.pow(y, 2)
z.sum().backward()
x.grad, y.grad
python 复制代码
(tensor([2., 2., 2.]), tensor([4., 4., 4.]))

特殊函数

1. Max函数

一般是求几个输入元素的最大值,如何计算梯度呢?
f ( x 0 , x 1 , ... , x n ) = max ⁡ ( x 0 , x 1 , ... , x n ) f(x_0,x_1,\ldots,x_n)=\max(x_0,x_1,\ldots,x_n) f(x0,x1,...,xn)=max(x0,x1,...,xn)

  1. 在数值上求出最大值 a a a

  2. 对函数进行变换
    f ( x 0 , x 1 , ... , x n , a ) = max ⁡ ( x 0 , x 1 , ... , x n , a ) = { a i f x < a x i f x = a f(x_0,x_1,\ldots,x_n,a)=\max(x_0,x_1,\ldots,x_n,a)= \left\{ \begin{aligned} a\quad if\ x<a\\ x\quad if\ x=a \end{aligned} \right. f(x0,x1,...,xn,a)=max(x0,x1,...,xn,a)={aif x<axif x=a

  3. 变换后就可以求梯度了
    ∇ x f ( x , a ) = { 0 i f x < a 1 i f x = a \nabla_x f(x,a)= \left\{ \begin{aligned} 0\quad if\ x<a\\ 1\quad if\ x=a \end{aligned} \right . ∇xf(x,a)={0if x<a1if x=a

在PyTorch中,如果存在多个相等的最大值,那么它们均分"1":

python 复制代码
import torch

x = torch.tensor([1, 2, 3, 4, 4, 0.], requires_grad=True)
y = torch.max(x)
y.backward()
x.grad
python 复制代码
tensor([0.0000, 0.0000, 0.0000, 0.5000, 0.5000, 0.0000])
2. Clip函数

在数据落在一定范围外时,与输入无关
f ( x ) = { x i f a < x < b a i f x < a b i f x > b f(x)= \left\{ \begin{aligned} &x\quad if\ a<x<b\\ &a\quad if\ x<a\\ &b\quad if\ x>b \end{aligned} \right. f(x)=⎩ ⎨ ⎧xif a<x<baif x<abif x>b

python 复制代码
import torch

x = torch.tensor([1, 2, 3, 4, 5, 6, 7.0], requires_grad=True)
y = torch.clip(x, 1.5, 5.5)
y.sum().backward()
x.grad
python 复制代码
tensor([0., 1., 1., 1., 1., 0., 0.])
相关推荐
Hylan_J6 分钟前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
莫忘初心丶10 分钟前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
牧歌悠悠2 小时前
【深度学习】Unet的基础介绍
人工智能·深度学习·u-net
坚毅不拔的柠檬柠檬3 小时前
AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构
人工智能·chatgpt·文心一言
坚毅不拔的柠檬柠檬3 小时前
2025:人工智能重构人类文明的新纪元
人工智能·重构
jixunwulian3 小时前
DeepSeek赋能AI边缘计算网关,开启智能新时代!
人工智能·边缘计算
Archie_IT3 小时前
DeepSeek R1/V3满血版——在线体验与API调用
人工智能·深度学习·ai·自然语言处理
失败尽常态5233 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447743 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农3 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx