深度学习系列之神经网络

时间:2024-05-23 12:13:19

引言

  随着人工智能时代的降临,深度学习(DeepLearning)成为继大数据、机器学习之后又一极具网络搜索热度的关键词,作为一名码农,如果不懂深度学习技术,感觉时刻要被同胞鄙视的样子。最近小编也在学习DL,独乐乐不如众乐乐,那么小编就带大家一起探寻深度学习技术中的奥秘,共同进步。

什么是深度学习

  机器学习众多算法中有一类叫做神经网络的算法,神经网络模型如下图所示:
深度学习系列之神经网络
  图中每个圈圈代表一个神经元,每一条有向箭头代表着神经元之间的连接。我们能够看到,上图中的神经网络有三层,即输入层(Input layer)、隐藏层(Hidden layer)和输出层(Ouput layer)。每一层之间的神经元没有连接,各层的神经元之间全连接。输入层用于传入数据,隐藏层会对输入的值进行运算后输出,输出层负责神经网络的数据输出。
  这是一个比较简单的神经网络模型,当隐藏层比较多(大于等于2)的时候我们就称之为深度神经网络,所谓的深度学习技术使用的就是深层神经网络模型。深层网络相比于浅层网络(仅有一个隐藏层)具备更好的表达能力,同样去拟合一个函数,浅层网络需要很多的神经元,而深层网络用较少的神经元就可以。也就是说,为了拟合一个函数,要么使用浅而宽的网络,要么使用深而窄的网络,但后者往往更节约资源。

神经元

  神经网络模拟了人脑中的神经元结构,一个神经元模型包含输入、计算和输出功能,如下图所示。
深度学习系列之神经网络
  一个神经元接收多个输入,如x1、x2、x3,每个输入上都有一个权值,如w1、w2、w3,因此,一个神经元的总输入就是每个输入值的加权和∑(X*W+b),其中X和W表示输入值、权重值向量,b表示神经元的偏置项。神经元的总输入经过一个**函数非线性变换后,就得到该神经元的输出,即Z = f(∑(X*W+b))。
深度学习系列之神经网络

前馈神经网络FNN(Feedforward Neural Network)

  一个神经元有多个输入和一个输出,每个神经元的输入既可以是其他神经元的输出,也可以是整个神经网络的输入。所谓神经网络的结构就是指的不同神经元之间的连接结构。如下图所示,是一个前馈神经网络FNN,FNN由一个输入层、一个或者多个隐藏层,和一个输出层构成,各层之间相互连接。
深度学习系列之神经网络
  FNN中,前一层神经元的输出和对应的权重矩阵相乘后,得到当前层神经元的输入,然后对输入值经过**函数的非线性变换后得到一个输出值,需要说明的是,输入层中的神经元一般不进行计算,只是用于提取数据中的特征向量。
  下面我们以Tensorflow游乐场为例,来训练一个简单的神经网络。Tensorflow游乐场以可视化的方式给出了神经网络的训练过程,Tensorflow游乐场左侧提供了4个不同的数据集来测试神经网络,默认数据为左上角被框出来那个。在这个数据集中,可以看到二维平面上有两种不同颜色的点,每一个点就代表了一个样本,点的颜色代表了样本的标签,因为点的颜色只有两种,所以这是一个二分类问题。
深度学习系列之神经网络
  上图就是一个简单FNN的训练过程,输入层有两个神经元,隐藏层有四个神经元,且只有一层,输出层是一个神经元。假设现在需要判断某工厂生产的零件是否合格,那么图中蓝色的点代表合格,桔色的点代表不合格,这是一个二分类问题。输入层用于提取数据的特征向量,如果用零件的长度和质量来描述一个零件是否合格,x1可以表示为零件的长度、x2可以表示为零件的质量。边上的颜色深浅就表示了对应的权重参数取值,颜色越深代表权重大,越浅就表示权重小。以默认的参数如学习率(learning rate)、**函数(activation)、正则化(regularization)、批样本量(batch size)等来训练神经网络,可以看出,在迭代100个左右的epoch后,输出层上的节点就能够很好的区别二维平面上不同颜色的点,从而解决一个二分类问题。

