面临的问题
定义神经⽹络后,我们回到⼿写识别上来。我们可以把识别⼿写数字问题分成两个⼦问题:
- 把包含许多数字的图像分成⼀系列单独的图像,每个包含单个数字;
也就是把图像
,分成6个单独的图像
- 分类单独的数字
我们将专注于编程解决第⼆个问题,分类单独的数字。这样是因为,⼀旦你有分类单独数字 的有效⽅法,分割问题是不难解决的。
- ⼀种⽅法是尝试不同 的分割⽅式,⽤数字分类器对每⼀个切分⽚段打分;
- 如果数字分类器对每⼀个⽚段的置信度都 ⽐较⾼,那么这个分割⽅式就能得到较⾼的分数;
- 如果数字分类器在⼀或多个⽚段中出现问题, 那么这种分割⽅式就会得到较低的分数
- 这种⽅法的思想是,如果分类器有问题,那么很可能是 由于图像分割出错导致的。
- 这种思想以及它的变化形式能够⽐较好地解决分割问题。
数字的分类
我们使用一个三层神经网络来识别单个数字;
⽹络的输⼊层包含给输⼊像素的值进⾏编码的神经元。
- 我们给⽹络的 训练数据会有很多扫描得到的28x28的⼿写数字的图像组成;
- 所有输入层包含784 = 28 x 28个神经元;
- 输⼊像素是灰度级的, 值为0.0表⽰⽩⾊,值为1.0表⽰⿊⾊,中间数值表⽰逐渐暗淡的灰⾊。
⽹络的第⼆层是⼀个隐藏层;
- 我们⽤n来表⽰神经元的数量,我们将给实验不同的数值。
⽹络的输出层包含有个神经元;
- 如果第⼀个神经元激活,即输出≈1,那么表明⽹络认为 数字是⼀个0。
- 如果第⼆个神经元激活,就表明⽹络认为数字是⼀个1。
- 依此类推。
- 更确切地说, 我们把输出神经元的输出赋予编号0到9,并计算出那个神经元有最⾼的激活值;
为什么需要10个输出神经元?
⼀个看起来更⾃然的⽅式就是使⽤5个输出神经元, 把每⼀个当做⼀个⼆进制值,结果取决于它的输出更靠近0还是1。
为什么我们反⽽要⽤个神经元呢?这样做难道 效率不低吗?最终的判断是基于经验主义的:我们可以实验两种不同的⽹络设计,结果证明对于这个特定的问题⽽⾔,10个输出神经元的神经⽹络⽐4个的识别效果更好.
为了理解为什么我们这么做,我们需要从根本原理上理解神经⽹络究竟在做些什么;
- 我们⾸先考虑第⼀个输出神经元,它告诉我们⼀个数字是不是0。它能那么做是因为可以权衡从隐藏层来的信息。
- 隐藏层的神经元在做什么呢?假设隐藏层的第⼀个神经元只是⽤于检测如下图像是否存在
- 为了达到这个⽬的,它通过对此图像对应部分的像素赋予较⼤权重,对其它部分赋予较⼩的 权重
- 同理,我们可以假设隐藏层的第⼆,第三,第四个神经元是为检测下列图⽚是否存在
- 就像你能猜到的,这四幅图像组合在⼀起构成了前⾯显⽰的⼀⾏数字图像中的0:
- 如果所有隐藏层的这四个神经元被激活那么我们就可以推断出这个数字是0。
假设神经⽹络以上述⽅式运⾏,我们可以给出⼀个貌似合理的理由去解释为什么⽤10个输出⽽不是4个。如果我们有4个输出,那么第⼀个输出神经元将会尽⼒去判断数字的最⾼有效 位是什么。把数字的最⾼有效位和数字的形状联系起来并不是⼀个简单的问题。很难想象出有 什么恰当的历史原因,⼀个数字的形状要素会和⼀个数字的最⾼有效位有什么紧密联系。
启发性
上⾯我们说的只是⼀个启发性的⽅法。没有什么理由表明这个三层的神经⽹络必须按照我所 描述的⽅式运⾏,即隐藏层是⽤来探测数字的组成形状。可能⼀个聪明的学习算法将会找到⼀ 些合适的权重能让我们仅仅⽤4个输出神经元就⾏。但是这个启发性的⽅法通常很有效,它会 节省你⼤量时间去设计⼀个好的神经⽹络结构