首页 > 其他分享 >深度学习 PyTorch 笔记 (1) :预备知识(张量、线代、微分基础)

深度学习 PyTorch 笔记 (1) :预备知识(张量、线代、微分基础)

时间:2024-05-26 19:34:53浏览次数:23  
标签:partial text sum torch 张量 PyTorch mathbf frac 线代

《动手学深度学习》笔记—— (1) 预备知识(张量、线代、微分基础)

教材:https://zh-v2.d2l.ai

文章目录


1 数据操作

1.1 n维数组与张量

N维数组是机器学习和神经网络的主要数据结构

在这里插入图片描述在这里插入图片描述

1.2 初始化

x = torch.arange(10)		# tensor([0,  1,  2,  3,  4,  5,  6,  7,  8,  9])
x = torch.zeros((2, 3, 4))	# 全0
x = torch.ones((2, 3, 4))	# 全1
x = torch.randn(3, 4)		# 均值为0、标准差为1的标准正态分布
x = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])	# 根据(嵌套)列表为每个元素赋确定值

# 查看形状
x.shape		# 返回形状类:torch.Size(维度张量)
x.shape[0]	# 获取维度张量

# 获取元素个数
x.numel()	# 计算张量中元素的总数(维度的乘积)

# 变形
X = x.reshape(3, -1)	# 用-1自动计算维度

1.3 访问元素

在这里插入图片描述

X[-1]		# 选择最后一个元素
X[1:3]		# 选择索引在[1, 3)上的元素(左开右闭,右-左 为切片长度,下同)

X[1, 2] = 9		# 指定索引写入元素
X[0:2, :] = 12	# 在索引0~1行批量写入元素

1.5 运算

# 按元素运算
X + Y, X - Y, X * Y, X / Y, X ** Y		# 所有基本运算符均升级为按元素运算(形状不同则广播,下同)
torch.exp(X)	# 指数运算
X == Y			# 通过逻辑运算符构建二元张量(True / False)

# 连结(dim=x: 沿轴x……)
torch.cat((X, Y), dim=0)	# 沿轴0(行)连结张量(上下拼接)
torch.cat((X, Y), dim=1)	# 沿轴1(列)连结张量(左右拼接)

# 降维函数(详见下文)
X.sum()		# 求和(返回只含1个元素的张量,下同)
X.mean()	# 求平均值

# 与NumPy数组的转换
A = X.numpy()			# 张量转化为n维数组(numpy.ndarray)
B = torch.tensor(A)		# n维数组转化为张量(torch.Tensor)

# 与Python标量的转换
a = torch.tensor([3.7])	# 大小为1的张量 tensor([3.7000])
a.item()				# 调用方法获取元素
float(a), int(a)		# 使用python

2 数据预处理

2.1 创建人工数据集

创建一个人工数据集,存储于csv(逗号分割值)文件中

import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
	f.write('NumRooms, Alley, Price\n')		# 列名
	f.write('NA, Pave, 127500\n')			# 每行表示一个数据样本
	f.write('2, NA, 106000\n')
	f.write('4, NA, 178100\n')
	f.write('NA, NA, 140000\n')

2.2 读取数据集

从创建的csv文件中加载原始数据集

import pandas as pd

data = pd.read_csv(data_file)	# pandas读取csv文件
print(data)

2.3 处理缺失数据

# 使用插值法
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())			# 填充缺失值为均值(仅适用于数值类型数据)
inputs = pd.get_dummies(inputs, dummy_na=True)	# 视为特征:缺失值 - Alley_nan,Str - Alley

# 所有条目都是数值类型,故可转换成张量
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)

3 线性代数

