11 - 向量微分、矩阵微分以及基于雅克比矩阵求导数

2023-11-02 04:38

本文主要是介绍11 - 向量微分、矩阵微分以及基于雅克比矩阵求导数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 手推机器学习-矩阵求导
    • 1.1 绪论
    • 1.2 ML中为什么需要矩阵求导
    • 1.3 向量函数与矩阵求导初印象
    • 1.4 矩阵求导-YX拉伸术
    • 1.5 常见矩阵求导公式举例
    • 1.6 求导细节补充
  • 2. 雅克比矩阵
    • 2.1 雅克比矩阵数学
    • 2.2 雅克比矩阵pytorch
    • 2.3 向量对向量求导&矩阵对矩阵求导
    • 2.4 小结

1. 手推机器学习-矩阵求导

B站链接

1.1 绪论

(1)理论

  • ML中为什么需要矩阵求导
  • 向量函数与矩阵求导初印象
  • 矩阵求导-YX拉伸术

(2)实战

  • 常见矩阵求导公式举例
  • 矩阵求导补充
  • 最小二乘法

1.2 ML中为什么需要矩阵求导

  • 向量化的数据会让计算变得简单
    对于一个方程组来说
    y 1 = W 1 x 11 + W 2 x 12 y_1=W_{1}x_{11}+W_2x_{12} y1=W1x11+W2x12
    y 2 = W 1 x 21 + W 2 x 22 y_2=W_{1}x_{21}+W_2x_{22} y2=W1x21+W2x22

向量化后可以简写为
[ y 1 y 2 ] = [ x 11 x 12 x 21 x 22 ] [ W 1 W 2 ] (1) \begin{bmatrix} y_1\\\\y_2\end{bmatrix}=\begin{bmatrix}x_{11}&x_{12}\\\\x_{21}&x_{22}\end{bmatrix}\begin{bmatrix}W_1\\\\W_2\end{bmatrix}\tag{1} y1y2=x11x21x12x22W1W2(1)
Y = X W (2) Y=XW\tag{2} Y=XW(2)
由上可以看出,不管我们的怎么增加x,y,w我们都可以用公式2进行表示,那么我们就可以看出来
for 循环和numpy矩阵运算

  • 向量化计算运算快

我们来对同样一组数据进行比较处理,看看for循环与numpy的矩阵

# -*- coding: utf-8 -*-
# @Project: zc
# @Author: zc
# @File name: numpy_new_test
# @Create time: 2022/3/16 18:43
import numpy as np
import timea = np.random.rand(10000000)
b = np.random.rand(10000000)
time_cur = time.time()
c = a.dot(b)
time_later = time.time()
print(f"c={c}")
vec_time = 1000 * (time_later - time_cur)
print("vectorized is " + str(vec_time) + "ms")
print()
c = 0
time_cur = time.time()
for i in range(a.size):c += a[i] * b[i]
time_later = time.time()
print(f"c={c}")
loop_time = 1000 * (time_later - time_cur)
print("Loop is " + str(loop_time) + "ms")
print()
print("times is " + str(loop_time / vec_time))
# 矢量化的时间-用 numpy 计算
c=2499945.9800939467
vectorized is 7.472991943359375ms# for循环的时间-用for 计算
c=2499945.9800934764
Loop is 3543.708086013794ms# numpy 居然比 for 循环块474倍
times is 474.2020482388974

