本系列意在长期连载分享,内容上可能也会有所增删改减;

因此如果转载,请务必保留源地址,非常感谢!

知乎专栏:当我们在谈论数据挖掘

引言

Deep Learning 是众多机器学习算法中的一种。它起源于60年代的 Perceptron,经过80年代的 Artificial Neural Network,现阶段被称为 Deep Learning。迄今为止,是“有监督学习”领域最强大的算法类型,暂时还没有“之一”。同时,它也正在往”无监督“和”强化学习“领域扩散。

除了算法效果突出,Deep Learning 另一个特点则是又一个”应用倒逼理论“的例子。Deep Learning 依靠强大的泛化能力在越来越多的应用领域开花,但是却极其缺乏理论依据。不论是模型的解释性、结构的设计、参数的选择等等,现阶段大多是依靠经验、试错。很多在以前或许被称为 Trick 的手段,在 Deep Learning 中却可能是重要的调参方法。

这个系列意在从 DNN(Deep Neural Network)开始,对 Deep Learning 领域一些常见的算法进行介绍及说明。

DNN 的结构

DNN(Deep Neural Network)的基本结构如下。其中[公式]表示一个训练样本向量,[公式]表示期望的输出向量。

先明确本文后续使用的变量的定义。若将其中相邻的两层 Hidden Layers 提取出来,其表示的含义如下。[公式]表示第[公式]层第[公式]个神经元的输入,[公式]表示第[公式]层第[公式]个神经元的输出,[公式]表示第[公式]层第[公式]个神经元输入对应的偏置。[公式]表示从[公式]连接到[公式]的权重,于是[公式]本质就是所有第[公式]层输出跟[公式]的线性组合。同时,第[公式]层到第[公式]层的所有权重能写成向量的形式[公式],其中第[公式]列表示从[公式]发出的权重。

接下来我们分别用[公式]分别表示第[公式]层所有输入构成的向量、所有输出构成的向量、以及所有偏置构成的向量。于是,[公式][公式]的关系可以表示为[公式],过程说明如下

对于第[公式]层第[公式]个神经元,其输入[公式]与输出[公式]的关系如下图,即经过一个激活函数[公式]进行了变换。我们也可以将它们的关系描述成向量的形式,即[公式]

因此,一个基础的 DNN 的网络就是下图的形式

Back Propagation

当设计好了 DNN 的结构,且有了训练样本,再给出损失函数的定义,接下来就可以求 DNN 中的参数[公式][公式]了。而所用的算法,本质就是梯度下降法,这里称为 BP(Back Propagation) 算法。需要注意的是,Deep Learning 中所说的 BP 跟传统的 BP 不完全一样,已经简化成纯粹的梯度下降,更容易理解,以下介绍的也是这种方法。

下图先简单地回顾下求导的链式法则。

假设我们的训练样本集合为[公式],且定义损失函数为[公式],其中[公式]为损失函数的参数向量,则有

[公式]

对于 DNN 来说,[公式]其实只是包含了[公式][公式],所以我们的目的就是求[公式][公式]

我们抽出第[公式]与第[公式]层的网络,根据链式法则,[公式]其实由两部分相乘所得,如下图

对于第一项,[公式]可以根据下面的方式计算。

[公式],即观察对象是中间的两个 Hidden Layer 时,有

[公式],即观察对象是从输入层到第一个 Hidden Layer时,有

归纳起来,即对于第一项,有

[公式]

对于第二项,我们将它定义成[公式],即[公式]。当[公式],即我们观察的是中间某层 Hidden Layer 时,同样根据链式法则,[公式][公式]有以下关系

[公式]

其中,每一项分别可以表示为

[公式]

可得

[公式]

[公式],即我们观察的是输出层时

[公式]

其中,[公式]根据[公式]的定义计算。如定义为[公式]

归纳起来,即对于第二项,我们写成向量形式,如下。其中[公式]表示向量 element-wise 的乘法(感谢 @雨辰 提醒)。

[公式]

为了更方便理解,其实对于[公式]的计算,可以看做是 DNN 网络的反向传播,如下图

此外,我们还需要计算[公式],其推导如下:

[公式]

因此,整个 Back Propagation 的过程本质就是先第一层正向计算[公式],再从最后一层反向计算[公式],最后求出[公式][公式]。也即其名字所示

综上所示,即 Back Propagation 的流程,传说中 BP 的四个公式也在过程中都推导过了,如下

[公式]

Mini-batch Gradient Descent

我们都知道 GD(Gradient Descent) 的本质就是希望逐步逼近最优,其迭代公式为

[公式]

我们最常用的 GD,是使用所有的训练样本来求梯度,即

[公式]

利用所有的训练样本来求梯度,好处是梯度下降的方向会稳定地朝着极值方向并收敛,不容易受噪声影响;但是问题也比较明显,一个是考虑了所有的数据所有收敛慢,同时容易陷入局部最优。随着数据量的增大,更大的问题就是每更新一次参数,计算量太大;同时,由于考虑了所有数据,收敛就慢。

因此 SGD(Stochastic Gradient Descent) 就应运而生:每次 Iteration 计算梯度并更新参数时只考虑一个样本,对每一个样本执行完这个过程称为一次 Epoch。即

[公式]

SGD 的好处就是加快了收敛的速度。问题就是由于根据一个样本求的梯度,方向并不一定指向极值方向;甚至可能出现每一次 Iteration 求出的梯度方向差异巨大,最终无法收敛。

因此 Mini-batch GD(Stochastic Gradient Descent) 又应运而生:每次 Iteration 计算梯度并更新参数时考虑 Batch_Size 个样本(称为一个 Batch),对所有样本执行完这个过程称为一次 Epoch。其公式如下,[公式]表示本次选择的 Batch,[公式]表示 Batch_Size

[公式]

尾巴

这一部分主要介绍了 DNN 与 Back Propagation,顺带介绍了 Mini-batch GD。其实关于 DNN 还有很多可以说,比如 Activation Function、Weight Decay、Dropout,Mini-batch GD 也有 Rprop、RMSProp 等方法,不过感觉内容还不少,准备独立出来。同时,关于 Deep Learning 的脉络,也即后续怎么写也还在考虑。有建议也欢迎提出。

本系列其他文章:

Supervised Learning:

当我们在谈论 Deep Learning:DNN 与 Backpropagation

当我们在谈论 Deep Learning:DNN 与它的参数们(壹)

当我们在谈论 Deep Learning:DNN 与它的参数们(贰)

当我们在谈论 Deep Learning:DNN 与它的参数们(叁)

当我们在谈论 Deep Learning:CNN 其常见架构(上)

当我们在谈论 Deep Learning:CNN 其常见架构(下)

当我们在谈论 Deep Learning:GAN 与 WGAN

Reference

  1. 文中 PPT 截图出自李宏毅老师的课件