Skip to content

三、深度学习基础

3.1 深度前馈神经网络

前馈神经网络是许多重要深度学习方法的基础,用给定的数据近似(拟合)某个函数\(f^*(x)\)。对于分类器而言,前馈神经网络的训练目标是学习参数\(\theta\)来得到理想分类器\(f^*(x)\)的最好近似函数。

在前馈神经网络中,输出层能直接接收来自训练数据的监督信号,而中间层不能。由于训练数据没有为中间层设定明确的输出目标,因此中间层也称为隐藏层

从网络层之间的输入与输出来看,每一层都可以看作向量->向量的函数;从网络层内的节点来看,网络层的每一层都可以看作向量到标量的函数的集合,每个节点代表一个函数。每个节点从上层所有节点聚合信息并进行变换(线性),然后传递给激活函数(非线性)。激活函数决定了信息能多大程度传递到下一层。线性运算与非线性运算提高了神经网络的拟合能力。

3.1.1 网络结构

在全连接前馈神经网络中,相邻层的节点组成了一个完全二分图。一个节点的运算主要由两部分构成:输入元素的线性加权求和偏置项。节点运算的数学表示为\(h=\alpha(b+\sum_{i}w_i\cdot x_i)\),其中\(\alpha\)为激活函数,\(b\)为偏置项。

picture 1

对于一般神经网络,在第\(k\)层有\(N^{(k)}\)个节点,该层输出为\(h^{(k)}\),则第\(k+1\)层的第\(j\)个元素可表示为:

\[
h_j^{(k+1)}=\alpha(b_j^{(k)}+\sum_{i=1}^{N^{(k)}}W_{j,i}^{(k)}h_i^{(k)})
\]

矩阵表示为:

\[
h^{(k+1)}=f^{(k+1)}(h^{(k)})=\alpha(b^{(k)}+W^{(k)}h^{(k)})
\]

picture 2

3.1.2 激活函数

整流函数】(Rectifier Function) 整流函数的定义为\(\mathrm{ReLU}(z)=\max\{0,z\}\)。采用整流函数作为激活函数的单元称为整流线性单元(ReLU)。

  • 当输入为负数时梯度为0,因此若某单元没有激活则无法获取训练该单元的监督信号
  • 带泄露整流线性单元(LeakyReLU) \(\mathrm{LeakyReLU}(z)=\begin{cases}\alpha z, &z<0 \\ z, & z\geq 0\end{cases}\)
  • 指数线性单元(ELU) \(\mathrm{ELU}(z)=\begin{cases}c(e^z-1), &z<0 \\ z, & z\geq 0\end{cases}\)

逻辑S型函数】(Logistic Sigmoid Function) \(\sigma(z)=\frac{1}{1+e^{-z}}\)

双曲正切函数\(\tanh(z)=\frac{2}{1+e^{-2z}}-1=2\sigma(2z)-1\)

picture 3

3.1.3 输出层与损失函数

对于二分类问题,使用线性层与逻辑S型函数将结果映射到0到1的范围(\(\hat{y}=\sigma(Wh+b)\))。输出为\(\hat{y}\)代表输入样本类别为1的概率。对于输出\(\hat{y}\)与真实标签值\(y\),可用过交叉熵损失函数计算真实值与模型预测值的差异:\(l(y,\hat{y})=-y\log(\hat{y})-(1-y)\log(1-\hat{y})\)。推断时若\(\hat{y}>0.5\)则预测为1,否则为0。

对于多分类问题,One-Hot向量\(y\in \{0,1\}^n\)指示样本的标签。使用线性层与Softmax函数将结果归一化为一个类别相关的离散概率分布:\(\hat{y}_i=\mathrm{Softmax}(z)_i=\frac{e^{z_i}}{\sum_je^{z_i}}\),其中\(\hat{y}_i\)表示输入样本属于类别\(i-1\)的概率。最终使用交叉熵计算损失函数\(l(y,\hat{y})=-\sum_{i=0}^{n-1}y_i\log(\hat{y}_i)\)。推断时若\(\hat{y}_i\)为输出单元中最大值,则预测为i-1。

3.2 卷积神经网络

卷积神经网络(CNN)是一种流行的神经网络模型。在CNN中,具有卷积运算的层称为卷积层,将附近神经元输出汇聚为新的输出的过程称为池化,具有池化功能的层称为池化层。

3.2.1 卷积与卷积层