1.3 向量函数与矩阵求导初印象

  • 标量函数:输出为标量的函数
    f ( x ) = x 2 ; x ∈ R ; f ( x ) = x 2 ∈ R f(x)=x^2;x\in R;f(x)=x^2\in R f(x)=x2;xR;f(x)=x2R
    f ( x ) = x 1 2 + x 2 2 ; x = [ x 1 , x 2 ] ∈ R 2 , f ( x ) = x 1 2 + x 2 2 ∈ R (3) f(x)=x_1^2+x_2^2;x=[x_1,x_2]\in R^2,f(x)=x_1^2+x_2^2 \in R\tag{3} f(x)=x12+x22;x=[x1,x2]R2,f(x)=x12+x22R(3)
  • 输入标量;输出矩阵函数
    f ( x ) = [ f 1 ( x ) = x f 2 ( x ) = x 2 ] ; x ∈ R ; [ f 1 ( x ) f 2 ( x ) ] ∈ R 2 (4) f(x)=\begin{bmatrix}f_1(x)=x\\\\f_2(x)=x^2\end{bmatrix};x\in R;\begin{bmatrix}f_1(x)\\\\f_2(x)\end{bmatrix}\in R^2\tag{4} f(x)=f1(x)=xf2(x)=x2;xR;f1(x)f2(x)R2(4)
    f ( x ) = [ f 11 ( x ) = x f 12 ( x ) = x 2 f 21 ( x ) = x 3 f 22 ( x ) = x 4 ] ; x ∈ R ; [ f 11 ( x ) f 12 ( x ) f 12 ( x ) f 22 ( x ) ] ∈ R 4 (5) f(x)=\begin{bmatrix}f_{11}(x)=x&f_{12}(x)=x^2\\\\f_{21}(x)=x^3&f_{22}(x)=x^4\end{bmatrix};x\in R;\begin{bmatrix}f_{11}(x)&f_{12}(x)\\\\f_{12}(x)&f_{22}(x)\end{bmatrix}\in R^4\tag{5} f(x)=f11(x)=xf21(x)=x3f12(x)=x2f22(x)=x4;xR;f11(x)f12(x)f12(x)f22(x)R4(5)
  • 输入矩阵,输出矩阵函数
    f ( x 1 , x 2 ) = [ f 11 ( x ) = x 1 + x 2 f 12 ( x ) = x 1 2 + x 2 2 f 21 ( x ) = x 1 3 + x 2 3 f 22 ( x ) = x 1 4 + x 2 4 ] ; x ∈ R 2 ; [ f 11 ( x ) f 12 ( x ) f 12 ( x ) f 22 ( x ) ] ∈ R 4 (6) f(x_1,x_2)=\begin{bmatrix}f_{11}(x)=x_1+x_2&f_{12}(x)=x_1^2+x_2^2\\\\f_{21}(x)=x_1^3+x_2^3&f_{22}(x)=x_1^4+x_2^4\end{bmatrix};x\in R^2;\begin{bmatrix}f_{11}(x)&f_{12}(x)\\\\f_{12}(x)&f_{22}(x)\end{bmatrix}\in R^4\tag{6} f(x1,x2)=f11(x)=x1+x2f21(x)=x13+x23f12(x)=x12+x22f22(x)=x14+x24;xR2;f11(x)f12(x)f12(x)f22(x)R4(6)
  • 求导的本质
    ∂ A ∂ B = ? : 指 的 是 每 一 个 来 自 A 的 元 素 对 每 一 个 自 B 的 元 素 求 导 \frac{\partial A}{\partial B}=?:指的是每一个来自A的元素对每一个自B的元素求导 BA=?AB

