0%

深度学习基础(1)

这是深度学习基础知识的第一篇文章。

为了通俗易懂的说明白,这里我们不按照“花书”,“西瓜书”和“统计学习方法”等这些优秀书籍的目录,从数学基础作为入门开始深入。从我自身来说,我曾经是一个本科与硕士都是计算机专业的学生,在读研的刚开始,其实本科的概率论其实已经忘的差不多了,加上学习深度学习基础知识的时候,其实是和数理统计和矩阵论的课程同步的。这里我个人认为,首先入门深度学习,知道简单的深度学习方法是如何去做的,它包括哪些部分,每个部分如何去实现对应的功能是最关键的。
数学理论的证明至关重要,其实数学方面的理解才是大家发paper,做优化的关键。介绍完基础,后续我也会增加一些数学理论的证明。


基础部分我们分为两个部分去说

  1. 神经网络模型
    • 感知机
    • 激活函数
  2. 模型的优化
    • 激活函数
    • 梯度
    • 反向传播

本文我们就主要针对神经网络模型进行基础的介绍以及目前所在使用的激活函数的介绍及其使用领域。


感知机

感知机是由Rosenblatt提出的,它作为神经网络以及支持向量机的基础,是一种线性分类的算法,最初是用在二分类的问题。它其实是受生物学的启发,生物神经网络中,我们知道最小组成单元是神经元,神经元之间互相连接,形成了大脑中复杂的神经网络。
在感知机中,我们通过公式中可以看出,其实就是两个向量之间的乘法。

公式中,表示的是模型的输出结果,针对二分类问题,就是0,1的标签。表示的是权重,最初我们会初始化一个值付给权重,我们可以理解为高中学的中的,为了拟合一条好的直线,我们需要不停的调整斜率;同时,感知机也是存在截距,公式中的就表示截距,这里我们叫做偏置。

我们都知道,直线的截距是负责直线的移动,这里偏置也是这种作用。

图 1 二分类示意图

从图 1中我们可以看到,在二维平面上,有两种颜色的小球被一条直线划分开来,直线是一维的。直线平面在本图中就是一个超平面,超平面本质上就是一个n维空间里面的n-1维度的子空间,三维中,超平面就是一个二维平面,如同我们生活的世界被一张无穷大的纸分成两部分。

我们针对二分类问题使用 的值来判断,由公式属于哪一类别,但是由于 的值范围来判断,给定一个阈值小于的时候,它是属于这一类,相反属于类。

如何得到最优的的值,使得直线的位置更合适?

针对每个样本,我们计算 ,则我们按照更新的值,最后达到最优,等价于公式

感知机的局限性(XOR问题)
感知机不能拟合XOR函数,他只能产生线性分割面。(Minsky&Papert,1969)
XOR问题其实就是在存在先行不可分的情况下,超平面无法将其分开。图我们可以看到,一根直线是无法将红绿点分开的。

图 2 XOR问题

为了解决这个办法,在十几年后提出了多层感知机的概念,也是因为这个问题没有解决,AI领域停驻了很长时间。

多层感知机
多层感知机中最重要的部分,就是fully connected层,全连接层其实就是我们之前介绍的公式,多层感知机其实就是多个全连接层的堆叠。但是这样就会有一个问题,就是你怎么堆叠都是线性方程,为了获取非线性的模型,我就就要引入激活函数的概念。我们需要对全连接层的输出后接入激活函数从而达到非线性的效果,从而更好的去拟合。

多层感知机的概念很简单,这里就不做过多的介绍,大家也不会把重心放在这里,下面我们主要介绍激活函数。

激活函数
激活函数(activation function)的作用主要是非线性化。公式是一个线性公式,不管再怎么嵌套公式也依然是线性模型。只通过线性变换,不管多少层的神经网络与单层的神经网络其实没有区别。比如,我们将堆叠三层,对应三层网络,可以由,一个没有隐藏层的神经网络代替。
这也是为什么深度学习在20世纪一度走向没落的原因。

