Jiahong 的个人博客

凡事预则立,不预则废


  • Home

  • Tags

  • Archives

  • Navigation

  • Search

Anaconda——Python环境和pip包安装方式

文本适用于anaconda,miniforge等包含conda的所有软件

conda对Python虚拟环境的管理方式

  • 虚拟环境均存储在./envs目录下,按照虚拟环境名称命名
  • 在不同虚拟环境下,conda会切换到当前envs目录,从而实现访问不同Python和pip

pip包的管理方式

  • pip对包默认存储在当前虚拟环境下的lib目录下与Python版本有关,比如,lib/python3.10/site-package
  • 具体包的安装路径可使用pip show [package_name]判断
  • pip是一个脚本文件,可以使用vim打开,第一行指定了当前pip对应的Python脚本位置,需要设置准确,第一行必须与当前环境下执行which python的结果一致,如果有问题可以修改到指定目录(特别是手动迁移conda管理的虚拟环境时)

如何迁移Python虚拟环境?

  • 迁移虚拟环境只需要copy envs文件下下的指定环境目录即可,迁移后记得修改pip/pip3文件对应的第一行路径

Anaconda——安装和常用命令

Anaconda安装和使用


安装

  • Anaconda官网下载安装即可

使用

管理conda版本

  • 检查conda版本

    1
    conda --version
  • 升级版本

    1
    conda update conda

管理环境

  • 创建环境

    1
    2
    3
    conda create --name your_env_name python=3.6
    # <==>
    conda create -n your_env_name python=3.6
  • 激活环境

    1
    source activate your_env_name # On Windows, remove the word 'source'
  • 列出所有环境

    1
    2
    3
    4
    5
    conda info --envs 
    # or
    conda info -e
    # or
    conda env list
  • 退出当前环境

    1
    source deactivate # On Windows, remove the word 'source'
  • 复制一个环境

    1
    conda create -n new_env_name --clone old_env_name
  • 删除环境

    1
    conda remove -n your_env_name

管理包

  • 查看已经安装的包

    1
    conda list
  • 向指定环境中安装包

    1
    conda install --name your_env_name package
    • 如果没有--name参数,package默认安装到当前环境中
    • tips: 一般来说当需要在同一个环境下面安装的包比较多时,我们会先激活想要操作的环境,然后直接不使用 --name参数安装

Anaconda——conda命令不能执行

出现包导入异常的错误

  • 错误如下

ImportError: No module named conda.cli

  • 解决方案:重装anaconda

    • 官网上下载anaconda的安装包,注意Python2,和Python3不能错
    • 执行时加上-u参数即可
      1
      bash Anaconda2-2018.12-Linux-x86_64.sh -u
  • 说明:

    • 上面的修复方案不会影响其他第三方包
    • 其他conda环境相关的问题也可以通过重装解决

Anaconda——conda和pip管理包的区别

conda和pip对包的管理有什么区别?

  • conda 使得我们可以在conda环境中安装任何语言的包(包括C语言和Python)
  • pip 使得我们可以在任何环境中安装Python包
管理工具 conda pip
使用环境 conda环境 任意平台
包语言 任意语言 Python语言

管理包命令

  • conda

    • 安装包

      1
      2
      # 从虚拟环境 your_env_name 中安装 packge_name包
      conda install -n your_env_name package_name
    • 删除包

      1
      2
      # 在虚拟环境 your_env_name 中删除 package_name包
      conda remove -n your_env_name package_name
  • pip

    • 安装包

      1
      2
      # 安装包到默认路径
      pip install package_name
    • 卸载包

      1
      2
      # 删除包
      pip uninstall package_name
    • 查看已经安装的包

      1
      2
      3
      4
      # 列出所有包
      pip list
      # 查看指定包的详细信息
      pip show --files package_name
    • 升级包

      1
      pip install --upgrade package_name

关于conda 命令更多详情参考Anaconda——安装和常用命令

ML——SVM-支持向量机


手动推导流程

  • 假设有N样本: \(X = (x_{1}, x_{2}, x_{3},\dots x_{N})\)
    • 样本点为: \(((x_{1}, y_{1}), (x_{2}, y_{2}), (x_{3}, y_{3}),\dots (x_{N}, y_{N}))\)
  • 假设 \(x_{i}\) 等所有向量都为列向量, \(w\) 为行向量(这里是为了推到方便,与<<统计学习方法>>一致)
    • 实际代码实现时与行列向量无关,取二者的内积np.inner(w,x)即可