1.4 矩阵求导-YX拉伸术

  • 标量不变,向量拉伸
  • 前面横向拉,后面纵向拉(YX:Y在前-横向拉,X在后-纵向拉)
    (1)假设 f ( x ) f(x) f(x)为标量,x为向量;我们可以得到如下:
    f ( x 1 , x 2 , . . . , x n ) = x 1 + x 2 , . . . , + x n (7) f(x_1,x_2,...,x_n)=x_1+x_2,...,+x_n\tag{7} f(x1,x2,...,xn)=x1+x2,...,+xn(7)
    x = [ x 1 , x 2 , . . . , x n ] T (8) x=[x_1,x_2,...,x_n]^T\tag{8} x=[x1,x2,...,xn]T(8)
    保证标量f(x)不变,向量x拉伸, ∂ f ( x ) ∂ x \frac{\partial f(x)}{\partial x} xf(x)-> YX;X在后面,所以纵向拉,f(x)标量不变;可得如下
    ∂ f ( x ) ∂ x = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] (9) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}\frac{\partial f(x)}{\partial x_1}\\\\\frac{\partial f(x)}{\partial x_2}\\\vdots\\\frac{\partial f(x)}{\partial x_n}\end{bmatrix}\tag{9} xf(x)=x1f(x)x2f(x)xnf(x)(9)
    (2)假设 f ( x ) f(x) f(x)是向量,x是标量;由于x是标量,所以不变;由于YX中Y在前,所以Y得横向拉;我们可以得到如下:
    f ( x ) = [ f 1 ( x ) f 2 ( x ) ⋮ f n ( x ) ] (10) f(x)=\begin{bmatrix}f_1(x)\\\\f_2(x)\\\vdots\\f_n(x)\end{bmatrix}\tag{10} f(x)=f1(x)f2(x)fn(x)(10)
  • 标量X不变,Y=f(x)在前横向拉:
    ∂ f ( x ) ∂ x = [ ∂ f 1 ( x ) ∂ x , ∂ f 2 ( x ) ∂ x , . . . , ∂ f n ( x ) ∂ x ] (11) \frac{\partial f(x)}{\partial x}=[\frac{\partial f_1(x)}{\partial x},\frac{\partial f_2(x)}{\partial x},...,\frac{\partial f_n(x)}{\partial x}]\tag{11} xf(x)=[xf1(x),xf2(x),...,xfn(x)](11)
    (3)假设 f ( x ) f(x) f(x)是向量函数,x是向量
    f ( x ) = [ f 1 ( x ) f 2 ( x ) ⋮ f n ( x ) ] ; x = [ x 1 x 2 ⋮ x n ] ; (12) f(x)=\begin{bmatrix}f_1(x)\\\\f_2(x)\\\vdots\\f_n(x)\end{bmatrix};x=\begin{bmatrix}x_1\\\\x_2\\\vdots\\x_n\end{bmatrix};\tag{12} f(x)=f1(x)f2(x)fn(x);x=x1x2xn;(12)
  • 先拉伸X,因为YX中X在后面,所以X在后-纵向拉, f ( x ) f(x) f(x)先保持不变
    ∂ f ( x ) ∂ x = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] (13) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}\frac{\partial f(x)}{\partial x_1}\\\\\\\frac{\partial f(x)}{\partial x_2}\\\vdots\\\\\frac{\partial f(x)}{\partial x_n}\end{bmatrix}\tag{13} xf(x)=x1f(x)x2f(x)xnf(x)(13)
  • 在拉伸 Y = f ( x ) Y=f(x) Y=f(x);Y在前-横向拉
    ∂ f ( x ) ∂ x = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] = [ ∂ f 1 ( x ) ∂ x 1 ∂ f 2 ( x ) ∂ x 1 … ∂ f n ( x ) ∂ x 1 ∂ f 1 ( x ) ∂ x 2 ∂ f 2 ( x ) ∂ x 2 … ∂ f n ( x ) ∂ x 2 ⋮ ⋮ ⋮ ⋮ ∂ f 1 ( x ) ∂ x n ∂ f 2 ( x ) ∂ x n … ∂ f n ( x ) ∂ x n ] (14) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}\frac{\partial f(x)}{\partial x_1}\\\\\\\frac{\partial f(x)}{\partial x_2}\\\vdots\\\\\frac{\partial f(x)}{\partial x_n}\end{bmatrix}=\begin{bmatrix}\frac{\partial f_1(x)}{\partial x_1}&\frac{\partial f_2(x)}{\partial x_1}&\dots&\frac{\partial f_n(x)}{\partial x_1} \\\\\\\frac{\partial f_1(x)}{\partial x_2}&\frac{\partial f_2(x)}{\partial x_2}&\dots&\frac{\partial f_n(x)}{\partial x_2}\\\vdots&\vdots&\vdots&\vdots\\\\\frac{\partial f_1(x)}{\partial x_n}&\frac{\partial f_2(x)}{\partial x_n}&\dots&\frac{\partial f_n(x)}{\partial x_n}\end{bmatrix}\tag{14} xf(x)=x1f(x)x2f(x)xnf(x)=x1f1(x)x2f1(x)xnf1(x)x1f2(x)x2f2(x)xnf2(x)x1fn(x)x2fn(x)xnfn(x)(14)

