神经网络简介

神经网络的要素

神经网络的每一层由节点构成,运算在节点中进行,节点的运作模式与人类的神经元大致相似,遇到足够的刺激信息时就会激活并释放信号。单个神经元可以用下图来表示:
20190912085138.png
左侧的”$1,x_1,x_2,…,x_m$”表示输入,”$w_0,w_1,…,w_m$”表示权重,输入和权重相乘求和之后即为网络的输入函数,之后再经过激活函数判断是否存在输出。
20190912085450.png
网络中的每一层的输出同时也是下一层的输入。

深度神经网络的重要概念

深度学习网络与普通的神经网络的区别主要在于深度,即网络中节点的层数。传统的网络主要使用一个输入层和一个输出层,中间可能添加一到两个隐藏层。那么包含三层以上的系统(包括输入层和输出层)就可以称为“深度”学习。

感知机

1958年,计算机科学家提出了由两层神经元组成的神经网络,称之为“感知机(Perceptron)”。感知机是当时首个可以学习的人工神经网络,甚至可以学习识别简单的图像,在当时引起轰动,出现了很多的相关研究,热度一直持续到1969年才结束。
20190912090412.png
热度消退的原因是Minsky在1969年出版了一本书《Perceptron》,用详细的数学证明了感知器的弱点。指出感知器对XOR(异或)这类简单分类任务都无法解决。如果将计算层增加到两层,计算量则过大,而且没有有效的学习算法。他的观点给学术界带来了巨大的影响,很多学者和实验室纷纷放弃了神经网络的研究,神经网络的研究陷入了第一次低谷。

多层感知机

1986年,Hinton等人提出了反向传播(Backpropagation, BP)算法,解决了两层神经网络所需要复杂计算量的问题。两层神经网络包含一个输入层、一个输出层,还增加了一个隐藏层。此时,中间层和输出层都是计算层,如下图:
20190912091414.png
此外,还有偏置单元与后一层的所有节点都有链接,设这些参数值为向量b,称之为偏置。如下图:
20190912091731.png
实际上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间真实的函数关系。

前向传播与反向传播算法

前向传播

在神经网络中,前向传播是利用当前的权重参数和输入数据,从下到上(即从输入层到输出层),求取预测结果,并利用预测结果与真实值求解损失函数的值。
20190912102500.png
20190912092441.png
大致的计算过程如下:

  1. 从输入层到隐含层
    $$Z_{h1}=w_1\times x_1+w_3\times x_2$$ $$Z_{h2}=w_2\times x_1+w_4\times x_2$$ $$f(Z_{h1})=\frac{1}{1+e^{-Z_{h1}}}$$ $$f(Z_{h2})=\frac{1}{1+e^{-Z_{h2}}}$$
  2. 从隐含层到输出层
    $$Z_{o1}=w_5\times f(Z_{h1})+w_7\times f(Z_{h2})$$ $$Z_{o2}=w_6\times f(Z_{h1})+w_8\times f(Z_{h2})$$ $$y_1=f(Z_{O1})=\frac{1}{1+e^{-Z_{O1}}}$$ $$y_2=f(Z_{O2})=\frac{1}{1+e^{-Z_{O2}}}$$
  3. 计算总误差
    $$E_{total}=\frac{1}{2}\sum(y-y’)^2$$

反向传播

在神经网络中,反向传播是利用前向传播求解的损失函数,从上到下(即从输出层到输入层)求解网络的参数梯度或新的参数值,经过前向和反向操作后,完成了一次迭代。

  1. 计算总误差
    20190912115131.png
    具体步骤如下:
    $$E_{total}=\frac{1}{2}\sum(y-y’)^2$$ $$E_{total}=E_{O1}+E_{O2}$$

  2. 从输出层到隐含层

