在我上一篇博客中,我们讨论了人工神经网络的动机是来源于生理。这一篇博文,我们将讨论如何实现人工神经网络。在人工神经网络中,我们使用不同层数的网络来解决问题。使用多少层的网络才能解决一个特定的问题是另一个话题,我很快将为此写一个博客。但是,目前我们仍然可以着手实现网络,并学习如何用它去解决问题。
作为程序员,我们比其他行业的人更了解代码,并且可以很快地学习任何东西。我们甚至可以直接通过代码了解人工神经网络。然而,我认为知道人工神经算法背后的数学原理有助于我们更好地理解这个过程。所以在研究代码之前,我会讨论它的数学原理。下图为一个前馈神经网络。人工神经网络中有几种网络结构,但是我们先从这个开始。
如上图所示,这个神经网络有三层,从左到右分别是:输入层,隐藏层和输出层。在输入层,输入神经单元X1,X2,... Xn。对于处于中间的隐藏层,其输出为Yh1,Yh2,... Yhn。对于输出层,输出为Y1,Y2,Y3。我们把目标输出设为Ŷ1,Ŷ2,...Ŷn。与此同时,我们在不同的神经元之间有不同的权重,并且把把X1到Yh1之间的权重命名为W11; X1到Yh2之间的为W12; X1到Yh3之间为W13,以此类推; 对于输出层神经元,我们也做了类似的工作。这里需要注意的一个重要的事情是,人工神经网络的输入可以是连续值,离散值或向量值。
总而言之,我们有下列的名词。如果你是神经网络的新手,我建议你看一遍这些名词:
现在,我们已经准备好以数学方式实现网络。每个神经元都有一个激活函数,如$f(x)=sigmoid(x)$。激活函数需要一个参数。我们的第一步是计算激活函数的输入。我们通过将权重乘以输入值来做到这一点。公式看起来像这样:
因此隐藏层的输出如下:
接下来隐藏层的输出成为输出层的输入,并乘以输出层的输入权重。因此,乘法就是这样的:
而输出层的最终输出是这样的:
如果您是第一次了解神经网络,您可能不知道Sigmoid函数是什么。下面是它的公式:
我们可以使用不同的激活函数来解决不同的问题。但什么时候选择什么激活函数,又是另一个话题,我们将在另一篇文章中讨论。但是简要地说,Sigmoid函数产生一个S形曲线。当网络的输入是连续可微的时候,我们使用Sigmoid函数,可以很容易地计算它的梯度。
本篇博文到此结束了!如果实现了上面提到的内容,我们的神经网络就准备好了。下一步是训练它。但在详细介绍如何进行训练之前,我们将看一下上述数学原理在Scala中的实现。这内容我们将在下一篇博客中看到。