1.5 常见矩阵求导公式举例

(1) f ( x ) f(x) f(x)是标量,x是向量
f ( x ) = A T X (15) f(x)=A^TX\tag{15} f(x)=ATX(15)
A = [ a 1 , a 2 , . . . , a n ] T ; X = [ x 1 , x 2 , . . . , x n ] T (16) A=[a_1,a_2,...,a_n]^T;X=[x_1,x_2,...,x_n]^T\tag{16} A=[a1,a2,...,an]T;X=[x1,x2,...,xn]T(16)

  • 因为f(x)为标量,所以标量不变,YX的X在后面,所以X纵向拉伸,故可得如下
    ∂ f ( x ) ∂ x = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] (17) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}\frac{\partial f(x)}{\partial x_1}\\\\\frac{\partial f(x)}{\partial x_2}\\\ \vdots\\\frac{\partial f(x)}{\partial x_n}\end{bmatrix}\tag{17} xf(x)=x1f(x)x2f(x) xnf(x)(17)
  • 由于 f ( x ) = ∑ i = 1 n ∑ j = 1 n a i x j f(x)=\sum_{i=1}^n\sum_{j=1}^na_ix_j f(x)=i=1nj=1naixj;所以可得偏导如下:
    ∂ f ( x ) ∂ x i = a i (18) \frac{\partial f(x)}{\partial x_i}=a_i\tag{18} xif(x)=ai(18)
  • 故导数可得如下:
    ∂ f ( x ) ∂ x = [ a 1 a 2 ⋮ a n ] = A (19) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}a_1\\\\a_2\\\ \vdots\\a_n\end{bmatrix}=A\tag{19} xf(x)=a1a2 an=A(19)
    (2)f(x)是二次型,x是列向量
    f ( x ) = X T A X = ∑ i = 1 n ∑ j = 1 n a i j x i x j (20) f(x)=X^TAX=\sum_{i=1}^n\sum_{j=1}^na_{ij}x_ix_j\tag{20} f(x)=XTAX=i=1nj=1naijxixj(20)
    X = [ x 1 , x 2 , . . . , x n ] T ; A = [ a 11 a 12 … a 1 n a 21 a 22 … a 2 n ⋮ ⋮ … ⋮ a n 1 a n 2 … a n n ] (21) X=[x_1,x_2,...,x_n]^T;A=\begin{bmatrix}a_{11}&a_{12}&\dots&a_{1n}\\a_{21}&a_{22}&\dots&a_{2n}\\\vdots&\vdots&\dots&\vdots\\a_{n1}&a_{n2}&\dots&a_{nn} \end{bmatrix}\tag{21} X=[x1,x2,...,xn]T;A=a11a21an1a12a22an2a1na2nann(21)
  • f(x)是标量,YX中X纵向拉伸
    ∂ f ( x ) ∂ x = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 ⋮ ∂ f ( x ) ∂ x n ] = [ ∑ j = 1 n a 1 j x j + ∑ i = 1 n a i 1 x i ∑ j = 1 n a 2 j x j + ∑ i = 1 n a i 2 x i ⋮ ∑ j = 1 n a n j x j + ∑ i = 1 n a i n x i ] (22) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}\frac{\partial f(x)}{\partial x_1}\\\\\frac{\partial f(x)}{\partial x_2}\\\\\vdots\\\\\frac{\partial f(x)}{\partial x_n}\\\end{bmatrix}=\begin{bmatrix}\sum_{j=1}^na_{1j}x_j+\sum_{i=1}^na_{i1}x_i\\\\\sum_{j=1}^na_{2j}x_j+\sum_{i=1}^na_{i2}x_i\\\\\vdots\\\\\sum_{j=1}^na_{nj}x_j+\sum_{i=1}^na_{in}x_i\\\end{bmatrix}\tag{22} xf(x)=x1f(x)x2f(x)xnf(x)=j=1na1jxj+i=1nai1xij=1na2jxj+i=1nai2xij=1nanjxj+i=1nainxi(22)
    ∂ f ( x ) ∂ x = [ ∑ j = 1 n a 1 j x j ∑ j = 1 n a 2 j x j ⋮ ∑ j = 1 n a n j x j ] + [ ∑ i = 1 n a i 1 x i ∑ i = 1 n a i 2 x i ⋮ ∑ i = 1 n a i n x i ] (23) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}\sum_{j=1}^na_{1j}x_j\\\\\sum_{j=1}^na_{2j}x_j\\\\\vdots\\\\\sum_{j=1}^na_{nj}x_j\\\end{bmatrix}+\begin{bmatrix}\sum_{i=1}^na_{i1}x_i\\\\\sum_{i=1}^na_{i2}x_i\\\\\vdots\\\\\sum_{i=1}^na_{in}x_i\\\end{bmatrix}\tag{23} xf(x)=j=1na1jxjj=1na2jxjj=1nanjxj+i=1nai1xii=1nai2xii=1nainxi(23)
    ∂ f ( x ) ∂ x = [ ∑ j = 1 n a 1 j x j ∑ j = 1 n a 2 j x j ⋮ ∑ j = 1 n a n j x j ] + [ ∑ i = 1 n a i 1 x i ∑ i = 1 n a i 2 x i ⋮ ∑ i = 1 n a i n x i ] (24) \frac{\partial f(x)}{\partial x}=\begin{bmatrix}\sum_{j=1}^na_{1j}x_j\\\\\sum_{j=1}^na_{2j}x_j\\\\\vdots\\\\\sum_{j=1}^na_{nj}x_j\\\end{bmatrix}+\begin{bmatrix}\sum_{i=1}^na_{i1}x_i\\\\\sum_{i=1}^na_{i2}x_i\\\\\vdots\\\\\sum_{i=1}^na_{in}x_i\\\end{bmatrix}\tag{24} xf(x)=j=1na1jxjj=1na2jxjj=1nanjxj+i=1nai1xii=1nai2xii=1nainxi(24)
    [ ∑ j = 1 n a 1 j x j ∑ j = 1 n a 2 j x j ⋮ ∑ j = 1 n a n j x j ] = [ a 11 a 12 … a 1 n a 21 a 22 … a 2 n ⋮ ⋮ … ⋮ a n 1 a n 2 … a n n ] [ x 1 x 2 ⋮ x n ] = A X (25) \begin{bmatrix}\sum_{j=1}^na_{1j}x_j\\\\\sum_{j=1}^na_{2j}x_j\\\\\vdots\\\\\sum_{j=1}^na_{nj}x_j\\\end{bmatrix}=\begin{bmatrix}a_{11}&a_{12}&\dots&a_{1n}\\a_{21}&a_{22}&\dots&a_{2n}\\\vdots&\vdots&\dots&\vdots\\a_{n1}&a_{n2}&\dots&a_{nn} \end{bmatrix}\begin{bmatrix}x_1\\\\x_2\\\\\vdots\\\\x_n\end{bmatrix}=AX\tag{25} j=1na1jxjj=1na2jxjj=1nanjxj=a11a21an1a12a22an2a1na2nannx1x2xn=AX(25)
    [ ∑ i = 1 n a i 1 x i ∑ i = 1 n a i 2 x i ⋮ ∑ i = 1 n a i n x i ] = [ a 11 a 21 … a n 1 a 12 a 22 … a n 2 ⋮ ⋮ … ⋮ a 1 n a 2 n … a n n ] [ x 1 x 2 ⋮ x n ] = A T X (26) \begin{bmatrix}\sum_{i=1}^na_{i1}x_i\\\\\sum_{i=1}^na_{i2}x_i\\\\\vdots\\\\\sum_{i=1}^na_{in}x_i\\\end{bmatrix}=\begin{bmatrix}a_{11}&a_{21}&\dots&a_{n1}\\a_{12}&a_{22}&\dots&a_{n2}\\\vdots&\vdots&\dots&\vdots\\a_{1n}&a_{2n}&\dots&a_{nn} \end{bmatrix}\begin{bmatrix}x_1\\\\x_2\\\\\vdots\\\\x_n\end{bmatrix}=A^TX\tag{26} i=1nai1xii=1nai2xii=1nainxi=a11a12a1na21a22a2nan1an2annx1x2xn=ATX(26)
    ∂ f ( x ) ∂ x = ∂ ( X T A X ) ∂ x = A X + A T X = ( A + A T ) X (27) \frac{\partial f(x)}{\partial x}=\frac{\partial (X^TAX)}{\partial x}=AX+A^TX=(A+A^T)X\tag{27} xf(x)=x(XTAX)=AX+ATX=(A+AT)X(27)
  • 当A为对称矩阵时,满足 A T = A A^T=A AT=A那么上式可得:
    ∂ f ( x ) ∂ x = ∂ ( X T A X ) ∂ x = A X + A T X = 2 A X (28) \frac{\partial f(x)}{\partial x}=\frac{\partial (X^TAX)}{\partial x}=AX+A^TX=2AX\tag{28} xf(x)=x(XTAX)=AX+ATX=2AX(28)

