《深度学习入门 : 基于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 |
---|---|---|
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+w2x2≤0)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+x2≤0)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 |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
通过真值表可以看出结果符合异或门的规则
通过叠加层(加深层),感知机可以进行更加灵活的表示
图片来自:《深度学习入门 : 基于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的计算形式有了更清晰的认识。