**函数(activation)

  在计算层中的神经元都有一个**函数对神经元的输入值进行非线性变换,常见的**函数有下面几种,**函数用g表示。
1、sigmoid函数
sigmoid函数的值域为[0,1],表达式为:
深度学习系列之神经网络
sigmoid函数的导数为:
深度学习系列之神经网络
深度学习系列之神经网络
2、tanh函数
tanh函数的值域为[-1,1],表达式为:
深度学习系列之神经网络
导数为:
深度学习系列之神经网络
深度学习系列之神经网络
3、Relu函数
线性修正单元(Relu)的值域为[0,+∞],表达式为:
深度学习系列之神经网络
导数为:
深度学习系列之神经网络
深度学习系列之神经网络

损失函数(loss function)

  神经网络模型的效果以及优化的目标是通过损失函数定义的。神经网络的训练过程就是为了找到适合的参数(权重参数W、偏置项b),使得目标函数最优(损失函数最小)。在经典的回归问题中,神经网络只有一个输出节点,这个节点的输出值就是预测值,它是一个任意实数,因此,回归中常用的损失函数是均方误差(MSE,mean squared error),定义如下:
深度学习系列之神经网络
  其中,yi表示一个batch中第i个数据的真实值,yi’为神经网络给出的预测值。
  分类问题中,需要定义事物的类别,因此在分类问题中经常使用的损失函数是交叉熵(cross entropy),交叉熵刻画了两个概率分布之间的距离,用概率分布p和q来表示交叉熵就是:
深度学习系列之神经网络
  需要注意的是,神经网络的输出不一定是一个概率分布。解决方法通常是在原有的输出层后加一个softmax回归层,将神经网络的输出变成一个概率分布。
深度学习系列之神经网络
  假设原始神经网络的输出为y1、y2…….yn,那么经过softmax回归处理之后的输出为:
深度学习系列之神经网络
  可以看出,经过softmax回归处理后,神经网络的输出变成一个概率分布,从而可以通过交叉熵来计算预测的概率分布和真是答案的概率分布之间的距离了。

梯度下降算法(Gradient Decent)

  梯度下降算法用于调整神经网络中参数的取值。根据定义好的损失函数,让模型在训练集数据上不断的迭代更新参数,直至找到适合的参数,使得目标函数最优。参数的取值决定着模型的质量。
深度学习系列之神经网络
  梯度下降算法更新参数的过程可以用寻找函数f(x)的极值点来表示,x代表模型中的参数,f(x)代表损失函数,对于初始化设置的参数x0,机器可以凭借强大的计算能力一步步的寻找f(x)的极值点。每一次迭代更新参数时,x都会沿着梯度的反方向让参数朝着总损失更小的方向更新。梯度是函数上升最快的方向,梯度的反方向便是函数下降最快的方向。每一次沿着梯度的反方向去修改x的值,最后就能一步步的走向函数的最小值附近,之所以说是最小值附近而不一定是那个最小值点,这是因为每一次参数移动的步长不会那么恰到好处,步长太长,就可能会越过最小值的那个点,收敛不到一个更好的点,从而影响模型的质量;步长太短,就需要迭代很多轮才能走到最小值附近。
梯度下降算法的公式:
深度学习系列之神经网络

过拟合

  我们希望通过训练出来的神经网络模型能够对未知的数据给出判断,模型在训练数据上的表现并不一定代表了它在未知数据上的表现。所谓的过拟合,指的是当一个模型过于复杂后,它可以很好地记忆每一个训练数据中随机噪音的部分而忘记了要去学习训练数据中通用的趋势,通俗说就是模型的迁移能力差。解决过拟合的方法通常有:1)增加训练样本量;2)设置dropout参数,让神经网络按一定比例失活,简化神经网络模型;3)正则化,减少特征向量的输入维度,从而减少权重参数的个数,让训练的模型具备更好的解释性,深度学习模型参数过多,并不是所有参数都对输出结果有大的影响,如果考虑所有参数的作用,则模型会过度拟合训练数据。