前言
上一次更新博客还是在去年。过去大半年时间因为换工作、适应新的国家的生活,不像在北京那会儿,有那么多成块(无聊)的时间学习了。新的同事很多博士,清华毕业生如云,好在加入这家公司之前我已经对学历祛魅了。唯一感到失望的是,我发现这些大牛竟不是因为聪明而牛逼,而是因为比我更努力或者说是更卷… (我只想背着手摇头)
因为工作需要,我要开始认真学深度学习了。想想做算法工作真是不容易,本来运筹出身,工作后一会儿要学机器学习,一会儿要学强化学习,一会儿要学因果推断,现在又要学深度了,真是累死我了~哭唧唧~
算了,撸起袖子慢慢学吧。深度学习之前看过一两本书,但是由于没怎么实践所以忘了,这次为了学的更牢靠一点,打算看书+写博客做笔记+实践一起,扎实点走一遍。
什么是感知机
感知机本质上是一种基础的二分类模型,接受多个信号,输出一个信号。下图是一个接收两个输入信号的感知机:
x 1 x_1 x1和 x 2 x_2 x2是输入信号, y y y是输出信号, w 1 w_1 w1和 w 2 w_2 w2是权重(控制信号流动的难以成都),图中的圆圈⭕️被称为「神经元」或「节点」。输入的信号被传往神经元时,会分别乘以权重 ( w 1 x 1 , w 2 x 2 ) (w_1x_1,w_2x_2) (w1x1,w2x2),只有当这个总和超过某一界限值时,才会输出1。这也成为「神经元被激活」,这里将该界限值称为阈值,计为 θ \theta θ。
用数学式表示则为:
简单逻辑电路:与门、与非门、或非
- 与门(AND GATE):输入都为1,则返回1,否则返回0;
- 与非门(NAND GATE):NOT AND GATE,颠倒了与门的输出,输入都为1时,返回0,否则返回1;
- 或门(OR GATE):输入只要有一个为1,则返回1,否则返回0;
- 异或门:仅当输入中只有1个为1时,返回1,否则返回0;
举一个两个输入的与门的例子:
如果用感知机来描述与门,则可以让
(
w
1
,
w
2
,
θ
)
=
(
1
,
1
,
0.8
)
(w_1, w_2, \theta) = (1, 1, 0.8)
(w1,w2,θ)=(1,1,0.8),这样的参数可以有很多。
感知机的实现和局限
用代码实现上面与门、非与门和或门:
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 1
else:
return 0
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 1
else:
return 0
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.4
tmp = np.sum(w*x) + b
if tmp > 0:
return 1
else:
return 0
注意,为了衔接后面的学习,上面代码里用 b b b代替了 θ \theta θ,这里我们可以称 b b b为偏置。偏置控制信号被激活的难以程度,权重控制输入信号的重要程度。
多层感知机
上面我们通过调整权重和偏置,轻松实现了与门、非与门和或门。但是仔细思考一下会发现,无法实现异或门。下图可以帮助直观的理解原因:无法通过一条直线分割三角形和圆形。
如果不用直线,是可以实现的:
这也引申出感知机的局限性,它只能表示由一条直线分割的空间。好消息是感知机可以通过「叠加」,解决这个局限性!
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
用表格表示该过程如下:
用感知机的图表示如下:
备注:有的书籍会通过「拥有权重的层数」来定义感知机的层数,所以上面的感知机也可能被称为两层。
可以看到,通过叠加感知机,可以表示单层感知机无法表示的东西(非线性),即加深层能使得感知机进行更灵活的表达。已经有研究证明,两层感知机(严格的说是激活函数使用了sigmoid函数的感知机)可以表示任意函数。
def sigmoid(x):
return 1 / (1 + np.exp(-x))
参考资料
[1] 斋藤康毅. (2018). 深度学习入门:基于Python的理论与实践. 人民邮电出版社.