神经网络 异或_从0到1:实现卷积神经网络(基础篇)

05a8ecf0763c9075692e9bccfb0e2af9.png
横看成岭侧成峰,远近高低各不同。
--苏轼《题西林壁》北宋

导言

ebe0a50e47f8207bb21d0b30c638aa18.png

“卷积神经网络”,是公开数据集上,历届夺冠算法的核心支撑模型。

为了更好的理解与使用这个模型,我们可以不借助计算框架,从零开始,回顾基础理论,一步步构建模型,实现学习算法,并在一个图像识别数据集上,训练这个模型,再验证模型预测的准确率。

回顾感知机模型

ebe0a50e47f8207bb21d0b30c638aa18.png

感知机是人工神经网络方法的理论基石。

维空间里分布的
个线性可分的实例点
,看作
维实数向量
,其特征
决定了实例点
的二分类类别

由输入实例点

特征,到输出类别
的映射,表示为如下
感知机函数:

其中,用线性方程:

表示了D维空间里的超平面,这个超平面按照输出类别

将实例点
划分在平面两侧:

对正实例点,

对负实例点,

对任意一个样本点

, 根据点到平面的距离公式,可知它到超平面
的距离:

而各个误分类点到分离超平面的总距离,可以用来度量模型的分类预测损失:

我们先为

,
设置初始值如 0,再通过
随机梯度下降stochastic gradient descent)方法 ,根据随机选出的误分类点,让参数不断更新梯度

为了灵活调整每次梯度下降的尺度,引入参数“步长” 或“学习率”

,来极小化损失,迭代更新参数:

通过有限次迭代,就能找到一个可以把线性可分正负实例点划分在两侧的分离超平面。

713d3005990f207400bb382c8524bc34.png

这个模型可以从二分类继续扩展到多分类:把上述模型的输出节点扩展为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

隐藏层(Hidden Layer)

ebe0a50e47f8207bb21d0b30c638aa18.png

感知机线性模型,能很好的处理线性可分的非异或类样本点的划分,却无法处理如下异或(XOR)问题:

18cbd4e426597ac9e08086befcaad27f.png

为模型添加隐藏层,可以解决这类问题。

原来的线性分类层:

引入一个隐藏层后,成为:

原始输入,多经过隐藏层处理后,再传递到输出层;隐藏层中的节点,表达了从输入特征中抽取得到的更高层特征;单层网络结构,成为多层结构,线性模型也成为线性组合模型,从而能处理上图所示的异或类样本的分类识别,适应更多线性分类场景。

然而,任意线性组合构成的模型,仍然是线性的,无法很好的处理下图示的非线性可分场景。

b07c68c3ffa6f66ea0171a5058be5877.png

如果把线性模型中间层中的节点h看作神经元,再把模型中这些神经元的输出,经过非线性函数处理,就可以使模型去线性化,得以处理非线性可分的场景。

这些处理神经元输出的非线性函数,也称为激活函数

激活函数

ebe0a50e47f8207bb21d0b30c638aa18.png

激活函数的引入,使模型可以通过非线性函数描述样本特征。

下图列举了较常见的几种激活函数,神经网络的节点,经过这些函数激活后,输出不再局限于输入的线性变换,模型也成为非线性神经网络模型,可以处理更复杂的非线性场景了。

85e508d13fbc314654f7a548e5b6d2b6.png

以上是ReLU和另一个常用激活函数tanh的图像对比。

下面是不再常用的S型激活函数和softplus激活函数的图像。

a53a70ee85ec5146b150dbd438492bcf.png

我们这里选用形式简洁的ReLU(Rectified Linear Units)作为激活函数:

  • 稀疏的激活性,单侧抑制,仅激活输出大于阈值0的信号
  • 宽阔的激活边界

随着神经网络深度(隐藏层数)的增加,ReLU降低信号的激活率的作用,愈加有助于重要特征的高效提取;而宽阔的激活边界,可以使深层网络下梯度消失的风险得到缓解。

从图像可以看到,ReLU函数不是处处可导的,但是反向传播梯度仍然可以计算,接下来的算法部分会介绍。

加入隐藏层和激活函数后,模型拥有了更强大的参数拟合能力,也可能带来新的问题。

参数拟合双刃剑

ebe0a50e47f8207bb21d0b30c638aa18.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
Johnny von Neumann

弗里曼.戴森回忆,恩瑞克.费米曾经引用 了冯.诺伊曼的论断:“四个参数可以拟合出大象”,来提醒他反思研究工作的物理意义和数学自洽;2010年,一篇发布在《物理学期刊》(American Journal of Physics) 上的文章,提供了用四个复参数勾勒大象的方法。