激活函数决定了,一个神经元是否应该通过加权求和并添加偏差而被激活。激活函数的目的是为神经元添加非线形的输入。一个没有激活函数的神经网络就只是一个线性回归模型,非线形的激活函数能够增加非线性的变换到输入中,使得它能够学习和表现更复杂的任务。

Sigmoid

图 3 sigmod损失示意图

Sigmoid函数是把一个实数,压缩到0~1的范围内,在二分类中经常使用这个函数。

这个激活函数在实际神经网络中并没有使用,因为他计算量十分大,会造成梯度消失,而且没有做到零点对称。关于梯度消失与梯度爆炸,我们后面说数学理论时,再进行说明。

Tanh

图 4 tanh损失示意图

tanh激活函数,与sigmod函数相似,只是sigmoid函数把数据压缩在(0~1)范围内,tanh函数是把数据压缩至(-1~1)范围内。

tanh函数它的均值是0,解决了sigmoid非0均值的问题,但是tanh也基本很少用了。
当然,tanh同样存在梯度消失的问题,没有根本解决sigmoid函数梯度消失的问题。

ReLU

图 5 relu损失示意图

ReLU函数是目前主流的激活函数,也是平常使用最多的激活函数,公式十分简单,小于零时为0,大于零的时候为数据本身。

ReLU函数的优点,第一点就是计算简单,而且解决了之前两个激活函数梯度消失的问题。ReLU将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征。

ReLU存在的问题,一是当x>0时,ReLU导数为常数1的好处就是在“链式反应”中不会出现梯度消失,但梯度下降的强度就完全取决于权值的乘积,这样就可能会出现梯度爆炸问题。二是当x<0时,ReLU将x<0的输出置为0,可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于‘dead’状态,所以使用ReLU的网络,学习率不能设置太大。
Leaky ReLU

图 6 leaky_relu损失示意图

这里是一个超参数,通常设置为0.01。显然,Leaky ReLU在某种程度上解决了dying ReLU的问题。请注意,如果我们将设为1,那么Leaky ReLU将成为线性函数 f(x)=xf(x)=xf(x)=x ,这是没有任何用处的。因此,的值从未设置为接近1。如果我们分别将α设为每个神经元的超参数,则得到参数ReLU或PReLU。

Max Out
其实,ReLU激活函数是Max Out激活函数的一种特殊情况。用的比较少,我们下面图可以很简单解释是如何实现的。

图 7 max out理解示意图

max out损失其实就是在多个神经单元中选出最大的值进行激活。

图 8 max out损失示意图

我们可以看到根据选择多个少神经单元进行激活,能够得到不同的激活函数曲线。Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。作者从数学的角度上也证明了这个结论,即只需2个 maxout 节点就可以拟合任意的凸函数了(相减),前提是”隐隐含层”节点的个数可以任意多.

但是同样也有缺点,每个神经元中有两组(w,b)参数,那么参数量就增加了一倍,这就导致了整体参数的数量激增。

GULE
其实还有许多其他的激活函数,但是用的都不太多,最后我们在介绍一个GELU激活函数,由于transformer模型的火热,该激活函数的使用也变得越来越多。

在激活函数领域,大多数的‘鄙视链’是Elus > Relu > Sigmoid,但是每个激活函数都有其缺陷,比如sigmoid的梯度消失,Elus和Relu的缺乏随机因素。

这里是正太分布的概率函数,可以采用正太分布,当然你也可以自己设置参数,通过训练得到

BERT源代码中,为了方便计算使用的是近似计算公式:

我们都知道激活函数的主要作用是提供非线性,同时为了提升模型的泛化能力,还会加入正则(如dropout等),但是这两个是分开的操作,GELU就是把这两种功能融合。其中从论文中的一些对比,也是体现这样的优势。

图 9 GELU损失与其他损失对比图