感知机
感知机接受多个输入信号,输出一个信号。感知机只有“流/不流”(0/1)两种取值,“0”表示不传递信号,"1"表示传递信号。
x1,x2是输入信号,y是输出信号,w1,w2表示权重,图中的⭕表示神经元。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这个称为“神经元被激活”。
y
=
{
0
,
w1x1+w2x2≤0
1
,
w1x1+w2x2>0
y= \begin{cases} 0, & \text {w1x1+w2x2≤0} \\ 1, & \text{w1x1+w2x2>0} \end{cases}
y={0,1,w1x1+w2x2≤0w1x1+w2x2>0
权重越大,对应的该权重的信号越重要。
简单逻辑电路
与门(AND gate)
与门仅在两个输入均为1时输入1,其他时候则输出0;真值表如下:
x1 | x2 | y |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
实际上,满足上述表的参数的选择方法有无数多个。比如,当(w1,w2,θ)=(0.5,0.5,0.5)时,满足与门的条件;设定这样的参数后,仅当x1和x2同时为1时,信号的加权总和才会超过给定的阈值θ。
简单实现:
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
AND(1,1)#输出1
AND(1,0)#输出0
AND(0,1)#输出0
AND(0,0)#输出0
使用权重和偏置的实现
import numpy as np
def AND(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
elif tmp >0:
return 1
AND(1,1)#输出1
AND(1,0)#输出0
AND(0,1)#输出0
AND(0,0)#输出0
与非门(MAND gate)
仅当x1和x2同时为1时输出0,其他时候输出1;真值表如下:
x1 | x2 | y |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 1 |
表示与非门,可以用(w1,w2,θ)=(-0.5,-0.5,-0.7)这样的组合,实际上就是实现与门的参数值的符号取反,可以实现与非门。
使用权重和偏置实现:
import numpy as np
def NAND(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
elif tmp >0:
return 1
NAND(1,1)#输出0
NAND(1,0)#输出0
NAND(0,1)#输出0
NAND(0,0)#输出1
或门(OR gate)
只要一个输入信号是1,输出就为1。真值表如下:
x1 | x2 | y |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
表示或门,可以用(w1,w2,θ)=(0.5,0.5,-0.2)这样的组合。
使用权重和偏置实现:
import numpy as np
def OR(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
elif tmp >0:
return 1
OR(1,1)#输出1
OR(0,1)#输出1
OR(1,0)#输出1
OR(0,0)#输出1
异或门(XOR gate)
仅当x1或x2中的一方为1时,才会输出1
x1 | x2 | y |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
多层感知机实现:
def XOR(x1,x2):
s1 = NAND(x1,x2)#与非门
s2 = OR(x1,x2)#或门
y = AND(s1,s2)#与门
return y