3.1 标量

  • 按元素操作 c = a + b c = a ⋅ b c = sin ⁡ a c=a+b \\ c=a\cdot b \\ c=\sin a c=a+bc=a⋅bc=sina
  • 长度 ∣ a ∣ = { a  if  a > 0 − a  otherwise  ∣ a + b ∣ ≤ ∣ a ∣ + ∣ b ∣ ∣ a ⋅ b ∣ = ∣ a ∣ ⋅ ∣ b ∣ |a|=\begin{cases} a & \text{ if } a>0 \\ -a & \text{ otherwise } \end{cases} \\ |a+b|≤|a|+|b| \\ |a \cdot b|=|a| \cdot |b| ∣a∣={a−a​ if a>0 otherwise ​∣a+b∣≤∣a∣+∣b∣∣a⋅b∣=∣a∣⋅∣b∣

3.2 向量

  • 按元素操作 c = a + b  where  c i = a i + b i c = α ⋅ b  where  c i = α b i c = sin ⁡ a  where  c i = sin ⁡ a i \begin{align*} c=a+b& \text{ where } c_i=a_i+b_i \\ c=\alpha \cdot b & \text{ where } c_i=\alpha b_i \\ c=\sin a & \text{ where } c_i=\sin a_i \end{align*} c=a+bc=α⋅bc=sina​ where ci​=ai​+bi​ where ci​=αbi​ where ci​=sinai​​
    在这里插入图片描述
  • 长度( L 2 L_2 L2​范数) ∥ a ∥ 2 = [ ∑ i = 1 m a i 2 ] 1 2 ∥ a ∥ ≥ 0  for all  a ∥ α ⋅ b ∥ = ∣ α ∣ ⋅ ∥ b ∥ \left\| a\right\|_2=[\sum_{i=1}^m a_i^2]^{\frac12}\\ \left\| a\right\|≥0 \text{ for all }a\\ \left\| \alpha \cdot b \right\|=|\alpha| \cdot \left\| b\right\| ∥a∥2​=[i=1∑m​ai2​]21​∥a∥≥0 for all a∥α⋅b∥=∣α∣⋅∥b∥
  • 点积 ⟨ a , b ⟩ = a T b = ∑ i a i b i ⟨ a , b ⟩ = a T b = 0 ⇔ a ⊥ b \left \langle a,b \right \rangle =a^{\text{T}}b=\sum_i a_ib_i \\ \left \langle a,b \right \rangle =a^{\text{T}}b=0 \Leftrightarrow a \bot b ⟨a,b⟩=aTb=i∑​ai​bi​⟨a,b⟩=aTb=0⇔a⊥b

3.3 矩阵

  • 按元素操作 C = A + B  where  C i j = A i j + B i j C = α B  where  C i j = α B i j C = sin ⁡ A  where  C i j = sin ⁡ A i j \begin{align*} C=A+B& \text{ where } C_{ij}=A_{ij}+B_{ij} \\ C=\alpha B & \text{ where } C_{ij}=\alpha B_{ij} \\ C=\sin A & \text{ where } C_{ij}=\sin A_{ij} \end{align*} C=A+BC=αBC=sinA​ where Cij​=Aij​+Bij​ where Cij​=αBij​ where Cij​=sinAij​​
  • 矩阵向量积 c = A b  where  c i = ∑ j A i j b j c=Ab \text{ where } c_i=\sum_j A_{ij}b_j c=Ab where ci​=j∑​Aij​bj​在这里插入图片描述
  • 矩阵乘法 C = A B  where  C i k = ∑ j A i j B j k C=AB \text{ where } C_{ik}=\sum_j A_{ij}B_{jk} C=AB where Cik​=j∑​Aij​Bjk​
  • 范数
    • 矩阵范数:满足 c = A b  hence  ∥ c ∥ ≤ ∥ A ∥ ⋅ ∥ b ∥ c=Ab \text{ hence } \left\| c\right\|≤\left\|A\right\|\cdot\left\| b\right\| c=Ab hence ∥c∥≤∥A∥⋅∥b∥ 的最小值
    • Frobenius范数(更常用) ∥ A ∥ Frob = [ ∑ i j A i j 2 ] 1 2 \left\| A\right\|_{\text{Frob}}=[\sum\limits_{ij}A_{ij}^2]^{\frac12} ∥A∥Frob​=[ij∑​Aij2​]21​
  • 特殊矩阵
    • 对称矩阵、反对称矩阵: A i j = A j i A_{ij}=A_{ji} Aij​=Aji​ 、 A i j = − A j i A_{ij}=-A_{ji} Aij​=−Aji​
    • 正定矩阵: ∥ x ∥ 2 = x T x ≥ 0  generalizes to  x T A x ≥ 0 \left\| x\right\|^2=x^{\text{T}}x≥0 \text{ generalizes to } x^{\text{T}}Ax≥0 ∥x∥2=xTx≥0 generalizes to xTAx≥0
    • 正交矩阵:QQ^T=1
    • 置换矩阵: P  where  P i j = 1  if and only if  j = π ( i ) P \text{ where } P_{ij}=1 \text{ if and only if } j=\pi(i) P where Pij​=1 if and only if j=π(i) 。置换矩阵必正交。
  • 特征向量和特征值: A x = λ x Ax=\lambda x Ax=λx
    • 特征向量:不被矩阵改变方向的向量
      在这里插入图片描述

3.4 PyTorch实现

a = torch.tensor([3.0])
x = torch.arange(10, dtype=torch.float32)
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)	# 5x4的矩阵

len(x)
A.shape

# 转置
A.T

# 深拷贝
B = A.clone()

# 按元素操作
A + B
A * B	# 哈达玛积

# 求和
A.sum()				# 对所有元素求和,降为标量
A.sum(axis=0)		# 沿轴0(行)求和,降为向量(参考连结方法cat())
A.sum(axis=[0, 1])	# 沿轴0、轴1求和,同方法sum()
# 求平均值
A.mean()			# 等价于 A.sum() / A.numel() 
A.mean(axis=0)		# 等价于 A.sum(axis=0) / A.shape[0]
# 保持轴数不变,便于广播
sum_A = A.sum(axis=1, keepdims=True)	# 对每一行求和
A / sum_A			# 每个元素分别除以其所在行元素和
# 累加求和
A.cumsum(axis=0)	# 沿轴0累加求和(形状不变)

# 向量点积
torch.dot(x, y)		# 等价于torch.sum(x * y)

# 矩阵向量积
torch.mv(A, x)

# 矩阵乘法
torch.mm(A, A)

# L2范数:向量元素的平方和的平方根
torch.norm(x)
# L1范数:向量元素的绝对值之和
torch.abs(x).sum()
# Frobenius范数:矩阵元素的平方和的平方根
torch.norm(A)

4 梯度

梯度是一个向量,指向函数变化率最大的方向。

标量 向量 矩阵 x ( 1 , ) x ( n , 1 ) X ( n , k ) 标量 y ( 1 , ) ∂ y ∂ x ( 1 , ) ∂ y ∂ x ( 1 , n ) ∂ y ∂ X ( k , n ) 向量 y ( m , 1 ) ∂ y ∂ x ( m , 1 ) ∂ y ∂ x ( m , n ) ∂ y ∂ X ( m , k , n ) 矩阵 Y ( m , l ) ∂ Y ∂ x ( m , l ) ∂ Y ∂ x ( m , l , n ) ∂ Y ∂ X ( m , l , k , n ) \begin{matrix} & & 标量 & 向量 & 矩阵\\ & &x_{(1,)} & \mathbf{x}_{(n,1)} & \mathbf{X}_{(n,k)}\\ 标量 & y_{(1,)} & \frac{\partial y}{\partial x}_{(1,)} & \frac{\partial y}{\partial \mathbf{x} }_{(1,n)} & \frac{\partial y}{\partial \mathbf{X}}_{(k,n)} \\ 向量 & \mathbf{y}_{(m,1)} & \frac{\partial \mathbf{y} }{\partial x}_{(m,1)} & \frac{\partial \mathbf{y} }{\partial \mathbf{x} }_{(m,n)} & \frac{\partial \mathbf{y}}{\partial \mathbf{X}}_{(m,k,n)} \\ 矩阵 & \mathbf{Y}_{(m,l)} & \frac{\partial \mathbf{Y}}{\partial x}_{(m,l)} & \frac{\partial \mathbf{Y}}{\partial \mathbf{x}}_{(m,l,n)} & \frac{\partial \mathbf{Y}}{\partial \mathbf{X}}_{(m,l,k,n)} \end{matrix} 标量向量矩阵​y(1,)​y(m,1)​Y(m,l)​​标量x(1,)​∂x∂y​(1,)​∂x∂y​(m,1)​∂x∂Y​(m,l)​​向量x(n,1)​∂x∂y​(1,n)​∂x∂y​(m,n)​∂x∂Y​(m,l,n)​​矩阵X(n,k)​∂X∂y​(k,n)​∂X∂y​(m,k,n)​∂X∂Y​(m,l,k,n)​​

4.1 标量导数

对于单变量函数,梯度即为导数

y y y a a a x n x^n xn exp ⁡ ( x ) \exp(x) exp(x) log ⁡ ( x ) \log(x) log(x) sin ⁡ ( x ) \sin(x) sin(x)
d y d x \frac{\mathrm{d} y}{\mathrm{d} x} dxdy​ 0 0 0 n x n − 1 nx^{n-1} nxn−1 exp ⁡ ( x ) \exp(x) exp(x) 1 x \frac1x x1​ cos ⁡ ( x ) \cos(x) cos(x)
y y y u + v u+v u+v u v uv uv y = f ( u ) , u = g ( x ) y=f(u),u=g(x) y=f(u),u=g(x)
d y d x \frac{\mathrm{d} y}{\mathrm{d} x} dxdy​ d u d x + d v d x \frac{\mathrm{d} u}{\mathrm{d} x}+\frac{\mathrm{d} v}{\mathrm{d} x} dxdu​+dxdv​ d u d x v + d v d x u \frac{\mathrm{d} u}{\mathrm{d} x}v+\frac{\mathrm{d} v}{\mathrm{d} x}u dxdu​v+dxdv​u d y d u d u d x \frac{\mathrm{d} y}{\mathrm{d} u}\frac{\mathrm{d} u}{\mathrm{d} x} dudy​dxdu​

4.2 标量对向量求导

标量 y y y 对向量 x \mathbf{x} x 的每一个分量求导,组成行向量
x = [ x 1 , x 2 , ⋯   , x n ] T ,   ∂ y ∂ x = [ ∂ y ∂ x 1 , ∂ y ∂ x 2 , ⋯   , ∂ y ∂ x n ] \mathbf{x}=[x_1, x_2, \cdots, x_n]^{\text{T}},\ \frac{\partial y}{\partial \mathbf{x} } =[ \frac{\partial y}{\partial x_1} , \frac{\partial y}{\partial x_2} ,\cdots, \frac{\partial y}{\partial x_n} ] x=[x1​,x2​,⋯,xn​]T, ∂x∂y​=[∂x1​∂y​,∂x2​∂y​,⋯,∂xn​∂y​]

y y y a a a a u au au sum ( x ) \text{sum}(\mathbf{x}) sum(x) ∥ x ∥ 2 \lVert \mathbf{x} \rVert^2 ∥x∥2
∂ y ∂ x \frac{\partial y}{\partial \mathbf{x} } ∂x∂y​ 0 T \mathbf{0}^{\text{T}} 0T a ∂ y ∂ x a\frac{\partial y}{\partial \mathbf{x} } a∂x∂y​ 1 T \mathbf{1}^{\text{T}} 1T 2 x T 2\mathbf{x}^{\text{T}} 2xT
y y y u + v u+v u+v u v uv uv ⟨ u , v ⟩ = u T v \left \langle \mathbf{u} ,\mathbf{v} \right \rangle=\mathbf{u}^{\text{T}}\mathbf{v} ⟨u,v⟩=uTv
∂ y ∂ x \frac{\partial y}{\partial \mathbf{x} } ∂x∂y​ ∂ u ∂ x + ∂ v ∂ x \frac{\partial u}{\partial \mathbf{x}}+\frac{\partial v}{\partial \mathbf{x}} ∂x∂u​+∂x∂v​ ∂ u ∂ x v + ∂ v ∂ x u \frac{\partial u}{\partial \mathbf{x}}v+\frac{\partial v}{\partial \mathbf{x}}u ∂x∂u​v+∂x∂v​u u T ∂ v ∂ x + v T ∂ u ∂ x \mathbf{u}^{\text{T}}\frac{\partial \mathbf{v}}{\partial \mathbf{x}}+\mathbf{v}^{\text{T}}\frac{\partial \mathbf{u}}{\partial \mathbf{x}} uT∂x∂v​+vT∂x∂u​

4.3 向量对标量求导

向量 y \mathbf{y} y 的每一个分量对标量 x x x 求导,组成列向量
y = [ y 1 , y 2 , ⋯   , y m ] T ,   ∂ y ∂ x = [ ∂ y 1 ∂ x , ∂ y 2 ∂ x , ⋯   , ∂ y m ∂ x ] T \mathbf{y}=[y_1, y_2, \cdots, y_m]^{\text{T}},\ \frac{\partial \mathbf{y}}{\partial x} =[ \frac{\partial y_1}{\partial x} , \frac{\partial y_2}{\partial x} ,\cdots, \frac{\partial y_m}{\partial x} ]^{\text{T}} y=[y1​,y2​,⋯,ym​]T, ∂x∂y​=[∂x∂y1​​,∂x∂y2​​,⋯,∂x∂ym​​]T

4.4 向量对向量求导

x = [ x 1 , x 2 , ⋯   , x n ] ,   y = [ y 1 , y 2 , ⋯   , y m ] ∂ y ∂ x = [ ∂ y 1 ∂ x ∂ y 2 ∂ x ⋮ ∂ y m ∂ 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 m ∂ x 1 , ∂ y m ∂ x 2 , ⋯   , ∂ y m ∂ x n ] \mathbf{x}=[x_1,x_2,\cdots,x_n],\ \mathbf{y}=[y_1,y_2,\cdots,y_m]\\ \frac{\partial \mathbf{y} }{\partial \mathbf{x} }=\begin{bmatrix} \frac{\partial y_1}{\partial \mathbf{x} } \\ \frac{\partial y_2}{\partial \mathbf{x} } \\ \vdots \\ \frac{\partial y_m}{\partial \mathbf{x} } \end{bmatrix} =\begin{bmatrix} \frac{\partial y_1}{\partial x_1},\frac{\partial y_1}{\partial x_2},\cdots,\frac{\partial y_1}{\partial x_n} \\ \frac{\partial y_2}{\partial x_1},\frac{\partial y_2}{\partial x_2},\cdots,\frac{\partial y_2}{\partial x_n} \\ \vdots \\ \frac{\partial y_m}{\partial x_1},\frac{\partial y_m}{\partial x_2},\cdots,\frac{\partial y_m}{\partial x_n} \end{bmatrix} x=[x1​,x2​,⋯,xn​], y=[y1​,y2​,⋯,ym​]∂x∂y​= ​∂x∂y1​​∂x∂y2​​⋮∂x∂ym​​​ ​= ​∂x1​∂y1​​,∂x2​∂y1​​,⋯,∂xn​∂y1​​∂x1​∂y2​​,∂x2​∂y2​​,⋯,∂xn​∂y2​​⋮∂x1​∂ym​​,∂x2​∂ym​​,⋯,∂xn​∂ym​​​

y \mathbf{y} y a \mathbf{a} a x \mathbf{x} x A x \mathbf{Ax} Ax x T A \mathbf{x}^{\text{T}}\mathbf{A} xTA
∂ y ∂ x \frac{\partial \mathbf{y} }{\partial \mathbf{x} } ∂x∂y​ 0 \mathbf{0} 0 I \mathbf{I} I A \mathbf{A} A A T \mathbf{A}^{\text{T}} AT
y \mathbf{y} y a u a\mathbf{u} au A u \mathbf{Au} Au u + v \mathbf{u}+\mathbf{v} u+v
∂ y ∂ x \frac{\partial \mathbf{y} }{\partial \mathbf{x} } ∂x∂y​ a ∂ u ∂ x a\frac{\partial \mathbf{u} }{\partial \mathbf{x} } a∂x∂u​ A ∂ u ∂ x \mathbf{A}\frac{\partial \mathbf{u} }{\partial \mathbf{x} } A∂x∂u​ ∂ u ∂ x + ∂ v ∂ x \frac{\partial \mathbf{u} }{\partial \mathbf{x} }+\frac{\partial \mathbf{v} }{\partial \mathbf{x} } ∂x∂u​+∂x∂v​

5 自动微分

5.1 向量链式法则

标量链式法则拓展到向量,可得

∂ y ∂ x ( 1 , n ) = ∂ y ∂ u ( 1 , ) ∂ u ∂ x ( 1 , n ) ,   ∂ y ∂ x ( 1 , n ) = ∂ y ∂ u ( 1 , k ) ∂ u ∂ x ( k , n ) ,   ∂ y ∂ x ( m , n ) = ∂ y ∂ u ( m , k ) ∂ u ∂ x ( k , n ) \frac{\partial y}{\partial \mathbf{x}}_{(1,n)}=\frac{\partial y}{\partial u}_{(1,)}\frac{\partial u}{\partial \mathbf{x} }_{(1,n)},\ \frac{\partial y}{\partial \mathbf{x} }_{(1,n)}=\frac{\partial y}{\partial \mathbf{u} }_{(1,k)}\frac{\partial \mathbf{u} }{\partial \mathbf{x} }_{(k,n)},\ \frac{\partial \mathbf{y} }{\partial \mathbf{x} }_{(m,n)}=\frac{\partial \mathbf{y} }{\partial \mathbf{u} }_{(m,k)}\frac{\partial \mathbf{u} }{\partial \mathbf{x}}_{(k,n)} ∂x∂y​(1,n)​=∂u∂y​(1,)​∂x∂u​(1,n)​, ∂x∂y​(1,n)​=∂u∂y​(1,k)​∂x∂u​(k,n)​, ∂x∂y​(m,n)​=∂u∂y​(m,k)​∂x∂u​(k,n)​

【例1】设 x , w ∈ R n ,   y ∈ R ,   z = ( ⟨ x , w ⟩ − y ) 2 \mathbf{x},\mathbf{w} \in \mathbb{R}^n,\ y\in \mathbb{R},\ z=(\left \langle \mathbf{x},\mathbf{w} \right \rangle -y )^2 x,w∈Rn, y∈R, z=(⟨x,w⟩−y)2 ,求 ∂ z ∂ w \frac{\partial z}{\partial \mathbf{w} } ∂w∂z​
【解】令 a = ⟨ x , w ⟩ ,   b = a − y ,   z = b 2 a=\left \langle \mathbf{x},\mathbf{w} \right \rangle,\ b=a-y,\ z=b^2 a=⟨x,w⟩, b=a−y, z=b2 ,则 ∂ z ∂ w = ∂ z ∂ b ∂ b ∂ a ∂ a ∂ w = ∂ b 2 ∂ b ∂ a − y ∂ a ∂ ⟨ x , w ⟩ ∂ w = 2 b ⋅ 1 ⋅ x T = 2 ( ⟨ x , w ⟩ − y ) x T \begin{align*} \frac{\partial z}{\partial \mathbf{w} } = & \frac{\partial z}{\partial b} \frac{\partial b}{\partial a} \frac{\partial a}{\partial \mathbf{w} } \\ = & \frac{\partial b^2}{\partial b}\frac{\partial a-y}{\partial a}\frac{\partial \left \langle \mathbf{x},\mathbf{w} \right \rangle}{\partial \mathbf{w}}\\ = & 2b \cdot1\cdot \mathbf{x}^{\text{T}} \\ = & 2(\left \langle \mathbf{x},\mathbf{w} \right \rangle -y) \mathbf{x}^{\text{T}} \end{align*} ∂w∂z​====​∂b∂z​∂a∂b​∂w∂a​∂b∂b2​∂a∂a−y​∂w∂⟨x,w⟩​2b⋅1⋅xT2(⟨x,w⟩−y)xT​

【例2】设 X ∈ R m × n ,   w ∈ R n ,   y ∈ R m ,   z = ∥ X w − y ∥ 2 \mathbf{X} \in \mathbb{R}^{m\times n},\ \mathbf{w} \in \mathbb{R}^n,\ \mathbf{y}\in \mathbb{R}^m,\ z=\lVert\mathbf{Xw}-\mathbf{y} \rVert^2 X∈Rm×n, w∈Rn, y∈Rm, z=∥Xw−y∥2 ,求 ∂ z ∂ w \frac{\partial z}{\partial \mathbf{w} } ∂w∂z​
【解】令 a = X w ,   b = a − y ,   z = ∥ b ∥ 2 \mathbf{a}=\mathbf{Xw},\ \mathbf{b}=\mathbf{a}-\mathbf{y},\ z=\lVert \mathbf{b} \rVert^2 a=Xw, b=a−y, z=∥b∥2 ,则 ∂ z ∂ w = ∂ z ∂ b ∂ b ∂ a ∂ a ∂ w = ∂ ∥ b ∥ 2 ∂ b ∂ a − y ∂ a ∂ X w ∂ w = 2 b T × I × X = 2 ( X w − y ) T X \begin{align*} \frac{\partial z}{\partial \mathbf{w} } = & \frac{\partial z}{\partial \mathbf{b} } \frac{\partial \mathbf{b} }{\partial \mathbf{a} } \frac{\partial \mathbf{a} }{\partial \mathbf{w} } \\ = & \frac{\partial \lVert\mathbf{b}\rVert ^2}{\partial \mathbf{b} }\frac{\partial \mathbf{a}-\mathbf{y}}{\partial \mathbf{a} }\frac{\partial \mathbf{Xw} }{\partial \mathbf{w}}\\ = & 2\mathbf{b}^{\text{T}} \times\mathbf{I} \times \mathbf{X} \\ = & 2(\mathbf{Xw} -\mathbf{y} )^{\text{T}}\mathbf{X} \end{align*} ∂w∂z​====​∂b∂z​∂a∂b​∂w∂a​∂b∂∥b∥2​∂a∂a−y​∂w∂Xw​2bT×I×X2(Xw−y)TX​

5.2 自动求导

  • 符号求导 D x [ 4 x 3 + x 2 + 3 ] = 12 x 2 + 2 x D_x[4x^3 + x^2 + 3]=12x^2 +2x Dx​[4x3+x2+3]=12x2+2x
  • 数值求导 ∂ f ( x ) ∂ x = lim ⁡ h → 0 f ( x + h ) − f ( x ) h \frac{\partial f(x)}{\partial x} =\lim_{h \to 0} \frac{f(x+h)-f(x)}{h} ∂x∂f(x)​=h→0lim​hf(x+h)−f(x)​

自动求导计算一个函数在指定值上的导数:1. 将代码分解成操作子;2. 将计算表示成一个无环图(计算图
由链式法则 ∂ y ∂ x = ∂ y ∂ u n ∂ u n ∂ u n − 1 ⋯ ∂ u 2 ∂ u 1 ∂ u 1 ∂ x \frac{\partial y}{\partial x}=\frac{\partial y}{\partial u_n}\frac{\partial u_n}{\partial u_{n-1}}\cdots\frac{\partial u_2}{\partial u_1}\frac{\partial u_1}{\partial x} ∂x∂y​=∂un​∂y​∂un−1​∂un​​⋯∂u1​∂u2​​∂x∂u1​​ 可得自动求导的两种模式:

正向累积(时间复杂度太高,不常用): ∂ y ∂ x = ∂ y ∂ u n ( ∂ u n ∂ u n − 1 ( ⋯ ( ∂ u 2 ∂ u 1 ∂ u 1 ∂ x ) ) ) \frac{\partial y}{\partial x}=\frac{\partial y}{\partial u_n}(\frac{\partial u_n}{\partial u_{n-1}}(\cdots(\frac{\partial u_2}{\partial u_1}\frac{\partial u_1}{\partial x}))) ∂x∂y​=∂un​∂y​(∂un−1​∂un​​(⋯(∂u1​∂u2​​∂x∂u1​​)))

反向累积反向传递,如下图所示): ∂ y ∂ x = ( ( ( ∂ y ∂ u n ∂ u n ∂ u n − 1 ) ⋯   ) ∂ u 2 ∂ u 1 ) ∂ u 1 ∂ x \frac{\partial y}{\partial x}=(((\frac{\partial y}{\partial u_n}\frac{\partial u_n}{\partial u_{n-1}})\cdots)\frac{\partial u_2}{\partial u_1})\frac{\partial u_1}{\partial x} ∂x∂y​=(((∂un​∂y​∂un−1​∂un​​)⋯)∂u1​∂u2​​)∂x∂u1​​
在这里插入图片描述

  • 过程
    1. 构造计算图
    2. 前向:执行图,存储中间结果
    3. 反向:从相反方向执行图(同时去除不需要的枝)

5.3 PyTorch实现

【例1】设函数 y = 2 x T x y=2\mathbf{x}^{\text{T}}\mathbf{x} y=2xTx ,通过自动求导求 ∂ y ∂ x \frac{\partial y}{\partial \mathbf{x} } ∂x∂y​

import torch

# x = torch.arange(4.0)		# tensor([0., 1., 2., 3.])
x = torch.arange(4.0, requires_grad=True)	# 开启梯度存储,用x.grad获取梯度
y = 2 * torch.dot(x, x)		# tensor(28., grad_fn=<MulBackward0>)
y.backward()	# 调用反向传播函数来自动计算标量y关于向量x每个分量的梯度

x.grad
(tensor([0., 4., 8., 12.])

【例2】设函数 y = sum ( x ) y=\text{sum}(\mathbf{x}) y=sum(x) ,通过自动求导求 ∂ y ∂ x \frac{\partial y}{\partial \mathbf{x} } ∂x∂y​

x.grad.zero_()	# PyTorch默认累积梯度,故需清除之前的梯度(以单下划线结尾的函数表示重写内容)
y = x.sum()
y.backward()

x.grad
tensor([1., 1., 1., 1.])

【例3】设函数 y = x ⊙ x \mathbf{y}=\mathbf{x}\odot \mathbf{x} y=x⊙x ,通过自动求导求 ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x} } ∂x∂y​
深度学习中,我们的目的不是计算微分矩阵,而是批量中每个样本单独计算的偏导数之和

