文章目录
-
-
- 一些简单的指令
- 数据操作
- 标量,向量,矩阵的相互求导
-
- [1. 标量对标量的求导](#1. 标量对标量的求导)
- [2. 标量对向量的求导](#2. 标量对向量的求导)
- [3. 向量对标量的求导](#3. 向量对标量的求导)
- [4. 向量对向量的求导](#4. 向量对向量的求导)
- [5. 矩阵对标量的求导](#5. 矩阵对标量的求导)
- [6. 矩阵对向量的求导](#6. 矩阵对向量的求导)
- 链式求导法则YYDS
- 求出损失函数偏导为0时的最优解w*
-
- [1. 损失函数的定义](#1. 损失函数的定义)
- [2. 对参数 w w w 求偏导](#2. 对参数 w w w 求偏导)
- [3. 设置梯度为 0](#3. 设置梯度为 0)
- [4. 解方程求 w ∗ w^* w∗](#4. 解方程求 w ∗ w^* w∗)
- [5. 数值优化方法](#5. 数值优化方法)
- Softmax回归的损失函数梯度推导
- [4. 最终梯度公式](#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
-
移项
∑ 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 -
将求和写为矩阵形式
设 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回归的损失函数梯度推导
-
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。