文章目录
1. 手推机器学习-矩阵求导
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⎦⎤=⎣⎡x11x21x12x22⎦⎤⎣⎡W1W2⎦⎤(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 time
a = 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;x∈R;f(x)=x2∈R
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+x22∈R(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⎦⎤;x∈R;⎣⎡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⎦⎤;x∈R;⎣⎡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⎦⎤;x∈R2;⎣⎡f11(x)f12(x)f12(x)f22(x)⎦⎤∈R4(6) - 求导的本质
∂ A ∂ B = ? : 指 的 是 每 一 个 来 自 A 的 元 素 对 每 一 个 自 B 的 元 素 求 导 \frac{\partial A}{\partial B}=?:指的是每一个来自A的元素对每一个自B的元素求导 ∂B∂A=?:指的是每一个来自A的元素对每一个自B的元素求导
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} ∂x∂f(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} ∂x∂f(x)=⎣⎢⎢⎢⎢⎢⎢⎡∂x1∂f(x)∂x2∂f(x)⋮∂xn∂f(x)⎦⎥⎥⎥⎥⎥⎥⎤

本文详细解析了机器学习中矩阵求导的必要性,介绍了向量函数的求导概念,包括YX拉伸术实例和常见公式。此外,深入探讨了雅可比矩阵的数学原理、PyTorch实现以及向量与矩阵间的求导技巧,适合理解并应用于深度学习和优化算法中。

2万+

被折叠的 条评论
为什么被折叠?