1.6 求导细节补充

分子布局和分母布局的区别:
详见知乎大佬链接:分子分母布局说明
在这里插入图片描述
在这里插入图片描述

  • 分母布局- YX拉伸术;分子布局-XY拉伸术;X在前面就像分数的X/Y就是分子布局,X在后面就像分数的Y/X就是分母布局
  • 区别:向量求导拉伸方向的区别;拉伸方向的口诀是不变的:
  • 口诀:前面横向拉,后面纵向拉

2. 雅克比矩阵

2.1 雅克比矩阵数学

雅克比矩阵就是在向量y关于向量x的偏导数组成的矩阵;本质是y中的每个元素关于x中每个元素求偏导
y = [ y 1 , y 2 , . . , y m ] ; x = [ x 1 , x 2 , . . . , x n ] y=[y_1,y_2,..,y_m];x=[x_1,x_2,...,x_n] y=[y1,y2,..,ym];x=[x1,x2,...,xn]
∂ y ∂ x = [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 … ∂ y 1 ∂ x n ∂ y 2 ∂ x 1 ∂ y 2 ∂ x 2 … ∂ y 2 ∂ x n ⋮ ⋮ ⋮ ⋮ ∂ y n ∂ x 1 ∂ y n ∂ x 2 … ∂ y n ∂ x n ] \frac{\partial y}{\partial x}=\begin{bmatrix}\frac{\partial y_1}{\partial x_1}&\frac{\partial y_1}{\partial x_2}&\dots &\frac{\partial y_1}{\partial x_n}\\\\\frac{\partial y_2}{\partial x_1}&\frac{\partial y_2}{\partial x_2}&\dots &\frac{\partial y_2}{\partial x_n}\\\\\vdots&\vdots&\vdots&\vdots\\\\\frac{\partial y_n}{\partial x_1}&\frac{\partial y_n}{\partial x_2}&\dots &\frac{\partial y_n}{\partial x_n}\end{bmatrix} xy=x1y1x1y2x1ynx2y1x2y2x2ynxny1xny2xnyn