连续信号的卷积过程为\((f*g)(t)=\int_{-\infty}^{\infty}f(\tau)g(t-\tau)d\tau\),离散信号的卷积过程为\((f*w)(t)=\sum_{\tau=-\infty}^{\infty}f(\tau)w(t-\tau)\)

在神经网络中,\(t\)可以作为输入层中的单元索引,函数\(w\)可作为内核(滤波器),卷积操作可表示稀疏连接图,卷积层可理解为在输入层上滑动内核进行卷积计算。

卷积层具有三个重要特点:稀疏连接参数共享等变表示

稀疏连接】 与传统神经网络相比,CNN在两层之间的连接更加稀疏。在密集连接的两层中,单个输出单元受到所有输入单元的影响;在CNN的两层中,输出单元仅受到少数输入单元的影响,由此引出感受野的概念。稀疏连接能够提高神经网络的计算效率,若不考虑参数共享,则当内核大小为\(K\)、输出大小为\(M\)时,时间复杂度为\(O(K\times M)\)

参数共享】 参数共享,指对不同输出单元执行计算时采用同一组参数。因此参数共享能够提高计算效率。

等变表示】 在卷积操作中平移函数(例如移位)是等变的,因此属性的偏移并不会影响CNN对于某一属性的指示。

3.2.2 实际操作中的卷积层

在典型的卷积层中,多个不同的卷积核会被并行应用,以提取输入层的特征,因此输入层和输出层都是多通道表示的,其中每个卷积核的结果对应于一个输出通道。

对于通道数为\(L\)的输入图片\(I\),对其进行\(P\)个卷积核的卷积操作,计算过程为:

\[
S(i,j,p)=(I*K_p)(i,j)=\sum_{l=1}^{L}\sum_{\tau=i-n}^{i+n}\sum_{j=\gamma-n}^{\gamma+n}I(\tau,\gamma,l)K_p(i-\tau,j-\gamma,l)
\]

有时为了降低计算复杂度,卷积核滑动时可以跳过一些位置,即卷积操作每隔s个位置执行一次,称为跨步卷积,数学表示为:

\[
S(i,j,p)=\sum_{l=1}^{L}\sum_{\tau=i-n}^{i+n}\sum_{j=\gamma-n}^{\gamma+n}I(\tau,\gamma,l)K_p((i-1)s+1-\tau,(j-1)*s+1-\gamma,l)
\]

在进行卷积运算前,通常需要进行零填充,而填充的大小、感受野的大小(或卷积核的大小)以及步长决定了给定输入大小时的输出大小。假设一维输入长度为\(N\),卷积填充大小为\(Q\),感受野大小为\(F\),步长为\(s\),则输出的尺寸为\(O=\frac{N-F+2Q}{s}+1\)

3.2.3 非线性激活层

ReLU是CNN中广泛使用的激活函数,非线性激活过程也称为探测阶段或探测层。

3.2.4 池化层

池化层通常在卷积层和探测层之后。池化函数通过汇总局部邻域的统计信息得到输出结果,因此在池化层之后数据的宽度和高度都会减小,但是数据的深度(通道数)不会改变。常用的池化操作包括最大池化、平均池化等。

3.2.5 卷积神经网络总体框架

基于CNN的分类任务的总体框架可分为两部分:特征提取模块分类模块。特征提取模块通过卷积层和池化层从输入中提取特征;分类模块是基于全连接的前馈神经网络。这两个模块通过展平操作连接,将由特征提取模块得到的多通道的特征矩阵展平为一维向量,该向量作为分类模块的输入。

picture 1

3.3 循环神经网络

当任务中数据样本由序列值构成时,将序列中每个元素看作输入层的一个输入单元的策略是不合适的:(1)输入的序列值长度可能不同(2)无法共享序列不同位置学习的特征。

循环神经网络(RNN)将序列的每个元素逐个地应用相同的函数,使得模型在不同序列位置上实现了参数共享。无论序列的长度为多少,模型都可以重复地使用相同的函数,这从本质上解决了输入序列长度变化的问题。

3.3.1 传统循环神经网络的网络结构

传统RNN模型一次提取序列中的一个元素,然后用一个神经网络模块进行处理,但是对于每个模块来说,其输入不仅包括单个序列元素,还包括前一模块的输出,因此序列中靠前的元素的信息会对靠后的元素的处理造成影响。