确定分类决策函数

  • 分类超平面
    $$w^{\star}x + b^{\star} = 0$$
    • 分类超平面由 \((w, b)\) 唯一确定(注意: LR的分类超平面由 \((w, b)\) 和阈值唯一确定)
  • 分类决策函数
    $$f(x) = sign(w^{\star}x + b^{\star})$$

确定优化目标

间隔定义
  • 函数间隔定义
    • 点 \((x_{i}, y_{i})\) 到超平面 \((w,b)\) 的函数间隔为(\(y_{i} \in \{1, -1\})\):
      $$\hat{\gamma}_{i} = y_{i}(w\cdot x_{i} + b)$$
    • 所有训练样本 \(X = (x_{1}, x_{2}, x_{3},\dots x_{m})\) 到超平面 \((w,b)\) 的函数间隔为:
      $$\hat{\gamma} = \min_{i=1,\dots,N}\hat{\gamma}_{i}$$
  • 几何间隔的定义
    • 点 \((x_{i}, y_{i})\) 到超平面 \((w,b)\) 的几何间隔为:
      $$\gamma_{i} = y_{i} (\frac{w}{||w||}\cdot x_{i} + \frac{b}{||w||})$$
    • 进一步推导得:
      $$\gamma_{i} = \frac {y_{i}(w\cdot x_{i} + b)}{||w||} = \frac{\hat{\gamma}}{||w||}$$
    • 所有训练样本 \(X = (x_{1}, x_{2}, x_{3},\dots x_{m})\) 到超平面 \((w,b)\) 的几何间隔为:
      $$\gamma = \min_{i=1,\dots,N}\gamma_{i}$$
确定优化目标
  • 求解能够正确划分训练数据集并且几何间隔最大的分类超平面(分离超平面)

  • 定义约束优化问题:
    $$
    \begin{align}
    &\max_{w,b} \quad \gamma \\
    &s.t. \quad y_{i} (\frac{w}{||w||}\cdot x_{i} + \frac{b}{||w||}) \geq \gamma, i = 1,2,\dots,N
    \end{align}
    $$

  • 将 \(\gamma = \frac{\hat{\gamma}}{||w||}\) 带入并在条件中消去分母上的 \(||w||\),得
    $$
    \begin{align}
    &\max_{w,b} \quad\frac{\hat{\gamma}}{||w||} \\
    &s.t.\quad y_{i} (w\cdot x_{i} + b) \geq \hat{\gamma}, i = 1,2,\dots,N
    \end{align}
    $$

  • 上面的式子中,函数间隔 \(\hat{\gamma}\) 的值不影响最优化问题的解,于是我们设置 \(\hat{\gamma}=1\)

    • 因为将参数 \((w,b)\) 同时扩大或缩小为 \((\lambda w,\lambda b)\),函数间隔对应变成 \(\lambda \hat{\gamma}\)
    • 两个等价的优化方法:
      • 设置 \(\hat{\gamma}=1\) 再对原始问题进行最优化得到参数 \((w^{\star},b^{\star})\)
      • 先对原始问题最优化求得参数 \((w,b)\),再将参数同时扩大或缩小为 \((\lambda w,\lambda b)\),使得 \(\lambda \hat{\gamma}=1\) 得到的最终参数 \((w^{\star},b^{\star}) = (\lambda w,\lambda b)\) 等价
        $$
        \begin{align}
        &\max_{w,b}\quad \frac{1}{||w||} \\
        &s.t.\quad y_{i} (w\cdot x_{i} + b) \geq 1, i = 1,2,\dots,N
        \end{align}
        $$
  • 进一步分析,由于最大化 \(\frac{1}{||w||}\) 与最小化 \(\frac{1}{2}||w||^{2}\) 等价(这里 \(w\) 为行向量时, \(||w||^{2} = ww^{T}\)), 最优化问题可等价表示为:
    $$
    \begin{align}
    &\min_{w,b}\quad \frac{1}{2}||w||^{2} \\
    &s.t.\quad y_{i} (w\cdot x_{i} + b) \geq 1, i = 1,2,\dots,N
    \end{align}
    $$

    • 这是一个凸二次规划问题(convex quadratic programming),凸优化问题参考Math——凸二次优化问题和拉格朗日对偶性
优化问题的求解(对偶)
  • 首先将SVM优化问题转换为一般凸优化形式
    $$
    \begin{align}
    &\min_{w,b}\quad \frac{1}{2}||w||^{2} \\
    &s.t.\quad 1 - y_{i} (w\cdot x_{i} + b) \leq 0, i = 1,2,\dots,N
    \end{align}
    $$
  • 由上述优化问题定义拉格朗日函数
    $$
    \begin{align}
    L(w,b,\alpha) = \frac{1}{2}||w||^{2} + \sum_{i=1}^{N}\alpha_{i}(1-y_{i}(w\cdot x_{i} + b))
    \end{align}
    $$
  • 根据拉格朗日对偶性,
    $$
    \begin{align}
    \min_{w,b}\max_{\alpha:\alpha_{i} \geq 0}L(w,b,\alpha) = \max_{\alpha:\alpha_{i} \geq 0}\min_{w,b}L(w,b,\alpha)
    \end{align}
    $$
    • 左边:原始问题为极小极大问题
    • 右边:对偶问题为极大极小问题
  • 解对偶问题:
  • 先求
    $$
    \begin{align}
    \min_{w,b}L(w,b,\alpha)
    \end{align}
    $$
  • 求导数为0得
    $$
    \begin{align}
    \nabla_{w}L(w,b,\alpha) &= w - \sum_{i=1}^{N}\alpha_{i}y_{i}x_{i} = 0 \\
    \nabla_{b}L(w,b,\alpha) &= \sum_{i=1}^{N}\alpha_{i}y_{i} = 0
    \end{align}
    $$
  • 解得:
    $$
    \begin{align}
    &w = \sum_{i=1}^{N}\alpha_{i}y_{i}x_{i} \\
    &\sum_{i=1}^{N}\alpha_{i}y_{i} = 0
    \end{align}
    $$
  • 代入原来的拉格朗日函数有:

