简单又复杂的人工神经网络

    最近正在看吴军博士的一本书《数学之美》,受到了很多启发,恶补了几天线性代数和高等数学,趁着自己思路清晰,把自己对人工神经网络的想法记录下来,顺便推导一下公式。

    一场人工智能狂潮正在悄悄的到来,也许要不了多久,各种智能产品将会环绕再我们的周围,坐在智能汽车里,告诉它要去的地方,自动驾驶技术就可以把你带到目的地,电视机也有智能芯片,它能懂你的爱好和习惯,自动播放你想要看的节目,诸如此类的场景,正在慢慢的到来。促使这场革命的恰恰是深度学习的发展和计算机硬件水平的提升。

    深度学习本质上就是多层人工神经网络,废话不多说,我们来看看人工神经网络。

   “人工神经网络”这个名字充满了科技感,那么它是用来做什么的呢?定义出这样一个网络是为了解决什么问题?其实它就是来解决分类问题的。人每天都在做分类问题,如红绿灯路口,走还是不走;今天下雨了,上班是骑车还是坐公交;晚上是吃火锅还是吃面条……这样一看,分类问题构成了我们日常生活的全部。计算机学会做分类问题,就能拥有一些智能了。

    看下面一张图片,我随便手写了几个数字。

     简单又复杂的人工神经网络_第1张图片

    人识别这些数字一眼看过去就知道了,计算机怎么识别这些数字呢?把每个数字的图切块,转化为一个个N维向量,可以看做是N维空间中的点,这些点就散落在其中。我们用三维空间来模拟一下:

     简单又复杂的人工神经网络_第2张图片

       我们在需要在这个立方体上画出一个特殊的“分界线”就能区分这些数字了,为了说明这个问题,我们简化一下,区分两个数字0和1,这时候就说到神经网络了,神经网络本质上是一个带权重的有向图。我们来怎么解决这个问题。

    简单又复杂的人工神经网络_第3张图片

    假设图片0被向量化成二维向量,用(x1,x2)表示,我们用AC、AD、BC、BD、CE、CF、DE、DF表示连接节点间的权重。

    加权计算之后:

    C点的值Yc=x1*AC+x2*BC

    D点的值Yd=x1*AD+x2*BD

    E的值Ye=Yc*CE+Yd*DE

    F的值Yf=Yc*CF+Yd*DF

    如果Ye和0的误差比Yf和1的误差小,那么图片就被识别为了0,识别正确,实际上,不可能权重不可能一次就准确,那么这时候就需要误差反向传播,来调整权重了。

    在调整权重之前,我们还是看看上面的权重计算都是线性的,在空间中画的分界线都是线性的,那么要分类复杂的模型,我们需要非线性的运算,这时候我们需要激活函数了。常用的激活函数有sigmoid 和tanh

    1、sigmoid :

 

    2、tanh

    

  加上了激活函数后,E、F的输出值分别就变成了:

    Ye=f[ f(Yc)*CE+f(Yd)*DE]

    Yf=f[ f(Yc)*CF+f(Yd)*DF]

    Ye和0、Yf和1需要有计算误差的方法,我们定义它损失函数,通常用平方差函数作为损失函数,平方差函数如下:

    

    公式中a表示Ye或者Yf,y表示0或者1

    好了,现在我们知道计算值Ye、Yf和目标值0、1之间的误差了,我们怎么能最快减小这个误差呢?这个误差我们可以想象成山脚到山顶的距离,我们走上山顶需要一个步长,这个步长可以起个名字,叫学习速率,learning rate。

    那么问题来了,怎么快速走到山顶,用梯度下降法,走最陡的地方。怎么找最陡的地方,把山当成一个曲面,求曲率最大的点。

    接下来,求出几个偏导数,就找到了曲率了。

    误差C对CE求偏导数,我们记为:

     

    那么C点和E点的权重应该更新为:

 

    类推:C对CF、C对DE、C对DF、C对AC、C对AD、C对BC、C对BD求偏导数,就可以更新所有权重了,这里会有复合函数,那么需要用到链式法则了。

    好了,这就是整个BP神经网络的构建和训练过程,有足够的训练数据,就可以训练一个可以分类的神经网络了,语音识别、图像识别、自然语言处理中的文本分类等等都是这个原理。

 

快乐源于分享。

   此博客乃作者原创, 转载请注明出处

你可能感兴趣的:(简单又复杂的人工神经网络)