目录
  1. 1. 模型引入
  2. 2. 算法原理
  3. 3. 代码实现
【统计学习方法死磕系列】感知机

感知是人类的一种本能,更确切的说是一切对外界有意识的动物的本能。它是对外界信息作出察觉、感觉、注意、知觉的一系列过程。因此,『感知机(Perceptron)』即是会感知的机器,它是机器学习中最最基础的模型,我们可以把它叫做人工神经元,是神经网络(深度学习)的起源算法。感知机在上世纪5、60年代,由科学家Frank Rosenblatt在受到其他科学家学术成果启发上而提出发展起来的。

如今,使用人工神经元的模型很常见,在许多有关神经网络的现代工作领域中,使用的主要神经元模型,其中之一的就是$sigmoid$神经元,在了解该神经元之前,先把聚焦点放在感知机上吧。

模型引入

感知机作为单层神经网络,其模型引入最初是为解决是否线性可分问题而提出的,一个感知机接收若干个二进制流输入,经过隐藏层的处理,最后产生一个二进制的输出。大致如下所示:

tikz0.png

上图所示的感知机有三个输入,当然这个输入是任意的。Rosenblatt在这个模型上提出了一个条简单计算法则来计算输出值。即引入权重。通过权重来表示各自的输入对输出的重要程度。神经元输出值是二进制的,因此只会返回 0 或者 1 ,它的取值是由输入值加权和是否小于或者大于某个阈值来决定的。表示如下:

                     $output = \left\{\begin{matrix}0
& if \sum_{j}w_jx_j \leq threshold
\\1
& if \sum_{j}w_jx_j > threshold
\end{matrix}\right.$

以上就是感知机的基本数学模型。也可以这样理解,感知机就是一个通过权衡证据来做决定的机器。这里举一个简单的例子。假设周末你所在的城市即将举行环市马拉松比赛。你是马拉松热爱者,正在决定是否周末参加比赛。

于是你可以通过以下三个因素来决定是否参加:

1、周末我是否有空?

2、周末天气好不好?

3、有朋友跟我一起参加么?

在不考虑权重情况下,我们有这三个输入变量,分别为

$x_1 = \{ 有空:1; 没空:0 \}$

$x_2 = \{ 天气好:1; 天气坏:0 \}$

$x_3 = \{ 有朋友:1; 没朋友:0 \}$

现在假设,即使没有朋友去参加也不怎么影响你去参加马拉松(只因你是狂热爱好者),那么分配给第三个因素权重 $w_3$ = 2,但是如果天气不好,连活动是否举办都受影响的话,就很无奈了,所以这里分配第二个因素权重 $w_2$ = 6,然后对于周末有没有空,除去工作突遇重大安排都能抽出时间参加,给予权重 $w_1$ = 2 影响也不是很大。最后,假设感知器的阈值为5.通过这些选择,感知机实现了所需的决策模型,天气好的时候输出为1,天气不好输出为0。无论是否有朋友一起参加,或者周末有其他事情安排,输出结果都一样,只会跟天气有关。(注:1 * 6 + 0 * 4 恒大于5)

通过改变权重和阈值,我们可以得到很多不同的决策模型。比如我们的阈值设为3,那么感知机就会做出只有天气好的时候你才可以去参加马拉松,或者当有朋友一起参加,并且周末也有空,那么就会去参加比赛。也就是说,这其实是另一种决策模式了。降低阈值,意味着降低了参加马拉松比赛的阻拦因素了。

显然,感知机并不是人类做出决策的一个完整模型。只是这个例子解释了感知机是如何通过权衡不同类型的证据来做出决定的。而一个复杂的感知器网络可以做出非常微妙的决定。见下图:

tikz1.png

在这个网络中,感知机的第一层 —— 通过权衡输入的证据,做出三个非常简单的决定。那么第二层的感知器呢?每一个感知器都是通过权衡第一层决策的结果来做决定的。这样,第二层的感知器可以在比第一层感知器更复杂、更抽象的层次上做出决定。第三层的感知器甚至可以做出更复杂的决定,依次递进,这样一个多层感知器网络就可以进行复杂的决策程序了。

顺便说一下,当定义感知机时,我们说过的感知机只有一个输出。但在上面这样的感知器网络里,似乎有多个输出。实际上,这些仍然可以看做是单个输出。多个输出箭头仅仅是一种看起来比较分明的方式,用它来指示一个感知器的输出被用作其他几个感知器的输入。它比仅仅画一条输出线然后分割来的更为方便。

接下来简化一下描述感知机的方式,条件 $\sum_{j} w_jx_j > threshold$ 看起来比较繁琐,我们可以通过两个符号变化来简化它。第一个变化,使用点积来表示加权和 $\vec{w}⋅\vec{x} ≡ \sum_{j} w_jx_j$,$\vec{w}$ 和 $\vec{x}$分别表示权重向量的分量和输入;第二个变化是将阈值移到不等式的另一边,并将其替换为所谓的感知器偏差 $b ≡ 阈值$。也就是使用偏差而不是阈值。因此,感知机规则重写如下:

                     $output = \left\{\begin{matrix}0
& if \vec{w}⋅\vec{x} + b \leq 0
\\1
& if \vec{w}⋅\vec{x} + b > 0
\end{matrix}\right.$

很显然,对于一个有很大偏差的感知器,感知器越容易输出1,因此我们可以把偏差看作是感知器输出1的容易程度的度量。但其实偏差就是用来衡量感知器触发的难易程度的,但如果偏差非常小,可以想象,感知器就很难输出1。引入偏差只是我们描述感知机的一个小变化,后面也不再使用阈值来描述了,将直接使用偏差。

上面我们一直将感知机描述为一种衡量证据以做出决定的方法。但其实它还有另一种用法,即我们可以使用感知机来计算我们通常认为是基础计算的基本逻辑函数,比如 与门(AND)、或门(OR)、与非门(AND NAND)。例如,假设我们有一个有两个输入的感知机,每个输入的权值均为-2,总体偏差为3,这时我们的感知机:

tikz2.png

然后我们看到当输入00时,输出值为1(注:(−2) ∗ 0 + (−2) ∗ 0 + 3 = 3 > 0),类似的输入01和10产生的输出值同样是1,但是当输入11,却生成了0,如果对二进制计算熟悉的话,就能很明显的看出这实现了一个与非门(NAND)计算。

NAND的例子表明我们可以使用感知器来计算简单的逻辑函数。事实上,我们可以使用感知器网络来计算任何逻辑函数。因为NAND门对于计算来说是通用的,也就是说,我们可以用与非门构建任何计算。例如,我们可以使用NAND门来构建一个两位元($x_1$ 和 $x_2$)相加的电路,这就需要计算位和,即 $x_1⊕x_2$,以及一个进位,当 $x_1$ 和 $x_2$ 都是1时,进位为1,也即进位就是按位积 $x_1·x_2$,见下图:

tikz3.png

为了得到一个等效的感知机网络,我们将所有的NAND门替换为感知机的两个输入,每个输入的权值均设为-2,总体偏差为3。下图是最终的网络:

tikz4.png

这个感知器网络一个值得注意的方面是,最左边的感知器的输出被用在了最下面感知器的两次输入了。当定义感知器模型时,我们并没有规定这种双输出到同一个地方是违规的。实际上,这并不重要。如果我们不希望出现这种情况,那么可以简单的将这两条线合并成一条,并将其权重由-2改成-4(这里是否等价可以尝试证明一下),而有了这个变化,现在网络看起来如下(注:未标记的权重均为-2,所有的偏差都等于3):

tikz5.png

到目前为止,我一直把像 $x_1$ 和 $x_2$ 这样的输入当作浮动在感知器网络左侧的变量。事实上,传统的做法是绘制一个额外的感知器层 —— 输入层 —— 来编码输入:

tikz6.png

这个符号表示输入感知机,我们有输出,但是没有输入,

tikz7.png

这是一种速记法,但并不意味着这是一个没有输入的感知器。假设我们有一个没有输入的感知器,那么,$\sum_{j} w_jx_j$ 的加权和就会始终为0。因此,如果 $b > 0$,感知器输出1;反之输出0。也就是说,感知器只输出一个固定的值,而不是期望的值($x_1$)。所以最好的理解就是把输入的感知机想成根本不是感知机,而是一些特殊的单位,它们被简单地定义为想要输出的值,

$x_1, x_2, \cdots$

算法原理

感知机算法原理:

1、对于每一个输入,乘以它的权重值;

2、把所有加权的输入相加

3、通过求和函数求得的和计算感知机的输出

代码实现

TBD

文章作者: Leo·Cheung
文章链接: http://tufusi.com/2019/12/19/%E3%80%90%E7%BB%9F%E8%AE%A1%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95%E6%AD%BB%E7%A3%95%E7%B3%BB%E5%88%97%E3%80%91%E6%84%9F%E7%9F%A5%E6%9C%BA/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ONE·PIECE
打赏
  • 微信
  • 支付宝

评论