$$
\begin{align}
\min_{w,b}L(w,b,\alpha) &= \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + \sum_{i=1}^{N}\alpha_{i}(1-y_{i}(\left [\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\right]\cdot x_{i} + b)) \\
&= \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) - \sum_{i=1}^{N}\alpha_{i}y_{i}\left [\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\right]\cdot x_{i} + \sum_{i=1}^{N}\alpha_{i}y_{i}b + \sum_{i=1}^{N}\alpha_{i}\\
&= \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) - \sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}y_{i}\alpha_{j}y_{j}(x_{j}\cdot x_{i}) + \sum_{i=1}^{N}\alpha_{i}y_{i}b + \sum_{i=1}^{N}\alpha_{i}\\
&= -\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + 0 + \sum_{i=1}^{N}\alpha_{i}\\
&= -\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + \sum_{i=1}^{N}\alpha_{i}
\end{align}
$$

  • 上面的 \(\min_{w,b}L(w,b,\alpha)\) 对 \(\alpha\) 求极大值有:
    $$
    \begin{align}
    \max_{\alpha} \quad &-\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) + \sum_{i=1}^{N}\alpha_{i} \\
    s.t. \quad &\sum_{i=1}^{N}\alpha_{i}y_{i} = 0 \\
    \quad &\alpha_{i} \geq 0, i = 1,2,\dots,N
    \end{align}
    $$

  • 转换为一般优化问题
    $$
    \begin{align}
    \min_{\alpha} \quad &\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_{i}\alpha_{j}y_{i}y_{j}(x_{i}\cdot x_{j}) - \sum_{i=1}^{N}\alpha_{i} \\
    s.t. \quad &\sum_{i=1}^{N}\alpha_{i}y_{i} = 0 \\
    \quad &-\alpha_{i} \leq 0, i = 1,2,\dots,N
    \end{align}
    $$

  • 假设上面的式子能够求得 \(\alpha\) 的解为:
    $$
    \begin{align}
    \alpha^{\star} = (\alpha_{1}^{\star}, \alpha_{2}^{\star},\dots, \alpha_{N}^{\star})
    \end{align}
    $$

  • 根据拉格朗日对偶问题与原始问题的解对应的条件,Math——凸优化问题和拉格朗日对偶性,如果上面的式子中存在下标 \(j\),满足 \(-\alpha_{j}^{\star} < 0\),即满足:
    $$\exists j \quad \alpha_{j}^{\star} > 0$$

  • 那么最终可求得:
    $$
    \begin{align}
    &w^{\star} = \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}x_{i} \\
    \end{align}
    $$

  • \(b^{\star}\) 的表达式由 \(\alpha_{j}^{\star} > 0\),和KKT条件 \(\alpha_{j}^{\star}(y_{j}(w^{\star}\cdot x_{j} + b^{\star})-1) = 0\) 可解得:
    $$
    \begin{align}
    y_{j}(w^{\star}\cdot x_{j} + b^{\star})-1 = 0 \\
    \end{align}
    $$

  • 注意到 \(y_{j}\in \{-1, 1\}\),所以 \(y_{j}^{2}=1\)
    $$
    \begin{align}
    y_{j}^{2}(w^{\star}\cdot x_{j} + b^{\star})-y_{j} = 0 \\
    w^{\star}\cdot x_{j} + b^{\star} = y_{j} \\
    \end{align}
    $$

  • 所以有
    $$
    \begin{align}
    b^{\star} &= y_{j} - w^{\star}\cdot x_{j} \\
    &= y_{j} - \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x_{j})
    \end{align}
    $$

  • 综合 \(w^{\star}\) 和 \(b^{\star}\) 的表达式,我们有分类超平面为:
    $$
    \begin{align}
    w^{\star}x + b^{\star} &= 0 \\
    \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x) + b^{\star} &= 0
    \end{align}
    $$

  • 分类决策函数为:
    $$
    \begin{align}
    f(x) &= sign(w^{\star}x + b^{\star}) \\
    f(x) &= sign\left (\sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x) + b^{\star}\right )
    \end{align}
    $$

    • 这就是分线性可分SVM的对偶形式
    • 分类决策函数只与待预测的样本 \(x\) 和已有训练数据 \(x_{j}\) 的输入内积 \((x_{j}\cdot x)\) 相关
      • 注意 \(b^{\star}\) 是通过原始训练样本算出来的定值, \(b^{\star}, w^{\star}\) 的值与待预测的未知样本无关,训练样本确定,参数就确定了, 内积的出现是在加入位置样本后 \(w^{\star}\cdot x\) 产生的
    • SVM的对偶形式使得我们可以用核函数来扩展SVM(非线性核函数可使得SVM能解决非线性问题)

支持向量

  • 优化问题的推导过程中,又一步,对偶问题与原始问题能够相等的条件是存在下标 \(j\),满足 \(-\alpha_{j}^{\star} < 0\),即满足:
    $$\exists j \quad \alpha_{j}^{\star} > 0$$
  • 上面的 \(j\) 对应的样本点 \((x_{j}, y_{j})\) 就是支持向量
    • 支持向量一定在间隔边界上:
      $$y_{j}(w^{\star}\cdot x_{j}+b^{\star})-1 = 0$$
    • 或者
      $$w^{\star}\cdot x_{j}+b^{\star} = \pm 1$$
      • \(y_i\) 的取值为 1 或者 -1
    • 实际上,在训练时参数 \((w^{\star}, b^{\star})\) 只依赖于 \(\alpha_{j} > 0\) 的点,即只依赖支持向量
      $$
      \begin{align}
      &w^{\star} = \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}x_{i} \\
      &b^{\star} = y_{j} - \sum_{i=1}^{N}\alpha_{i}^{\star}y_{i}(x_{i}\cdot x_{j})
      \end{align}
      $$
    • 所有非支持向量对应的 \(\alpha_{i} = 0\),所以对最终参数 \((w^{\star}, b^{\star})\) 只与支持向量相关

核函数

  • \(\phi(x)\) 定义为从输入空间到希尔伯特空间的映射
    $$
    \begin{align}
    K(x,z) = \phi(x)\phi(z)
    \end{align}
    $$
  • 将SVM对偶形式中的内积 \((x_{i}\cdot x_{j})\) 用核函数 \(K(x_{i},x_{j}) = \phi(x_{i})\phi(x_{j})\) 来替代即可在SVM中应用核技巧

