对于28*28的手写数字识别网络,输入层有784个神经元,每个神经元里面装着一个像素值,这个像素值叫做**值,神经网络运作时,上一层的**值将决定下一层的**值,神经网络处理信息的核心机制是上一层的**值是通过怎样的运算算出下一层的**值的
神经网络的分层可以理解为隐藏层对应每一层可以提取一个特征,最后把提取到的特征组合起来,就能判断分类了。比如手写熟悉识别9.第一个隐藏层识别圆圈,第二个影藏层识别竖线,组合起来就是一个9了,下面这个网络涉及到差不多13000个参数,算法会调整这130O0个权重和偏置值以提高网络对训练数据的表现

最是不胜清怨机器学习实际上是在找某个函数的最小值

梯度下降算法

最是不胜清怨决定其**值的加权和中的权重有点像是那些连接的强弱,而偏置值则表明神经元是否更容易被**,
在一开始,我们会完全随机地初始化所有的权重和偏置值,可想而知这个网络对于给定的训练示例会表现得非常糟糕,毕竟它只是在做一些随机的判断

代价函数

损失=预测值和实际值做差的平方,来表示预测值和实际值的接近程度,注意,都用的概率表示,实际概率只有一个为1,其他的为0
最是不胜清怨3.37就是训练单个样本的代价

最是不胜清怨注意一下网络能对图像进行正确的分类时这个平方和就比较小,相反,这个值就很大,你接下就要考虑手头上几万个训练样本中代价的平均值,而我们就用这个平均代价来评价这个网络有多糟,为了简化问题我们先不去想一个有13000个变量的函数,而先考虑简单的一元函数只有一个输入变量只输出一个数字,要怎么找输入值x使得函数值最小化呢,学过微积分的都知道有时候你可以直接算出这个最小值,不过函数很复杂的话就不一定能写出来,而我们这个超复杂13000元的代价函数就更加是不可能做到的了。一个更灵活的技巧是先随便挑一个输入值,然后考虑向左还是向右走函数值才会变小,准确地说如果你找到了函数在这里的斜率,那斜率为正就向左走斜率为负就向右走,在每一个点上都这样子重复计算新斜率再适当地走一小步的话,你就会逼近函数的某个局部最小值,你可以想象一个小球滚下山坡
它会停在一个局部最小值,但是无法保证你落到的局部最小值就是代价函数可能达到的全局最小值
最是不胜清怨
值得一提的是如果每步的大小和斜率成比例,那么在最小值附近斜率会越来越平缓每步会越来越小这样可以防止调过头,想象÷个更复杂的两个输入一个输出的二元函数,输入空间可以想象成XY平面代价函数是平面上方的曲面,现在我们不管函数的斜率,而应该问在输入空间内沿哪个方向走,才好让输出结果下降得最快,那么沿梯度的负方向走函数值自然就降低得最快了,这个梯度向量的长度就代表了这个最陡的斜坡到底有多陡,你只要懂得让函数值最小的算法,其实不过是先计算梯度再按梯度反方向走一小步下山然后循环.

最是不胜清怨

最是不胜清怨
最是不胜清怨处理带13000个输入的函数也是一个道理,想象把13000个权重偏置都放到一个列向量里,那么代价函数的负梯度也不过是个向量
最是不胜清怨负梯度正是指出了在这个大到爆炸的函数输入空间内,具体如何改变每一项参数才可以让代价函数的值下降得最快
那么对于这个我们特别设计的代价函数,更新权重和偏置来降低代价函数的值,意味着输入训练集的每一份样本的输出,都更接近期待的真实结果而不是一串10个随机数组,要注意的是这个代价函数取了整个训练集的平均值,所以最小化的意思是对所有的样本得到的总体结果都会更好一点,这个计算梯度的算法是神经网络的核心,我们叫做反向传播算法[BP]

当我们提到让网络学习实质上就是让代价函数的值最小,为了达到这个效果,代价函数非常有必要是平滑的,这样我们才能每次挪一点点最后找到一个局部最小值,这也解释了为什么认工神经完的**值是连续的,而非直接沿袭生物学神经元那种二元式的,要么**要么非**的取值模式,这种按照负梯度的倍数不停调整函数输入值的过程,就叫做梯度下降法,这是一种可以让你收敛到代价函数图中某一个"坑"里,即一个局部最小值的地方

负梯度中的每一项都告诉了我们两件事,正负号很明显在告诉我们输入向量的这一项该调大还是调小
最是不胜清怨每一项的相对大小更告诉了我们改变哪个值的影响更大
最是不胜清怨
对于下面这个方程,第一个变量的重要性是第二个变量的3倍,3/2和1/2就是权重,那么改变x的值会造成更大的影响

最是不胜清怨

神经网络本身是一个带784个输入和10个输出的函数,代价函数则是更复杂一层,把那13000多个权重偏置作为输入,通过训练数据得出一个对网络糟糕程度的评分,而代价亟数的梯度则在上边还要复杂一层,告诉我们如何微调权重偏置的值,才可以让代价函数的结果改变得最快,也就是可以理解为改变了哪些权重影响力最大,那么当你随机初始化权重和偏置并通过梯度下降法调整了很多次参数之后

