# 深度学习之《深度学习入门》学习笔记（二）感知机

> 作者：zning（https://ning.ae） · 发布：2019/08/12 21:44 下午 (UTC+8) · 原文：https://zning.me/15656174993229.html

最近学习吴恩达《Machine Learning》课程以及《深度学习入门：基于Python的理论与实现》书，一些东西总结了下。现就后者学习进行笔记总结。本文是本书的学习笔记（二）感知机。

* [深度学习之《深度学习入门》学习笔记（一）Python入门](./15656172902685.html)

* [深度学习之《深度学习入门》学习笔记（二）感知机](./15656174993229.html)

* [深度学习之《深度学习入门》学习笔记（三）神经网络](./15656175642754.html)

* [深度学习之《深度学习入门》学习笔记（四）神经网络的学习](./15691207315042.html)

感知机是作为神经网络（深度学习）的起源的算法。

感知机接收多个输入信号，输出一个信号。感知机的信号只有0/1两种取值。在本书，0代表“不传递信号”，1代表“传递信号”。

感知机的数学表达式：

$$
y=\begin{cases}
0&(w_1x_1+w_2x_2\leq\theta) \\ 1&(w_1x_1+w_2x_2>\theta)
\end{cases}
$$

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

## 感知机的实现

```python
# 与门
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
```

```python
AND(0, 0)
```

> 0

```python
AND(1,0)
```

> 0

```python
AND(0,1)
```

> 0

```python
AND(1,1)
```

> 1

## 导入权重和偏置

```python
# NumPy实现感知机与权重与偏置
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

```python
# 使用权重和偏置实现与门
def AND2(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
# 实现与非门
def NAND2(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
# 实现或门
def OR2(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
```

## 感知机的局限

感知机无法实现逻辑异或门。感知机的局限性就在于它只能表示由一条直线分割的空间，即只能分割线性空间。

## 多层感知机

感知机可以“叠加层”。

```python
# 异或门的实现
def XOR2(x1, x2):
    s1 = NAND2(x1, x2)
    s2 = OR2(x1, x2)
    y = AND2(s1, s2)
    return y
```

```python
XOR2(0, 0)
```

> 0

```python
XOR2(1, 0)
```

> 1

```python
XOR2(0, 1)
```

> 1

```python
XOR2(1,1)
```

> 0

异或门是一种多层结构的神经网络。与门、或门是单层感知机，而异或门是2层感知机。叠加了多层的感知机也称为**多层感知机**。

> 异或门感知机总共由3层构成，但是因为拥有权重的层实质上只有2层（第0层和第1层之间，第1层和第2层之间），所以称为“2层感知机”。不过，有的文献认为异或门感知机是由3层构成的，因此称其为“3层感知机”。

异或门2层感知机的具体步骤：

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

通过这样的结构，感知机得以实现异或门。这也可以解释为“单层感知机无法表达的东西，通过增加一层就可以解决”。也就是说，通过叠加层（加深层），感知机能进行更加灵活的表示。
