1.感知机是什么?

  • 感知机接受多个输入信号,输出一个信号。
  • 感知机的信号只有“流/不流“(1/0)两种取值
  • 例:接收两个输入信号的感知机的例子
image-20241213111525105

其中x1x_1,x2x_2是输入信号,yy是输出信号,w1w_1 ,w2w_2是权重。图中的\circ称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1,w2x2)(w_1x_1,w_2x_2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为*“神经元被激活”*。将这个界限值称为阈值,用符号θ\theta表示。

将上述内容用数学式来表示,可表示为

y={0(w1x1+w2x2θ)1(w1x1+w2x2θ)y=\begin{cases} 0&(w_1x_1+w_2x_2\leq \theta)\\ 1&(w_1x_1+w_2x_2\geq \theta)\\ \end{cases}

感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。

2.逻辑电路回顾

  • 与门

    真值表如下

image-20241213120241990

用感知机实现与门。需要确定能满足真值表的w1,w2,θw_1,w_2,\theta的值。参数选择方法有无数种,且仅当x1x2x_1和x_2同时为1时,信号的加权总和才会超过给定的阈值θ\theta

  • 与非门

    真值表如下

image-20241213121441919

只要把实现与门的参数值的符号取反,就可以实现与非门

  • 或门

    真值表如下

image-20241213121805929

3.感知机的实现

  • 简单实现与门
1
2
3
4
5
6
7
def AND(x1,x2):
w1,w2,theta = 0.5,0.5,0.7
temp = x1 * w1 + x2 * w2
if temp <= theta:
return 0
elif temp > theta:
return 1

输出结果如下:

image-20241213123718914

按照同样的步骤,也可以实现与非门和或门。

  • 导入权重和偏置

为了处理更复杂的情况,我们将(1)(1)修改为

y={0(b+w1x1+w2x20)1(b+w1x1+w2x2>0)y=\begin{cases} 0&(b+w_1x_1+w_2x_2\leq 0)\\ 1&(b+w_1x_1+w_2x_2 > 0)\\ \end{cases}

此处,bb称为偏置。如式(2)(2)所示,感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0。按照式(2)(2)实现感知机,利用python解释器来逐一确定结果。

image-20241213130158159
  • 使用权重和偏置值实现与,与非和或门

    • 与门
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def AND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
    return 0
    else:
    return 1
    • 与非门(仅权重和偏置值不同)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def NAND(x1,x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
    return 0
    else:
    return 1
    • 或门(仅权重和偏置值不同)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def OR(x1,x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
    return 0
    else:
    return 1

这里把θ-\theta命名为偏置bb,但注意,偏置和权重w1,w2w_1,w_2的作用是不一样的。具体说w1w2w_1和w_2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。比如,若bb0.1-0.1,则只要输入信号的加权总和超过0.10.1,神经元就会被激活。但是如果bb20.0-20.0,则输入信号的加权总和必须超过20.020.0,神经元才会被激活。像这样,偏置的值决定了神经元被激活的容易程度。

4.感知机的局限性

用上面的感知机无法实现异或门,原因如下:

将或门的动作情况形象化,假设权重参数为(b,w1,w2)=(0.5,1.0,1.0)(b,w_1,w_2) = (-0.5,1.0,1.0)时,感知机可用下式(3)(3)表示:

y={0(0.5+w1x1+w2x20)1(0.5+w1x1+w2x2>0)y=\begin{cases} 0&(0.5+w_1x_1+w_2x_2\leq 0)\\ 1&(0.5+w_1x_1+w_2x_2 > 0)\\ \end{cases}

(3)(3)表示的感知机会生成由直线0.5+x1+x2=0-0.5+x_1+x_2=0分割开的两个空间。其中高一个空间输出1,另一个空间(灰色区域)输出0,如下图所示

image-20241213171127710

或门在(x1,x2)=(0,0)(x_1,x_2)=(0,0)时输出0,在(x1,x2)(x_1,x_2)(0,1),(1,0),(1,1)(0,1),(1,0),(1,1)时输出1。

上图中\circ表示0,\triangle表示1。

但异或门如下图所示

image-20241213171742521

想要用一条直线分开,无论如何都做不到。但使用一条曲线就可以了,如下图所示

image-20241213172439145

感知机的局限性就在它只能表示由一条直线分割的空间。上图这样弯曲的曲线无法用感知机表示。上图这样的曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间

5.多层感知机

可以通过组合与门、与非门、或门实现异或门,如下图所示

image-20241213173335004

这里,x1x_1x2x_2表示输入信号,yy表示输出信号。x1x_1x2x_2是与非门和或门的输入,而与非门和或门的输出则是与门的输入。把s1s_1作为与非门的输入,把s2s_2作为或门的输出填入真值表,真值表如下

image-20241213173837892

观察x1x2y观察x_1、x_2、y,可以发现确实符合异或门的输出。

那么,通过前面定义的AND函数、NAND函数、OR函数,可以像下面这样轻松地实现异或。

1
2
3
4
5
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND2(s1,s2)
return y

这个XOR函数输出预期结果

截屏2024-12-13 17.54.00

用感知机的表示方法(明确的显示神经元)来表示这个异或门,结果如下图所示

image-20241213175829242

异或门是一种多层结构的神经网络。这里将最左边的一列称为第0层,中间的一列称为第1层,最右边的一列称为2层。叠加了多层的感知机也称为多层感知机

上图所示的2层感知机中,先在第0层和第1层的神经元之间进行信号的传送和接收,然后在第1层和第2层之间进行信号的传送和接收,具体如下所示。

  1. 第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元。
  2. 第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出yy