1、神经网络的起始——感知机(perceptrons)
说到神经网络,先要讲的当然是 感知机 ,感知机 在上世纪50年代末和60年代初由科学家 Frank Rosenblatt 取得了进展,灵感来自早期由 Warren McCulloch 与 沃尔特·皮兹 的神经研究工作。
如今,越来越多的算法使用人工神经元模型,在许多现代神经网络的研究中,主要的神经网络模型是一种叫做乙状结肠神经元的神经网络模型。接下来很快就会讲到 乙状结肠 神经元。这就是我们 神经网络中的 Sigmoid 激活函数的机理,但要明白 Sigmoid 神经元以什么样的方式定义他们,这就得先了解下 感知器( perceptrons )。
2、感知机-perceptrons
2.1 原理阐述
先简单的构思下,你觉得感知机是如何工作的?感知机需要几个二进制输入, X1,X2,…Xn ,并产生一个二进制输出:
上图所示的
Perceptron
有三个输入,但是实际的输入可能远多于三个或是少与三个。
Rosenblatt
提出了一个简单的规则来计算输出,他首先引入了
weights
(权重)概念,
ω1,ω2,...
。以实数权重
ω
表示输入到输出的重要性,神经元的输出 0 或 1 ,这取决于加权因子(即
weights
) 小于或大于某一阈值。就像权重,阈值为一个实数,是一个神经元的参数。
公式表示为:
(1)
这就是我们熟知的激活函数的最初形态, 0 状态代表抑制, 1 状态代表激活。这简单的数学公式帮助我们了解 perceptrons 是如何工作的。姑且我们把它理解为: 它是一种通过权衡输入信息的重要性来决定你的输出。
2.2 实例理解
举个简单的例子,假设在这个周末,你听说你的城市将有一个摇滚音乐节,你喜欢摇滚,现在想做决定看是否去音乐节。假设你通过权衡三个因素来做出你的决定:
1)当天的天气好吗?
2)你的男朋友或女朋友是否想陪你一起去?
3)到达目的地的交通是否便利。
下面我们把它公式化,我们以相应的二进制变量来表示这三个因素 x1,x2,x3 。假设我们把天气好表示为 x1=1 ,反之 x1=0 。相似地假设,有人陪 x2=1 , 反之 x2=0 ; 交通便利 x3=1 ,反之 x3=0 。
现在,假设:
1、你非常喜欢摇滚音乐,所以即使的男、女朋友不去,你也很可能会去参加这个摇滚音乐节。
2、但也许你真的讨厌的坏天气,如果初先坏天气,你很可能就不去了。
你可以使用感知器模型来做这类决策,这时我们设置权重因子 w1=6,w2=2,w3=2. 对 w1 值越大,表明天气因素对你有更重要的意义,远不如是否有人陪伴或是交通情况。最后,假设你选择一个 阈值为 5 的感知器。有了这些选择,感知机可实现你理想的决策模型,当天气好的时候,输出 1 ; 0 表示天气不好。这时,无论你的男朋友或女朋友是否想去,或是交通情况是否便利,这两项将不再影响你的输出。
通过不同的权重和阈值,我们可以得到不同的决策模型。例如,假设我们选择了一个阈值为 3 。然后,如果天气好,感知器 会判定你应该去参加这个音乐节。亦或是天气不好,但是你的男、女朋友愿意陪你去并且交通便利,感知器 也会判定定你应该去参加这个音乐节。总而言之,权值或是阈值的改变,它将会是一个不同的决策模型。
显然,感知器不是人类的一个完整的决策模型,人的神经网络要复杂得多!但是,例子说明的是一个感知器是如何衡量不同种类的约束条件的重要性,以作出决定。就这方面而言,举例还算是恰当。当然,一个复杂的网络感知器就可以做出非常微妙的决定:
2.3 多层网络
下面是一个多层网络结构:
在这个相对复杂的网络中,通过感知( inputs )我们将综合权衡 3 个感知器(即考虑权重因子的大小),第一层做出三个非常简单的决策。那么关于第二层感知器呢?我们做出的决策是通过权衡感知所做出的决策,这样,在第二层感知器就会在比第一层感知器更复杂、更抽象的层次上作出决定。那么第三层就可能做出更复杂,更加抽象的决策。由此可知,多感知层网络可以从事复杂的决策。
* 这里要提醒的一下的是,可能有些刚接触的神经网络的朋友们,这里的感知器都是单输出。图示网络造成的错觉,感知器看起来有多个输出,事实上,它们仍然是单一输出(下面随手画了下,凑活着看),多输出箭头仅仅是表明从感知器的输出作为其他几个感知器输入的有效途径。又通过赋予不同的权重因子来做出下一层的决策,这样来逐层学习。
2.4 感知规则
接下来简单描述下感知规则: ∑jwjxj> 阈值 (threshold) 我们以多个感知器加权求和的方式与设定的阈值比较做出决策,显然这种方式显得比较繁琐,我们可以这样去简化它。
1)将
∑jwjxj
改写成点积的形式,
w⋅∑jwjxj≡
∑jwjxj
,这里
w
和
x
均为向量,代表着 权重
2)将阈值移动到不等式的另一边,并将其替换为感知器的偏置
b
(神经网中看到的偏置
这里使用的是偏置而不是 threshold ,那么感知规则可以改写为:
* 这里在简单描述下偏置,你可以把这种偏见当作衡量一个感知器到输出
1
的决策的一个衡量指标。对于一个真正的大偏差的感知(这里就有点我们特征工程中的显著特征的意味了),它是非常容易的感知到输出
代码实现:
class Network(object):
def __init__(self, sizes):
self.num_layers = len(sizes)
self.sizes = sizes
self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])]
明天继续!!