从人工智能这个词流行起来以后,神经网络这个词也变得家喻户晓了,很多人想要去学习一下神经网络方面的知识,但看到神经网络深奥的概念以及复杂的公式时,也只能放弃。不要惊慌,这篇文章会由浅入深再加例子的形式帮助你理解前馈神经网络,希望对你有帮助。
为了帮助你更好的理解前馈神经网络,我会分三部分进行讲解:
- 第一部分使用例子帮你建立基础概念
- 第二部分在概念的基础上融合数学
- 第三部分使用数学说明前馈神经网络
一 先从小明说起
小明的面前有五堆文档,每一堆都有1000份,其中的四堆已经按照,英语、法语、德语、意大利语分类好,小明现在要做的事情就是将第五堆未分类的文档进行分类。
小明并没有学习过那么多的语言,所以他现在看到第五堆文档就头大。
小明现在已经没有时间去学习这四种语言了,但是小明想到了一个办法,他先看了一遍已经分好类的四种语言都有哪些特征,例如英语中的哪些字符是其他语言中没有的,意大利语的字母一般都是什么样子的。
当小明学习完了这些语言的特征以后,小明就将左侧未分类的文档一个个的看一遍,当他读取第一篇文档的时候发现了Ä字符时,就会将这篇文档放在德语类别中,当看到文档中有很多的“th”二元字符对的时候,就会将此篇文档放在英语类别中。
就这样小明经过不断的读文档->看特征->按照特征分类,最后他将所有的文档都进行了正确的分类。
但是有意思的是小明还是不懂这几种语言,但是他还是能够正确的进行分类。
二 使用数学解析小明
上面的小明并不懂语言,但是却做到了正确的分类,接下来我们使用数学解析一下这个事情。
小明找到特征
上面的小明并不是直接将未分类的1000分文档进行分类的,他是先学习了一遍已分好类的文档中都有哪些特征,如果使用X代表每一个文档中的二元字符对出现的频率,使用Y代表最终的分类,那么数学公式可以这样表示:
Y英语 = Xaa * Waa英语 + Xab * Wab英语 + Xac * Wac英语 + ...... + Xzz * Wzz英语
Y法语 = Xaa * Waa法语 + Xab * Wab法语 + Xac * Wac法语 + ...... + Xzz * Wzz法语
Y德语 = Xaa * Waa德语 + Xab * Wab德语 + Xac * Wac德语 + ...... + Xzz * Wzz德语
Y意大利语 = Xaa * Waa意大利语 + Xab * Wab意大利语 + Xac * Wac意大利语 + ...... + Xzz * Wzz意大利语
注:W代表权重
对于上面的公式,小明已经知道了X与Y,他学习特征的目的就是获取每种语言最优的权重,也就是学习W。
小明进行分类
当小明在自己的脑子里面学习到了W这个体系以后,他就开始对未分类的文档进行分类了,也就是不断的输入X,最后小明使用上面的公式,输入X和W得到了文档的最终分类。
其中W指的就是我们通俗理解上的模型。小明整个分类的过程就是先使用已知的X与Y求出W,然后再使用已知的X与W求出Y。
对于上面的这种训练模式我们叫做有监督学习。
三 公式下的前馈神经网络
针对于上面文档分类来说,输入就是一些待分类的文档,输出就是文档最终所属的类别,而小明就是作为黑盒存在,现在让我们将这个黑盒打开。
图中就是前馈神经网络的一个示意了,为什么叫前馈呢?这是因为每一个神经元都只与前一层的神经元相连接。
上面的输入层就是我们待分类的文档,输出层就是文档的类别,中间的三个隐藏层就是各种特征的计算。
让我们先拿一个输入神经元与第一层隐藏层中的一个神经元出来:
输入层的每一个神经元都是一个二元字符对的频率,在得到第一个隐藏层时将二元字符对频率乘了一个权重,并且添加了一个偏置项b,公式表示:
NNMLP1(x) = x*W1 + b1
为了我们计算的便捷性,需要在神经网络中使用一些非线性函数处理隐藏层数据,以往经常使用的非线性函数是sigmoid函数,但是研究人员发现在最后结果的表现上,ReLU(修正线性单元)函数是优于sigmoid函数的。
上图就是ReLU函数的图像。
那么上面的公式就会是:
NNMLP1(x) = Re1(x*W1 + b1)
那么最后我们将一层推广到最终结果时:
NNMLP3(x) = P
h1 = Re1(x*W1 + b1)
h2 = Re2(h1*W2 + b2)
h3 = Re3(h2*W3 + b3)
P = h3 * W3
为了方便查看上面的公式我将每一层就单独例举了出来。
在上面的公式中我们可以看到最后的P只是使用h3 * W3,我们将偏置向量强制为0.
最终我们得到的就是一个关于文档分类的概率。
值得注意的是,X输入是一个向量,W是一个向量矩阵,最后得到的P也是一个向量。
总结
上面我们通过小明的例子,解释了一下什么是前馈神经网络,以及其公式的表示,对于神经网络我们可以使用一些已经标记好的数据,训练得到一个合适的模型也就是W,然后我们就可以将这个模型应用在未知的数据中去。
实际上在应用前馈神经网络的时候,我们需要结合自己的诉求来界定隐藏层的层数以及偏置项,而为了防止过拟合情况的发生,我们在训练的时候也会使用正则化或者丢弃法的方式。