常用核函数

  • 多项式核函数
    $$K(x,z) = (x\cdot z + 1)^{p}$$
  • 高斯核函数
    $$K(x,z) = e^{\left( -\frac{||x-z||^{2}}{2\sigma^{2}}\right )}$$
  • 字符串核函数
    [待更新]

序列最小最优化算法(SMO)

  • 为什么要用SMO?
    • 前面我们的推导将 SVM的参数求解 转化为了一个求解凸二次优化的问题
    • 凸二次优化问题有全局最优解(有很多优化算法可以求解凸二次优化问题)
    • 但是当样本量太大时,普通的凸二次优化算法会变得十分低效 ,导致实际操作中无法使用
    • 所以我们需要一个能高效实现的算法 SMO
  • 基本思路
    • 如果所有变量的解都满足最优化问题的KKT条件,那么这个最优化问题的解就得到了
      • 原因: KKT条件是该最优化问题的充要条件
    • 否则,存在某些解不满足KKT条件,选择两个变量,固定其他变量,
      • 两个变量中其中一个是最不满足KKT条件的变量 ,
      • 另一个在第一个确定后,自动由约束条件确定下来
    • 针对这两个变量构建二次规划问题的解,这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解
      • 原因: 因为二次规划问题的目标函数值变得更小
      • 此时可通过解析方法求解(由于只有两个变量,比较简单),整个算法的速度会很快
    • SMO算法不断的将原问题分解为子问题,迭代更新参数,每次更新两个参数,最终得到近似解
  • 优点:
    • 训练速度快

补充说明

SVM需要特征归一化

是必要的

  • 因为SVM寻找的是所谓的间隔(margin), 就是两个支持向量的间隔
  • 如果不归一化的话, 这个间隔会因为不同特征的单位等, 数值被放大或者缩小, 从而造成无法评估间隔 , 所以归一化对于SVM很重要
  • 线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization
    • 个人理解: 非线性的SVM其实也应该归一化,不然核函数映射到高位空间后以后还是可能受数值影响?

损失函数自带正则

  • 由于优化目标中就自带了参数 \(\frac{1}{2}||w||^2\),所以SVM实际上已经自己带了L2正则化了
  • 这也是SVM也叫结构风险最小化算法的原因
    • 结构风险最小化就是模型复杂度最小化

Linux——用户管理

用户管理简单笔记


用某个其他用户身份打开可视化软件

  • 说明:在某个用户不能登录桌面时,可能可以通过进入root用户创建一个新的用户,然后用该用户登录桌面
  • 不同用户之间的软件可能不共享,所以要想打开其他用户装的软件可以考虑从终端切换到其他用户,然后再打开软件
  • 不同用户的git用户信息等都不同,也需要切换到其他用户使用
  • 为了避免用户权限问题,打开软件时都从终端用文件所属用户的身份打开即可

多用户打开各自软件问题

  • 说明:在Linux系统有多个用户时,我们可能需要从一个用户界面打开终端登录另一个用户,从而使用该用户的环境和软件

问题描述

  • 在一个用户登录图形界面后,需要以另一个用户的身份打开一个图形化软件,此时直接打开图形化软件可能遇到如下错误

    No protocol specified

问题发生原因

  • 因为Xserver默认情况下禁止别的用户图形程序运行在当前用户图形界面上

解决方案

  • 在当前用户下执行命令
    1
    xhost +

Bash——Shell使用笔记


