神经网络 | ② 感知器:神经网络的基石

引言

神经网络并非凭空而来,它的前身正是感知器。感知器是神经网络的起源,也是深度学习大厦的第一块基石。

本文从单层感知器出发,介绍其数学原理和代码实现,揭示它只能处理线性可分问题的局限;再通过堆叠多层,引出多层感知器如何突破非线性难题。理解感知器,就是理解神经网络"为什么要有层、为什么要有激活函数、为什么要加深"的第一把钥匙。


单层感知器

  • 定义 ------ 感知器(Perceptron)是神经网络的起源,由 Frank Rosenblatt1957 年提出。它是一个接收多个输入输出一个信号的简单算法。

  • 数学表示

    • 基本形式 ------ 感知器接收输入信号 x1,x2,...x_1, x_2, ...x1,x2,...,每个输入有对应的权重 w1,w2,...w_1, w_2, ...w1,w2,...,计算加权和后,通过一个阈值函数输出结果,其中 θ\thetaθ 是阈值:
  • 偏置形式 ------ 将阈值移到左边,得到更常用的形式,其中 b=−θb = -\thetab=−θ 称为偏置

    对偏置形式,左图的偏置 bbb 没有画出,可以添加一个输入信号 1,权重为 bbb 来表示。由于偏置的输入信号一直是 1, 为区别于其他神经元,可以将其涂灰,如右图所示:

  • 代码实现 ------ 实现简单的与门感知器

    python 复制代码
    # 采用基本形式的数学表达实现
    def AND(x1, x2):
        w1, w2, theta = 0.5, 0.5, 0.7
        tmp = x1*w1 + x2*w2
        if tmp <= theta:
            return 0
        elif tmp > theta:
            return 1
    python 复制代码
    # 采用偏置形式的数学表达实现
    def AND(x1, x2):
        x = np.array([x1, x2])
        w = np.array([0.5, 0.5])  	# 权重
        b = -0.7                  	# 偏置
        if np.sum(w * x) + b <= 0:
            return 0
        else:
            return 1
    python 复制代码
    print(f"0 AND 0 = {AND(0, 0)}")
    print(f"1 AND 0 = {AND(1, 0)}")
    print(f"0 AND 1 = {AND(0, 1)}")
    print(f"1 AND 1 = {AND(1, 1)}")

    偏置 bbb 和权重 w1、w2w_1、w_2w1、w2 的作用是不 一样的

    • 权重 w1、w2w_1、w_2w1、w2 是控制输入信号的重要性的参数
    • 偏置 bbb 是调整神经元被激活的容易程度(输出信号为1的程度)的参数
  • 局限性 ------ 单层感知器只能解决线性可分 问题,无法解决线性不可分 问题。以异或门 XOR为例:

    在二维平面上,XOR 的真值表无法用一条直线分隔开两类点。这就是单层感知器的局限


多层感知器

  • 定义 ------ 通过叠加 的方式,增加单层感知器的层数,从而变为多层感知器(Multi-Layer Perceptron, MLP)。其由输入层、隐藏层和输出层组成,能够表示任意非线性函数

    上面的感知机总共由3层构成,但是因为拥有权重的层 实质上只有2层,所以称为2层感知机。不过,有的文献认为该感知机是由3层构成的,因而将其称为3层感知机

  • 突破 ------ 叠加多层感知器可以解决非线性问题。异或门可以通过组合与门、与非门、或门实现:

  • 代码实现 ------ 使用之前定义的 AND 函数、NAND 函数、OR 函数实现异或门感知器

    python 复制代码
    def XOR(x1, x2):
        s1 = NAND(x1, x2)
        s2 = OR(x1, x2)
        y = AND(s1, s2)
        return y
    python 复制代码
    print(f"0 XOR 0 = {XOR_gate(0, 0)}")
    print(f"1 XOR 0 = {XOR_gate(1, 0)}")
    print(f"0 XOR 1 = {XOR_gate(0, 1)}")
    print(f"1 XOR 1 = {XOR_gate(1, 1)}")

参考文献

1 斋藤康毅. 深度学习入门:基于Python的理论与实现M. 陆宇杰, 译. 北京: 人民邮电出版社, 2018.