深度学习中的数学


深度学习是机器学习中基于神经网络的一个分支,它有多个衍生,例如多层感知机(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

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

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

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

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


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


参数vs超参:参数是指反向传播需要更新的那些参数,譬如W和b;而超参是指那些定义我们算法的参数,可以被调整来提升神经网络的性能,譬如学习率、迭代次数、激活函数、网络层数、每一层的神经单元数等。


第五部分:激活函数

激活函数是神经网络中的一种非线性化函数,下面是一些常用的激活函数:

注意:如果激活函数全是线性的,那么整个神经网络跟一个简单的线性回归是一样的。

第六部分:优化算法

归一化输入

在优化损失函数之前,需要先归一化输入去加速训练过程。正态化数据一般是用的比较多的方法,减去偏差,除以方差即可。下图阐释了归一化的作用:


梯度下降

通常我们都会想构建一个凸的和可导的函数J,让它的局部最小值就是全局最小值,数学上来讲求凸函数的全局最小就是求解导数为0的等式。通常我们用的算法都是这样的:


Mini-batch梯度下降

这种技术主要就是把训练集分成批次一批一批喂给神经网络进行训练:

mini-batch的size选择可以是一个小的数目譬如2000,一般的选择是2的N次方,内存友好。

值得注意的是如果size为1,那么这种算法就叫stochastic gradient descent


Momentum梯度下降

一个比较典型的带momentum的梯度下降算法如下:

由于梯度都是在很小的批次上计算的所以噪声很大,这种指数加权平均可以给导数一个更好的近似。


RMSprop

它跟上述算法很像,区别就是它包含一个二次的momentum并且参数更新也有个小的变化:


Adam

Adam是一个自适应学习率的算法,更适合更深的神经网络。它可以被看做是RMSprop和momentum的结合。算法如下:


Learning rate decay

它的主要思想是随着迭代次数增加降低学习率,避免在训练后期在最优值附近过渡动荡。有很多decay算法,这里列出一些比较常见的:


Regularization

当训练一个神经网络的时候,我们可能碰到以下问题:

  1. 高偏差,即欠拟合,网络发现不了最优化路径。通常表现是训练集不收敛或者效果不好。

  2. 高方差,即过拟合,网络在训练集上拟合得非常好,但是开发机或者测试集就非常差。

简单图示如下:

下图是一个解决高偏差或者高方差问题的简单图示:


L1-L2正则

正则是一种防止过拟合的一个优化技术,它主要是通过在损失函数上加上一些约束条件完成:


Dropout正则

简单来说,dropout就是针对每一层网络的每一个单元进行一个概率p的丢弃操作,去减少网络复杂度防止过拟合。假如没有dropout:

假如加上dropout:


Early stopping

这种技术相当简单,就是在J_train和J_dev开始分离的时候停止训练:



梯度问题

梯度的计算在深度网络上主要会出现两个问题:梯度消失和梯度爆炸。主要是因为层次多了以后,参数会出现N次方,这个N次方会导致在底小于1的时候,梯度算出来接近0(梯度消失);在底大于1的时候,梯度算出来非常大(梯度爆炸)。


这里只是深度学习中的一些简单的入门,供入门者参考。祝学习快乐。


参考地址:https://towardsdatascience.com/deep-learnings-mathematics-f52b3c4d2576

15 views1 comment

©2020 by EasyCSTech. Special thanks to IPinfo​ and EasyNote.