机器学习学习笔记-20240927

文章目录

本人跟着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

  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=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

  1. 移项
    ∑ 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

  2. 将求和写为矩阵形式

设 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

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

来源: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=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),所以交叉熵损失较大。模型需要通过优化减少这个损失,使得预测更接近真实标签。

  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=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. 计算梯度

现在我们需要计算 :

  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=1∑Kykzk)=−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) ∂zi∂log(j=1∑Kezj)=∑j=1Kezj1⋅∂zi∂(j=1∑Kezj)=∑j=1Kezjezi=σ(zi)

  3. 合并结果

    将两部分结合起来,得到损失函数的梯度:
    ∂ 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。
相关推荐
微刻时光6 分钟前
影刀RPA实战:Excel拆分与合并工作表
笔记·程序人生·自动化·excel·rpa·影刀
IT199519 分钟前
Docker笔记-Docker磁盘空间清理
笔记·docker·eureka
岁岁岁平安33 分钟前
springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)
java·spring boot·后端·学习·threadlocal·jwt令牌
笑非不退1 小时前
机器学习和深度学习区别
机器学习
不拱地的猪1 小时前
VTK 与 OpenCV 的区别和各自的特点
opencv·计算机视觉
布丁不叮早起枣祈2 小时前
9.30学习
学习
仟濹2 小时前
原来还有【快速排序】 qsort() 函数
java·c语言·开发语言·数据结构·python·学习·算法
WZF-Sang2 小时前
Linux工具的使用——yum和vim的理解和使用
linux·运维·服务器·开发语言·学习·编辑器·vim
红米煮粥2 小时前
OpenCV-指纹识别
人工智能·opencv·计算机视觉
Re.不晚2 小时前
C语言系列4——指针与数组(1)
c语言·开发语言·数据结构·c++·学习·算法