2.2 雅克比矩阵pytorch

jacobian
pytorch中主要是向量对向量之间的jacobian求导
我们定义x,y,如下:
x = [ 0 1 2 3 ] ; y = x 2 ; y = [ 0 1 4 9 ] x=\begin{bmatrix}0&1&2&3\end{bmatrix};y=x^2;y=\begin{bmatrix}0&1&4&9\end{bmatrix} x=[0123];y=x2;y=[0149]
∂ y ∂ x = [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ∂ y 1 ∂ x 3 ∂ y 1 ∂ x 4 ∂ y 2 ∂ x 1 ∂ y 2 ∂ x 2 ∂ y 2 ∂ x 3 ∂ y 2 ∂ x 4 ∂ y 3 ∂ x 1 ∂ y 3 ∂ x 2 ∂ y 3 ∂ x 3 ∂ y 3 ∂ x 4 ∂ y 4 ∂ x 1 ∂ y 4 ∂ x 2 ∂ y 4 ∂ x 3 ∂ y 4 ∂ x 4 ] = [ 2 x 1 0 0 0 0 2 x 2 0 0 0 0 2 x 3 0 0 0 0 2 x 4 ] = [ 0 0 0 0 0 2 0 0 0 0 4 0 0 0 0 6 ] \frac{\partial y}{\partial x}=\begin{bmatrix}\frac{\partial y_1}{\partial x_1}&\frac{\partial y_1}{\partial x_2}&\frac{\partial y_1}{\partial x_3}&\frac{\partial y_1}{\partial x_4}\\\\\frac{\partial y_2}{\partial x_1}&\frac{\partial y_2}{\partial x_2}&\frac{\partial y_2}{\partial x_3}&\frac{\partial y_2}{\partial x_4}\\\\\frac{\partial y_3}{\partial x_1}&\frac{\partial y_3}{\partial x_2}&\frac{\partial y_3}{\partial x_3}&\frac{\partial y_3}{\partial x_4}\\\\\frac{\partial y_4}{\partial x_1}&\frac{\partial y_4}{\partial x_2}&\frac{\partial y_4}{\partial x_3}&\frac{\partial y_4}{\partial x_4}\end{bmatrix}=\begin{bmatrix}2x_1&0&0&0\\\\0&2x_2&0&0\\\\0&0&2x_3&0\\\\0&0&0&2x_4\end{bmatrix}=\begin{bmatrix}0&0&0&0\\\\0&2&0&0\\\\0&0&4&0\\\\0&0&0&6\end{bmatrix} xy=x1y1x1y2x1y3x1y4x2y1x2y2x2y3x2y4x3y1x3y2x3y3x3y4x4y1x4y2x4y3x4y4=2x100002x200002x300002x4=0000020000400006

  • 代码:
