DL-深度学习入门-基于Python的理论与实现-2-感知机

《深度学习入门》第 2 章学习笔记。

正文

2.1 感知机是什么

  • 接收多个输入信号,输出一个信号。
  • 感知机的信号只有“流/ 不流”(1/0)两种取值。在本书中,0 对应“不传递信号”,1 对应“传递信号”。
png

一个接收两个输入信号的感知机的例子。x1x_1x2x_2 是输入信号,yy 是输出信号,w1w_1w2w_2 是权重(ww 是 weight 的首字母)。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1w_1x_1w2x2w_2x_2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出 1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 θ\theta 表示。

用数学式来表示:

y={0(w1x1+w2x2θ)1(w1x1+w2x2>θ)y=\left\{\begin{matrix}0\quad(w_1x_1+w_2x_2\le\theta)\\ 1\quad(w_1x_1+w_2x_2>\theta)\end{matrix}\right.

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

权重相当于电流里所说的电阻。电阻是决定电流流动难度的参数, 电阻越低,通过的电流就越大。而感知机的权重则是值越大,通过 的信号就越大。不管是电阻还是权重,在控制信号流动难度(或者流 动容易度)这一点上的作用都是一样的。

2.3 感知机的实现

2.3.1 简单的实现

python
def AND(x1, x2):
    """
    模拟一个 AND 门
    """
    w1, w2, theta = 0.5, 0.5, 0.7  # 接受参数 w1 = 0.5, w2 = 0.5, 阈值为 0.7
    tmp = x1 * w1 + x2 * w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1
python
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))
0
0
0
1

2.3.2 导入权重和偏置

导入权重和偏置, 把 θ\theta 换成 b-b

y={0(b+w1x1+w2x20)1(b+w1x1+w2x2>0)y=\left\{\begin{matrix}0\quad (b+w_1x_1+w_2x_2\le 0)\\1\quad(b+w_1x_1+w_2x_2>0)\end{matrix}\right.

此处,bb 称为偏置,w1w_1w2w_2 称为权重。感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于 0 则输出 1,否则输出 0。

python
import numpy as np
 
x = np.array([0, 1])  # 输入
w = np.array([0.5, 0.5])  # 权重
b = -0.7  # 偏置
w * x
array([0. , 0.5])
python
np.sum(w * x)
0.5
python
np.sum(w * x) + b  # 大约为-0.2(由浮点小数造成的运算误差)
-0.19999999999999996

2.3.3 使用权重和偏置的实现

python
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
python
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))
0
0
0
1

偏置的值决定了神经元被激活的容易程度。这里我们将 w1w_1w2w_2 称为权重,将 bb 称为偏置,但是根据上下文,有时也会将 bbw1w_1w2w_2 这些参数统称为权重(将 1 也视为输入,bb 是调整神经元被激活的容易程度(输出信号为 1 的程度)的参数)。

python
def NAND(x1, x2):
    """
    模拟一个非门
    """
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5])  # 仅权重和偏置与 AND 不同!
    b = 0.7
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
python
print(NAND(0, 0))
print(NAND(1, 0))
print(NAND(0, 1))
print(NAND(1, 1))
1
1
1
0
python
def OR(x1, x2):
    """
    模拟一个或门
    """
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])  # 仅权重和偏置与 AND 不同!
    b = -0.2
    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
python
print(OR(0, 0))
print(OR(1, 0))
print(OR(0, 1))
print(OR(1, 1))
0
1
1
1

2.4 感知机的局限性

单层感知机无法解决异或问题。

2.5 多层感知机

2.5.1 已有门电路的组合

png png

2.5.2 异或门的实现

python
def XOR(x1, x2):
    """
    使用之前定义的 AND 函数、NAND 函数、OR 函数,实现 XOR 门。
    """
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y
python
print(XOR(0, 0))
print(XOR(1, 0))
print(XOR(0, 1))
print(XOR(1, 1))
0
1
1
0

实际上,与门、或门是单层感知机,而异或门是 2 层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron)

png

上图的感知机总共由 3 层构成,但是因为拥有权重的层实质上只有 2 层(第 0 层和第 1 层之间,第 1 层和第 2 层之间),所以称为“2 层感知机”。不过,有的文献认为上图的感知机是由 3 层构成的,因而将其称为“3 层感知机”。

2.7 小结

  • 感知机是具有输入和输出的算法。给定一个输入后,将输出一个既 定的值。
  • 感知机将权重和偏置设定为参数。
  • 使用感知机可以表示与门和或门等逻辑电路。
  • 异或门无法通过单层感知机来表示。
  • 使用 2 层感知机可以表示异或门。
  • 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
  • 多层感知机(在理论上)可以表示计算机。