Loss及其梯度

部署运行你感兴趣的模型镜像

一、Loss及其梯度

一、常见的Loss函数类型

  1. Mean squared error(均方差,mse)
    1. 基本形式
      1. loss=∑[y−fθ(x)]2loss=\sum[y-f_\theta(x)]^2loss=[yfθ(x)]2
      2. L2−norm=∣∣y−fθ(x)∣∣2L2-norm=||y-f_\theta(x)||_2L2norm=yfθ(x)2
      3. loss=norm(y−fθ(x))2loss=norm(y-f_\theta(x))^2loss=norm(yfθ(x))2
    2. mse求导
      ▽loss▽θ=2∗∑[y−fθ(x)]∗▽fθ(x)▽θ \frac{\triangledown loss}{\triangledown \theta}=2*\sum{\left[ y-f_{\theta}\left( x \right) \right]}*\frac{\triangledown f_{\theta}\left( x \right)}{\triangledown \theta} θloss=2[yfθ(x)]θfθ(x)
  2. Cross Entropy Loss(交叉熵)
    1. 可用于二分类(binary)和多分类(multi-class)问题
    2. 使用时常与softmax搭配使用

二、使用Pytorch自动求导

1、autograd.grad函数使用

  1. torch.autograd.grad(mse,[w])
    1. mse:给出的值
    2. [w]:自变量,切记requires_grad=True
      1. 可以使用w.requires_grad_(True)修改。
      2. 可以在生成的时候设置requires_grad=True
  2. 相关代码
# 以f(x) = xw+b 为例
# x初始值为1,w为dim=1、值为2的tensor,b假设为0
#----------------------------------------------------------------------------------
x = torch.ones(1)
w = torch.full([1],2)
mse = F.mse_loss(torch.ones(1),x*w) # 第一个参数给的是pred值,第二个参数给的是label值
w.requires_grad_(True) #告诉pytorch需要梯度信息
mse=F.mse_loss(torch.ones(1),x*w) #静态图需要更新信息
#----------------------------------------------------------------------------------
print("mse = ",mse)
print("grad = ",torch.autograd.grad(mse,[w]))
# 输出: mse =  tensor(1.)
# 输出:grad =  (tensor([2.]),)

2、loss.backward函数使用

  1. F.mse_loss(pred,label):求解出mse的值
    1. pred:是预测值
    2. label:是真实计算出的参数
  2. w.backward() :反向传播求出梯度
  3. 相关代码
# 以f(x) = xw+b 为例
# x初始值为1,w为dim=1、值为2的tensor,b假设为0
#----------------------------------------------------------------------------------
x = torch.ones(1)
w = torch.full([1],2,requires_grad=True)
mse = F.mse_loss(torch.ones(1),x*w)
mse.backward()
grad = w.grad
#----------------------------------------------------------------------------------
print("mse = ",mse)
print("grad = ",grad)
# mse =  tensor(1., grad_fn=<MeanBackward0>)
# grad =  tensor([2.])

三、Softmax激活函数

1、soft version of max简介

  1. 在深度学习中,softmax在多分类的场景中使用广泛。他讲一些输入映射为[0-1]之间的实数,并且归一化保证和为1。

2、Softmax定义:

  1. 函数:
    S(yi)=eyi∑jeyj S\left( y_i \right) =\frac{e^{y_i}}{\sum_j^{}{e^{yj}}} S(yi)=jeyjeyi
  2. 演示
    在这里插入图片描述

