深度学习基础--感知机

学习资料

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

内容均是从该书中总结

感知机

感知机基本概念

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

图片来自:《深度学习入门 : 基于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
000
100
010
111

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

  • 权重与阈值:

    • 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
001
101
011
110

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

  • 权重与阈值:

    • 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
000
101
011
111
  • 权重和阈值

    • 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
000
101
011
110

或门的权重和偏置设为: ( 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)
在这里插入图片描述

图片来自:《深度学习入门 : 基于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

异或门的可视化如图:

在这里插入图片描述

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

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

线性和非线性

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

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

在这里插入图片描述

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

多层感知机

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

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

在这里插入图片描述
在这里插入图片描述

图片来自:《深度学习入门 : 基于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
00100
10111
01111
11010

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

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

感知机表示:
在这里插入图片描述

图片来自:《深度学习入门 : 基于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的计算形式有了更清晰的认识。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值