---
categories: 课程
title: 深度学习基础
tags:
- 2022春季
- 科研
description: 学不完了,学不完了...
---
这一章马老师讲的很玄学,尽我所能写一写…
Credit to Eren Zhao and saltyp0rridge.
- 全连接神经网络 —— 对 n-1 层和 n 层而言,n-1 层的任意一个节点,都和第 n 层所有节点有连接。即第 n 层的每个节点在进行计算的时候,激活函数的输入是 n-1 层所有节点的加权,这个激活函数是非线性的,可作用于大多数场景,然而权重过多,计算量很大。
- 前馈神经网络 —— 在其内部,参数从输入层向输出层单向传播。有异于循环神经网络,它的内部不会构成有向环。
- 多层感知器 ——(Multilayer Perceptron,缩写 MLP)是一种前向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP可以被看作是一个有向图,由多个的节点层所组成,每一层都全连接到下一层。除了输入节点,每个节点都是一个带有非线性激活函数的神经元(或称处理单元)。一种被称为反向传播算法的监督学习方法常被用来训练 MLP。多层感知器遵循人类神经系统原理,学习并进行数据预测。它首先学习,然后使用权重存储数据,并使用算法来调整权重并减少训练过程中的偏差,即实际值和预测值之间的误差。主要优势在于其快速解决复杂问题的能力。多层感知的基本结构由三层组成:第一输入层,中间隐藏层和最后输出层,输入元素和权重的乘积被馈给具有神经元偏差的求和结点,主要优势在于其快速解决复杂问题的能力。MLP 是感知器的推广,克服了感知器不能对线性不可分数据进行识别的弱点。
- 全连接层 —— Fully Connected Layer 类似 FCN
- 稠密层 —— 即 FCL 的同义词
通过增设 0 项可以统一形式,不必单独写偏置量。
优点:适合于潜在行为是线性(与线性回归相似)的任务。
缺点:无法提供非线性映射,当多层网络使用 identity 激活函数时,整个网络就相当于一个单层模型。
一般论文中的
函数定义: $$ { f }(x)=\sigma (x)=\frac { 1 }{ 1+{ e }^{ -x } } $$ 导数:
优点:
-
$sigmoid$ 函数的输出映射在$(0,1)$ 之间,单调连续,输出范围有限,优化稳定,可以用作输出层; - 求导容易;
缺点:
- 由于其软饱和性,一旦落入饱和区梯度就会接近于0,根据反向传播的链式法则,容易产生梯度消失,导致训练出现问题;
- Sigmoid 函数的输出恒大于 0。非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢;
- 计算时,由于具有幂运算,计算复杂度较高,运算速度较慢。
取值范围在 (-1, 1)
,可经过简单变换变成 sigmoid。
函数定义:
导数:
函数图形如图 4 所示:
优点:
-
$tanh$ 比$sigmoid$ 函数收敛速度更快; - 相比
$sigmoid$ 函数,$tanh$ 是以$0$ 为中心的;
缺点:
- 与
$sigmoid$ 函数相同,由于饱和性容易产生的梯度消失; - 与
$sigmoid$ 函数相同,由于具有幂运算,计算复杂度较高,运算速度较慢。
线性整流函数,整流这个词来自二极管。
函数定义:
$$ f(x)=\begin{cases} \begin{matrix} 0 & x<0 \end{matrix} \ \begin{matrix} x & x\ge 0 \end{matrix} \end{cases} $$ 导数:
优点:
- 收敛速度快;
- 相较于
$sigmoid$ 和$tanh$ 中涉及了幂运算,导致计算复杂度高, ReLU 可以更加简单的实现; - 当输入
$x>=0$ 时,ReLU 的导数为常数,这样可有效缓解梯度消失问题; - 当
$x<0$ 时,ReLU 的梯度总是$0$ ,提供了神经网络的稀疏表达能力;
缺点:
- ReLU 的输出不是以
$0$ 为中心的; - 神经元坏死现象,某些神经元可能永远不会被激活,导致相应参数永远不会被更新;
- 不能避免梯度爆炸问题;
在输出时,作用在整个层上,输出的和为 1,可视为概率。
softmax 函数一般用于多分类问题中,它是对逻辑斯蒂(logistic)回归的一种推广,也被称为多项逻辑斯蒂回归模型(multi-nominal logistic mode)。假设要实现 k 个类别的分类任务,Softmax 函数将输入数据
显然,$0<y_i<1$。下图给出了三类分类问题的 softmax 输出示意图。在图中,对于取值为 4、1和-4 的
由于 softmax 输出结果的值累加起来为 1,因此可将输出概率最大的作为分类目标。
也可以从如下另外一个角度来理解:给定某个输入数据,可得到其分类为三个类别的初始结果,分别用
- 梯度是指增长最快的方向,故而需要加上梯度的相反数
- 在多维情况下,梯度计算较为复杂,可以改为偏导数
这张图对于 sigmoid 情况下的梯度下降说的很清楚。
注意,这里 k 是 j 的后续,而不前驱,也即右图中 k 在 j 上方。
批量梯度下降
标准的梯度下降,即批量梯度下降(batch gradient descent, BGD),在整个训练集上计算损失函数关于参数
$$
\theta=\theta-\eta \nabla_{\theta}J(\theta)
$$
其中
BGD 对于凸误差曲面(convex error surface)保证收敛到全局最优点,而对于非凸曲面(non-convex surface)则是局部最优点。
缺点:收敛缓慢,容易陷入局部极值点。
随机梯度下降
随机梯度下降( stotastic gradient descent, SGD )则是每次使用一个训练样本
$$
\theta=\theta -\eta \cdot \nabla_{\theta}J(\theta;x^i;y^i)
$$
其中
BGD 能够收敛到(局部)最优点,然而 SGD 的震荡特点导致其可以跳到新的潜在的可能更好的局部最优点。已经有研究显示当我们慢慢的降低学习率时,SGD 拥有和 BGD 一样的收敛性能,对于非凸和凸曲面几乎同样能够达到局部或者全局最优点。
Mini-batch 梯度下降
Mini-batch gradient descent( mini-batch gradient descent, MBGD )则是在上面两种方法中采取了一个折中的办法:每次从训练集中取出 batch size 个样本作为一个 mini-batch,以此来进行一次参数更新。
$$
\theta=\theta -\eta \cdot \nabla_{\theta} J(\theta;x^{(i:i+n);y^{(i:i+n)}})
$$
其中
优点
- 减小参数更新的方差,这样可以有更稳定的收敛。
- 利用现在最先进的深度学习库对矩阵运算进行了高度优化的特点,这样可以使得计算 mini-batch 的梯度更高效。
样本数目较大的话,一般的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,如果mini-batch 大小是
MBGD 是训练神经网络时的常用方法,而且通常即使实际上使用的是 MBGD,也会使用 SGD 这个词来代替。
误差反向传播算法,给出了一种计算偏导数的方法。
在物理学中,“熵”被用来表示热力学系统所呈现的无序程度。香农将这一概念引入信息论领域,提出了“信息熵”概念,通过对数函数来测量信息的不确定性。
交叉熵(cross entropy)是信息论中的重要概念,主要用来度量两个概率分布间的差异。假定
交叉熵刻画了两个概率分布之间的距离,旨在描绘通过概率分布
这里仍然以三类分类问题为例,假设数据
那么对于数据
很显然,一个良好的神经网络要尽量保证对于每一个输入数据,神经网络所预测类别分布概率与实际类别分布概率之间的差距越小越好,即交叉熵越小越好。于是,可将交叉熵作为损失函数来训练神经网络。
上图给出了一个三个类别分类的例子。由于输入数据
在上式中,$y_2$ 和
在神经网络训练中,要将输入数据实际的类别概率分布与模型预测的类别概率分布之间的误差(即损失)从输出端向输入端传递,以便来优化模型参数。下面简单介绍根据交叉熵计算得到的误差从
由于交叉熵损失函数
同理,交叉熵损失函数导数为
在上面的例子中,假设所预测中间值
可以看出,$Softmax$ 和交叉熵损失函数相互结合,为偏导计算带来了极大便利。偏导计算使得损失误差从输出端向输入端传递,来对模型参数进行优化。在这里,交叉熵与$Softmax$ 函数结合在一起,因此也叫
softmax 把分类输出标准化成概率分布,cross-entropy 刻画预测分类和真实结果概率分布之间的相似度。
神经网络遇到的两大问题:梯度消失 + 过拟合
神经网络并非层数越深越好,层数越深,越越靠近输入处的神经元的梯度越小
比如用 sigmoid,$\delta_h=o_h(1-o_h)\le \frac{1}{4}$,越乘梯度越小
解决思路:
-
使用 ReLU 激活函数,ReLU 的导数为 1
-
优化网络结构
GoogLeNet:
配合 inception 模块采用辅助输出,中途分支的输出对应更浅层的神经网络,训练时用三个输出共同计算 Loss,辅助输出更靠近输入,可以缓解梯度消失问题
ResNet:
设输入为
$\boldsymbol{x}$ ,假设我们希望学出的理想映射为$f(\boldsymbol{x})$ ,从而作为激活函数的输入。左图虚线框中的部分需要直接拟合出该映射$f(\boldsymbol{x})$ ,而右图虚线框中的部分则需要拟合出有关恒等映射的残差映射$f(\boldsymbol{x})-\boldsymbol{x}$ 。残差映射在实际中往往更容易优化。实际中,当理想映射$f(\boldsymbol{x})$ 极接近于恒等映射时,残差映射也易于捕捉恒等映射的细微波动。右图也是 ResNet 的基础块,即残差块(residual block)。在残差块中,输入可通过跨层的数据线路更快地向前传播。![]()
词向量又称为词嵌入(word embedding),是一种将单词表示为向量的方法。
嵌入:满足一定性质的一种变换。
- 用与词表等长的向量表示一个词
- 向量只有一个元素为 1,其余为 0
- 第 i 个元素为 1 的向量用于表示词表中的第 i 个词
优点
- 编码简单
缺点
- 编码太长
- 无法度量词之间的相似性
- 一种压缩表示方法,将词映射到一个较短的向量,用向量的所有位联合表示一个词。
- 可根据需要指定向量的大小。
- 一般语义相近的词在空间中分布相近。
neural network language model,这一块描述的我真的很不理解,私以为和 Viterbi algorithm 那章一样,希望通过神经网络来学习语句内词语的联系,也即前 n-1 个词确定时,第 n 个词的分布概率。
结合这两张图,还是蛮好理解的。
- 通过让联合概率最大化估计概率的方法称作最大似然估计
联合概率分布一般含有参数,通过最大似然方法估计该联合概率的参数,对于神经网络语言模型就是估计网络的参数值
- softmax 计算复杂度高
- 输出层神经元个数多,等于词表长度 k
- 全连接层参数较多
经过简化的 NNLM 模型,连续词袋模型(CBOW)or 跳词模型(Skip-Gram Model)
对于第 t 个词
也即在此图中,直接将词向量相加得到
接下来,把得到的 tensor
注意,$w_t$ 对应的词所在的位置实际上是确定的(在建树时就由词频决定了),故而
- 词
$\mathrm{w}$ 的最大似然函数:
- 定义损失函数(负对数似然函数):
再以此为基础,BP 更新参数。
优点
- 每次只更新路径上的参数,也即每次只更新与该词有关的参数
- 越是常用的词距离根节点越近,参数越少
- 连接权重过多
- 影响训练速度
- 影响使用速度
- 局部链接:每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受(receptive field)。
- 权值共享:同一层的权值相同,移动视野不移动权重。
- 池化:最大池化 or 平均池化
- 从局部到全局:层数越高的神经元获得的感知范围越大。
- CNN 同样使用 BP 来优化,推导相对复杂
- 参数少,只与卷积核的大小和数量有关
- 具有特征抽取能力
- 特征的平移不变性(一定程度上)
channel 这个概念混淆的很厉害。总结一下,我按照 torch 中的 cnn 的 channel 定义,将其分为三种:
- 最初输入的图片样本的 channels ,取决于图片类型,比如 RGB
- 卷积操作完成后输出的 out_channels ,即卷积核的数量。此时的 out_channels 也会作为下一次卷积时的卷积核的 in_channels
- 注意,对于某个卷积核产生的一个隐藏层,这个隐藏层上的神经元共享参数。然而不同的卷积核产生的不同隐藏层并不共享参数
- 卷积核中的 in_channels ,就是上一次卷积的 out_channels ,如果是第一次做卷积,就是样本图片的 channels
一种降维手段。
一般来说,当高的步幅
Recurrent Neural Network
而 RNN 并非刚性地记忆所有固定长度的序列,而是通过隐藏状态来存储之前时间步的信息。
我们考虑输入数据存在时间相关性的情况。假设 $\boldsymbol{X}t \in \mathbb{R}^{n \times d}$ 是序列中时间步 $t$ 的小批量输入,$\boldsymbol{H}t \in \mathbb{R}^{n \times h}$ 是该时间步的隐藏变量。与多层感知机不同的是,这里我们保存上一时间步的隐藏变量 $\boldsymbol{H}{t-1}$,并引入一个新的权重参数 $\boldsymbol{W}{hh} \in \mathbb{R}^{h \times h}$,该参数用来描述在当前时间步如何使用上一时间步的隐藏变量。具体来说,时间步
$$ \boldsymbol{H}t = \phi(\boldsymbol{X}t \boldsymbol{W}{xh} + \boldsymbol{H}{t-1} \boldsymbol{W}{hh} + \boldsymbol{b}h). $$ 与多层感知机相比,我们在这里添加了 $\boldsymbol{H}{t-1} \boldsymbol{W}{hh}$ 一项。由上式中相邻时间步的隐藏变量 $\boldsymbol{H}t$和$\boldsymbol{H}{t-1}$ 之间的关系可知,这里的隐藏变量能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。因此,该隐藏变量也称为隐藏状态。由于隐藏状态在当前时间步的定义使用了上一时间步的隐藏状态,上式的计算是循环的。使用循环计算的网络即循环神经网络(recurrent neural network)。
循环神经网络有很多种不同的构造方法。含上式所定义的隐藏状态的循环神经网络是极为常见的一种。在时间步
$$
\boldsymbol{O}t = \boldsymbol{H}t \boldsymbol{W}{hq} + \boldsymbol{b}q.
$$
循环神经网络的参数包括隐藏层的权重 $\boldsymbol{W}{xh} \in \mathbb{R}^{d \times h}$、$\boldsymbol{W}{hh} \in \mathbb{R}^{h \times h}$ 和偏差 $\boldsymbol{b}h \in \mathbb{R}^{1 \times h}$,以及输出层的权重 $\boldsymbol{W}{hq} \in \mathbb{R}^{h \times q}$ 和偏差
当时间步数较大或者时间步较小时,循环神经网络的梯度较容易出现衰减或爆炸。虽然裁剪梯度可以应对梯度爆炸,但无法解决梯度衰减的问题。通常由于这个原因,循环神经网络在实际中较难捕捉时间序列中时间步距离较大的依赖关系。
门控循环神经网络(gated recurrent neural network)的提出,正是为了更好地捕捉时间序列中时间步距离较大的依赖关系。它通过可以学习的门来控制信息的流动。其中,门控循环单元(gated recurrent unit,GRU)是一种常用的门控循环神经网络,它引入了重置门(reset gate)和更新门(update gate)的概念,从而修改了循环神经网络中隐藏状态的计算方式。
门控循环单元中的重置门和更新门的输入均为当前时间步输入 $\boldsymbol{X}t$ 与上一时间步隐藏状态 $\boldsymbol{H}{t-1}$,输出由激活函数为 sigmoid 函数的全连接层计算得到。
具体来说,假设隐藏单元个数为
$$ \begin{aligned} \boldsymbol{R}t = \sigma(\boldsymbol{X}t \boldsymbol{W}{xr} + \boldsymbol{H}{t-1} \boldsymbol{W}_{hr} + \boldsymbol{b}r),\ \boldsymbol{Z}t = \sigma(\boldsymbol{X}t \boldsymbol{W}{xz} + \boldsymbol{H}{t-1} \boldsymbol{W}{hz} + \boldsymbol{b}_z), \end{aligned} $$
其中 $\boldsymbol{W}{xr}, \boldsymbol{W}{xz} \in \mathbb{R}^{d \times h}$ 和 $\boldsymbol{W}{hr}, \boldsymbol{W}{hz} \in \mathbb{R}^{h \times h}$ 是权重参数,
接下来,门控循环单元将计算候选隐藏状态来辅助稍后的隐藏状态计算。我们将当前时间步重置门的输出与上一时间步隐藏状态做按元素乘法(符号为
具体来说,时间步
$$
\tilde{\boldsymbol{H}}t = \text{tanh}(\boldsymbol{X}t \boldsymbol{W}{xh} + \left(\boldsymbol{R}t \odot \boldsymbol{H}{t-1}\right) \boldsymbol{W}{hh} + \boldsymbol{b}h),
$$
其中 $\boldsymbol{W}{xh} \in \mathbb{R}^{d \times h}$ 和
最后,时间步
$$ \boldsymbol{H}_t = \boldsymbol{Z}t \odot \boldsymbol{H}{t-1} + (1 - \boldsymbol{Z}_t) \odot \tilde{\boldsymbol{H}}_t. $$
值得注意的是,更新门可以控制隐藏状态应该如何被包含当前时间步信息的候选隐藏状态所更新。假设更新门在时间步
我们对门控循环单元的设计稍作总结:
- 重置门有助于捕捉时间序列里短期的依赖关系;
- 更新门有助于捕捉时间序列里长期的依赖关系。
long short-term memory,LSTM,比门控循环单元的结构复杂。
LSTM 中引入了3个门,即输入门(input gate)、遗忘门(forget gate)和输出门(output gate),以及与隐藏状态形状相同的记忆细胞(某些文献把记忆细胞当成一种特殊的隐藏状态),从而记录额外的信息。
与门控循环单元中的重置门和更新门一样,如图所示,长短期记忆的门的输入均为当前时间步输入 $\boldsymbol{X}t$ 与上一时间步隐藏状态 $\boldsymbol{H}{t-1}$,输出由激活函数为 sigmoid 函数的全连接层计算得到。如此一来,这 3 个门元素的值域均为
具体来说,假设隐藏单元个数为
$$ \begin{aligned} \boldsymbol{I}t &= \sigma(\boldsymbol{X}t \boldsymbol{W}{xi} + \boldsymbol{H}{t-1} \boldsymbol{W}_{hi} + \boldsymbol{b}i),\ \boldsymbol{F}t &= \sigma(\boldsymbol{X}t \boldsymbol{W}{xf} + \boldsymbol{H}{t-1} \boldsymbol{W}{hf} + \boldsymbol{b}f),\ \boldsymbol{O}t &= \sigma(\boldsymbol{X}t \boldsymbol{W}{xo} + \boldsymbol{H}{t-1} \boldsymbol{W}{ho} + \boldsymbol{b}_o), \end{aligned} $$
其中的 $\boldsymbol{W}{xi}, \boldsymbol{W}{xf}, \boldsymbol{W}{xo} \in \mathbb{R}^{d \times h}$ 和 $\boldsymbol{W}{hi}, \boldsymbol{W}{hf}, \boldsymbol{W}{ho} \in \mathbb{R}^{h \times h}$ 是权重参数,$\boldsymbol{b}_i, \boldsymbol{b}_f, \boldsymbol{b}_o \in \mathbb{R}^{1 \times h}$ 是偏差参数。
接下来,长短期记忆需要计算候选记忆细胞
具体来说,时间步
$$ \tilde{\boldsymbol{C}}t = \text{tanh}(\boldsymbol{X}t \boldsymbol{W}{xc} + \boldsymbol{H}{t-1} \boldsymbol{W}_{hc} + \boldsymbol{b}_c), $$
其中 $\boldsymbol{W}{xc} \in \mathbb{R}^{d \times h}$ 和 $\boldsymbol{W}{hc} \in \mathbb{R}^{h \times h}$ 是权重参数,$\boldsymbol{b}_c \in \mathbb{R}^{1 \times h}$ 是偏差参数。
记忆细胞
我们可以通过元素值域在
$$ \boldsymbol{C}_t = \boldsymbol{F}t \odot \boldsymbol{C}{t-1} + \boldsymbol{I}_t \odot \tilde{\boldsymbol{C}}_t. $$
遗忘门控制上一时间步的记忆细胞
隐藏状态
有了记忆细胞以后,接下来我们还可以通过输出门来控制从记忆细胞到隐藏状态
这里的 tanh 函数确保隐藏状态元素值在 -1 到 1 之间。需要注意的是,当输出门近似 1 时,记忆细胞信息将传递到隐藏状态供输出层使用;当输出门近似 0 时,记忆细胞信息只自己保留。下图展示了长短期记忆中隐藏状态的计算。
对于单向的循环网络,序列前面的内容被后面的内容淹没。而且,单向循环网络都假设当前时间步是由前面的较早时间步的序列决定的,因此它们都将信息通过隐藏状态从前往后传递。有时候,当前时间步也可能由后面时间步决定。例如,当我们写下一个句子时,可能会根据句子后面的词来修改句子前面的用词。双向循环神经网络通过增加从后往前传递信息的隐藏层来更灵活地处理这类信息。
下面我们来介绍具体的定义。
给定时间步
其中权重 $\boldsymbol{W}{xh}^{(f)} \in \mathbb{R}^{d \times h}$、$\boldsymbol{W}{hh}^{(f)} \in \mathbb{R}^{h \times h}$、$\boldsymbol{W}{xh}^{(b)} \in \mathbb{R}^{d \times h}$、$\boldsymbol{W}{hh}^{(b)} \in \mathbb{R}^{h \times h}$ 和偏差
然后我们连结两个方向的隐藏状态
$$
\boldsymbol{O}_t = \boldsymbol{H}t \boldsymbol{W}{hq} + \boldsymbol{b}q,
$$
其中权重 $\boldsymbol{W}{hq} \in \mathbb{R}^{2h \times q}$ 和偏差