显示目录占用空间大小

  • 显示第一层目录大小(人类可读格式,如 M/G)

    1
    du -sh */
    • 命令解释:
      • du:统计当前目录下的第一级下,所有子目录/文件的磁盘占用;
      • -s(--summarize):只显示总大小(不列出子文件/子目录的详细大小);
      • -h(--human-readable):用人类易读的单位(K/M/G)显示;
      • */:通配符,只匹配当前目录下的「第一层子目录」(结尾的 / 是关键,排除文件,只选目录);
    • 这个命令 Mac 也可以使用
    • 在 Linux 里面,这个命令的等价命令是 du -h ./ --max-depth=1
  • 显示当前目录大小(人类可读格式,如 M/G)

    1
    du -sh ./
    • 命令解释:
      • du:统计当前目录的总磁盘占用
      • -s(--summarize):只显示总大小(不列出子文件/子目录的详细大小);
      • -h(--human-readable):用人类易读的单位(K/M/G)显示;
      • ./:只匹配当前目录
  • 显示当前目录下,指定层级的目录磁盘占用情况

    1
    2
    # 以最大 2 级子文件夹为例(包括第一级)
    du -h ./ --max-depth=2
    • 命令解释:
      • du:统计当前目录下的第一级下,所有子目录/文件的磁盘占用;
      • -h(--human-readable):用人类易读的单位(K/M/G)显示;
      • ./:只匹配当前目录
      • --max-depth=2:最深到两级目录

递归删除某个文件夹下的某个名称文件

  • 假设目标文件夹是 /path/to/dir

  • 在执行删除前,先用 -print 检查匹配结果,确保不会误删:

    1
    find /path/to/dir -type f -name "xxx.pt" -print
    • find:递归查找文件
    • /path/to/dir:替换为你的目标目录路径
    • -type f:只匹配普通文件
    • -name "xxx.pt":匹配文件名为 xxx.pt
    • -print:输出匹配结果
  • 删除上述匹配的文件:

    1
    find /path/to/dir -type f -name "xxx.pt" -delete
    • -delete:直接删除匹配到的文件
  • 补充:如果需要匹配所有以 .pt 结尾的文件(比如 model.pt、xxx.pt 等),可以这样写:

    1
    find /path/to/dir -type f -name "*.pt" -delete

搜索符合预期规则的文件并合并

  • 以合并前缀相同的 .jsonl 文件为例:

    1
    ls -1 /user/prefix_* | grep -E "/user/prefix_[0-9]+\.jsonl" | sort -V | xargs cat > path_to_output
    • 单独使用 ls -1 /user/prefix_* | grep -E "/user/prefix_[0-9]+\.jsonl" | sort -V 可以按照顺序打印文件名称
    • 如果不需要排序可以删除 sort -V 参数

Bash——awk和xargs命令的使用

用于在linux bash中设计处理terminal输出自动删除等问题


使用实例

  • 示例:下面的代码是删除所有名字为<none>的docker镜像
    1
    sudo docker images | grep '<none>' | awk '{print $3}' | xargs sudo docker rmi

awk

  • 示例:读取每一行的第三列的值
    1
    awk '{print $3}'

xargs

  • 示例:将管道传递过来的所有行添加到后面的命令后面,等价于sudo docker rmi <rows>
    1
    xargs sudo docker rmi

Bash——命令分隔符

在 Linux Bash 命令中,有;,&&,||三种命令链接方式,本文将介绍他们之间的区别


三种连接方式的区别

  • ;:各个命令之间相互独立,不管前面的语句是否成功执行,所有命令都将被执行
  • &&:命令依次被执行,只有当前面的命令执行成功后,后面的命令才会被执行
  • ||:命令依次被执行,只有当前面的命令执行失败后,后面的命令才会被执行

Math——梯度和微分的理解

梯度方向是函数局部上升最快的方向


微分的定义与理解

  • 假设在任意方程中存在自变量 \(t\) 和因变量 \(x,y\),他们都是 \(t\) 的函数 \(x(t),y(t)\),则当所有因变量都对同一个自变量 \(t\) 计算变化量时,即可得到微分形式:
    $$
    \begin{align}
    d y &= y(t+\Delta) - y(t) \\
    d x &= x(t+\Delta) - x(t) \\
    d t &= (t+\Delta) - t = \Delta
    \end{align}
    $$
    • 其中 \(\Delta \rightarrow 0\)
  • 此时有:
    • 导数 \(\frac{dy}{dt}\) 表示因变量 \(y\) 关于 \(t\) 的变化率,是 \(t\) 的函数
    • 导数 \(\frac{dx}{dt}\) 表示因变量 \(x\) 关于 \(t\) 的变化率,是 \(t\) 的函数
    • 导数 \(\frac{dy}{dx}\) 可以表示因变量 \(y\) 关于 \(x\) 的变化率:
      $$ \frac{dy}{dx} = \frac{\frac{dy}{dt}}{\frac{dx}{dt}} $$
      • 注意: 从上面的证明可以看出,要求 \(dy\) 和 \(dx\) 都是在同一个自变量(这里是 \(t\),也可以是其他变量,比如 \(x\) )发生微小变化的时候得到的
  • 注意:
    • \(dy\) 表示微分,具体是关于 \(x\) 或 \(t\),亦或是其他变量的增量,要根据上下文来判断
    • \(\frac{dy}{dt}\) 表示 \(y\) 关于 \(t\) 的变化率,在不同的 \(t\) 点,变化率不同,所以 \(\frac{dy}{dt}\) 是关于 \(t\) 的函数, \(\frac{dy}{dt}\vert_{t=t_0}\) 可表示 \(y\) 关于 \(t\),在 \(t=t_0\) 处的变化率

