“plugins”: [ “katex” ]

认知神经元

什么是神经网络?我们先解释下人工神经网络的一种,感知神经网络。1950 - 1960年代,受到Warren McCulloch 和 Walter Pitts的启发,科学家Frank Rosenblatt提出了感知神经网络的概念。今天,通常我们使用另外一种人工神经元,名字为sigmoid神经元。这本书也将重点探讨这种神经元。很快我们就将开始探讨它。不过,为了理解为什么sigmoid神经元被定义为他们的样子,我先介绍一下感知神经元(perceptrons). perceptrons是如何工作的呢?一个perceptrons有数个二级制的输入x_1,x_2,…,处理结果是一个二进制的输出:

tikz0

这个例子中,perceptrons有三个输入,x1,x_2,x_3,实际上,输入可能会更多或者更少。Rosenblatt提出了一个计算输出的简单规则。他引入了weights权重的概念,w_1,w_2,…,每个权重是一个实数,它代表了每个输入因素对输出结果的影响程度。神经元的输出,0或1,取决于权重w与i相乘然后求和\sum{j}{ } w_jx_j的结果,如果大于某个阈值,则为1,否则为0.阈值是神经元的一个参数,它也是实数。可以用更精确一些的算法表示如下:

$$output = \left{\begin{matrix} 0 & if \sum_j w_jx_j \leqslant threshold \ 1& if \sum_j w_jx_j > threshold \end{matrix}\right. \qquad \qquad \qquad (1) $$

这就是一个perceptron是如何工作的。 这是一个很基础的数学模型。你可以一个perceptron看做是装置,它通过衡量凭据及其权重来进行决策。举个不太现实但容易理解的例子,稍后我们将举个更为现实的例子。周末就要来了,你听说你所在的城市将举行一个芝士节活动。你非常喜欢吃芝士,正在考虑是否要参加。你会考虑三个因素:

  1. 天气是否晴朗
  2. 你的女朋友/女朋友是否也愿意去
  3. 地点公共交通是否便利(你不开车) 用三个变量来代表这三个因素:$$x_1$$,$$x_2$$和$$x_3$$。比如如果天气不错,$$x_1$$ = 1;如果$$x_1$$ = 0,就以为这天气很糟糕。同样,$$x_2$$ = 1 意味着你女朋友/女朋友愿意去, $$x_2$$ = 0为不愿意。$$x_3$$同样。 现在加入你是只是的狂热爱好者,即使交通不便利,你女朋友/女朋友也不愿去,你还是会高高兴兴参加。但你非常讨厌糟糕的天气,如果天气不过,你绝对不会去。你可以使用perceptron来构建你的决策模型。其中一个办法是设代表天气的$$w_1$$设为6,其它两个因素 $$w_2$$ = 2, $$w_3$$.$$w_1$$的值很高,意味着天气对你的决策影响很大,远远超过另外两个因素。若你选择的阈值为5,则最终如果天气好,最终输出的结果就会大于1,相反,只要天气不好,结果就为0.输出的结果与你女朋友/男朋友愿不愿意去或者交通是否方便并没有关系。 调整权重和阈值,可以得到不同的决策模型。例如,如果阈值设置为3,无论天气好与坏,或者举办地点交通很便利且你女朋友/男朋友愿意去,perceptron将最终决定你是否参加芝士节。就变为了一个不同的决策模型。降低阈值则意味着你更愿意参加芝士节。 很明显,perceptron不是一个完整的人类决策模型,我们仍然可以清楚看到perceptron如何通过对各个因素施加权重来进行决策的。不过,看起来,通过一个复杂的perceptrons网络做细致的决定似乎是可行的。

认知神经元 - 图2

在这个网络中,perceptrons的第一列(第一层perceptrons)通过对输入设置权重,做了3个简单的决定。那perceptrons第二层会怎么做呢?第二层的perceptrons都会将第一层的perceptrons的输出作为输入,配以权重后,得出自己的结果。这样,相对于第一层的perceptrons,第二层的perceptron能够做出更复杂更抽象的决策。第三层perceptron,更为甚之。这样下去,有许多层perceptron构成的网络就可以做出复杂的决策。 当我定义perceptron时我说过一个perceptron只有一个输出结果。在上述网络中,perceptron似乎有多个输出结果。事实上,它们仍然是单一输出结果。多个输出的箭头不过是为了方便我们理解一层perceptron的输出是其后层perceptron的输入而已。如果画一条输出线然后将它分为几节,会显得有些混乱。 我们来简化一下perceptrons的描述。条件xxxx看起来蛮头疼的,我们可以用两个标记来改善一下。第一个改变是把xxx改为一个dot product,xxxx, 这里w和x是向量,分别代表权重和输入。第二个改变是把阈值挪到不等式的另外一边,并用perceptrons的bias来代替,b=-threshold. 使用偏移量替换到阈值,perceptrons规则就可以写作:

$$ output = \left{\begin{matrix} 0 & if w \dot x + b \leqslant threshold \ 1& if w \dot x + b > threshold \end{matrix}\right. \qquad \qquad \qquad (2) $$

你可以把偏移量理解为输出结果为1的难以程度。或者,如果用生物学术语,偏移量意味着让perceptron的难以程度。如果一个perceptrons有一个非常大的偏移量,perceptrons输出结果为1就非常容易。反之,如果为很大的负值,输出结果为1就变得十分困难。很明显,引入偏移量只是我们描述perceptrons时的一个小变化。稍后,我们将会了解到它是如何帮助简化符号。因此,本书中,我们将一直使用偏移量这个术语而不是阈值。

我已经把perceptrons描述为通过权衡各个输入变量来进行决策。perceptrons的另外一个用途是用做数据计算的基础的逻辑函数,诸如AND,OR,或者NAND。 例如,一个perceptron有两个输入,每一个权重是-2,整体的偏移量是3,perceptrons是这样的:

认知神经元 - 图3

输入若为00则输出为1,因为(−2)x0+(−2)x0+3=3为正数。这里,我引进了x符号以便使乘法更加明确。类似的,如果输入为01或者10,结果也是1.但如果输入为11则输出为0,因为 (−2)x1+(−2)x1+3=−1为负值。由此可见,perceptron实现了NAND门。 NAND门的例子可以看出可以使用perceptron来计算简单的逻辑函数。事实上,我们可以通过perceptron网络来计算任意的逻辑函数。原因是NAND门是一个通用的计算式,任何计算都可以通过组合NAND门来完成。例如,我们可以通过NAND门组合建立一个电路,功能是完成x_1x_2相加。这需要计算二级制的加法,x_1x_2,同事,当x_1x_2都是1时,carry bit被设置为1。也就是说,carry bit只是按位运算的x_1,x_2的结果。

认知神经元 - 图4

用perceptron替换掉NAND可以得到一个同样功能的perceptrons网络,每个perceptron权重为-2,偏移量设置为3.于是一个决策网络诞生了。注意,为了方便画箭头,我把右下角的NAND门对应的perceptron移动了一点点。

认知神经元 - 图5

另外一个值得注意的事情是,最左侧perceptron的输出两次被用作最底部perceptron的输入。在定义perceptron的时候,我可没说一个perceptron的输出不能同时两次被用作另外一个perceptron的输入。事实上,完全是可以的。但如果你真的不想这么做,也可以把两条线合并为一条线,然后把权重设置为-4就可以了。(如果还没有理解这是为什么,你应该停下来,花些时间弄明白它)。修改后的网络如下所示,所有未标出来的权重都为-2,所有的偏移量都为3,只有一个权重为-4: 认知神经元 - 图6

我们一直把x_1x_2当做变量画在perceptron 网络的左侧,但通常情况下,会在perceptrons网络的左侧在加一层—- 输入层,来放置输入。

认知神经元 - 图7

如下标记只用作输入perceptron,他只有输出,没有输入。

输入神经元

简化了的符号而已。这不意味着它是一个没有输入的perceptron。为了看清这一点,假设一个perceptron没有输入,权重x参数求和则永远为零,\sum_jw_jx_j那么,如果b>0,则perceptron的输出为1,否则,perceptron输出为0,这就说明perceptron的输出为一个固定的值,而非我们预期的值()。 最好别把输入perceptron当做真的perceptron,把它当做特殊的输出为预期值(x_1,x_2,…)特殊单元好了。 上面加法的例子,可以出perceptrons网络是如何模拟包含多个NAND门的电路的。NAND门在计算中是通用的,因此,perceptrons网络也可以用作通用计算。 perceptrons的计算通用性揖让人信心满满同时也多少有些让人失望。信心满满是因为perceptron网络可以像其他计算设备那样强大。但同时,让人沮丧的是,看起来perceptron也只是一种NAND门而已。这绝非是个大新闻。 不过,实际情况好一些。我们可以设计一个学习算法来让人工神经元网络自动调整权重和阈值。无需程序员直接干预,只需要外部输入即可完成调整。通过这些学习算法,我们能够以一种完全不同于传统逻辑门的方法来使用perceptrons网络。不必把NAND或者其他门电路清晰布局出来,神经网络会自己学习如何解决这个问题,甚至是一些通过直接设计电路解决起来极端困难的问题。