给定一个向量
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\{\begin{aligned}h_1({\bf{x}})&=\frac{\partial y_1}{\partial {\bf{x}}}=(2x_1,0)^{\top}\\h_2({\bf{x}})&=\frac{\partial y_2}{\partial {\bf{x}}}=(0,2x_2)^{\top}\end{aligned}\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)=∂x∂y1=(2x1,0)⊤=∂x∂y2=(0,2x2)⊤,loss2(x)=mean(h1(x1)−h2(x2))=x1−x2将损失函数
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+x1−x2最终损失函数
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}
∂x∂loss=(x1+1,x2−1)⊤
以下为用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)