import torch
from torch import nndef f(x):return x.pow(2)x = torch.arange(4,dtype=torch.float)
y = f(x)
print(f"x={x}")
print(f"x.shape={x.shape}")
print(f"y={y}")
print(f"y.shape={y.shape}")
jabobian_x = torch.autograd.functional.jacobian(f, x)
print(f"jabobian_x.shape={jabobian_x.shape}")
print(f"jabobian_x={jabobian_x}")
x=tensor([0., 1., 2., 3.])
x.shape=torch.Size([4])
y=tensor([0., 1., 4., 9.])
y.shape=torch.Size([4])
jabobian_x.shape=torch.Size([4, 4])
jabobian_x=tensor([[0., 0., 0., 0.],[0., 2., 0., 0.],[0., 0., 4., 0.],[0., 0., 0., 6.]])

2.3 向量对向量求导&矩阵对矩阵求导

pytorch中对于反向传播来说,有两种计算方式,第一种是用backward进行计算,另外一种是用 v T @ j a c o b i a n v^T@jacobian vT@jacobian

import torch
from torch import nn
from torch.autograd.functional import jacobian# 1.向量a对向量b的求导backward
a = torch.randn(3, requires_grad=True)
b = torch.randn(3, requires_grad=True)def func(a):return a + by = func(a)
y.backward(torch.ones_like(y))
a_grad = a.grad
print(f"a_grad={a_grad}")
# 2.向量a对向量b的求导jacobianjacobian_a = torch.ones_like(func(a)) @ jacobian(func, a)
print(f"jacobian_a={jacobian_a}")
# 3.矩阵m对矩阵n的求导backward
m = torch.randn((2, 3), requires_grad=True)
n = torch.randn((3, 2), requires_grad=True)
z = m @ n
z.backward(torch.ones_like(z))
m_grad = m.grad
n_grad = n.grad
print(f"m_grad={m_grad}")
print(f"n_grad={n_grad}")# 4.矩阵m对矩阵n的求导jacobian
def func_m(m):return m @ njacobian_m = torch.ones_like(func_m(m[0])) @ jacobian(func_m, m[0])
print(f"jacobian_m={jacobian_m}")
a_grad=tensor([1., 1., 1.])
jacobian_a=tensor([1., 1., 1.])
m_grad=tensor([[ 1.3068,  1.3378, -1.5509],[ 1.3068,  1.3378, -1.5509]])
n_grad=tensor([[-1.4083, -1.4083],[-2.3474, -2.3474],[ 0.6330,  0.6330]])
jacobian_m=tensor([ 1.3068,  1.3378, -1.5509])

