引言:
学习神经网络并不是一定要了解人脑神经结构。
如前所属,线性分类器可以用公式s=Wx来表示,其中X表示一张图片,是一个[3072*1]的列向量,包含了一副图像里的所有像素点。W是[10*3072]的参数矩阵。两个矩阵相乘的结果是一个[10*1]的列向量,表示了这幅图在分类时,每个类别的得分。
对线性分类器进行改进, s=W2max(0,W1x),其中W1选择[100*3072]的矩阵,max是非线性计算,可以滤除所有的负数结果。W2是一个[10*100]的矩阵,进过相乘,最终得到的仍旧是一个[10*1]的列向量,即每个分类的得分。在改进的算法中非线性运算是关键,若舍弃,W1和W2直接相乘后,判别函数将回归线性函数。W1和W2可以通过SGD(stochastic gradient descent)算法优化取得。这个改进的算法就是一个最简单的二层神经网络。
再进一步改进,最简单的三层神经网络可以用公式s=W3max(0,W2max(0,W1x))来表示。W1,W2,W3矩阵中的所有参数都可以通过学习获得。
神经建模
最早神经网络领域研究的是如何对神经网络的生理结构进行模拟。如今,神经网络是机器学习中的研究热点。我们仍旧从最简单的生理神经网络机制入手,来了解神经网络。
生理刺激与连接
大脑的最基本计算单元是神经细胞,人脑包含860亿神经细胞。这些细胞通过约10^14 - 10^15 个突触相连接。生理神经和神经工作机制如下图所示:
每一个神经细胞通过多个树突( dendrites )获取输入,进过计算将结果通过轴突(axon)输出。轴突连接着另一个神经细胞的树突。将计算结果传递给另一个神经细胞。如图左所示。
图右是对神经生理结果的建模。每一个树突的输入用WiXi(i=0,1,2,3...)表示。神经细胞将每个树突的输入相加,并加上修正项b。将结果带入激活函数f,激活函数的结果表示了与输出端相连的另一个神经细胞的树突被激活的发生率。sigmoid是常用的激活函数,其输出在0-1之间。
神经建模代码如下:
class Neuron(object):
# ...
def forward(inputs):
""" assume inputs and weights are 1-D numpy arrays and bias is a number """
cell_body_sum = np.sum(inputs * self.weights) + self.bias
firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid activation function
return firing_rae
换句话说,每一个神经用输入和自身的参数W做内积再加上偏置量b,最后将结果带入激活函数给出神经计算的输出结果。