长度为n的序列可表示为\((x^{(1)},x^{(2)},\cdots,x^{(n)})\),在位置\(t\)产生的输出信息\(y^{(t)}\),流入下一个模块的输出信息\(h^{(t)}\),且\(h^{(0)}\)初始化为0。循环神经网络处理第i个元素的过程可表述如下:(\(W_{hh}\)\(W_{hx}\)\(W_{yh}\)表示线性变换相关的参数矩阵,\(b_h\)\(b_y\)为偏置项,\(\alpha_h\)\(\alpha_y\)为激活函数)

\[
\begin{aligned}
h^{(i)}&=\alpha_h(W_{hh}h^{(i-1)}+W_{hx}x^{(i-1)}+b_h) \\
y^{(i)}&=\alpha_y(W_{yh}h^{(i)}+b_y)
\end{aligned}
\]

picture 1

传统RNN模型并不能很好地捕获序列中元素之间的长距离依赖关系。随着网络模型模块的不断叠加,传统RNN模型可能出现梯度爆炸(损坏模型优化过程)或梯度消失(靠后的元素无法为靠前的元素的计算提供指导信息)。

3.3.2 长短期记忆网络

长短期记忆网络(LSTM)相比传统RNN模型的独特之处在于一组门单元控制其信息流。信息流过序列中连续位置的状态单元\(C^{(t-1)}\)隐藏状态\(h^{(t-1)}\),其中状态单元可被认为从先前状态传播到下一个位置的信息,隐藏状态帮助确定该信息如何传播。

LSTM的工作过程大致如下:

  • 确定从先前单元状态来的那些信息应该被丢弃。该决定由遗忘门做出,遗忘门可表述为\(f_t=\sigma(W_f\cdot x^{(t)}+U_f\cdot h^{(t-1)}+b_f)\)
  • 确定输入\(x^{(t)}\)中哪些信息需要存储到新单元状态中。该决定由输入门做出,输入门可表述为\(i_t=\sigma(W_i\cdot x^{(t)}+U_i\cdot h^{(t-1)}+b_i)\)
  • 输入\(x^{(t)}\)经由神经网络处理后生成候选值\(\tilde{C}^{(t)}=\tanh(W_c\cdot x^{(t)}+U_c\cdot h^{(t-1)}+b_c)\)
  • 通过组合旧单元状态\(C^{(t-1)}\)和新候选单元状态\(\tilde{C}^{(t)}\),生成新单元状态\(C^{(t)}=f_t \odot C^{(t-1)}+i_t\odot \tilde{C}^{(t)}\)\(odot\)为Hadamard积)
  • 最后生成隐藏状态\(h^{(t)}\)。隐藏状态基于更新的单元状态\(C^{(t)}\)输出门,输出门确定要保留新单元状态的哪些信息。新的隐藏状态生成方式为\(o_t=\sigma(W_o\cdot x^{(t)}+U_o\cdot h^{(t-1)}+b_o)\)\(h^{(t)}=o_t\odot \tanh(C^{(t)})\)

picture 1

LSTM神经网络总体框架可表述为\(C^{(t)},h^{(t)}=LSTM(x^{(t)},C^{(t-1)},h^{(t-1)})\)

3.3.3 门控循环单元

门控循环单元(GRU)可看作LSTM的一种变体,其中遗忘门和输入门合并为GRU的更新门,单元状态和隐藏状态合并为GRU中同一状态。

门控RNN模型GRU公式如下:

  • \(z_t=\sigma(W_z\cdot x^{(t)}+U_z\cdot h^{(t-1)}+b_z)\)
  • \(r_t=\sigma(W_r\cdot x^{(t)}+U_r\cdot h^{(t-1)}+b_r)\)
  • \(\tilde{h}^{(t)}=\tanh(W\cdot x^{(t)}+U\cdot (r^{(t)}\odot h^{(t-1)})+b)\)
  • \(h^{(t)}=(1-z_t)\odot h^{(t-1)}+z_t\odot \tilde{h}^{(t)}\)

\(z_t\)为更新门,\(r_t\)为重置门,GRU的总体框架可表述为\(h^{(t)}=GRU(x^{(t)},h^{(t-1)})\)

picture 2

3.4 自编码器