梯度的定义与理解

  • 对函数 \(f(x, y, z)\) 而言
  • 方向导数:各个方向的导数,函数,标量
    • 关于x, y, x的偏导数: \(\frac {\partial f}{\partial x}, \frac {\partial f}{\partial y}, \frac {\partial f}{\partial z}\)
    • 对特定的某一点 \((x_{0}, y_{0}, z_{0})\) 而言,改点的偏导数是将对应的值带入后得到的数值,是一个确定的数值
  • 梯度:各个方向导数组成的向量,每一维为一个方向导数,矢量
    • 梯度: \((\frac {\partial f}{\partial x}, \frac {\partial f}{\partial y}, \frac {\partial f}{\partial z}\)),一个向量
    • 梯度方向表示函数局部上升最快的方向
    • 梯度的模 \(|\nabla f|\) 表示变化率

直观理解

  • 一维函数中,代表参数(自变量)的点在一条直线上运动,所以梯度的方向有正向和负向
  • 二维函数中,代表参数(自变量)的点在一个平面上运动,所以梯度的方向有无数种,但都在二维平面上
  • 三维函数中,代表参数(自变量)的点在一个空间中运动,所以梯度的方向有无数种,但都在三维空间中
  • 无论何时,梯度方向是函数上升最快的方向,指明参数朝着这个方向移动时,函数上升的速度最快
  • 梯度下降法中,求取梯度的意义就在于知道函数上升或者下降最快的方向

关于梯度的模 \(|\nabla f|\)

  • 梯度的方向与参数(自变量)的变化相关,梯度的模 \(|\nabla f|\) 与函数变化相关
  • 梯度的模可以理解为变化率,也就是在梯度对应的方向上移动单位长度后,函数能上升的数值大小为 \(|\nabla f|\) (当然,这是按照当前点周围的极小的曲面拟合出来的平面计算得到的数值,不是真正的函数数值)
  • 梯度下降法中,梯度的方向指明了参数移动的方向,梯度的模暗示着参数移动时函数的增量大小
  • 但为什么梯度下降法中,保留着梯度的模?而不是将梯度向量变成单位向量?梯度的模有什么特殊的意义吗?
    • 一个猜想:在梯度下降法时,如果超参数步长 \(\alpha\) 不变的话,每次迭代时参数(自变量)真正移动的长度是 \(\alpha\times |\nabla f|\),此时随着迭代次数的增加, \(|\nabla f|\) 值会越来越小(可以证明,因为越来越接近最地点,函数变化率越来越小),这会导致 \(\alpha\times |\nabla f|\) 越来越小,从而减少震荡?
    • 梯度的模的意义可用数学证明,移动梯度的模的 \(\alpha\) 倍是最优的,详情参考我的博客ML——最优化方法-无约束参数优化方法中用一阶泰勒展开推导梯度下降法的过程
      • 基本思路,将函数在参数的某个值 \(\theta_{t} + \delta\) 处一阶泰勒展开,然后对 \(\delta\) 加上正则项.最后在直接求导即可得到梯度下降法的更新表达式

附录:其他参考博客

  • 参考链接: 为什么梯度方向是函数局部上升最快的方向
1…596061
Joe Zhou

Joe Zhou

Stay Hungry. Stay Foolish.

608 posts
49 tags
GitHub E-Mail
© 2026 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4