702b679cb29d5412fe05d22a6fe41c09.png

过拟合与正则化

d93947338aefec4fa3fc10f780b5bf87.png

在训练数据集上,训练迭代次数不足,模型没有学到训练样本的一般特征,称为欠拟合(under-fitting);

反之,有大量参数的复杂模型,经过多轮训练,会将训练数据中,不具一般性的噪声,也学习到模型参数里,结果在训练数据上得到很好的拟合表现,在未知数据上预测效果却不好,这种情况称为过拟合(Over-fitting)。

通过大量参数,在训练数据上拟合复杂模型,可能很好地反映出训练数据集上的细微特征,包括不具一般性的样本噪声,过拟合为模型引入“偏见”,增加了模型的泛化误差。

过拟合的缓解方法,是根据模型的复杂程度,增加罚项(penalty term),使模型的结构风险最小化。

总损失中增加的罚项部分,也称为L2 正则化项(regularizer),其中,是根据模型复杂度设定的罚项系数;乘数0.5用于简化计算;||w ||是权值参数w L2 范数,计算方法参见之前在第二篇中,学习策略部分的介绍。

你可以进一步了解正则化处理,也可以跳到”隐藏层“部分继续阅读,不影响正则化方法的使用。

再深一点:关于正则项

d93947338aefec4fa3fc10f780b5bf87.png

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

由于总损失增加了正则化损失部分:

反向传播时,权值矩阵W 的也相应增加了正则化部分梯度:

增加了隐藏层之后,隐藏层的M 个节点和输入层节点之间,有了新的权值矩阵 W1 和偏置b1

隐藏层到输出层的参数仍然保留,命名为W2 ,b2 ,以方便对应。

626ff6c0239975f9246fe28125af6d86.png

隐藏层到输出层参数梯度计算方法不变,以隐藏层输出的M个元素数组h ,作为输入,

所以W2 , b2 反向传播梯度,正则化后,成为:

其中

W1, b1 仍然可以设置初始值,然后用梯度下降法( gradient descent),让参数不断更新梯度▽W1 和▽b1,来极小化损失函数。

首先,误差反向传播到隐藏层:

再看激活函数 ReLU(x) =max(0,x),不是处处可导的,但是观察函数性质,当输出为负数时,经过ReLU之后被抑制,其梯度降为0;如果输出为非负数,则导数为1,即误差传递到此处是自变量x 本身。

所以实际反向梯度△h

得到正则化后,参数更新的梯度:

得到反向传播的全部参数更新梯度。

实现

d93947338aefec4fa3fc10f780b5bf87.png

这个算法的python实现,不借助计算框架,在全连接神经网络的基本结构上,增加了正则化处理,缓解过拟合问题,通过添加一个隐藏层并激活,使模型能处理非线性可分特征,进一步提高识别效果。

以下是设置单隐藏层500个隐藏层节点的训练过程:

f12d084044d77fd18b07b4860e1517ce.png

d93947338aefec4fa3fc10f780b5bf87.png

验证集上识别正确率稳定在98以上%。

969909b0e8d61ed9c5c6b60e4367614e.png

d93947338aefec4fa3fc10f780b5bf87.png

以上,介绍了具有一个隐藏层的全连接神经网络,随着深度(隐藏层)增加,神经网络能在复杂的输入样本上提取更多的特征,得以在一些数据集上,超过了人工识别准确率。

增加深度也带来了新挑战:连接节点和参数过多,导致反向传播训练效率降低,且增加了过拟合风险;下一次,我们在目前网络结构的基础上,引入卷积核(Convolutional kernel)处理,可使之进化成为一个卷积神经网络(CNN), 应对这一挑战。

(完)

d93947338aefec4fa3fc10f780b5bf87.png

索引

从0到1:实现卷积神经网络

  1. 第一个模型:了解基础,开始搭建第一个模型
无双谱:从0到1:实现卷积神经网络(基础篇)​zhuanlan.zhihu.com
0c18b7fec5a14cfe6c60931cde1e6a81.png

2.卷积处理:理解卷积和采样,向CNN演进

无双谱:从0到1:实现卷积神经网络(算法篇)​zhuanlan.zhihu.com
19d275b47cb6383f19135d7f2023b221.png

3.知行合一:优化提速实现,更快的CNN

无双谱:从0到1:神经网络实现图像识别(实现篇)​zhuanlan.zhihu.com
6dc1a50ecd45cddf27754ef6dfadc547.png

d93947338aefec4fa3fc10f780b5bf87.png

参考

[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值