20190912115951.png
假设上图中需要分析权重参数$w_5$对于整个误差的影响,可以用整体误差对于$w_5$求偏导求出:这里利用微分中的链式法则
$$\frac{\partial E_{total}}{\partial w_5}=\frac{\partial E_{total}}{\partial f(Z_{O1})}\times
\frac{\partial f(Z_{O1})}{\partial Z_{O1}}\times \frac{\partial Z_{O1}}{\partial w_5}$$
最后可以调整权重为$w_5’$,具体的计算公式为:
$$w_5’=w_5-\lambda \frac{\partial E_{total}}{\partial w_5}$$

  1. 从隐含层到输入层
    20190912163037.png
    若需要分析权重参数$w_1$对整个误差的影响,可以用整体误差对$w_1$求偏导求出。
    $$\frac{\partial E_{total}}{\partial w_1}=\frac{\partial E_{O1}}{\partial f(Z_{h1})}\times \frac{\partial f(h1)}{\partial Z_{h1}}\times \frac{\partial Z_{h1}}{\partial w_1}$$
    其中:
    $$\frac{\partial E_{total}}{\partial Z_{h1}}=\frac{\partial E_{O1}}{\partial f (Z_{h1})}+\frac{\partial E_{O2}}{\partial f(Z_{h1})}$$

    $$\frac{\partial E_{O1}}{\partial f(Z_{h1})}=\frac{\partial E_{O1}}{\partial Z_{O1}}\times \frac{\partial Z_{O1}}{\partial f(Z_{h1})}$$ $$\frac{\partial E_{O2}}{\partial f(Z_{h1})}=\frac{\partial E_{O2}}{\partial Z_{O2}}\times\frac{\partial Z_{O2}}{\partial f(Z_{h1})}$$
    最后可以得到修改后的权重$w_1$的值:
    $$w_1’=w_1-\lambda \frac{\partial E_{total}}{\partial w_1}$$

卷积神经网络

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,他的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

结构

卷积神经网络由输入层、卷积层、激活函数、池化层、全连接层组成。

卷积层

通过在输入图像中滑动不同的卷积核并执行一定的运算而组成,一般用它来进行特征提取。
20190914095335.png
例如上图中输入图像为$32\times 32\times 3$,3是他的深度,卷积层是一个$5\times 5\times 3$的感受野(filter)。通过一个感受野与输入图像的卷积可以得到一个$28\times 28\times 1$的特征图,上图是使用两个filter得到两个特征图。

激活函数

首先需要明确使用激活函数的目的:神经网络中,如果输入变化很小,导致输出结构发生截然不同的变化,这种情况显然是无法让人满意的,为了模拟更加细微的变化,输入和输出值不只是0到1,可以是0和1之间的任何数。换句话说:激活函数是用来给模型加入非线性因素的,因为线性模型的表达力不够。

激活函数应该具有下述的性质:
(1)非线性。线性激活层对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。
(2)连续可微。梯度下降法的要求。
(3)范围最好不饱和。当有饱和的区间段时,若系统优化进入到该段,梯度近似为0,网络的学习就会停止。(这里我没太看懂,可以参考原文
(4)单调性。当激活函数是单调时,单层神经网络的误差函数是凸的,方便优化。
(5)在原点处近似线性。这样当权值初始化为接近0的随机值时,网络可以学习的较快,不用可以调节网络的初始值。

常用的激活函数如下:
Sigmoid函数
$$f(x)=\frac{1}{1+e^{-x}}$$
目前已经被淘汰。
缺点:

  • 饱和时梯度值非常小。由于BP算法反向传播时后层的梯度是以乘性的方式传递到前层,因此当层数比较多的时候,传到前层的梯度就会非常小,网络权值得不到有效的更新,即梯度耗散。如果该层的权值初始化使得$f(x)$处于饱和状态时,网络基本上权值无法更新。
  • 输出值不是以0为中心值。

Tanh函数
$$\tanh(x)=2\sigma(2x)-1$$
其中$\sigma$为sigmoid函数,仍然具有饱和的问题。

ReLU函数
$$f(x)=\max (0,x)$$
为Alex在2012年提出的一种新的激活函数。该函数很大程度解决了BP算法在优化深层神经网络时的梯度耗散问题。
优点:

  • $x>0$时,梯度恒为1,无梯度耗散问题,收敛快。
  • 增大了网络的稀疏性。训练完成后为0的神经元越多,稀疏性越大,提取出来的特征就越具有代表性,泛化能力就越强。
  • 运算量很小。
    缺点:
  • 如果后层的某个梯度非常大,导致$W$更新后变得特别大,导致该层的输入$<0$,输出为0,这时该层就会‘die’,没有更新。

Leaky RuLU函数
20190914121142.png
改善了ReLu的死亡特性,但是也同时损失了一部分稀疏性,且增加了一个超参数,目前来说好处不是非常明确。

Maxout函数
$$f(x)=\max(w_1^Tx+b_1,w_2^Tx+b_2)$$
泛化了ReLU和Leaky ReLU,改善了死亡特性,但是同样损失了部分稀疏特性,每个非线性函数增加了两倍的参数。

池化层

0%