在http://neuralnetworksanddeeplearning.com/看到这篇文章。写的简单易懂。适合初学者学习,不过是英文的。
自己尝试着一边翻译一边学习。
第一章 使用神经网络识别手写数字
人眼是世界上最奇妙的东西之一。有如下一串手写数字:
大部分人一眼就能看出是504192。实际上“一眼看出来”没有这么简单。在我们大脑的左右半球,都有掌控视觉大脑皮层,被称为V1区。V1包含了1.4亿的神经细胞。且这些细胞组成了几十亿的连接。我们的视觉不仅仅使用了V1区,还包括了V2,V3,V4和V5区,他们用来处理更为复杂的场景。我们的大脑就是一个经过几百万年演进的超级电脑,能很好的识别外在的世界。识别手写数字是非常复杂的事情,但是我们人类能够识别,这应该是令人赞叹的事情。但是这些都是潜意识的,所以我们觉得我们能识别这些问题很平常,没有什么惊叹的。
但是如果你尝试自己编程实现以上功能,那就会发现这是非常复杂的。我们自己轻而易举能够做到的事情突然变得非常困难。例如,我们是这么识别9这个数字的,“上面是个圈,右下方拖着一个长尾巴”。但是如果用算法来描述,就没那么简单了。如果你想定义一个规则,你很快就会发现无论如何定义规则,都有着大量的例外。这让人非常绝望。
神经网络用不同的方式来解决这个问题。他的主要思想是利用大量的手写的数字(称为训练样本),
然后研发一个能从这些样本进行学习的系统。换句话说,神经网络能利用大量的样本自己推测出规则。而且,样本个数越大,神经网络学的越多,就越聪明。所以上面我只用了100个例子,如果有几千个或者几百万个或几十亿个样本,我们可以建造一个更好的系统。
本章,我们会编程来实现一个能识别手写数字的神经网络。整个程序只有74行长,而且没有用特殊的神经网络库函数。但是这个程序的识别正确率能达到96%以上。更进一步,在后面章节中,我们能把识别正确率提到到99%以上。实际上,现在最好的商用神经网络已经在银行中用来处理支票,在邮局识别地址了。
We're focusing on handwriting recognition because it's an excellent prototype problem for learning about neural networks in general. As a prototype it hits a sweet spot: it's challenging - it's no small feat to recognize handwritten digits - but it's not so difficult as to require an extremely complicated solution, or tremendous computational power. Furthermore, it's a great way to develop more advanced techniques, such as deep learning. And so throughout the book we'll return repeatedly to the problem of handwriting recognition. Later in the book, we'll discuss how these ideas may be applied to other problems in computer vision, and also in speech, natural language processing, and other domains.
如果本章只是要写一个能识别手写数字的程序,那么本章会很短。但是我们会顺便介绍很多的关于神经网络的基本概念,包括两个重要的人工神经元(感知机和sigmoid神经元),标准的神经网络学习算法-随机梯度递减法。并且我会着重介绍神经网络的来龙去脉,使得读着对神经网络有直观地感受。所以本章会比较长,但是这是值得的。最后,我会介绍什么是深度学习,为什么它很重要。
什么是神经网络?我们先看一种人工神经元---感知机。感知机是上个世纪五六十年代由Frank Rosenblatt发明的。现在人们普遍使用的是另一种模型sigmoid神经元,我们马上也会讲到。但是为了理解sigmoid神经元,我们还是要花时间讲一下感知机的。
感知机是如何工作的呢?一个感知机有多个二进制的输入x1,x2..., 产生一个单一的输出。
这个例子中的感知机有三个输入x1,x2,x3。Rosenblatt提供了一个简单的规则来产生输出。他一如了weights权重,w1,w2,..., 都是实数。这些数字代表了各个输入对输出的重要程度。神经元的输出是0或者1,是由权重的和 ∑jwjxj 决定。如果和小于某个阈值,那么输出为0;如果大于某个阈值,那么输出为1。阈值也是一个实数。我们可以用方程来表示如下:
output={01if ∑jwjxj≤ thresholdif ∑jwjxj> threshold(1) 感知机是这么工作的。
这个是基本的数学模型。你可以这么看感知机:他是一个通过改变权重来做出不同决定的设备机器。举个很好理解但是不太恰当的例子。周末了,你听说成立举办一个奶酪节。你很喜欢奶酪,在思考去还是不去。可能有三个方面的考虑:
1 天气
2 女朋友
3 交通
我们可以用x1,x2,x3来表示这三个方面。例如天气好,那么x1=1;天气不好,x1=0; 女朋友想去x2=1,不想去x2=0;交通方便有地铁,x3=1,不方面x3=0。
假如你非常喜欢奶酪,不管天气如何,不管女朋友去不去,你都想去。但是你又非常在意天气,天气不好,你就不去了。现在用感知机来帮你做出决定。一个方法是选择权重。w1=6,w2=2,w3=2。w1=6表示你更在意天气。最后,选择5作为去不去的阈值。所以当天气好的时候,不管交通和女朋友,仅仅计算w1*x1=6已经大于5,所以你肯定去。当天起不好的时候,不管交通好,女朋友想去,总和最大是0*w1 + 1* w2 + 1*w3=4,小于5,所以天气不好,你肯定不去。
通过改变权重和阈值,我们可以得到不同的决策结果。例如,我们选择阈值3。当天气好的时候,你肯定回去;如果天气不好,但是交通方便,女朋友想去,那么总和是4,你也得去。也即是说,这个系统已经变成完全不同的系统了。选择阈值3本身就代表着你很想去奶酪节。
显然,感知机不是一个完美的人类思考的模型。但是上面的例子揭示了感知机可以通过调节权重做出不同的决定。如果感知机模型再复杂一些,那么也许能够做出更合理的决策。
在上图的网络中,第一列叫做第一层,它做出三个决定。第二层是加权第一层的输出,因此第二层能做出比第一层更复杂更抽象的决定。第三层可以做出更更复杂的决定。这样,多层神经网络可以做出非常复杂的决策。
前文提到感知机都只有一个输出。但是上面的图看上去一个感知机有多个输出。实际上还是只有一个输出。多输出的箭头只是一个表示方式。如果先话一个箭头,后面再分出不同的线来,整个图会显得比较丑。
让我们简化一下感知机的描述。 ∑jwjxj>threshold 看上去挺复杂的,我们可以用两个方法简化。第一个, w⋅x≡∑jwjxj 。用点来
表示乘法求和,其中w和x都是向量。第二个,把threshold阈值移到不等式的另一边,且令 b≡−threshold。 方程可以简化为:
output={01if w⋅x+b≤0if w⋅x+b>0(2)