入坑AI的时候就是看的这本书,当时比较粗略地看到了第六章,没有记笔记,现在来重温一下,力求建立自己的知识体系
本chap学习感知机(perceptron)这一算法并利用感知机解决一些简单的问题。感知机是由美国学者Frank Rosenblatt在1957年提出来的。
严格地讲,本章中所说的感知机应该称为“人工神经元”或“朴素感知机”,但是因为很多基本的处 理都是共通的,所以这里就简单地称为“感知机”。
既然是再次看这本书,就尝试自己总结和概况
把前面的式子变一变,这里把−θ命名为偏置b,偏置的值决定了神经元被激活的容易程度。
w1和w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。
比如,若b为 −0.1,则只要输入信号的加权总和超过0.1,神经元就会被激活。但是如果b 为−20.0,则输入信号的加权总和必须超过20.0,神经元才会被激活。
哈哈 在数电里面学过了这些gates,那这里就记录一些英文表达
我们尝试找一个能实现与门功能的感知机,与门的输入输出我们知道了,那就是要找剩下的几个参数,两个权重和一个阈值
书上给的这个例子 0.5,0.5,0.7
tmp那里是把前面的数学公式右边减到左边来了,当且仅当x1=1,x2=1时,0.5x1+0.5x1>0.7
# coding: utf-8
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
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
(0, 0)->0
(1, 0)->0
(0, 1)->0
(1, 1)->1
有无数组参数都可以做到,比如
w = np.array([0.6, 0.5])
b = -0.95
回忆一下数电,输入的0表示低电平,1表示高电平,输出也是两种情况,低电平or高电平
NAND ,即Not AND
与非门就是颠倒了与门的输出
要表示与非门,可以用(w1, w2, θ) = (−0.5, −0.5, −0.7) 这样的组合(其 他的组合也是无限存在的)。实际上,只要把实现与门的参数值的符号取反, 就可以实现与非门
代码实现
# coding: utf-8
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
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
我们来思考一下参数, 根据或或门的特点,w1和w2都要比θ大,然后θ>=0即可
也就是 0<=θ< min[w1,w2]
θ=-b(代码里面)
code
# coding: utf-8
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
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
哈哈哈我记得大一学C语言的时候,异或和同或总是傻傻分不清
前面的感知机能否实现这个异或门呢
之前在凑前几个参数的具体值的时候,我是将00,y ;01,y;10,y;11,y四种情况代入进去分析的
再来看看书上是如何分析的
将或门的动作形象化。或门的情况下,当权重参数 (b, w1, w2) = (−0.5, 1.0, 1.0)时可满足真值表
感知机会生成由直线−0.5 + x1 + x2 = 0分割开的两个空 间。其中一个空间输出1,另一个空间输出0
换成异或门还能找条直线来分开吗?
其实和我前面推导的式子来理解也一样,直线的斜率一会儿大于0,一会儿小于0,分不开的
书上给了这种做法
(与非)和(或)再与
code
# coding: utf-8
from and_gate import AND
from or_gate import OR
from nand_gate import NAND
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
与非门可以使用感知机实现。也就是说,如果通过组合与非门可以实现计算机的话,那么通过组合感知机也可以表示计算机(感知机的组合可以通过叠加了多层的单层感知机来表示)。
感知机通过叠 加层能够进行非线性的表示,理论上还可以表示计算机进行的处理
感知机是神经网路的基础