• Abben

深度学习中的数学


深度学习是机器学习中基于神经网络的一个分支,它有多个衍生,例如多层感知机(MLP)、卷积神经网络(CNN)和循环神经网络(RNN)等,并可用于多个领域,例如计算机视觉、自然语言处理、机器翻译等。

近年来深度学习的发展主要得益于以下三点:

  1. 比较直白的特征工程:大部分机器学习算法都需要人类的经验来做特征工程和提取,深度学习几乎不需要,特征准备好,它可以自动从中学取各自的权重。

  2. 巨大的数据集:数据的不断积累可以支持更深层的神经网络。

  3. 硬件更新:新的GPU、TPU允许更快速的数学计算。


在这篇博客中,我们主要集中在多层感知机,来讨论深度学习成功背后的数学,以及优化它们性能的优化算法。本篇概要如下:

  1. 定义

  2. 学习算法

  3. 参数初始化

  4. 前向反向传播

  5. 激活函数

  6. 优化算法


第一部分:定义

我们以预测房价为例,基于房子的大小,它可以被模型化如下:

上图展示了一个最简单的神经单元,包含了线性映射和非线性层激活函数。多层感知机(MLP)是神经网络里面比较简单的一种网络结构,它有多个层次,每个层次结构相同,信息从输入层一直流到输出层。通常它的结构就是一个输入层、多个隐层、一个输出层。下图展示的是一个5个神经神经单元的输入层+3个神经单元的第一隐层+3个神经单元的第二隐层+两个神经单元的输出层,每个神经单元就是上图activation(wx+b)结构:


在大多数深度学习问题中,我们一般都需要根据输入X去预测y,X可以是结构化的,譬如存在数据库里面的;可以非结构化的,譬如声音、图片、文本等。

现实生活中的深度学习都是对给定函数f的近似,这个近似是有用的主要归功于以下理论:

理论主要表达深度学习可以解决所有数学上可表达的问题。


通常机器学习我们都会讲数据分为3个集合:训练集,训练算法用的;开发集,用于调整算法和评估偏差和方差用的;测试集,用于评估最终算法的准确率,也可以说泛化性。

下表总结了数据的数量对应的集合划分情况:

深度学习算法需要比较大的数据集,如果有了,那么我们可以开始训练了。

通常在开始前,我们还会对输入做一个标准化,下面还会提到。


第二部分:学习算法

神经网络中的学习是指根据梯度计算参数权重的过程,换句话说,就是找到最好的参数去达到最好数据集拟合效果。为了达成这个目标,我们定义了一个目标函数,叫loss function,简称J,用来衡量在训练集上实际值和预测值的差距。

我们用以下两步来最小化J:

前向传播:根据input和相应的神经网络,传播数据到输出,一般是一小批一小批处理(batch)或者整个数据集一次处理。之后就可以计算出损失函数的值了。

反向传播:计算损失函数的梯度值,然后根据下降算法去更新参数。

每迭代完一次训练集我们就要一个epoch。定义完结构以后,学习算法就如下所示:

损失函数L计算真实值和预测值之间的距离。


第三部分:参数初始化

定义完神经网络的结构以后,第一步就是参数初始化,就相当于给模型的权重注入初始噪声。一般有以下几种初始化方法:

  1. 0初始化:W和b都置零,会导致大部分隐藏层参数都一样,导致训练过程效果不佳。

  2. 随机初始化:将参数用随机值进行初始化,主要是如果参数过大,一些激活函数可能会饱和影响后续梯度训练。

  3. Xavier初始化:从一个正态分布中随机采样参数,N(0,2/n_i)。

  4. Glorot初始化:跟Xavier初始化方法一样,方差的计算不一样,N(0,2/(n_i+n_{i+1}))。

第四部分:前向反向传播

神经网络是一系列的回归加激活函数组成,它们就是我们说的前向传播。反向传播也是一系列从输出到输入的代数运算。

前向传播,假设一个神经网络有L层:

训练集上的数学,假设是一个样本:

假设是多个样本,对每一层[i]:

上述图示如下:


反向传播,它是学习阶段的第二步,主要就是把前向传播的预测结果和实际结果的距离差值注入到网络的参数中,更新相应的参数使得它俩的距离变小。

计算图:在神经网络中,计算是用计算图来表示,它将J分解成若干个中间变量表示。我们以这个函数为例:f(x,y,z)=(x+y).z

我们通过以下两步来计算:

前向传播:从inputs到output进行计算,f(−2,5,−4)=−12

反向传播:利用链式法则计算从输出到输入的梯度:

以上两步可以用下面的计算图来表示:

数学上,我们一般通过以下式子来计算梯度

当我们进行反向传播的时候,还需要去检查梯度是否正确,算法如下:


最终我们用下图来总结下前向和反向传播: