神经网络与深度学习

第一章 使用神经网络识别手写数字

手写识别:是学习神经网络的一个很好的原型问题。作为一个原型,它达到了一个最佳点:它具有挑战性——识别手写数字不是件容易的事——但它并不难到需要一个极其复杂的解决方案,或巨大的计算能力。

以下包括两种重要的人工神经元(感知器和Sigmoid神经元),以及被称为随机梯度下降的神经网络标准学习算法的关键思想

  1. 感知机

那么感知机是如何工作的呢?
一个感知器接受几个二进制输入,x1,x2,…,并产生一个二进制输出:
神经网络与深度学习
在这个例子中,感知机有三个输入,x1 x2 x3。一般来说,它可以有更多或更少的输入。Rosenblatt提出了一个简单的规则来计算输出。他引入了权重,w1,w2,…,实数来表示各自的输入对输出的重要性。

神经元的输出(0或1)是由∑jwjxj的加权和是小于还是大于某个阈值所决定的。就像权值一样,阈值是一个实数,它是神经元的一个参数。用更精确的代数术语来说:
神经网络与深度学习
这就是感知机的工作原理!

一个例子:
假设周末快到了,你听说你所在的城市将举办奶酪节。你喜欢奶酪,正在决定是否去参加这个节日。你可以通过权衡以下三个因素来做出决定:
1)天气好吗?
2)你的男朋友或女朋友想要陪你吗?
3)这个节日在公共交通附近吗?(你没有车)。
赋予三个因素(三个输入)不同的权重,将会得到不同的结果,影响因素大的所占权重大。通过改变权重和阈值(门槛),我们可以得到不同的决策模型。
显然,感知器并不是人类决策的完整模型!但是这个例子说明了感知机是如何权衡不同的证据来做出决定的。一个复杂的感知器网络可以做出非常微妙的决定。

jwjxj>threshold(阈值)比较繁琐,我们可以通过两个符号变化来简化它。第一个变化是编写∑jwjxj点积,w⋅x≡∑jwjxj, w和x是权重向量的分量和输入,分别。第二个变化是将阈值移到不等式的另一边,并将其替换为所谓的感知器偏置b≡threshold。使用偏置而不是阈值,感知器规则可以重写:
神经网络与深度学习偏置是用来衡量感知器触发的难易程度的。对于一个有很大偏置的感知器,它很容易输出1。但如果偏置非常小,感知器就很难输出1。

我已经将感知机描述为一种衡量证据以做出决定的方法。另一种使用感知机的方法是计算我们通常认为是基础计算的基本逻辑函数,比如AND, OR, AND NAND。例如,假设我们有一个有两个输入的感知机,每个输入的权值为- 2,总体偏置为3。这是我们的感知器:
神经网络与深度学习
然后我们看到输入00生成输出1,因为(−2)∗0+(−2)∗0+3=3是正数。类似的计算表明,输入01和10产生输出1。但是输入11生成输出0,因为(−2)∗1+(−2)∗1+3=−1是负数。我们的感知器实现了一个NAND门!
NAND的例子表明我们可以使用感知器来计算简单的逻辑函数。事实上,我们可以使用感知机网络来计算任何逻辑函数。原因是NAND门对于计算来说是通用的,也就是说,我们可以用NAND门构建任何计算。
神经网络与深度学习
这个加法器的例子演示了一个感知器网络如何被用来模拟一个包含许多NAND门的电路。因为NAND门对于计算来说是通用的,因此感知机对于计算来说也是通用的。

事实证明,我们可以设计出自动调整人工神经元网络的权重和偏差的学习算法。这种调优是对外部刺激的响应,不需要程序员的直接干预。这些学习算法使我们能够以一种与传统逻辑门截然不同的方式使用人工神经元。我们的神经网络可以简单地学会解决问题,而不是明确地设计一个由NAND和其他门组成的电路,有时候,直接设计传统电路是极其困难的。

  1. Sigmoid神经元
    我们希望网络学习权重和偏差,这样网络的输出就能正确地对数字进行分类。为了了解学习是如何进行的,假设我们对网络中的某个权重(或偏差)做了一个小小的改变。我们想要的是,这个小的权重变化只会引起网络输出的一个小的对应变化。神经网络与深度学习
    如果某一权重(或偏差)的微小变化确实只会导致输出的微小变化,那么我们可以利用这一事实来修改权重和偏差,使我们的网络以我们希望的方式运行。

    问题是,当我们的网络包含感知器时,情况就不同了。事实上,网络中任何一个感知器的权值或偏差的一个小变化有时会导致该感知器的输出完全翻转,比如从0到1。这种翻转可能会导致网络其他部分的行为以某种非常复杂的方式完全改变。

    我们可以通过引入一种叫做Sigmoid神经元的新型人工神经元来克服这个问题。Sigmoid神经元与感知器类似,但经过了修饰,所以它们的权重和偏差的微小变化只会导致它们的输出产生微小的变化。
    神经网络与深度学习
    就像感知器一样,sigmoid神经元也有输入,x1,x2,…但是这些输入不只是0或1,它们也可以取0到1之间的任何值。例如,0.638。和感知器一样,sigmoid神经元对每个输入都有权值,w1、w2、…和总体偏置b,但输出不是0或1。取而代之的是σ(w⋅x + b),其中σ被称为sigmoid函数,定义为:
    神经网络与深度学习
    一个输入为x1、x2、…、权值为w1、w2、…、b的sigmoid神经元的输出为:
    神经网络与深度学习
    当 z=w⋅x+bz=w⋅x+b比较大的和正的数时,输出为1,当z=w⋅x+bz=w⋅x+b为很大的负数时,e-z→∞,σ(z)≈0,和感知机相似,只有当w⋅x + b的中等大小,从感知器模型有很多偏差。
    神经网络与深度学习

平滑版本的阶梯函数:
神经网络与深度学习
神经网络与深度学习
当我们使用不同的**函数时,主要的变化是方程(5)中偏导数的特定值发生了变化。

我们应该如何解释sigmoid神经元的输出呢?显然,感知机和sigmoid神经元之间的一个很大的区别是sigmoid神经元不只是输出0或1。他们可以作为输出任意实数0至1,所以例如一般值为 0.173和0.698等等…是合法的输出。这可能是有用的,例如,如果我们想使用输出值来表示图像输入到神经网络中像素的平均强度。但有时也会令人讨厌。假设我们希望网络的输出显示“输入图像是9”或“输入图像不是9”。显然,如果输出是0或1,就像在感知机中那样做是最容易的。但是在实践中,我们可以设置一个约定来处理这个问题,例如,通过决定大于0.5的任何输出解释为“9”,并且任何输出小于0.5,则表示“not a 9”。当我们使用这样的约定时,我总是明确地声明,所以它不应该引起任何混乱。

练习:模拟感知机的Sigmoid神经元
一、 假设我们在一个感知机的网络中取所有的权值和偏差,然后乘以一个正的常数c> 0。显示网络的行为不会改变。
答案: 由数学关系可知 cwx+cb≤0 = wx+b≤0,输出为1的时候同理。
二、 假设我们有和最后一个问题相同的设置——一个感知机网络。假设还选择了感知机网络的整体输入。我们不需要实际的输入值,我们只需要输入能被修复就可以。假设权重和偏见,w⋅x + b≠0输入x的任何特定的感知机网络。现在用sigmoid神经元替换网络中的所有感知机,并将权重和偏差乘以一个正的常数c> 0。表明,当c→∞**神经元网络的行为感知机网络是完全一样的。当w⋅x + b = 0时,这种神经元怎么才会失败呢?
答:z≡w⋅x+b,乘以正常数和上题同理。只会加剧z变成更大的正数或者负数,对神经网络的判断并无影响,因为该处神经网络的判断的分界线是z=0,当w⋅x+b=0 z恒等于0.5,所以常数c不会对该处神经网络产生影响。

  1. 神经网络的结构

  2. 一个用来分类手写数字的简单网络

  3. 利用梯度下降进行学习

  4. 利用我们的网络对数字进行分类

  5. 面向深度学习