![05a8ecf0763c9075692e9bccfb0e2af9.png](https://i-blog.csdnimg.cn/blog_migrate/8835a9abffaa4254b885eaa24450fbf4.jpeg)
横看成岭侧成峰,远近高低各不同。
--苏轼《题西林壁》北宋
导言
![ebe0a50e47f8207bb21d0b30c638aa18.png](https://i-blog.csdnimg.cn/blog_migrate/73f9b5cde4f23222b92280d90dcce0d0.png)
“卷积神经网络”,是公开数据集上,历届夺冠算法的核心支撑模型。
为了更好的理解与使用这个模型,我们可以不借助计算框架,从零开始,回顾基础理论,一步步构建模型,实现学习算法,并在一个图像识别数据集上,训练这个模型,再验证模型预测的准确率。
回顾感知机模型
![ebe0a50e47f8207bb21d0b30c638aa18.png](https://i-blog.csdnimg.cn/blog_migrate/73f9b5cde4f23222b92280d90dcce0d0.png)
感知机是人工神经网络方法的理论基石。
把
由输入实例点
其中,用线性方程:
表示了D维空间里的超平面,这个超平面按照输出类别
对正实例点,
对负实例点,
对任意一个样本点
而各个误分类点到分离超平面的总距离,可以用来度量模型的分类预测损失:
我们先为
为了灵活调整每次梯度下降的尺度,引入参数“步长” 或“学习率”
通过有限次迭代,就能找到一个可以把线性可分正负实例点划分在两侧的分离超平面。
![713d3005990f207400bb382c8524bc34.png](https://i-blog.csdnimg.cn/blog_migrate/3673884cfc951d21d71d129af3db176f.jpeg)
这个模型可以从二分类继续扩展到多分类:把上述模型的输出节点扩展为K个 ;权值向量w扩展为 D x K的权值矩阵W,偏置(bias) b扩展为长度为K的数组;一个样本点的行向量,经过模型处理,就会得到在所有K个类别上的归属可能性得分 z。
一方面,使用softmax方法,把输出z进一步标准化(normalize),得到某个样本点,归属于任意类别 j 的概率:
另一方面,MNIST数据集某个样本所对应的正确标签,如(0,0,0,0,0,0,0,0,0,1),可以视为放平之后的分类期望向量
就可以用 交叉熵(cross entropy)来刻画两个概率分布的相似程度,用来度量预测损失:
这样,某一样本点使用模型预测的损失函数,可以写为:
同样用梯度下降法,得到反向传播的参数更新梯度:
其中
这个算法的python实现,可以在 MNIST数据集上,得到超过90%的验证准确率。
![b06a5e469b39a43d8bb133fd2f8e8e00.png](https://i-blog.csdnimg.cn/blog_migrate/1b696860ce16e07cfc2aeb938b5e6f24.jpeg)
隐藏层(Hidden Layer)
![ebe0a50e47f8207bb21d0b30c638aa18.png](https://i-blog.csdnimg.cn/blog_migrate/73f9b5cde4f23222b92280d90dcce0d0.png)
感知机线性模型,能很好的处理线性可分的非异或类样本点的划分,却无法处理如下异或(XOR)问题:
![18cbd4e426597ac9e08086befcaad27f.png](https://i-blog.csdnimg.cn/blog_migrate/e1b7f27233fb71d51d68c0cb5ffa53dd.jpeg)
为模型添加隐藏层,可以解决这类问题。
原来的线性分类层:
引入一个隐藏层后,成为:
原始输入,多经过隐藏层处理后,再传递到输出层;隐藏层中的节点,表达了从输入特征中抽取得到的更高层特征;单层网络结构,成为多层结构,线性模型也成为线性组合模型,从而能处理上图所示的异或类样本的分类识别,适应更多线性分类场景。
然而,任意线性组合构成的模型,仍然是线性的,无法很好的处理下图示的非线性可分场景。
![b07c68c3ffa6f66ea0171a5058be5877.png](https://i-blog.csdnimg.cn/blog_migrate/1cc59e7433c27b5457ef3d1e8d4a4bf3.jpeg)
如果把线性模型中间层中的节点h看作神经元,再把模型中这些神经元的输出,经过非线性函数处理,就可以使模型去线性化,得以处理非线性可分的场景。
这些处理神经元输出的非线性函数,也称为激活函数。
激活函数
![ebe0a50e47f8207bb21d0b30c638aa18.png](https://i-blog.csdnimg.cn/blog_migrate/73f9b5cde4f23222b92280d90dcce0d0.png)
激活函数的引入,使模型可以通过非线性函数描述样本特征。
下图列举了较常见的几种激活函数,神经网络的节点,经过这些函数激活后,输出不再局限于输入的线性变换,模型也成为非线性神经网络模型,可以处理更复杂的非线性场景了。
![85e508d13fbc314654f7a548e5b6d2b6.png](https://i-blog.csdnimg.cn/blog_migrate/4c546fccfa65db9d5a2a0a1e982fd30a.jpeg)
以上是ReLU和另一个常用激活函数tanh的图像对比。
下面是不再常用的S型激活函数和softplus激活函数的图像。
![a53a70ee85ec5146b150dbd438492bcf.png](https://i-blog.csdnimg.cn/blog_migrate/5ba20dc4108d0c69f6201753598e36b9.jpeg)
我们这里选用形式简洁的ReLU(Rectified Linear Units)作为激活函数:
- 稀疏的激活性,单侧抑制,仅激活输出大于阈值0的信号
- 宽阔的激活边界
随着神经网络深度(隐藏层数)的增加,ReLU降低信号的激活率的作用,愈加有助于重要特征的高效提取;而宽阔的激活边界,可以使深层网络下梯度消失的风险得到缓解。
从图像可以看到,ReLU函数不是处处可导的,但是反向传播梯度仍然可以计算,接下来的算法部分会介绍。
加入隐藏层和激活函数后,模型拥有了更强大的参数拟合能力,也可能带来新的问题。
参数拟合双刃剑
![ebe0a50e47f8207bb21d0b30c638aa18.png](https://i-blog.csdnimg.cn/blog_migrate/73f9b5cde4f23222b92280d90dcce0d0.png)
具有大量参数的模型,拟合能力会有多强大呢?
"With four parameters I can fit an elephant, and with five I can make him wiggle his trunk."("四参可使拟象,俱五参,栩然动其鼻。" )
--Enrico Fermi criticized the complexity of Dyson’s model by quoting Johnny von Neumann, 1953
![1cad701099aeb41a724b405aba18267e.png](https://i-blog.csdnimg.cn/blog_migrate/7df985faf94f43c05c29b349991859da.jpeg)
弗里曼.戴森回忆,恩瑞克.费米曾经引用 了冯.诺伊曼的论断:“四个参数可以拟合出大象”,来提醒他反思研究工作的物理意义和数学自洽;2010年,一篇发布在《物理学期刊》(American Journal of Physics) 上的文章,提供了用四个复参数勾勒大象的方法。
![702b679cb29d5412fe05d22a6fe41c09.png](https://i-blog.csdnimg.cn/blog_migrate/7e1042610b135e4865d137ec721459ca.jpeg)
过拟合与正则化
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
在训练数据集上,训练迭代次数不足,模型没有学到训练样本的一般特征,称为欠拟合(under-fitting);
反之,有大量参数的复杂模型,经过多轮训练,会将训练数据中,不具一般性的噪声,也学习到模型参数里,结果在训练数据上得到很好的拟合表现,在未知数据上预测效果却不好,这种情况称为过拟合(Over-fitting)。
通过大量参数,在训练数据上拟合复杂模型,可能很好地反映出训练数据集上的细微特征,包括不具一般性的样本噪声,过拟合为模型引入“偏见”,增加了模型的泛化误差。
过拟合的缓解方法,是根据模型的复杂程度,增加罚项(penalty term),使模型的结构风险最小化。
总损失中增加的罚项部分,也称为L2 正则化项(regularizer),其中,入是根据模型复杂度设定的罚项系数;乘数0.5用于简化计算;||w ||是权值参数w 的L2 范数,计算方法参见之前在第二篇中,学习策略部分的介绍。
你可以进一步了解正则化处理,也可以跳到”隐藏层“部分继续阅读,不影响正则化方法的使用。
再深一点:关于正则项
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
L2正则化的直观效果是:含有相对大分量的权值参数 w,其罚项项也越大;各分量相对小而分散权值w,罚项也较小。
例如:
输入向量 x = [1,1,1,1],和两个权值向量 w1=[1,0,0,0], w2=[0.25,0.25,0.25,0.25]。
做内积运算后结果均为1;然而 W1 的L2 罚项为1, W2 由于各分量相对小而分散,罚项只有0.25。
L2 正则化后的模型,倾向于均衡评估输入样本点上全部各个维度的特征,而不是少数大分量值特征对分类结果的影响,来提高模型在测试数据集上的泛化(generalization)能力,缓解过拟合风险。
上面的例子可以看到:输入样本点各个维度特征分量的数值特征,影响了内积计算结果;而偏置 b , 既不参与内积计算,也不对特征分量的数值特征做倍数放大。所以实践中通常只对权值参数 w 做正则化处理。
算法
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
由于总损失增加了正则化损失部分:
反向传播时,权值矩阵W 的也相应增加了正则化部分梯度:
增加了隐藏层之后,隐藏层的M 个节点和输入层节点之间,有了新的权值矩阵 W1 和偏置b1 ;
隐藏层到输出层的参数仍然保留,命名为W2 ,b2 ,以方便对应。
![626ff6c0239975f9246fe28125af6d86.png](https://i-blog.csdnimg.cn/blog_migrate/2a9b89032afdefdb377ab5d993531cd3.jpeg)
隐藏层到输出层参数梯度计算方法不变,以隐藏层输出的M个元素数组h ,作为输入,
所以W2 , b2 反向传播梯度,正则化后,成为:
其中
对 W1, b1 仍然可以设置初始值,然后用梯度下降法( gradient descent),让参数不断更新梯度▽W1 和▽b1,来极小化损失函数。
首先,误差反向传播到隐藏层:
再看激活函数 ReLU(x) =max(0,x),不是处处可导的,但是观察函数性质,当输出为负数时,经过ReLU之后被抑制,其梯度降为0;如果输出为非负数,则导数为1,即误差传递到此处是自变量x 本身。
所以实际反向梯度△h 为
得到正则化后,参数更新的梯度:
得到反向传播的全部参数更新梯度。
实现
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
这个算法的python实现,不借助计算框架,在全连接神经网络的基本结构上,增加了正则化处理,缓解过拟合问题,通过添加一个隐藏层并激活,使模型能处理非线性可分特征,进一步提高识别效果。
以下是设置单隐藏层500个隐藏层节点的训练过程:
![f12d084044d77fd18b07b4860e1517ce.png](https://i-blog.csdnimg.cn/blog_migrate/5f5a341e9652d4fae4c08d1ed75e2a71.jpeg)
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
验证集上识别正确率稳定在98以上%。
![969909b0e8d61ed9c5c6b60e4367614e.png](https://i-blog.csdnimg.cn/blog_migrate/3324d251eca828e36656db82c73b9f9f.jpeg)
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
以上,介绍了具有一个隐藏层的全连接神经网络,随着深度(隐藏层)增加,神经网络能在复杂的输入样本上提取更多的特征,得以在一些数据集上,超过了人工识别准确率。
增加深度也带来了新挑战:连接节点和参数过多,导致反向传播训练效率降低,且增加了过拟合风险;下一次,我们在目前网络结构的基础上,引入卷积核(Convolutional kernel)处理,可使之进化成为一个卷积神经网络(CNN), 应对这一挑战。
(完)
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
索引
从0到1:实现卷积神经网络
- 第一个模型:了解基础,开始搭建第一个模型
![0c18b7fec5a14cfe6c60931cde1e6a81.png](https://i-blog.csdnimg.cn/blog_migrate/c4a270a85c5b7825235c261909f3fca7.jpeg)
2.卷积处理:理解卷积和采样,向CNN演进
无双谱:从0到1:实现卷积神经网络(算法篇)zhuanlan.zhihu.com![19d275b47cb6383f19135d7f2023b221.png](https://i-blog.csdnimg.cn/blog_migrate/b190ea92a2e45f0fa50f25ffa81f2a02.jpeg)
3.知行合一:优化提速实现,更快的CNN
无双谱:从0到1:神经网络实现图像识别(实现篇)zhuanlan.zhihu.com![6dc1a50ecd45cddf27754ef6dfadc547.png](https://i-blog.csdnimg.cn/blog_migrate/c83c9fa9a3887617363e3e95c9a3cbe3.jpeg)
![d93947338aefec4fa3fc10f780b5bf87.png](https://i-blog.csdnimg.cn/blog_migrate/36515b9736ca5ecca099f98c9211b3ce.jpeg)
参考
[1] 斯坦福大学 class CS231n:The Stanford CS class CS231n
[2] Jürgen Mayer, Khaled Khairy, Jonathon Howard. Drawing an elephant with four complex parameters .American Journal of Physics, 201