• torch.autograd.grad求二阶导数


    1 用法介绍

    pytorchtorch.autograd.grad函数主要用于计算并返回输出相对于输入的梯度总和,具体的参数作用如下所示:

    torch.tril(input, diagonal=0, *, out=None) ⟶ \longrightarrow Tensor

    • outputs(sequence of Tensor):表示微分函数的输出
    • inputs (sequence of Tensor):表示微分函数的输入
    • grad_outputs (sequence of Tensor):表示“向量-雅克比矩阵”的向量
    • retain_graph (bool, optional):表示是否需要将计算图释放掉,当计算二阶导数时需要设置为True
    • create_graph (bool, optional):表示是否需要将梯度将会加入到计算图中,当计算高阶导数或者其他计算时会将其设置为需要设置为True
    • allow_unused (bool, optional):表示是否只返回输入的梯度,而不返回其他叶子节点的梯度

    2 实例讲解

    以下给出了具体的二阶导数解析解的数学实例

    给定一个向量 x = ( x 1 , x 2 ) ⊤ {\bf{x}}=(x_1,x_2)^{\top} x=(x1,x2),可以得到向量 y = ( y 1 , y 2 ) ⊤ = ( x 1 2 , x 2 2 ) ⊤ {\bf{y}}=(y_1,y_2)^{\top}=(x^2_1,x^2_2)^{\top} y=(y1,y2)=(x12,x22)。对向量 y {\bf{y}} y的元素求平均可以得到损失函数 l o s s 1 \mathrm{loss}_1 loss1为: l o s s 1 ( x ) = m e a n ( y ) = x 1 2 + x 2 2 2 \mathrm{loss}_1({\bf{x}})=\mathrm{mean}({\bf{y}})=\frac{x_1^2+x^2_2}{2} loss1(x)=mean(y)=2x12+x22向量 y {\bf{y}} y元素的分量分别对 x {\bf{x}} x求偏导,然后相加求平均得到损失函数 l o s s 2 \mathrm{loss}_2 loss2 { h 1 ( x ) = ∂ y 1 ∂ x = ( 2 x 1 , 0 ) ⊤ h 2 ( x ) = ∂ y 2 ∂ x = ( 0 , 2 x 2 ) ⊤ , l o s s 2 ( x ) = m e a n ( h 1 ( x 1 ) − h 2 ( x 2 ) ) = x 1 − x 2 \left\{h1(x)=y1x=(2x1,0)h2(x)=y2x=(0,2x2)

    \right.,\quad \mathrm{loss}_2({\bf{x}})=\mathrm{mean}(h_1({\bf{x}}_1)-h_2({\bf{x}}_2))=x_1-x_2 h1(x)h2(x)=xy1=(2x1,0)=xy2=(0,2x2),loss2(x)=mean(h1(x1)h2(x2))=x1x2将损失函数 l o s s 1 \mathrm{loss}_1 loss1与损失函数 l o s s 2 \mathrm{loss}_2 loss2相加可以得到 l o s s ( x ) = l o s s 1 ( x ) + l o s s 2 ( x ) = x 1 2 + x 2 2 2 + x 1 − x 2 \mathrm{loss}({\bf{x}})=\mathrm{loss}_1({\bf{x}})+\mathrm{loss}_2({\bf{x}})=\frac{x_1^2+x_2^2}{2}+x_1-x_2 loss(x)=loss1(x)+loss2(x)=2x12+x22+x1x2最终损失函数 l o s s \mathrm{loss} loss对向量 x {\bf{x}} x的偏导数为 ∂ l o s s ∂ x = ( x 1 + 1 , x 2 − 1 ) ⊤ \frac{\partial {\mathrm{loss}}}{\partial{{\bf{x}}}}=(x_1+1,x_2-1)^{\top} xloss=(x1+1,x21)

    以下为用pytorch实现二阶导数相对应的代码实例:

    import torch
    
    x = torch.tensor([5.0, 7.0], requires_grad=True)
    y = x**2
    
    loss1 = torch.mean(y)
    
    h1 = torch.autograd.grad(y[0], x, retain_graph = True, create_graph=True)
    h2 = torch.autograd.grad(y[1], x, retain_graph = True, create_graph=True)
    loss2 = torch.mean(h1[0] - h2[0])
    
    loss = loss1 + loss2
    
    result = torch.autograd.grad(loss, x)
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    当向量 x {\bf{x}} x取值为 ( 5 , 7 ) ⊤ (5,7)^{\top} (5,7)时,根据数学解析解得到的二阶导数为 ( 6 , 6 ) ⊤ (6,6)^{\top} (6,6),对应的代码运行的实验结果也为 ( 6 , 6 ) (6,6) (6,6)

  • 相关阅读:
    2024.6.17 作业 xyt
    公众号微信网页授权
    【2022版】基于矩阵分解的PCA 白化&ZCA白化
    云原生技术详解
    思维模型 晕轮效应
    数据结构-----串(String)详解
    在CSDN上挣点外快的小tips
    模拟京东快递单号查询 练习
    Linux实用操作-----快捷键的使用(收藏系列)
    建筑模板常见的问题有哪些?
  • 原文地址:https://blog.csdn.net/qq_38406029/article/details/126133345