自编码器可看作一个试图在输出中复现输入的神经网络,位于中间位置的隐藏层表达\(h\)描述了一个包含输入信息的编码。自编码器包括编码器解码器两部分,其中编码器将输入编码为\(h\)\(h=f(x)\)),解码器通过编码重构输入(\(\hat{x}=g(h)\))。理想的自编码器并不能够完美地重构输入,而是将一些必要的信息压缩到编码中以获得较为满意的输出。自编码器的损失函数可表示为\(l(x,g(f(x)))\)

信息瓶颈”的设计对于自编码器至关重要。通过限制编码维度可得到欠完备自编码器;通过增加正则化选项阻断输入与输出之间的记忆可得到正则化自编码器

3.4.1 欠完备自编码器

一个编码维度小于输入维度的自编码器称为欠完备自编码器。通过最小化重构误差,模型可以将输入中最重要的信息保存在隐藏层编码中。

picture 1

3.4.2 正则化自编码器

通过叠加更多编码器和解码器网络层,可以增加字编码器的深度,但是如果容量太大,则自编码器可能无法学习任何有用的东西。为了防止自编码器学到一个恒等函数,可以在损失函数中加入正则化项:\(l(x,g(f(x)))+\eta \cdot \Omega(h)\),其中\(\Omega(h)\)表示在编码\(h\)上的正则化项,\(\eta\)为决定正则化作用大小的超参数。

稀疏编码器的正则化项使用编码\(h\)\(L_1\)范数\(\Omega(h)=||h||_1\)。基于\(L_1\)范数的正则化项迫使编码\(h\)变得稀疏。

另一种增加编码稀疏性的方法是使编码中的神经元在大部分时间处于“非活跃状态”,即\(h\)中神经元的数值比较小。基于一组训练样本\(\{x_{(i)}\}_{i=1}^{m}\)的平均隐藏层编码可表示为\(\bar{h}=\frac{1}{m}\sum_{i=1}^{m}h(x_{(i)})\)。我们希望限制隐藏层编码中的每个元素,使其与一个小数值\(\rho\)尽可能接近。

正则化项的自编码器也可称为稀疏自编码器。正则化项既可应用在欠完备自编码器上,也可独立作为“信息瓶颈”(当正则化项存在时编码的维度不一定小于输入维度)。

3.5 深度神经网络的训练

3.5.1 梯度下降