最是不胜清怨

最是不胜清怨要记得网络本身不过是个函数有784个输入值即像素的灰度,最后的输出值是10个数字,而所有的权重和偏置值可以说就组成了这个函数的参数。而代价函数还要再抽象一层,这13000多个权重和偏置值作为它的参数,它输出的是单个数值来表示这些权重和偏置值有多差劲,而且代价函数取决于网络对子上万个训练数据的综合表现。你得告诉电脑怎么改变这些权重和偏置值,网络识别率才能有进步

每一个卷积核只能提取到到一个特征。所以,卷积层会有多个卷积核,来提取不同种类的特征。

假设现在原图的大小为 10 × 10,使用卷积核的大小为3 × 3,卷积核的个数为 5 个,用来提取 5 个不同的特征,那么得到的特征图大小为 8×8(10-3+1),如果使用padding 方法,那么得到的特征图为10 × 10,但是,在运算过程中卷积核所使用的权重参数的个数仅仅为:3 × 3 × 5 = 45个权重参数。

我们大部分人都是在后知后觉中发现这个问题很简单,但是只有大神才能做先驱者!LeNet首次把卷积的思想加入到神经网络模型中,这是一项开创性的工作,而在此之前,神经网络输入的都是提取到的特征而已,就比如想要做一个房价预测,我们选取了房屋面积,卧室个数等等数据作为特征。而将卷积核引入到了神经网络去处理图片后,自然而然就会出现一个问题,神经网络的输入是什么?如果还是一个个像素点上的像素值的话,那就意味着每一个像素值都会对应一个权系数,这样就带来了两个问题:
1.每一层都会有大量的参数
2.将像素值作为输入特征本质上和传统的神经网络没有区别,并没有利用到图像空间上的局部相关性。

而权值共享的卷积操作有效解决了这个问题,无论图像的尺寸是多大,都可以选择固定尺寸的卷积核,LeNet中最大的卷积核只有551,而在AlexNet中最大的卷积核也不过是11113。而卷积操作保证了每一个像素都有一个权系数,只是这些系数是被整个图片共享的,这大大减少了卷积核中的参数量。此外卷积操作利用了图片空间上的局部相关性,这也就是CNN与传统神经网络或机器学习的一个最大的不同点,特征的自动提取。
这也就是为什么卷积层往往会有多个卷积核(甚至几十个,上百个),因为权值共享后意味着每一个卷积核只能提取到一种特征,为了增加CNN的表达能力,当然需要多个核,不幸的是,它是一个Hyper-Parameter。

神经元与神经元之间的每一个连接都有一个权值w
输入向量的维度和输入层神经元个数相同
输出向量的维度和输出层神经元个数相同
神经网络是一个模型,那么这些权值就是模型的参数,也就是模型要学习的东西。然而,一个神经网络的连接方式、网络的层数、每层的节点数这些参数,则不是学习出来的,而是人为事先设置的。对于这些人为设置的参数,我们称之为超参数(Hyper-Parameters)。
最是不胜清怨输入层节点数是确定的。因为MNIST数据集每个训练数据是28*28的图片,共784个像素,因此,输入层节点数应该是784,每个像素对应一个输入节点。
输出层节点数也是确定的。因为是10分类,我们可以用10个节点,每个节点对应一个分类。输出层10个节点中,输出最大值的那个节点对应的分类,就是模型的预测结果。
我们每训练10轮,评估一次准确率。当准确率开始下降时(出现了过拟合)终止训练。

Relu函数作为**函数,有下面几大优势:

速度快:和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个max(0,x),计算代价小很多。
减轻梯度消失问题 :
稀疏性: 通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是**的,而采用sigmoid**函数的人工神经网络,其**率大约是50%。有论文声称人工神经网络在15%-30%的**率时是比较理想的。因为relu函数在输入小于0时是完全不**的,因此可以获得一个更低的**率。

全连接神经网络之所以不太适合图像识别任务,主要有以下几个方面的问题:

参数数量太多:考虑一个输入10001000像素的图片(一百万像素,现在已经不能算大图了),输入层有10001000=100万节点。假设第一个隐藏层有100个节点(这个数量并不多),那么仅这一层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩大一点,参数数量就会多很多,因此它的扩展性很差。
没有利用像素之间的位置信息 :对于图像识别任务来说,每个像素和其周围像素的联系是比较紧密的,和离得很远的像素的联系可能就很小了。如果一个神经元和上一层所有神经元相连,那么就相当于对于一个像素来说,把图像的所有像素都等同看待,这不符合前面的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有大量的权重,它们的值都是很小的(也就是这些连接其实无关紧要)。努力学习大量并不重要的权重,这样的学习必将是非常低效的。
网络层数限制: 我们知道网络层数越多其表达能力越强,但是通过梯度下降方法训练深度全连接神经网络很困难,因为全连接神经网络的梯度很难传递超过3层。因此,我们不可能得到一个很深的全连接神经网络,也就限制了它的能力。

那么,卷积神经网络又是怎样解决这个问题的呢?主要有三个思路:

局部连接 :这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
权值共享 :一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。

相关文章: