深度学习基础--感知机

文章目录

  • 学习资料
  • 感知机
    • 感知机基本概念
    • 简单逻辑电路
      • 与门
      • 与非门
      • 或门
    • 使用权重和偏置的实现
      • 使用权重和偏置实现与门
      • 使用权重和偏置实现与非门
      • 使用权重和偏置实现或门
    • 感知机的局限性
      • 线性和非线性
    • 多层感知机
      • 已有门电路的组合实现异或门
    • 小结

学习资料

《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

内容均是从该书中总结

感知机

感知机基本概念

深度学习基础--感知机_第1张图片

图片来自:《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

x 1 , x 2 x_1,x_2 x1,x2:两个输入信号

w 1 , w 2 w_1,w_2 w1,w2:两个权重(weight),权重指重要程度。

⭕ ⭕ 神经元结点

神经元被激活:两个输入信号分别乘以固定的权重 ( w 1 x 1 , w 2 x 2 ) (w_1x_1,w_2x_2) (w1x1,w2x2),送入神经元 y y y y y y会计算传送过来的信号的总和,当这个总和超过某个界限值(阈值,符号 θ \theta θ),输出 1 1 1。这被称为“神经元被激活”。

运行原理的数学公式:
y = { 0 , ( w 1 x 1 + w 2 x 2 ≤ θ ) 1 , ( w 1 x 1 + w 2 x 2 > θ ) (2.1) y= \left\{ \begin{aligned} 0,(w_1x_1+w_2x_2 \le \theta) \\ 1,(w_1x_1+w_2x_2 > \theta) \\ \end{aligned} \right. \tag{2.1} y={0,(w1x1+w2x2θ)1,(w1x1+w2x2>θ)(2.1)

简单逻辑电路

用简单逻辑电路理解感知机

与门

用与门逻辑来理解感知机

与门真值表

x 1 x_1 x1 x 2 x_2 x2 y y y
0 0 0
1 0 0
0 1 0
1 1 1

设置权重和阈值来实现与门:

  • 权重与阈值:

    • w 1 w_1 w1:0.5

    • w 2 w_2 w2:0.5

    • θ \theta θ:0.9

      这三个并不唯一,只要能满足上面的真值表都可以

代码实现与门:

def and_gate(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.9  # 初始化两个权重w1,w2和阈值theta
    result = w1 * x1 + w2 * x2  # 计算结果传给result
    if result <= theta:  # 将结果result与阈值theta比较
        return 0
    else:
        return 1


print(f"(0, 0)与门结果判定:{and_gate(0, 0)}")
print(f"(1, 0)与门结果判定:{and_gate(1, 0)}")
print(f"(0, 1)与门结果判定:{and_gate(0, 1)}")
print(f"(1, 1)与门结果判定:{and_gate(1, 1)}")
"""
(0, 0)与门结果判定:0
(1, 0)与门结果判定:0
(0, 1)与门结果判定:0
(1, 1)与门结果判定:1
"""

与非门

与非门的真值表:

x 1 x_1 x1 x 2 x_2 x2 y y y
0 0 1
1 0 1
0 1 1
1 1 0

与非门与门的真值判定相反。

  • 权重与阈值:

    • w 1 w_1 w1:-0.5

    • w 2 w_2 w2:-0.5

    • θ \theta θ:-0.9

      不唯一,此处完全和上面与门的实现设定的权重和阈值相反

代码实现与非门:

def n_and_gate(x1, x2):
    w1, w2, theta = -0.5, -0.5, -0.9  # 初始化两个权重w1,w2和阈值theta
    result = w1 * x1 + w2 * x2  # 计算结果传给result
    if result <= theta:  # 将结果result与阈值theta比较
        return 0
    else:
        return 1


print(f"(0, 0)与非门结果判定:{n_and_gate(0, 0)}")
print(f"(1, 0)与非门结果判定:{n_and_gate(1, 0)}")
print(f"(0, 1)与非门结果判定:{n_and_gate(0, 1)}")
print(f"(1, 1)与非门结果判定:{n_and_gate(1, 1)}")
"""
(0, 0)与非门结果判定:1
(1, 0)与非门结果判定:1
(0, 1)与非门结果判定:1
(1, 1)与非门结果判定:0
"""

或门

或门的真值表

x 1 x_1 x1 x 2 x_2 x2 y y y
0 0 0
1 0 1
0 1 1
1 1 1
  • 权重和阈值

    • w 1 w_1 w1:0.5

    • w 2 w_2 w2:0.5

    • θ \theta θ:0.4

      同样不唯一

代码实现或门

def or_gate(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.4  # 初始化两个权重w1,w2和阈值theta
    result = w1 * x1 + w2 * x2  # 计算结果传给result
    if result <= theta:  # 将结果result与阈值theta比较
        return 0
    else:
        return 1


print(f"(0, 0)或门结果判定:{or_gate(0, 0)}")
print(f"(1, 0)或门结果判定:{or_gate(1, 0)}")
print(f"(0, 1)或门结果判定:{or_gate(0, 1)}")
print(f"(1, 1)或门结果判定:{or_gate(1, 1)}")
"""
(0, 0)或门结果判定:0
(1, 0)或门结果判定:1
(0, 1)或门结果判定:1
(1, 1)或门结果判定:1
"""

使用权重和偏置的实现

上面的实现比较直接简单,现在上难度!!!

式子(2.1)的 θ \theta θ换成 − b -b b ( b = − θ b = -\theta b=θ),使用下式来表示感知机的行为:
y = { 0 , ( b + w 1 x 1 + w 2 x 2 ≤ 0 ) 1 , ( b + w 1 x 1 + w 2 x 2 > 0 ) (2.2) y=\left\{ \begin{aligned} 0,(b+w_1x_1+w_2x_2 \le 0) \\ 1,(b+w_1x_1+w_2x_2 > 0) \\ \end{aligned} \right. \tag{2.2} y={0,(b+w1x1+w2x20)1,(b+w1x1+w2x2>0)(2.2)
b b b:偏置

感知机会计算输入信号和权重的乘积然后加上偏置,结果大于0输出1,否则输出0。

使用权重和偏置实现与门

代码如下:

import numpy as np


def and_gate(x1, x2):
    w = np.array([0.5, 0.5])  # 权重
    b = -0.9  # 偏置
    x = np.array([x1, x2])  # 输入
    r = np.sum(x * w) + b  # 计算结果
    if r <= 0:  # 判定结果
        return 0
    else:
        return 1


print(f"(0, 0)与门结果判定:{and_gate(0, 0)}")
print(f"(1, 0)与门结果判定:{and_gate(1, 0)}")
print(f"(0, 1)与门结果判定:{and_gate(0, 1)}")
print(f"(1, 1)与门结果判定:{and_gate(1, 1)}")
"""
(0, 0)与门结果判定:0
(1, 0)与门结果判定:0
(0, 1)与门结果判定:0
(1, 1)与门结果判定:1
"""

使用权重和偏置实现与非门

代码如下:

import numpy as np


def n_and_gate(x1, x2):
    w = np.array([-0.5, -0.5])  # 权重
    b = 0.9  # 偏置
    x = np.array([x1, x2])  # 输入
    r = np.sum(x * w) + b  # 计算结果
    if r <= 0:  # 判定结果
        return 0
    else:
        return 1


print(f"(0, 0)与非门结果判定:{n_and_gate(0, 0)}")
print(f"(1, 0)与非门结果判定:{n_and_gate(1, 0)}")
print(f"(0, 1)与非门结果判定:{n_and_gate(0, 1)}")
print(f"(1, 1)与非门结果判定:{n_and_gate(1, 1)}")
"""
(0, 0)与非门结果判定:1
(1, 0)与非门结果判定:1
(0, 1)与非门结果判定:1
(1, 1)与非门结果判定:0
"""

使用权重和偏置实现或门

import numpy as np


def or_gate(x1, x2):
    w = np.array([0.5, 0.5])  # 权重
    b = -0.4  # 偏置
    x = np.array([x1, x2])  # 输入
    r = np.sum(x * w) + b  # 计算结果
    if r <= 0:  # 判定
        return 0
    else:
        return 1


print(f"(0, 0)或门结果判定:{or_gate(0, 0)}")
print(f"(1, 0)或门结果判定:{or_gate(1, 0)}")
print(f"(0, 1)或门结果判定:{or_gate(0, 1)}")
print(f"(1, 1)或门结果判定:{or_gate(1, 1)}")
"""
(0, 0)或门结果判定:0
(1, 0)或门结果判定:1
(0, 1)或门结果判定:1
(1, 1)或门结果判定:1
"""

感知机的局限性

单层感知机可以实现与门、与非门和或门,但无法实现异或门 x 1 x_1 x1 x 2 x_2 x2一方为1才会输出 1 1 1)。

异或门真值表如下:

x 1 x_1 x1 x 2 x_2 x2 y y y
0 0 0
1 0 1
0 1 1
1 1 0

或门的权重和偏置设为: ( b , w 1 , w 2 ) = ( − 0.5 , 1.0 , 1.0 ) (b, w_1, w_2) = (-0.5, 1.0, 1.0) (b,w1,w2)=(0.5,1.0,1.0)时,感知机的数学表示如下:
y = { 0 , ( − 0.5 + x 1 + x 2 ≤ 0 ) 1 , ( − 0.5 + x 1 + x 2 > 0 ) (2.3) y=\left\{ \begin{aligned} 0,(-0.5+x_1+x_2 \le 0) \\ 1,(-0.5+x_1+x_2 > 0) \\ \end{aligned} \right. \tag{2.3} y={0,(0.5+x1+x20)1,(0.5+x1+x2>0)(2.3)
深度学习基础--感知机_第2张图片

图片来自:《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

∘ \circ :0

Δ \Delta Δ:1

直线: − 0.5 + x 1 + x 2 = 0 -0.5+x_1+x_2=0 0.5+x1+x2=0

异或门的可视化如图:

深度学习基础--感知机_第3张图片

图片来自:《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

无法用一条直线将0和1划分开

线性和非线性

线性空间:由直线分割而成的空间

非线性空间:由曲线分割而成的空间

深度学习基础--感知机_第4张图片

图片来自:《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

多层感知机

感知机的特性决定它可以叠加层。

已有门电路的组合实现异或门

深度学习基础--感知机_第5张图片
深度学习基础--感知机_第6张图片

图片来自:《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

该组合(异或门)的真值表:

x 1 x_1 x1 x 2 x_2 x2 s 1 s_1 s1 s 2 s_2 s2 y y y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0

通过真值表可以看出结果符合异或门的规则

通过叠加层(加深层),感知机可以进行更加灵活的表示

感知机表示:
深度学习基础--感知机_第7张图片

图片来自:《深度学习入门 : 基于Python的理论与实现 》/ (日) 斋藤康毅著 ; 陆宇杰译. – 北京 : 人民邮电出版社, 2018.7(2019.5重印)

代码实现:

import numpy as np


def and_gate(x1, x2):
    """与门"""
    w = np.array([0.5, 0.5])  # 权重
    b = -0.9  # 偏置
    x = np.array([x1, x2])  # 输入
    r = np.sum(x * w) + b  # 计算结果
    if r <= 0:  # 判定结果
        return 0
    else:
        return 1


def n_and_gate(x1, x2):
    """与非门"""
    w = np.array([-0.5, -0.5])  # 权重
    b = 0.9  # 偏置
    x = np.array([x1, x2])  # 输入
    r = np.sum(x * w) + b  # 计算结果
    if r <= 0:  # 判定结果
        return 0
    else:
        return 1


def or_gate(x1, x2):
    """或门"""
    w = np.array([0.5, 0.5])  # 权重
    b = -0.4  # 偏置
    x = np.array([x1, x2])  # 输入
    r = np.sum(x * w) + b  # 计算结果
    if r <= 0:  # 判定
        return 0
    else:
        return 1


def xor_gate(x1, x2):
    """异或门"""
    s1 = n_and_gate(x1, x2)
    s2 = or_gate(x1, x2)
    y = and_gate(s1, s2)
    return y


print(f"(0, 0)异或门结果判定:{xor_gate(0, 0)}")
print(f"(1, 0)异或门结果判定:{xor_gate(1, 0)}")
print(f"(0, 1)异或门结果判定:{xor_gate(0, 1)}")
print(f"(1, 1)异或门结果判定:{xor_gate(1, 1)}")
"""
(0, 0)异或门结果判定:0
(1, 0)异或门结果判定:1
(0, 1)异或门结果判定:1
(1, 1)异或门结果判定:0
"""

小结

感知机说白了就是一层层的逻辑和计算判断,这种方式的表示方法可以清晰的表示出输入到输出之间的运行逻辑。是神经网络的前置基础知识,通过学习这部分内容联系前面学的吴恩达的深度学习视频,对于视频中的 w x + b wx+b wx+b的计算形式有了更清晰的认识。

你可能感兴趣的:(Python,深度学习,深度学习,python,人工智能)