2.4 小结

(1)通过上述代码我们发现一个问题,我们求解一个参数的导数,不仅仅可以用y.backward得到x.grad;还可以通过jacobianv的积来得到;
(2)矩阵A对矩阵B的求导可以将矩阵A按行拆分成向量,再通过jacobian来得到导数;

这篇关于11 - 向量微分、矩阵微分以及基于雅克比矩阵求导数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328164

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

8. 自然语言处理中的深度学习:从词向量到BERT

引言 深度学习在自然语言处理(NLP)领域的应用极大地推动了语言理解和生成技术的发展。通过从词向量到预训练模型(如BERT)的演进,NLP技术在机器翻译、情感分析、问答系统等任务中取得了显著成果。本篇博文将探讨深度学习在NLP中的核心技术,包括词向量、序列模型(如RNN、LSTM),以及BERT等预训练模型的崛起及其实际应用。 1. 词向量的生成与应用 词向量(Word Embedding)

用Python实现时间序列模型实战——Day 14: 向量自回归模型 (VAR) 与向量误差修正模型 (VECM)

一、学习内容 1. 向量自回归模型 (VAR) 的基本概念与应用 向量自回归模型 (VAR) 是多元时间序列分析中的一种模型,用于捕捉多个变量之间的相互依赖关系。与单变量自回归模型不同,VAR 模型将多个时间序列作为向量输入,同时对这些变量进行回归分析。 VAR 模型的一般形式为: 其中: ​ 是时间  的变量向量。 是常数向量。​ 是每个时间滞后的回归系数矩阵。​ 是误差项向量,假

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵,二次型函数,及其相关的解析证明过程和各个过程的可视化几何解释(深蓝色字体)。 非常喜欢清华大学张颢老师说过的一段话:如果你不能用可视化的方式看到事情的结果,那么你就很难对这个事情有认知,认知就是直觉,解析的东西可以让你理解,但未必能让你形成直觉,因为他太反直觉了。 正定矩阵 定义 给定一个大小为 n×n 的实对称矩阵 A ,若对于任意长度为 n 的非零向量 ,有 恒成

python科学计算:NumPy 线性代数与矩阵操作

1 NumPy 中的矩阵与数组 在 NumPy 中,矩阵实际上是一种特殊的二维数组,因此几乎所有数组的操作都可以应用到矩阵上。不过,矩阵运算与一般的数组运算存在一定的区别,尤其是在点积、乘法等操作中。 1.1 创建矩阵 矩阵可以通过 NumPy 的 array() 函数创建。矩阵的形状可以通过 shape 属性来访问。 import numpy as np# 创建一个 2x3 矩阵mat

【UVA】10003-Cutting Sticks(动态规划、矩阵链乘)

一道动态规划题,不过似乎可以用回溯水过去,回溯的话效率很烂的。 13988658 10003 Cutting Sticks Accepted C++ 1.882 2014-08-04 09:26:49 AC代码: #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include