3、Softmax求导:

  1. i==j
    pi=∂eai∑k=1Neak p_i=\partial \frac{e^{a_i}}{\sum\nolimits_{k=1}^N{e^{a_k}}} pi=k=1Neakeai
    ∂pj∂aj=∂eai∑k=1Neak∂aj=eai(∑k=1Neak−eaj)(∑k=1Neak)2=eaj∑k=1Neak×(∑k=1Neak−eaj)∑k=1Neak=pi(1−pj) \frac{\partial p_j}{\partial a_j}=\frac{\partial \frac{e^{a_i}}{\sum\nolimits_{k=1}^N{e^{a_k}}}}{\partial a_j}=\frac{e^{a_i}\left( \sum\nolimits_{k=1}^N{e^{a_k}}-e^{a_j} \right)}{\left( \sum\nolimits_{k=1}^N{e^{a_k}} \right) ^2}=\frac{e^{a_j}}{\sum\nolimits_{k=1}^N{e^{a_k}}}\times \frac{\left( \sum\nolimits_{k=1}^N{e^{a_k}}-e^{a_j} \right)}{\sum\nolimits_{k=1}^N{e^{a_k}}}=p_i\left( 1-p_j \right) ajpj=ajk=1Neakeai=(k=1Neak)2eai(k=1Neakeaj)=k=1Neakeaj×k=1Neak(k=1Neakeaj)=pi(1pj)

  2. i!=j
    pi=∂eai∑k=1Neak p_i=\partial \frac{e^{a_i}}{\sum\nolimits_{k=1}^N{e^{a_k}}} pi=k=1Neakeai
    ∂pj∂aj=∂eai∑k=1Neak∂aj=0−eajeai(∑k=1Neak)2=−eaj∑k=1Neak×eai∑k=1Neak=−pj⋅pi \frac{\partial p_j}{\partial a_j}=\frac{\partial \frac{e^{a_i}}{\sum\nolimits_{k=1}^N{e^{a_k}}}}{\partial a_j}=\frac{0-e^{a_j}e^{a_i}}{\left( \sum\nolimits_{k=1}^N{e^{a_k}} \right) ^2}=\frac{-e^{a_j}}{\sum\nolimits_{k=1}^N{e^{a_k}}}\times \frac{e^{a_i}}{\sum\nolimits_{k=1}^N{e^{a_k}}}=-p_j·p_i ajpj=ajk=1Neakeai=(k=1Neak)20eajeai=k=1Neakeaj×k=1Neakeai=pjpi

  3. 公式合并

    ∂pj∂aj={pi(1−pj)  if  i=j−pj⋅pi            if  i≠j \frac{\partial p_j}{\partial a_j}=\begin{cases} p_i\left( 1-p_j \right) \,\, if\,\,i=j\\ -p_j·p_i\,\, \,\, \,\, \,\, \,\, \,\, if\,\,i\ne j\\ \end{cases} ajpj={pi(1pj)ifi=jpjpiifi=j

    1. 使用Kronecker delta
      δij={1    if  i=j0    if  i≠j \delta ij=\begin{cases} 1 \,\, \,\,if\,\,i=j\\ 0 \,\, \,\,if\,\,i\ne j\\ \end{cases} δij={1ifi=j0ifi=j
      ∂pi∂aj=pi(δij−pj) \frac{\partial p_i}{\partial a_j}=p_i\left( \delta _{ij}-p_j \right) ajpi=pi(δijpj)

4、Softmax函数及其求导:

a = torch.rand(3)
a.requires_grad_(True)
p = F.softmax(a,dim=0) #会自动完成建图操作
grad0 = torch.autograd.grad(p[0],[a],retain_graph=True) #必须是dim为1的
grad1 = torch.autograd.grad(p[1],[a],retain_graph=True)
grad2 = torch.autograd.grad(p[2],[a],retain_graph=True)

print("a = ",a)
print("p = ",p)
print("grad0 = ",grad0)
print("grad1 = ",grad1)
print("grad2 = ",grad2)
#-------------------------------------------------------------------------------
# a =  tensor([0.2260, 0.5295, 0.0540], requires_grad=True)
# p =  tensor([0.3128, 0.4238, 0.2634], grad_fn=<SoftmaxBackward>)
# grad0 =  (tensor([ 0.2150, -0.1326, -0.0824]),)
# grad1 =  (tensor([-0.1326,  0.2442, -0.1116]),)
# grad2 =  (tensor([-0.0824, -0.1116,  0.1940]),)

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值