1. 简介
神经网络和深度学习是由Michael Nielsen所写,其特色是:兼顾理论和实战,是一本供初学者深入理解Deep Learning的好书。
2. 感知器与sigmoid神经元
2.1 感知器(Perceptrons)
感知器工作原理:接收一系列二进制输入,经过特定的规则计算之后,输出一个简单的二进制。
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194954652-1261521138.png)
计算规则:通过引入权重(weights)表示每个输入对于输出的重要性,则有
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194954874-1421927729.png)
记w⋅x=∑jwjxj,b=-threshold,则有
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194955087-772704051.png)
其w是权重,b是偏差。
2.2 Sigmoid神经元(Sigmoid Neurons)
为了使学习变得可能,需要具备的【学习特征】:权重或偏差有较小的变化,导致输出也有较小的变化。如下图所示:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194955324-578778919.png)
感知器网络存在的缺陷是:某个感知器较小的权重或偏差变化,可能导致输出在0与1之间进行翻转。所以包含感知器的网络不具备【学习特征】。
幸运的是:Sigmoid神经元具有此【学习特征】,即其较小的权重或偏差变化,导致其输出变化较小。
Sigmoid函数:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194955554-1980294313.png)
Sigmoid神经元输出:
感知器与sigmoid神经元的差别:
1) 感知器只输出0或1
2)sigmoid神经元不只输出0或1,而可输出[0,1]之间的任意值
3. 神经网络架构
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194955984-992850796.png)
3.1 手写数字识别
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194956260-749865245.png)
训练图像大小为28x28,每个训练图像有一个手写数字。
在输出层,如果第一个神经元被激活(即其输出接近1),则此网络认为此手写数字为0;
如果第二个神经元被激活(即其输出接近1),则此网络认为此手写数字为1;
其它以此类推。
3.2 算法描述
设x表示训练图像,则x是一个28x28=784维列向量。
表示输入图片x是数字6 。
需要寻找一个算法来发现w和b,使其输出接近标签值,为了量化接近程序,定义如下成本函数:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194956870-1072308749.png)
w:所有权重的集合
b:所有偏差的集合
n:训练样本数
a: 输出向量(其值依赖x,w,b)
x:一幅训练图像
||v||:表示向量的范数,即向量的长度
C:二次成本函数(mean squared error or MSE)
如果
接近于0,表示y(x)接近输出a,即学习效果很好。
此成本函数中,w和b为变量。
注:hidden layers和output layer中的每个神经元对应一个组w、b。
3.2.1 学习目标
如何找到满足要求的w和b:答案是梯度下降法(Gradient Descent)
1)最小化二次成本函数
2)检测分类的准确性
学习目标:在训练神经网络中,找到使二次成本最小的w和b的集合。
3.2.2 梯度下降更新规则
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194957350-785488360.png)
:表示学习速度(Learning Rate)
此规则用于在神经网络中学习参数w和b。
3.2.3 算法推导(梯度下降法: gradient descent)
要求极小值,先讨论具有2个变量的简单情况,然后再推广:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194957847-76935324.png)
令
,
为梯度向量,则有:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194958497-1579604113.png)
现在的问题是如何选择
,使
负数,则有:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194959204-1238241999.png)
则v的更新规则为:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822194959488-995759026.png)
按此规则,一步一步跌代,C值不断减少,直到全局最小值。
总之,梯度下降法是:重复计算梯度
,然后向相反的方向移动(即下坡最快最陡的方向),如下图所示:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195000060-680340350.png)
上面讨论了只有两个变量的情况,现在推广到m个变量的情况,对应公式如下:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195000359-1230812287.png)
3.2.4 随机梯度下降法(Stochastic Gradient Descent)
为不减少计算量,把n个学习样本分成很多组,每组有m个学习样本,每次只计算一个组,则有如下推导:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195000576-1077281573.png)
则w和b的更新规则为:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195000776-1435367649.png)
注:如果m=1,则为在线学习(online)。
3.2.5 w和b的数量
对于hidden layers和输出层的神经元,每个神经元对应一个w向量和一个b,w向量的维数是其输入神经元的数量。第一层神经元没有w和b,其值直接输出。
第一层就表示原始图像数据,这些数据不经任何处理,直接作为Xj参与第二层的运算,第二层首先基于每个Xj,计算其z(z=wx+b),然后计算出sigmoid(z),以此类推。直到最后一层,利用BP算法,先计算最后一层w和b的梯度,然后以此向前,直到计算出第二层的梯度为止。
4. BP算法(反向传播算法)
BP(Backpropagation Algorithm) :是一个计算成本函数梯度的算法。
需要基于每个训练样本计算每一层的w和b的梯度,从而更新每一层的w和b。
BP的真正目标:是计算每个样本的偏导数:
和
。
4.1 定义标记符号
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195001761-2042140804.png)
则有激活值的如下公式:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195001992-30667289.png)
函数向量化有如下形式:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195002245-2134880435.png)
即函数对向量的每个元素分别计算,然后生成对应的向量。
则上面的函数向量表示为:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195002578-2004813791.png)
记
,则有![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195003049-1574940898.png)
4.2 公式推导过程
4.2.1 计算激活值
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195003262-1693869797.png)
4.2.2 最后一层(L层)的二次成本函数
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195003599-436622713.png)
4.2.3 单个训练样本(x)的二次成本函数
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195003798-980486043.png)
4.2.4 定义误差![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195004000-1566574760.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195004192-1695075778.png)
4.2.5 定义输出层误差
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195004407-1023856897.png)
4.2.6 求最后一层(L层)激活值的偏导数![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195004632-12919435.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195004845-363593581.png)
4.2.7 根据最后一层的误差计算前一层的误差
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195005060-173284799.png)
4.2.8 计算目标值![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195005312-1075927849.png)
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195005584-949587473.png)
4.2.9 BP的四个基本方程式
4.3 证明四个基本议程式
4.3.1 证明BP1
4.3.2 证明BP2
4.4 BP计算过程
5. SGD(随机梯度下降)计算过程
6. 改进神经网络学习方法
理想地,期望我们的神经网络能从自己的错误中快速地进行学习。
神经元通过改变权重和偏差的来进行学习的学习速度由成本函数的偏导数(
和
)决定,所以学习速度慢的根本原因是:偏导数太小。 6.1 交叉熵成本函数
交叉熵成本函数定义如下:
对权重w的求导结果为(n为训练样本数):
根据上面的求导公式,则避免了在二次成本函数中由
导致的学习速度慢问题。 6.2 推广交叉成本函数
把交叉成本函数推广到具有多个神经元的多层网络中,则交叉成本函数变为:
与二次成本函数相比,唯一不同的是
的计算方法,其它计算方法完全相同。 6.3 交叉熵的含义
粗略地说,交叉熵是“不确定性”的一种度量。特别地,我们的神经元想要计算函数x-> y = y(x)。但是,它用函数x->a = a(x) 进行了替换。假设我们将a 想象成我们神经元估计为y = 1 的概率,而1-a 则是y = 0 的概率。那么交叉熵衡量我们学习到y的正确值的平均起来的不确定性。如果输出我们期望的结果,不确定性就会小一些;反之,不确定性就大一些。
6.4 Softmax(柔性最大值)
Softmax+log-likelihood(对数似然)成本函数:在现代图像分类网络中最常用。
Softmax为神经网络定义了一个新的输出层,即它的激活函数不再是Sigmoid,而是Softmax函数。
Softmax的每个神经元的输出都为正,且它们的和为1。所以Softmax层的输出可以看作一个概率分布。
与Softmax相比,Sigmoid层的输出不能形成一个概率分布,且没有一个直观、简单的解释。
6.4.1 Softmax如何解决学习速度慢的问题?
从以上梯度公式中可知,对于解决学习速度慢的问题:【Softmax输出层+对数似然成本函数】与【Sigmoid输出层+交叉熵成本函数】效果相当。
在二者间如何做出选择呢?
当你需要把输出当做概率解释时,则需要使用【Softmax输出层+对数似然成本函数】。
7. 过拟合和规范化
7.1 过拟合(Overfitting)
在神经网络中,过拟合(Overfitting)是一个主要问题。此问题在现代网络中特别突出,因为现代网络有大量的权重和偏差。为了进行有效的训练,我们需要一个检测是否过拟合的方法,以防止过度训练(Overtraining),并且我们还需要可以减少过拟合效果的技术。
最直接的检测过拟合的方法是:跟踪测试数据在训练过的网络中的准确性。如测试数据分类的准确性不再改善,我们应当停止训练;或测试数据分类的准确性和训练数据分类的准确性都不再改善,我们应当停止训练。
如果对训练样本过拟合,则其推广能力就差,导致对新的数据的预测或分类的准确性变差。
7.2 规范化(Regularization)-减少过拟合
增加训练数据是减少过拟合的方法之一。
规范化(Regularization)也是减少过拟合的方法之一。有时候被称为权重衰减(weight decay)或者L2 规范化。L2 规范化的思想是增加一个额外的项到成本函数中,这个项叫做规范化项。规范化的交叉熵如下:
>0是规范化参数(regularization parameter) C0是原来常规的成本函数。 如果
较小,我们期望最小化原始成本函数;如果
较大,我们期望最小化权重。 则可得:
可进一步得到:
权重衰减因子:![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195011183-61290527.png)
针对小批量训练样本(m个),则有:
7.3 为什么规范化可以减少过拟合
权重越小,复杂度就越低;可以为数据提供更简洁更有力的解释。
当有异常输入时,小的权重意味着网络输出变化不大,即不易学习到数据中的局部噪声。总而言之,规范化网络基于训练数据的主要规律,从而创建一个相对简单的模型,并且拒绝学习训练数据中的噪声(异常数据)。这样强制网络学习数据的本质规律,并把学到的规律进行更好地推广。
8. 权重初始化
可加快学习速度。
假设输入层有1000个神经元,且已经使用归一化的高斯分布初始化了连接第个隐层的权重。如下图所示:
为了简化,设输入层一半神经元值为1,另一半为0。让我们考虑隐层神经元输入的带权和z:
其中500项消去了,因为对应的输xj 为0。所以z 是包含501个归一化的高斯随机变量的和,包含500个权重项和1个偏差项。因此z本身是一个均值为0、标准差为
(方差为501)的高斯分布。它是一个非常宽的高斯分布,根本不是非常尖的形状: 注:
正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。
标准正态分布服从N(0,1)
两个都服从正太分布的变量,例如X服从N(a,b),Y服从N(c,d),且X和Y相互独立,则有:
1)X+Y服从N(a+c,b+d)
2)X-Y服从N(a-c,b+d)
即两变量相加减时,期望相应加减,方差始终是相加。
从上图上可以看出|z|会变得很大,即z>>1或z<<-1。如果这样,隐层神经元的输出
就会接近1或者0,即隐层神经元进入饱和状态了。即隐层神经元的输出
将非常接近于0或1。在这种情况下,权重的修改对隐层神经元的输出激活值影响很小,从而对下一层的隐层神经元、直到对输出层的神经元的输出都很小,从而导致学习速度慢的问题。 (注:输出层神经元饱和于错误值也会导致学习速度慢的问题,这可以通过选择成本函数<如交叉熵>来避免,但选择成本函数的方法不能解决隐层神经元饱和的问题)
从以上分析可知,如果隐层神经元的权重服从N(0,1)分布,它将导致隐层神经元的激活值接近于0或1,并且导致学习速度下降,如何解决此问题呢?
通过选择更好的初始化权重和偏差可以解决此问题。
答案是:初始化权重服从N(0,1/
)分布,偏差服从N(0,1)。其中
表示此层神经元输入权重个数(即此隐层神经元的输入神经元个数,如上例中
=1000)。权重之后为:
,其服从N(0,3/2)。 方差的计算方法:500*1/1000+1=1500/1000=3/2。其图形非尖,如下图所示:
此神经元饱和的可能性很低,从而导致学习速度慢的可能性也很低。
9. 神经网络可以计算任何函数
“神经网络可以计算任何函数”的真正含义:
1)不是说一个网络可以被用来准确地计算任何函数,而是我们可以获得尽可能好的一个近似。通过增加隐层神经元的数量,可以提升近似的精度。
2)可以按照上面的方式近似的函数类其实是连续函数。如果函数不是连续的,也就是会有突然、极陡的跳跃,那么一般来说无法使用一个神经网络进行近似。
总而言之:包含一个隐层的神经网络可以被用来按照任意给定的精度近似任何连续函数。
10. 为什么训练深度神经网络比较困难?
对于学习算法,前面使用的是苦力般的学习方法(基于反向传播的随机梯度下降)来训练深度网络,这样产生的问题是:深度神经网络并不比浅层网络性能好太多。
其根据原因是:在深度网络中,不同层的学习速度差异很大。尤其是, 在网络后面层的学习速度很好的时候,前面层在训练时停滞不变,基本上学不到东西;或先前的层学习的比较好,但是后面层却停滞不变。其停滞不前的原因是学习速度下降了,学习速度下降与基于梯度的学习方法有关。
实际上,我们发现在深度神经网络中使用基于梯度下降的学习方法本身存在着内在不稳定性。这种不稳定性使得前面或者后面层的学习速度受到抑制。在真正理解了这些难点之后,我们就能够获得有效训练深度网络的更深洞察力。
在某些深度神经网络中,在我们在隐层BP的时候梯度倾向于变小。这意味着在前面的隐层中的神经元学习速度要慢于后面的隐层。在多数的神经网络中都存在着这个现象,这个现象也被称作是:消失的梯度问题(Vanishing Gradient Problem)。
在前面层中的梯度会变得非常大,这叫做:激增的梯度问题(Exploding Gradient Problem),这也没比消失的梯度问题更好处理。更加一般地说,在深度神经网络中的梯度是不稳定的,在前面层中或会消失,或会激增。这种不稳定性才是深度神经网络中基于梯度学习的根本问题。
10.1 消失的梯度问题的根本原因?
深度神经网络中的梯度不稳定性。
由于梯度的值小于1,在随机梯度下降算法中,前面层的梯度由后面层的梯度参与相乘,所以造成前面层的梯度很小,后面层的梯度依次变大。从而造成了梯度的不均衡性。
11. 卷积神经网络(CNN)
CNN(Convolutional neural networks):使用了一个特殊架构来进行图像分类。
它的三个基本概念为:局部感受野(Local receptive fields),共享权重(Shared weights),和混合(Pooling)。
11.1 基本概念
11.1.1 局部感受野
在之前的全连接网络中,输入被描绘成纵向排列的神经元,但在卷积神经网络中,把输入看作28 x 28的方形神经元排列。第一个隐层中的每个神经元只与输入图像的一个小区域(如5x5)连接,这个输入图像的小区域叫做隐层神经元的局部感受野(Local receptive fields)。如下图所示:
![](https://images2018.cnblogs.com/blog/1470684/201808/1470684-20180822195015301-1501027171.png)
每个连接学习一个权重,且隐层神经元也学习一个总的偏差。即此隐层神经元正在对输入图像的此区域进行学习、了解。一个隐层神经元与一个局部感受野一一对应,即每个隐层神经元有:5x5个权重和1个偏差。 如上图所示,对于一个28x28的输入图像,如果局部感受野的大小为5x5,则第一个隐层中有24x24个神经元。
11.1.2 共享权重和偏差
每组24x24个隐层神经元使用相同的权重和偏差。即对于每组中的第(j,k)隐层神经元,其激活值为:
即每组有5x5个权得和1个偏差,其26个需要学习的参数。这表示第一个隐层中的所有神经元在输入图像的不同地方检测相同的特征。(图像具有平移不变性)
特征映射:从输入层到隐层的映射。
共享权重:定义特征映射的权重。
共享偏差:定义特征映射的偏差。
卷积核或滤波器:共享权重和偏差。
为了做图像识别,需要多个特征映射,且一个完整的卷积层由多个不同的特征映射组成,如下图包含三个特征映射:
上面20幅图像对应20个不同的特征映射(或滤波器、或卷积核),每个特征映射用5x5方块图表示,对应局部感受野的5x5个权重。白色表示小权重,黑色表示大权重。
共享权重和偏差最大的优点是:大大减少了网络中参数的数量。如全连接网络的参数是卷积网络参数的30倍左右。(卷积网络20个特征:20x26=520, 全连接20个隐层神经元:20x784=15680)
11.1.3 混合层
卷积神经网络除包含卷积层之外,还包含混合层(Pooling Layers),混合层在卷积层之后,它的职责是简化(总结)卷积层输出的信息。
混合层根据卷积层输出的所有特征映射,然后提炼出新的特征映射。
1)Max-Pooling
从2x2区域中找一个最大的激活值输出。
Max-Pooling是一个用于询问:是否在图像的一个区域内发现了指定的特征。
2)L2-Pooling
L2-Pooling就是计算矩阵2x2的2范数(先计算4个数的平方的和,然后开平方)。
L2-Pooing:是一个从卷积层提炼信息的方法。
11.1.4 完整的卷积神经网络
最后一层与前面一层是全连接,其连接数为:3x12x12x10。
卷积神经网络与全连接神经网络的架构不一样,但其目标是一样的, 它们的目标为:使用训练数据训练网络的权重和偏差,然后对输入的图像做出正确的分类。