非标量调用backward()需要传入一个gradient参数,该参数指定微分函数关于self梯度
本例只想求偏导数的和,所以应传入分量全为 1 1 1 的梯度(由求导公式 ∂ sum ( x ) ∂ x = 1 T \frac{\partial \text{sum}(\mathbf{x} )}{\partial \mathbf{x} } =\mathbf{1}^{\text{T} } ∂x∂sum(x)​=1T 可得)

x.grad_zero_()
y = x * x
y.sum().backward()	# 等价于 y.backward(torch.ones(len(x)))

x.grad
tensor([0., 2., 4., 6.])

【例4】构建如下函数的计算图需经过Python控制流,计算变量的梯度

def f(a):
	b = a * 2
	while b.norm() < 1000:
		b *= 2
	if b.sum() > 0:
		c = b
	else:
		c = 100 * b
	return c


a = torch.randn(size=(), requires_grad=True)
d = f(a)
d.backward()

a.grad == d / a		# d实为关于a的线性函数,因此梯度即为该直线的斜率
tensor(True)

标签:partial,text,sum,torch,张量,PyTorch,mathbf,frac,线代
From: https://blog.csdn.net/Akira37/article/details/139213368

相关文章

  • pytorch环境配置
    1.查看已有的虚拟环境condaenvlist2.创建虚拟环境的名字和python版本condacreate-nnupackpython=3.83.维基百科查看显卡算力以及对应的cuda版本4.查看自己的cuda版本5.找到pytorch历史版本安装代码https://pytorch.org/get-started/previous-versions/6.激活......
  • 深度学习笔记03_pytorch实现天气识别
    ......
  • 使用FP8加速PyTorch训练的两种方法总结
    在PyTorch中,FP8(8-bit浮点数)是一个较新的数据类型,用于实现高效的神经网络训练和推理。它主要被设计来降低模型运行时的内存占用,并加快计算速度,同时尽量保持训练和推理的准确性。虽然PyTorch官方在标准发布中尚未全面支持FP8,但是在2.2版本中PyTorch已经包含了对FP8的“有限支持”并......
  • 从PyTorch到PyTorch Lightning
    目录从PyTorch到PyTorchLightning从PyTorch到PyTorchLightning总结,pytorchlightning封装了trainingloop,使代码变得简洁,数据加载器、优化器、损失函数都被封装在了model当中,和model中的forward函数相同,也作为了一个函数。具体可见从PyTorch到PyTorchLightning—简要介绍-......
  • pytorch-20 lstm实践
    一、LSTM预测类型数据类型:单变量、多变量与面板数据数据处理(滑窗方式):单变量有seq2seq,seq2point;多变量:特征滑窗,带标签滑窗1.数据类型:单变量、多变量与面板数据在时间序列的世界中,除了最常见的单变量时间序列之外,我们还有多变量时间序列数据和面板数据两种复杂经典数据结......
  • Pytorch-01 框架简介
    智能框架概述人工智能框架是一种软件工具,用于帮助开发人员构建和训练人工智能模型。这些框架提供了各种功能,如定义神经网络结构、优化算法、自动求导等,使得开发人员可以更轻松地实现各种人工智能任务。通过使用人工智能框架,开发人员可以更快速地开发和部署机器学习和深度学......
  • Pytorch-08 实战:手写数字识别
    手写数字识别项目在机器学习中经常被用作入门练习,因为它相对简单,但又涵盖了许多基本的概念。这个项目可以视为机器学习中的“HelloWorld”,因为它涉及到数据收集、特征提取、模型选择、训练和评估等机器学习中的基本步骤,所以手写数字识别项目是一个很好的起点。我们的要做......
  • pytorch中forward的理解
    使用pytorch的时候,模型训练时,不需要使用forward,只要在实例化一个对象中传入对应的参数就可以自动调用forward函数1classModule(nn.Module):2def__init__(self):3super(Module,self).__init__()4#......56defforward(se......
  • 如何确保环境中已经安装了支持GPU加速的库(如CuPy、TensorFlow-GPU或PyTorch)
    要确保环境中已经安装了支持GPU加速的库(如CuPy、TensorFlow-GPU或PyTorch),你可以遵循以下步骤进行检查和安装:1.检查CUDA和cuDNN首先,确保你的系统上已经安装了NVIDIA的CUDAToolkit和cuDNN库,���为这些库是GPU���速深度学习框架(如TensorFlow和PyTorch)运行的基础。你可以访问NVIDIA的官方......
  • pytorch(GPU版)安装
    确认有无英伟达显卡,有才能安装GPU版的pytorch,否则只能装CPU版1.任务管理器->性能:设备管理器->显示适配器,也可以:nvidia驱动安装地址(大部分电脑自带,不需要额外安装):https://www.nvidia.cn/Download/index.aspx?lang=cn2.nvidia控制面板->帮助->系统信息->组件查看nvidia驱......