本人跟着B站李沐进行学习,卧槽,就感觉教的真的很好,相见恨晚,感觉之前都白学了。

一些简单的指令

nvidia-smi 查看CPU状态
pip install torch0.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

数据操作

广播机制

机器学习学习笔记-20240927-LMLPHP
把张量不一样的也进行相加处理,挺牛的。
如果数组的维度不同,较小的数组会在较大数组的前面添加维度,直到两者维度相同。
如果某个维度的大小不相同,且其中一个数组的大小为 1,较小数组会沿着该维度重复。
如果某个维度的大小不相同且都不为 1,则无法进行广播,会引发错误。

标量,向量,矩阵的相互求导

机器学习学习笔记-20240927-LMLPHP

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=(x1f,x2f,,xnf)
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=[xF]= x1F1x1FmxnF1xnFm
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= dxdM11dxdMm1dxdM1ndxdMmn
6. 矩阵对向量的求导
  • 定义:当矩阵 M ( x ) \mathbf{M}(\mathbf{x}) M(x) 的每个元素都是向量 x \mathbf{x} x 的函数时,求导结果是一个由雅可比矩阵组成的三维张量。

这些求导关系是理解多变量函数变化和优化算法的基础,广泛应用于解析力学、量子力学和机器学习等领域。

链式求导法则YYDS

机器学习学习笔记-20240927-LMLPHP

求出损失函数偏导为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=1n(yixiTw)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=1n(yixiTw)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=1n(yixiTw)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=1n(yixiTw)xi=0

  1. 将方程展开
    将括号展开,可以得到:
    ∑ 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=1nyixii=1n(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=1nyixii=1nxixiTw=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=1nyixi=i=1nxixiTw
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= x1Tx2TxnT

此时,向量 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= y1y2yn

所以, ∑ 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

  1. 求解 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回归的损失函数梯度推导

机器学习学习笔记-20240927-LMLPHP
来源:B站https://www.bilibili.com/video/BV1K64y1Q7wu/?p=2&spm_id_from=pageDriver&vd_source=591a381cfce5c2eccb909df0428d1ee4评论sudo_rm_-rf

  1. 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 是所有输入的指数和,用来归一化概率。

  2. 交叉熵损失函数的定义
    假设我们有一个真实标签向量 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=1nyilog(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^)+(1y)log(1y^)]

这个公式表达了当真实类别为 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=13yilog(y^i)=[0log(0.7)+1log(0.2)+0log(0.1)]=log(0.2)=1.609

在这种情况下,由于模型对真实类别的概率预测较低( 0.2 0.2 0.2),所以交叉熵损失较大。模型需要通过优化减少这个损失,使得预测更接近真实标签。

  1. 梯度推导
    为了推导损失函数关于输入 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=1Kyilog(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=1Kyizi+log(j=1Kezj)

3.2. 计算梯度

现在我们需要计算 :

  1. 对第一项求导
    ∂ ∂ 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=1Kykzk)=yi

  2. 对第二项求导
    ∂ ∂ 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) zilog(j=1Kezj)=j=1Kezj1zi(j=1Kezj)=j=1Kezjezi=σ(zi)

  3. 合并结果
    将两部分结合起来,得到损失函数的梯度:
    ∂ L ∂ z i = − y i + σ ( z i ) \frac{\partial L}{\partial z_i} = -y_i + \sigma(z_i) ziL=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 ziL=σ(zi)yi
只勉强看懂思路,整体看不太懂。害就这样吧。
补充说明

  • 这个推导中使用的交叉熵损失是基于离散的类别标签,因此每个 y j y_j yj 只有一个值为 1 1 1,其余均为 0 0 0
10-06 01:16