梯度下降及其变种是深度学习中最常被用来最小化损失函数的方法。梯度下降是一种一节迭代优化算法,每次迭代中通过向梯度的反方向前进一步更新参数\(W\)\(W'=W-\eta \cdot \triangledown_WL(W)\),其中\(\eta\)代表学习率。学习率决定了梯度下降的速度,通常学习率设定为较小的常数。损失函数通常为对于一组训练样本的惩罚的总和\(L(W)=\sum_{i=1}^{N_s}L_i(W)\)

在许多情况下,直接在所有样本上进行梯度下降需要消耗大量时间和空间,因此小批量梯度下降法应运而生。在小批量梯度下降法中,梯度可以被估计为\(\sum_{j\in M}\triangledown_W L_i(W)\)。梯度下降法还有其它变体例如Adagrad、Adadelta、Adam等。

3.5.2 反向传播

反向传播算法提供了使用动态规划计算梯度的有效算法。反向传播由两个阶段组成:

  • 前向传播 输入进入神经网络,神经网络基于当前参数计算输出,通过输出计算损失函数
  • 反向传播 根据链式法则,模型可以从输出层反向计算所有参数的梯度

路径分解

\(h^r\)为来自第\(r\)层的神经元。在大多数多层神经网络中,一般会有若干路径连接\(h^{r-1}\)\(h^{r}\),因此需要将不同路径相关的梯度加起来:(\(P\)为从\(h^r\)\(o\)的路径的集合)

\[
\frac{\partial L}{\partial w_{(h^{r-1},h^r)}}=\underbrace{\frac{\partial L}{\partial o}\cdot [\sum_{[h^r,h^{r+1},\cdots,h^k,o]\in P}\frac{\partial o}{\partial h^k}\prod_{i=r}^{k-1}\frac{\partial h^{i+1}}{\partial h^i}]}_{\triangle(h^r,o)=\frac{\partial L}{\partial h^r}}\cdot \frac{\partial h^r}{\partial w_{(h^{r-1},h^r)}}
\]

将任意路径\(p\in P\)分解为两部分:边\((h^r,h^{r+1})\)和从\(h^{r+1}\)\(o\)的路径,共享相同的第一条边为\((h^r,h^{r+1})\)的路径的集合记为\(P_{r+1}\)\(P_{r+1}\)去除共享的边\((h^r,h^{r+1})\)的路径的集合记为\(P_{r+1}'\),则有下列关系:(\(\varepsilon\)表示所有从\(h^r\)到第\(r+1\)层任意神经元的边的集合)

\[
\begin{aligned}
\triangle(h^r,o)
&=\frac{\partial L}{\partial o}\cdot [\sum_{[h^r,h^{r+1},\cdots,h^k,o]\in P}\frac{\partial o}{\partial h^k}\prod_{i=r}^{k-1}\frac{\partial h^{i+1}}{\partial h^i}] \\
&=\frac{\partial L}{\partial o}\cdot [\sum_{[h^r,h^{r+1},\cdots,h^k,o]\in P}\frac{\partial o}{\partial h^k}\prod_{i=r+1}^{k-1}\frac{\partial h^{i+1}}{\partial h^i}\cdot \frac{\partial h^{r+1}}{\partial h^r}] \\
&=\frac{\partial L}{\partial o}\cdot [\sum_{(h^r,h^{r+1})\in \varepsilon} \frac{\partial h^{r+1}}{\partial h^r} \cdot [\sum_{[h^r,h^{r+1},\cdots,h^k,o]\in P_{r+1}'}\frac{\partial o}{\partial h^k}\prod_{i=r+1}^{k-1}\frac{\partial h^{i+1}}{\partial h^i}]] \\
&=\sum_{(h^r,h^{r+1})\in \varepsilon} \frac{\partial h^{r+1}}{\partial h^r} \cdot\frac{\partial L}{\partial o}\cdot [\sum_{[h^r,h^{r+1},\cdots,h^k,o]\in P_{r+1}'}\frac{\partial o}{\partial h^k}\prod_{i=r+1}^{k-1}\frac{\partial h^{i+1}}{\partial h^i}] \\
&=\sum_{(h^r,h^{r+1})\in \varepsilon} \frac{\partial h^{r+1}}{\partial h^r}\cdot\triangle(h^{r+1},o)
\end{aligned}
\]

\(a^{r+1}\)代表\(h^{r+1}\)单元在使用激活函数\(\alpha\)前的数值(\(h^{r+1}=\alpha(a^{r+1})\)),则通过链式法则可计算\(\frac{\partial h^{r+1}}{\partial h^r}\)

\[
\frac{\partial h^{r+1}}{\partial h^{r}}=\frac{\partial\alpha(a^{r+1})}{\partial a^{r+1}}\cdot \frac{\partial a^{r+1}}{\partial h^r}=\alpha'(a^{r+1})\cdot w_{(h^r,h^{r+1})}
\]

因此,\(\frac{\partial L}{\partial w_{(h^{r-1},h^r)}}\)的计算可通过以下关系计算:

\[
\begin{cases}
\triangle(h^r,o)&=\sum_{(h^r,h^{r+1})\in \varepsilon} \alpha'(a^{r+1})\cdot w_{(h^r,h^{r+1})}\cdot\triangle(h^{r+1},o)\\
\frac{\partial h^r}{\partial w_{(h^{r-1},h^r)}}&=\alpha'(a^r)\cdot h^{r-1}
\end{cases}
\]

3.5.3 预防过拟合

参数正则化】 在机器学习中,将模型参数正则化项引入损失函数是防止过拟合的常用技术。通过正则化,模型中参数被约束为相对较小值,这通常意味着对应的模型具有更好的泛化能力。模型参数的\(L_1\)\(L_2\)范数是两个常用的正则化项。

Dropout】 Dropout是一种防止过拟合的有效技术。Dropout的基本思想是在每批训练过程中忽略网络中的某些单元,因此引入被称为dropout rate的超参数\(p\)来控制每个单元被忽略的概率。在每次迭代中,根据概率\(p\)随机确定网络中哪些神经元被忽略。不过Dropout仅在训练中使用,在推断阶段仍使用整个网络。

批量归一化】 批量归一化最初用来解决内部协变量偏移问题,也可以降低模型过拟合风险。批量归一化将上一层的激活输入下一层之前进行归一化处理。如果训练过程中采用小批量训练,则该归一化通过减去批次平均值并除以批次标准偏差实现。在推断阶段,使用总体样本的统计信息执行归一化。