实现代码:
理论
感知机
从广义上来说,感知机可以是一种可以接受信息的模型,我们的神经系统就可以接受信息,比如你看到了美女,眼睛就很难移开,所以我们的神经系统就是一个典型的感知机,这个概念也是由此而来。
同样的,机器学习模型可以接受数据,并形成动作和输出,所以我们的机器学习模型,同样也是一个感知机。
由来
在生物领域对人体感知的探索中,需要回答三个问题:
- 神经系统是以怎样的方式接受到外界信息的。
- 信息是以怎样的形式存储的/被记忆的
- 已经存储的信息是怎样对我们的认知和行为产生影响的。
输入模拟
我们的人体反应就是大家熟知的,通过皮肤美妙的触感,以及其他感官得到信息。
对于一个机器学习模型来说,信息如何获取呢?其实和人体的神经元很类似。(当然,这中观点只是学派之一,但是现在成为主流)
我们的神经元中有突触,其中一个是用来接受刺激的,如果刺激达到阈值,就让神经元做出反应,反之则没有反应。就像看到长得一般的没兴趣看,看到长得漂亮的,生理上就无法将眼睛移动开来。
对于机器学习中的神经元,也是类似。
假设输入层就是外界信息,我们在第一个隐藏层之前加入一个激活函数,以ReLU为例,它长下面这样。如果输入的刺激(值)达到了阈值之后,输入的刺激(值)越大,给出的反应就越大,如果没有达到阈值,就不反应。而这种阈值的设定,是可以人为的,这就是各种激活函数的用处。
这样就模仿了输入的地方。我们也就回答了第一个问题。
记忆模拟
从感知机的时代来看,这个问题只是提出了一种很有前瞻性的假设,信息是通过神经元之间的连接来存储的。我们现在的LSTM机器之后的系列网络比较好的模拟了这个过程。
但是我们知道了一点,就是需要将各个神经元之间关联起来才有用。于是网络的各种稀奇古怪的连接就有了模拟对象。
行为模拟
按理来说,每个神经元都应该有自己的动作。并且按照生物学中的神经系统的理论,不同层的神经元还负责着不同程度的信息抽象。
OK,我们需要让每个神经元都有一个动作。并且每一层的神经元做的事情应该类似,那我们就来模拟一下吧。
输入我们建模为数据:X(多维)
记忆就是需要神经元之间建立连接:我们再看下面这个图,就是在每个箭头上都要给一个权值。如果隐藏层设为H,那么在不考虑激活函数的情况下,就应该是这么个玩意:
X
W
=
H
XW = H
XW=H
如果将激活函数考虑进去的,就是这样:
a
c
t
i
v
e
(
X
)
W
=
H
active(X)W = H
active(X)W=H
如果将每个神经元的行为考虑进去之后,那么H到下一层就可以建模为:
h
i
=
Σ
k
=
1
4
(
x
k
w
k
i
+
b
i
)
h_i = \Sigma_{k=1}^{4}(x_kw_{ki} + b_i )\\
hi=Σk=14(xkwki+bi)
a
c
t
i
v
e
(
H
)
W
‘
=
o
u
t
p
u
t
active(H)W^{`} = output
active(H)W‘=output
其中,
h
h
h是H中的元素,x是X中的元素,w是W中的元素.
所以,我们现在就知道感知机了,也知道激活函数就是为了模拟信息刺激的阈值,偏置b就是为了模拟神经元自身的作用,w就是为了模拟神经元之间的连接.
具体的细节,可以参看代码(文最上部分)
敬请批评指正.