《动手学深度学习》笔记—— (1) 预备知识(张量、线代、微分基础)
文章目录
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∑mai2]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∑aibi⟨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∑Aijbj
- 矩阵乘法 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∑AijBjk
- 范数
- 矩阵范数:满足 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 dxduv+dxdvu | d y d u d u d x \frac{\mathrm{d} y}{\mathrm{d} u}\frac{\mathrm{d} u}{\mathrm{d} x} dudydxdu |
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∂uv+∂x∂vu | 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∂Xw2bT×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→0limhf(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
- 过程
- 构造计算图
- 前向:执行图,存储中间结果
- 反向:从相反方向执行图(同时去除不需要的枝)
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