文章目录
- 一些简单的指令
- 数据操作
- 广播机制
- 标量,向量,矩阵的相互求导
- 1. 标量对标量的求导
- 2. 标量对向量的求导
- 3. 向量对标量的求导
- 4. 向量对向量的求导
- 5. 矩阵对标量的求导
- 6. 矩阵对向量的求导
- 链式求导法则YYDS
- 求出损失函数偏导为0时的最优解w*
- 1. 损失函数的定义
- 2. 对参数 w w w 求偏导
- 3. 设置梯度为 0
- 4. 解方程求 w ∗ w^* w∗
- 5. 数值优化方法
- Softmax回归的损失函数梯度推导
- 4. 最终梯度公式
本人跟着B站李沐进行学习,卧槽,就感觉教的真的很好,相见恨晚,感觉之前都白学了。
一些简单的指令
nvidia-smi 查看CPU状态
pip install torch1.8.1+cu111 torchvision0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html 我用的是这个安装 pytorch,
python --version 查看python版本
conda env list 查看虚拟环境列表
conda create -n study python=3.8 创建名为study的环境
cd g: 打开G盘
jupyter notebook
数据操作
广播机制
把张量不一样的也进行相加处理,挺牛的。
如果数组的维度不同,较小的数组会在较大数组的前面添加维度,直到两者维度相同。
如果某个维度的大小不相同,且其中一个数组的大小为 1,较小数组会沿着该维度重复。
如果某个维度的大小不相同且都不为 1,则无法进行广播,会引发错误。
标量,向量,矩阵的相互求导
1. 标量对标量的求导
- 定义:如果有两个标量函数
f
(
x
)
f(x)
f(x) 和
g
(
x
)
g(x)
g(x),则
f
f
f 关于
g
g
g 的导数为:
d f d g \frac{df}{dg} dgdf
2. 标量对向量的求导
- 定义:如果
f
(
x
)
f(\mathbf{x})
f(x) 是标量函数,
x
\mathbf{x}
x 是
n
n
n-维向量,则
f
f
f 相对于
x
\mathbf{x}
x 的导数为梯度向量:
∇ x f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , … , ∂ f ∂ x n ) \nabla_{\mathbf{x}} f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right) ∇xf=(∂x1∂f,∂x2∂f,…,∂xn∂f)
3. 向量对标量的求导
- 定义:如果一个向量函数
F
(
x
)
\mathbf{F}(x)
F(x) 的每个分量都是标量
x
x
x 的函数,则其导数为:
d F d x = ( d F 1 d x , d F 2 d x , … , d F n d x ) \frac{d\mathbf{F}}{dx} = \left( \frac{dF_1}{dx}, \frac{dF_2}{dx}, \ldots, \frac{dF_n}{dx} \right) dxdF=(dxdF1,dxdF2,…,dxdFn)
4. 向量对向量的求导
- 定义:如果
F
(
x
)
\mathbf{F}(\mathbf{x})
F(x) 是一个从
n
n
n-维向量到
m
m
m-维向量的函数,则导数为雅可比矩阵:
J = [ ∂ F ∂ x ] = [ ∂ F 1 ∂ x 1 ⋯ ∂ F 1 ∂ x n ⋮ ⋱ ⋮ ∂ F m ∂ x 1 ⋯ ∂ F m ∂ x n ] J = \left[ \frac{\partial \mathbf{F}}{\partial \mathbf{x}} \right] = \begin{bmatrix} \frac{\partial F_1}{\partial x_1} & \cdots & \frac{\partial F_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial F_m}{\partial x_1} & \cdots & \frac{\partial F_m}{\partial x_n} \end{bmatrix} J=[∂x∂F]= ∂x1∂F1⋮∂x1∂Fm⋯⋱⋯∂xn∂F1⋮∂xn∂Fm
5. 矩阵对标量的求导
- 定义:如果一个矩阵
M
(
x
)
\mathbf{M}(x)
M(x) 的每个元素都是标量
x
x
x 的函数,则其导数是一个相同维度的矩阵:
d M d x = [ d M 11 d x ⋯ d M 1 n d x ⋮ ⋱ ⋮ d M m 1 d x ⋯ d M m n d x ] \frac{d\mathbf{M}}{dx} = \begin{bmatrix} \frac{dM_{11}}{dx} & \cdots & \frac{dM_{1n}}{dx} \\ \vdots & \ddots & \vdots \\ \frac{dM_{m1}}{dx} & \cdots & \frac{dM_{mn}}{dx} \end{bmatrix} dxdM= dxdM11⋮dxdMm1⋯⋱⋯dxdM1n⋮dxdMmn
6. 矩阵对向量的求导
- 定义:当矩阵 M ( x ) \mathbf{M}(\mathbf{x}) M(x) 的每个元素都是向量 x \mathbf{x} x 的函数时,求导结果是一个由雅可比矩阵组成的三维张量。
这些求导关系是理解多变量函数变化和优化算法的基础,广泛应用于解析力学、量子力学和机器学习等领域。
链式求导法则YYDS
求出损失函数偏导为0时的最优解w*
在机器学习中,求解最优参数 w ∗ w^* w∗ 通常是通过使损失函数对参数的偏导数为 0 来实现的,这意味着我们需要找到损失函数的最小值或极小值点
1. 损失函数的定义
设损失函数为 L ( w ) L(w) L(w),它表示模型预测与实际值之间的差异。最常见的损失函数包括平方损失(用于回归)和交叉熵损失(用于分类)。
例如,对于线性回归中的平方损失函数:
L
(
x
,
y
,
w
)
=
1
2
∑
i
=
1
n
(
y
i
−
x
i
T
w
)
2
L(\mathbf{x},y ,w) = \frac{1}{2} \sum_{i=1}^n (y_i - \mathbf{x}_i^T w)^2
L(x,y,w)=21i=1∑n(yi−xiTw)2
其中,
x
i
\mathbf{x}_i
xi 是第
i
i
i 个样本的输入,
y
i
y_i
yi 是第
i
i
i 个样本的真实输出,
w
w
w 是模型的参数。
2. 对参数 w w w 求偏导
我们对损失函数
L
(
w
)
L(w)
L(w) 关于参数
w
w
w 求偏导数,得到梯度
∇
w
L
(
w
)
\nabla_w L(w)
∇wL(w)。例如,对于平方损失函数,其梯度为:
∇
w
L
(
w
)
=
−
∑
i
=
1
n
(
y
i
−
x
i
T
w
)
x
i
\nabla_w L(w) = -\sum_{i=1}^n (y_i - \mathbf{x}_i^T w) \mathbf{x}_i
∇wL(w)=−i=1∑n(yi−xiTw)xi
3. 设置梯度为 0
为了找到损失函数的极小值点,我们需要让梯度为 0:
∇
w
L
(
w
)
=
0
\nabla_w L(w) = 0
∇wL(w)=0
将上面的梯度公式代入,得到:
∑
i
=
1
n
(
y
i
−
x
i
T
w
)
x
i
=
0
\sum_{i=1}^n (y_i - \mathbf{x}_i^T w) \mathbf{x}_i = 0
i=1∑n(yi−xiTw)xi=0
4. 解方程求 w ∗ w^* w∗
通过解上面的方程,我们可以得到最优解 w ∗ w^* w∗。
我们来详细求解方程:
∑
i
=
1
n
(
y
i
−
x
i
T
w
)
x
i
=
0
\sum_{i=1}^n (y_i - \mathbf{x}_i^T w) \mathbf{x}_i = 0
i=1∑n(yi−xiTw)xi=0
- 将方程展开
将括号展开,可以得到:
∑ i = 1 n y i x i − ∑ i = 1 n ( x i T w ) x i = 0 \sum_{i=1}^n y_i \mathbf{x}_i - \sum_{i=1}^n (\mathbf{x}_i^T w) \mathbf{x}_i = 0 i=1∑nyixi−i=1∑n(xiTw)xi=0
其中,
x
i
T
w
\mathbf{x}_i^T w
xiTw 是标量,
x
i
\mathbf{x}_i
xi 是向量。因此,我们可以重写第二项为:
∑
i
=
1
n
y
i
x
i
−
∑
i
=
1
n
x
i
x
i
T
w
=
0
\sum_{i=1}^n y_i \mathbf{x}_i - \sum_{i=1}^n \mathbf{x}_i \mathbf{x}_i^T w = 0
i=1∑nyixi−i=1∑nxixiTw=0
2. 移项
∑
i
=
1
n
y
i
x
i
=
∑
i
=
1
n
x
i
x
i
T
w
\sum_{i=1}^n y_i \mathbf{x}_i = \sum_{i=1}^n \mathbf{x}_i \mathbf{x}_i^T w
i=1∑nyixi=i=1∑nxixiTw
3. 将求和写为矩阵形式
设
X
\mathbf{X}
X 是输入数据矩阵,其每一行为
x
i
T
\mathbf{x}_i^T
xiT,即:
X
=
[
x
1
T
x
2
T
⋮
x
n
T
]
\mathbf{X} = \begin{bmatrix} \mathbf{x}_1^T \\ \mathbf{x}_2^T \\ \vdots \\ \mathbf{x}_n^T \end{bmatrix}
X=
x1Tx2T⋮xnT
此时,向量
y
\mathbf{y}
y 表示输出:
y
=
[
y
1
y
2
⋮
y
n
]
\mathbf{y} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}
y=
y1y2⋮yn
所以,
∑
i
=
1
n
y
i
x
i
\sum_{i=1}^n y_i \mathbf{x}_i
∑i=1nyixi 可以写作
X
T
y
\mathbf{X}^T \mathbf{y}
XTy,而
∑
i
=
1
n
x
i
x
i
T
\sum_{i=1}^n \mathbf{x}_i \mathbf{x}_i^T
∑i=1nxixiT 可以写作
X
T
X
\mathbf{X}^T \mathbf{X}
XTX。方程变为:
X
T
y
=
X
T
X
w
\mathbf{X}^T \mathbf{y} = \mathbf{X}^T \mathbf{X} w
XTy=XTXw
- 求解
w
w
w
假设 X T X \mathbf{X}^T \mathbf{X} XTX 是可逆的,我们可以两边同时乘以 ( X T X ) − 1 (\mathbf{X}^T \mathbf{X})^{-1} (XTX)−1,得到:
w = ( X T X ) − 1 X T y w = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y} w=(XTX)−1XTy
这就是线性回归中通过最小二乘法求解得到的最优解
w
∗
w^*
w∗。
如果
X
T
X
\mathbf{X}^T \mathbf{X}
XTX 不可逆,可能需要使用正则化等方法来处理。
w
∗
=
(
X
T
X
)
−
1
X
T
y
w^* = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y}
w∗=(XTX)−1XTy
5. 数值优化方法
当损失函数不能直接求解闭式解时,可以使用数值优化算法,比如梯度下降法或牛顿法。梯度下降法通过反复更新参数
w
w
w 来逼近最优解,更新公式为:
w
t
+
1
=
w
t
−
η
∇
w
L
(
w
t
)
w_{t+1} = w_t - \eta \nabla_w L(w_t)
wt+1=wt−η∇wL(wt)
其中
η
\eta
η 是学习率。
Softmax回归的损失函数梯度推导
来源:B站https://www.bilibili.com/video/BV1K64y1Q7wu/?p=2&spm_id_from=pageDriver&vd_source=591a381cfce5c2eccb909df0428d1ee4评论sudo_rm_-rf
-
Softmax函数的定义
假设我们有一个输入向量 z = [ z 1 , z 2 , … , z n ] \mathbf{z} = [z_1, z_2, \dots, z_n] z=[z1,z2,…,zn],经过Softmax变换后的输出是:
y ^ i = e z i ∑ j = 1 n e z j \hat{y}_i = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}} y^i=∑j=1nezjezi
其中, y ^ i \hat{y}_i y^i 表示输入 z i z_i zi 对应的Softmax输出, ∑ j = 1 n e z j \sum_{j=1}^{n} e^{z_j} ∑j=1nezj 是所有输入的指数和,用来归一化概率。 -
交叉熵损失函数的定义
假设我们有一个真实标签向量 y = [ y 1 , y 2 , … , y n ] \mathbf{y} = [y_1, y_2, \dots, y_n] y=[y1,y2,…,yn],其中每个 y i y_i yi 是 0 0 0 或 1 1 1,表示该样本属于第 i i i 类。交叉熵损失函数的定义为:
L = − ∑ i = 1 n y i log ( y ^ i ) L = -\sum_{i=1}^{n} y_i \log(\hat{y}_i) L=−i=1∑nyilog(y^i)
这个损失函数用于衡量预测概率分布 y ^ \hat{\mathbf{y}} y^ 和真实标签分布 y \mathbf{y} y 之间的差异。
交叉熵损失函数(Cross-Entropy Loss)是机器学习和深度学习中用于分类任务的一种常用损失函数,特别是在多分类任务中常与Softmax函数一起使用。它用来衡量模型的输出概率分布和真实标签之间的差异。其本质是计算两个概率分布之间的距离,距离越小,模型的预测越接近真实结果。
对于单个样本,假设真实标签为 y i y_i yi,模型的预测概率为 y ^ i \hat{y}_i y^i,其中 y i y_i yi 表示样本所属的真实类别, y ^ i \hat{y}_i y^i 表示模型预测的该类别的概率。那么,二分类问题的交叉熵损失函数定义为:
L = − [ y log ( y ^ ) + ( 1 − y ) log ( 1 − y ^ ) ] L = - \left[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \right] L=−[ylog(y^)+(1−y)log(1−y^)]
这个公式表达了当真实类别为 y = 1 y = 1 y=1 和 y = 0 y = 0 y=0 时的损失。其含义是:
- 如果样本的真实标签是 y = 1 y = 1 y=1,我们希望模型预测的 y ^ \hat{y} y^ 越接近 1 损失越小。
- 如果样本的真实标签是 y = 0 y = 0 y=0,我们希望模型预测的 y ^ \hat{y} y^ 越接近 0 损失越小。
举个例子:假设我们有一个 3 类分类问题,模型的预测概率输出为:
y
^
=
[
0.7
,
0.2
,
0.1
]
\hat{\mathbf{y}} = [0.7, 0.2, 0.1]
y^=[0.7,0.2,0.1]
真实的标签为第二类,也就是说真实标签的 one-hot 编码为:(原来独热编码就是这么简单的东西)
y
=
[
0
,
1
,
0
]
\mathbf{y} = [0, 1, 0]
y=[0,1,0]
交叉熵损失计算为:
L
=
−
∑
i
=
1
3
y
i
log
(
y
^
i
)
=
−
[
0
⋅
log
(
0.7
)
+
1
⋅
log
(
0.2
)
+
0
⋅
log
(
0.1
)
]
=
−
log
(
0.2
)
=
1.609
L = - \sum_{i=1}^{3} y_i \log(\hat{y}_i) = -[0 \cdot \log(0.7) + 1 \cdot \log(0.2) + 0 \cdot \log(0.1)] = -\log(0.2) = 1.609
L=−i=1∑3yilog(y^i)=−[0⋅log(0.7)+1⋅log(0.2)+0⋅log(0.1)]=−log(0.2)=1.609
在这种情况下,由于模型对真实类别的概率预测较低( 0.2 0.2 0.2),所以交叉熵损失较大。模型需要通过优化减少这个损失,使得预测更接近真实标签。
- 梯度推导
为了推导损失函数关于输入 z \mathbf{z} z 的梯度,我们需要分别求 L L L 关于 z \mathbf{z} z 的偏导数。
好的,我们来逐步推导Softmax回归损失函数的梯度公式。首先,我们先理解Softmax回归的基本概念和损失函数。
3.1. 损失函数的展开
将损失函数 ( L(y, z) ) 展开为:
L ( y , z ) = − ∑ i = 1 K y i log ( e z i ∑ j = 1 K e z j ) L(y, z) = -\sum_{i=1}^{K} y_i \log\left(\frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}\right) L(y,z)=−i=1∑Kyilog(∑j=1Kezjezi)
可以化简为:
L ( y , z ) = − ∑ i = 1 K y i z i + log ( ∑ j = 1 K e z j ) L(y, z) = -\sum_{i=1}^{K} y_i z_i + \log\left(\sum_{j=1}^{K} e^{z_j}\right) L(y,z)=−i=1∑Kyizi+log(j=1∑Kezj)
3.2. 计算梯度
现在我们需要计算 :
-
对第一项求导:
∂ ∂ z i ( − ∑ k = 1 K y k z k ) = − y i \frac{\partial}{\partial z_i} \left(-\sum_{k=1}^{K} y_k z_k\right) = -y_i ∂zi∂(−k=1∑Kykzk)=−yi -
对第二项求导:
∂ ∂ z i log ( ∑ j = 1 K e z j ) = 1 ∑ j = 1 K e z j ⋅ ∂ ∂ z i ( ∑ j = 1 K e z j ) = e z i ∑ j = 1 K e z j = σ ( z i ) \frac{\partial}{\partial z_i} \log\left(\sum_{j=1}^{K} e^{z_j}\right) = \frac{1}{\sum_{j=1}^{K} e^{z_j}} \cdot \frac{\partial}{\partial z_i}\left(\sum_{j=1}^{K} e^{z_j}\right) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} = \sigma(z_i) ∂zi∂log(j=1∑Kezj)=∑j=1Kezj1⋅∂zi∂(j=1∑Kezj)=∑j=1Kezjezi=σ(zi) -
合并结果:
将两部分结合起来,得到损失函数的梯度:
∂ L ∂ z i = − y i + σ ( z i ) \frac{\partial L}{\partial z_i} = -y_i + \sigma(z_i) ∂zi∂L=−yi+σ(zi)
4. 最终梯度公式
因此,Softmax回归损失函数关于 logits ( z_i ) 的梯度为:
∂
L
∂
z
i
=
σ
(
z
i
)
−
y
i
\frac{\partial L}{\partial z_i} = \sigma(z_i) - y_i
∂zi∂L=σ(zi)−yi
只勉强看懂思路,整体看不太懂。害就这样吧。
补充说明
- 这个推导中使用的交叉熵损失是基于离散的类别标签,因此每个 y j y_j yj 只有一个值为 1 1 1,其余均为 0 0 0。