深度学习|感知机:神经网络之始
引言
了解计算机组成原理的我们都知道,计算机处理的所有复杂任务和计算,实际都可以通过简单的与非门叠加实现。而从上文中,我们知道了神经网络是可以通过叠加层的方式来叠加各类计算逻辑的。
那么只要我们能够通过简单网络实现基础的与或非
逻辑运算,是否就可以通过叠加层的方式,将神经网络的表达能力扩展到可以表达计算机的所有复杂运算呢?
答案是肯定的!我们从感知机
来展开说明。
基本概念
感知机
(准确的说是单层感知机)是由两层神经元组成的最简单的神经网络模型,输入层接收外界输入信号,输出层是 M-P 神经元。
是输入信号,y 是输出信号, 是权重。感知机的信号只有 1/0 两种取值,0 表示不传递信号,1 表示传递信号。
输入层:接收特征向量,如 ,每个输入特征对应一个感知机的输入。
权重:每个输入特征都有一个相应的表示该特征对输出的影响的权重(weight),如 。
输入信号被送往神经元时,会被分别乘以固定的权重 ,神经元会计算传入信号的总和,只有当这个总和超过某个阈值
(),才会输出 1,也就是这个神经元被激活。
数学表示
感知机 计算逻辑的直观表示为数学式 1:
用偏置项 b 表示阈值
,其中 b=-,感知机的计算逻辑可以表示为式 2:
偏置:为了使模型更加灵活,感知机还包含一个偏置(bias)项 b,帮助调整分类边界。
更一般的,我们将式 2 拆分为激活函数
的表示方式:
激活函数:用于处理加权和从而得到输出的函数。感知机常用的激活函数是阶跃函数(Step Function),其输出为 0 或 1,表示分类结果。
引入一个中间变量(加权和 a),将式 2 重写为:
加权求和:求输入特征的加权和,其中 是 的权重, 是偏置。
式 5 中输入信号的总和会被式 3 定义的激活函数 转换为最终输出,最终得到式 6:
逻辑运算
了解了感知机的计算逻辑,就可以尝试使用感知机进行几个计算机处理器的最基本逻辑运算:与、或、非、异或。
与、与非、或
与门
(AND Gate
)、与非门
(NAND Gate
)、或门
(OR Gate
)的真值表:
AND Gate | NAND Gate | OR Gate | ||
---|---|---|---|---|
0 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 |
以 AND Gate
为例,使用感知机实现 AND Gate 实际就是在式 5 中找到一组 参数,使得 为 (0, 0)、(0, 1)、(1, 0) 时输出 0, 为 (1, 1) 时输出 1。
若用 表示横轴, 表示纵轴,○ 表示 y=0,△ 表示 y=1。要找到合适的 参数,就相当于找到一条直线,用这条直线可以将 ○ 和 △ 完全分隔开。如图 2 所示, 这条直线就能很好的满足条件。
将 = (0.5, 0.5, -0.7) 代入式 5,可得式 6:
如式 6 所示,令感知机的权重参数 = (0.5, 0.5, -0.7) ,就能让 AND Gate 的 4 组 输入对应的输出 y 全部正确。
AND 运算过程的代码实现如下:
def AND(x1, x2):
"""
感知机 AND Gate 计算逻辑
"""
x = np.array([x1, x2]).T
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.dot(x, w) + b # 等效于 x1 * w1 + x2 * w2 + b
return np.where(tmp <= 0, 0, 1)
print('