Nesterov
1. 简介
Nesterov 加速梯度算法是一种对 Momentum 动量法的改进。
2. 原理
第 ttt 次迭代时:
W^t=Wt−1+αΔWt−1Wt=Wt^−η∂L∂W^t\begin{array}{c}
\hat{\boldsymbol{W}}_t = \boldsymbol{W}_{t-1} + \alpha \Delta \boldsymbol{W}_{t-1} \\
\boldsymbol{W}_t = \hat{\boldsymbol{W}_{t}} - \eta \frac{\partial L}{\partial \hat{\boldsymbol{W}}_t}
\end{array}
W^t=Wt−1+αΔWt−1Wt=Wt^−η∂W^t∂L
其中,W\boldsymbol{W}W 为需要更新的参数,LLL 为损失函数,∂L∂W^\frac{\partial L}{\partial \hat{\boldsymbol{W}}}∂W^∂L 为 LLL 关于 W^\hat{\boldsymbol{W}}W^ 的梯度,η\etaη 为学习率,α\alp ...
Adam
1. 简介
Adam 算法可以看作动量法和 RMSprop 算法的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。
2. 原理
第 ttt 次迭代时:
一方面计算梯度平方的指数加权平均:
Gt=β2Gt−1+(1−β2)∂L∂Wt−1⊙∂L∂Wt−1\begin{array}{c}
\boldsymbol{G}_t = \beta_2 \boldsymbol{G}_{t-1} + (1-\beta_2) \frac{\partial L}{\partial \boldsymbol{W}_{t-1}} \odot \frac{\partial L}{\partial \boldsymbol{W}_{t-1}}
\end{array}
Gt=β2Gt−1+(1−β2)∂Wt−1∂L⊙∂Wt−1∂L
另一方面计算梯度的指数加权平均:
Mt=β1Mt−1+(1−β1)∂L∂Wt−1\begin{array}{c}
\boldsymbol{M}_t = \beta_1 \boldsymbol{M}_{t-1} + (1-\beta_1) \frac{\pa ...
Momentum
1. 简介
Momentum 类似于物理中的冲量的思想,Momentum 算法优化的过程给人的感觉就像是小球在地面上滚动。
2. 原理
第 ttt 次迭代时:
vt=αvt−1−η∂L∂Wt−1Wt=Wt−1+vt\begin{array}{c}
\boldsymbol{v}_t = \alpha \boldsymbol{v}_{t-1} - \eta \frac{\partial L}{\partial \boldsymbol{W}_{t-1}} \\
\boldsymbol{W}_t = \boldsymbol{W}_{t-1} + \boldsymbol{v}_t
\end{array}
vt=αvt−1−η∂Wt−1∂LWt=Wt−1+vt
其中,W\boldsymbol{W}W 为需要更新的参数,LLL 为损失函数,∂L∂W\frac{\partial L}{\partial \boldsymbol{W}}∂W∂L 为 LLL 关于 W\boldsymbol{W}W 的梯度,η\etaη 为学习率,v\boldsymbol{v}v 类似于物理上的速度,α\ ...
优化算法
1. 简介
深度学习网络中参数更新的优化方法主要分为两种:
调整学习率,使得优化更稳定
梯度估计修正,优化训练速度
2. 常用优化方法汇总
3. 原理
上述常用方法均可以使用一下公式来进行同一描述:
ΔWt=−ηtGt+εMtGt=ψ(∂L∂W1,⋯ ,∂L∂Wt)Mt=ϕ(∂L∂W1,⋯ ,∂L∂Wt)\begin{array}{c}
\Delta \boldsymbol{W}_t = - \frac{\eta_t}{\sqrt{\boldsymbol{G}_t+\boldsymbol{\varepsilon}}}\boldsymbol{M}_t \\
\boldsymbol{G}_t = \psi(\frac{\partial L}{\partial \boldsymbol{W}_1}, \cdots, \frac{\partial L}{\partial \boldsymbol{W}_t}) \\
\boldsymbol{M}_t = \phi(\frac{\partial L}{\partial \boldsymbol{W}_1}, \cdots, \frac{\ ...
SGD
1. 简介
梯度下降法即沿着训练集的梯度方向下降。随机梯度下降(stochastic gradient descent:SGD)按照数据生成分布抽取 mmm 个小批量(独立同分布的)样本,通过计算它们的梯度均值,从而得到梯度的无偏估计;然后随机梯度下降算法沿着随机挑选的小批量数据的梯度下降方向,能够很大程度加速梯度下降的过程。
2. 思路
2.1 梯度下降
第 ttt 次迭代时:
Wt=Wt−1−η∂L∂Wt−1\begin{array}{c}
\boldsymbol{W}_t = \boldsymbol{W}_{t-1} - \eta \frac{\partial L}{\partial \boldsymbol{W}_{t-1}}
\end{array}
Wt=Wt−1−η∂Wt−1∂L
其中,W\boldsymbol{W}W 为需要更新的参数,LLL 为损失函数,η\etaη 为学习率。
2.2 伪代码
1234567Require: 学习率 eRequire: 初始参数 o while 停止准则未满足 do 从训练集中采集包含 m 个样本的小批量 & ...
RNN
【注】参考自邱锡鹏的《神经网络与深度学习》。
1. 简介
循环神经网络(RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其他神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。而前馈网络是一种静态网络,不具备记忆能力。
RNN 能够用于处理时序数据的神经网络,被广泛应用于语音识别、语言模型以及自然语言生成等任务上。
时序数据的长度一般是不固定的,而前馈神经网络要求输入和输出的维数都是固定的,不能任意改变。
理论上,前馈神经网络可以模拟任何连续函数,而循环神经网络可以模拟任何程序。
2. 给网络增加记忆能力
为了处理这些时序数据并利用其历史信息,我们需要让网络具有短期记忆能力,一般有三种方法可以给网络增加短期记忆能力:
2.1 延时神经网络
一种简单的利用历史信息的方法是建立一个额外的延时单元,用来存储网络的历史信息(可以包括输入、输出、隐状态等)。这种方式的代表模型为延时神经网络:
延时神经网络(TDNN)是在前馈网络中的非输出层都添加一个延时器,记录神经元的最近几次活性值。
在第 ttt 个时刻,第 lll 层神经元的活性值依 ...
CNN
1. 简介
CNN 是专门用于处理网格化数据的神经网络。CNN 中新增了 Convolution 层和 Pooling 层,CNN 的层的连接顺序是「Convolution-ReLU-(Pooling)」(Pooling层有时会被省略)。这可以理解为之前的“Affine-ReLU”连接被替换成了「Convolution-ReLU-(Pooling)」连接。
2. CNN 的优势
全连接层(Affine 层)忽略了数据的形状。比如,输入数据是图像时,图像通常是高、长、通道方向上的 3 维形状。但是,向全连接层输入时,需要将 3 维数据拉平为 1 维数据。
图像是 3 维形状,这个形状中应该含有重要的空间信息。比如,空间上邻近的像素为相似的值、 RBG 的各个通道之间分别有密切的关联性、相距较远的像素之间没有什么关联等, 3维形状中可能隐藏有值得提取的本质模式。
而卷积层可以保持形状不变。当输入数据是图像时,卷积层会以3维数据的形式接收输入数据,并同样以3维数据的形式输出至下一层。因此,在CNN中,可以(有可能)正确理解图像等具有形状的数据。
【注】把 3 维数据表示为多维数组 ...
正则化
1. 定义
在机器学习中,许多策略被显式设计来减少测试误差(可能会增大训练误差为代价),这些策略被统称为正则化。常用的正则化方法简介如下表:
正则化方法
简介
正则化项
通过在经验损失上加上模型参数向量的罚项来防止模型过拟合,常用的有 L1L_1L1 和 L2L_2L2 范数。
Dropout
通过随机 Mask 掉隐藏层的神经元,使得训练过程中实际训练了一堆的子网络,而最终测试用的整个网络相当于是很多子网络的集成,增加了模型的泛化性。
标签平滑
标签平滑是通过将传统的 one-hot 编码的 0,10, 10,1 硬标签软化,即用软标签 yf,yty_f, y_tyf,yt 替代硬标签(0<yf<yt<10 \lt y_f \lt y_t \lt 10<yf<yt<1),从而防止模型过度自信而导致模型过拟合。
早停
在模型训练开始过拟合的时候(即测试误差开始不降反增),中止模型训练。
2. 正则化项
正则化项(也称罚项)常常加在经验风险上,一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。用公式 ...
Linux下查看系统信息
1. 查看发行版信息
通用方法:
1cat /etc/os-release
借助 lsb_release 工具:
1lsb_release -a
【注】并不是所有 Linux 发行版都自带 lsb_release 命令,如果系统上没有该命令需要手动安装 lsb-release 工具。
查看 Linux 发行版名称和版本号的 8 种方法
2. 查看 Linux 内核版本
以下两个命令都可以用来查看 Linux 内核版本:
12uname -acat /proc/version
3. 查看显卡厂商
1lspci | grep -i vga
4. 查看内存容量
1free -g/-m/-k/-b # -g/-m/-k/b 分别表示以 gb,mb,kb,b 为单位显示内存容量
5. 查看 CPU 信息
1lscpu
6. 查看系统各类硬件信息
1inxi -Fi
inxi 命令还可以具体查看具体某一硬件信息,具体参看 inxi --help 。
【注】并不是所有 Linux 发行版都自带 inxi 命令,如果系统上没有该命令需要手动安装 inxi 工具。
7. 查看系统主要软硬件 ...
Manjaro20.1下搭建Pytorch环境
1. 安装 cuda 环境
1sudo pacman -S python-pytorch-cuda
2. 安装 pytorch 环境
1pip install torch torchvision
也可以用其他命令比如 conda 等,具体可以参照 pytorch 官网。
3. 测试
1python
进入到 python 命令行后运行:
12import torchtorch.cuda.is_available()
如果返回结果是 True,则说明环境已经搭建好;如果返回是 False,则说明环境还有问题。如果上述安装都没有问题,那么可能和笔者一样,是 Manjaro 当前启用了开源的 Nouveau 显卡驱动,需要将其禁用,然后再安装最新的 Nvidia 闭源驱动(详见下文)。
4. 问题 & 解决
问题: 如果上述安装都没有问题,输入以下命令测试当前系统 Nvidia 闭源驱动是否工作良好:
1nvidia-smi
如果当前 Manjaro 启用了开源的 Nouveau 显卡驱动,或者启用的不是最新的闭源驱动,都会导致该命令输出报错信息:NVIDIA-SMI has fa ...
Mint20下查看nvidia显卡型号
1. 命令
12nvidia-smi # 显示 GPU 的实时信息nvidia-smi -L # 列出所有可用的 NVIDIA 设备信息
2. 参数含义
GPU:GPU 编号。
Name:GPU 型号。
Persistence-M:持续模式的状态。持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少,这里显示的是off的状态。
Fan:风扇转速,从0到100%之间变动。
Temp:温度,单位是摄氏度。
Perf:性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能(即 GPU 未工作时为P0,达到最大工作限度时为P12)。
Pwr:Usage/Cap:能耗。
Memory Usage:显存使用率。
Bus-Id:涉及GPU总线的东西,domain:bus:device.function。
Disp.A:Display Active,表示GPU的显示是否初始化。
Volatile GPU-Util:浮动的GPU利用率。
Uncorr. ECC:Error Correcting Code,错误检查与纠正。
Compute M:compute mode ...
矩阵基本概念
1. 术语
概念/符号
含义
方阵
行数和列数相同的矩阵
长方矩阵
函数和列数可能不相同的矩阵
C\mathbb{C}C
复数域
R\mathbb{R}R
实数域
Sn\mathbb{S}^nSn
nnn 阶对称阵全集
diag(d1,⋯ ,dn)\mathrm{diag}(d_1,\cdots,d_n)diag(d1,⋯,dn)
表示对角元素为 d1,⋯ ,dnd_1,\cdots,d_nd1,⋯,dn 的对角矩阵
⊙\odot⊙
Hadamard 积
设 A=(aij)∈Cm×n
A = (a_{ij}) \in \mathbb{C}^{m \times n}
A=(aij)∈Cm×n,aija_{ij}aij 是矩阵 AAA 的元素,则:
A⊤A^\topA⊤:表示 AAA 的转置。
A‾\overline{A}A:表示 AAA 的共轭。
A∗A^*A∗:表示 AAA 的共轭转置,即 A∗=(A‾)⊤
A^* = (\overline{A})^\top
A∗=(A)⊤ 。
2. 矩阵
2.1 定义
设 A∈Cn×n
A ...