人工智能起步-反向回馈神经网路算法(BP算法)
人工智能分为强人工,弱人工。
弱人工智能就包括我们常用的语音识别,图像识别等,或者为了某一个固定目标实现的人工算法,如:下围棋,游戏的AI,聊天机器人,阿尔法狗等。
强人工智能目前只是一个幻想,就是自主意识,具有自我成长、创造力的AI。如妇联2里的奥创,各种电影都有这个概念了。
我希望不久的将来能目睹这一奇迹。
不积跬步无以至千里。
先从基础讲起。
目前比较先进的算法理论据我所知应该分成3大类
1,神经网络
2,遗传算法
3,隐马尔柯夫链
这篇的主题是神经网路,其他两种我以后可能会写出来(可能!)。
2018-03-09 修正 这2年一下这几种算法的发展规模更大了。
1,深度神经网络
2,生成对抗网络
3,深度强化学习
4,迁移学习
5,循环神经网络
神经元生物原理
百多年前脑部的生物构造被研究出来之后,有大牛就想象可以通过模拟神经系统造人。然后研究出各类神经网络算法。所以先讲这部分内容,之后理解BP算法会更带感。
神经元是神经网络的基本单位,先贴一张图。
可以看到神经元的主要构造分为3个部分 N个树突+细胞体 +突触
神经元之间的连接是就是树突连接(另一个神经元)的突触。这种首尾相连的结构,N个树突可以连接N个神经元。
信号的传输方式是由N个神经元通过树突传递神经递质,递质上附加了生物电,当生物电累加到一定阙值时就会激发突触发送信号出去。
基本逻辑就是这样。下面我们看看人类的脑洞。
BP算法原理
BP算法由输入层→隐层→输出层构成。
输入输出层:这里可以看到这层可以有多个入口,也可以只有1个入口。
比如要做一个根据每期福利彩票的结果预测下期的结果。
那么输入层就应该上一期的结果(N个数字)。输出层就是这期(N个数字)。
隐层:隐层可以有N个节点或者N个层次。
正向过程:
输入层分别累加到隐层的各个节点
假设 输入是x 隐层节点是s
那么
s1 = x1+x2+x3+x4+……
s2 = x1+x2+x3+x4+……
s3 = x1+x2+x3+x4+……
然后为了可以动态调整各个节点加入的权值w1 w2 w3……
就变成
s1 = w1*x1+w2*x2+w3*x3+w4*x4+……
s2 = w1*x1+w2*x2+w3*x3+w4*x4+……
s3 = w1*x1+w2*x2+w3*x3+w4*x4+……
顺便加一个偏移值b 数学公式就成了:
Sj 还要经过传递函数 f() 算出 隐层节点的值
f()传递函数对应的过程就是:
神经元累加生物电到达一定程度时触发放电。如果没到达阙值这些累积的生物电就打水漂了。
举个例子来说
常用的一种激励函数是sigmoid 函数图如下
公式 f= 1/(1+e^-x)
这个S型函数的意义只要达到某一阙值 函数就会输出1 就算超出阙值也不会影响输出值。
这里原先是我理解错了,BP算法加入sigmod函数主要的意义在于加入非线性函数来解决非线性问题。
选sigmod的好处在于 求导方便 sigmod的导数= 1 - f
反向回馈的时候需要计算导数
隐层到输出层的过程也是一样的。
不过BP算法的重点在于反向回馈。
反向:
正向传输结束之后我们能够拿到一次结果。
这个结果就可以跟预期值做比较,一般计算方差E。
那么这个误差就可以反向的传递给上一层,用来调整上层节点的权值 w 。这个过程反复执行直到方差E小于期望的最小误差。(因为现实是不可能达到0误差,所以如果不设置最小期望误差则程序结束不了。)
至于具体的权值调整的公式有完整的推导过程,过于复杂这里不讨论。
核心的概念就是通过计算整体方差E对权值变量Wj 的偏微分得出 当前权值应该增加还是应该减少,上式很像n的那个字母就是指学习率。就是这里一次要调整权值时用的基本单位。
偏微分科普:
比如 一个公式有N个变量 y = aX +bY+cZ; 这里 XYZ是变量。abc是常量。
偏微分就是求单一变量的变化对y值的影响,其他变量在此被当作常量来求导。
那么y在这里求x的偏微分,就应该是 =a ; (bY+CZ)被当作常量。
小结:
那么一次正向反馈+一次反向调整权值使得全局误差减少,做多几次直到全局误差符合期望的最小误差。这就是一次训练完成。
多次训练需要提供不同的输入值。
再拿上面的例子说:
就是我拿第1期的开奖结果作为输入值,第2期的开奖结果作为预期值计算误差,这就是一次完整的训练。
第二次训练就是拿第2期作为输入值,第3期作为预期值。
以此类推直到没有新的训练样本。训练完成的神经网络就可以用来预测往后的任何一期的开奖结果。
(当然由于福利彩票是完全随机没有规律的,所以其实预测结果很糟糕。)
BP算法理论上能够逼近所有线性函数。
通俗点讲,BP算法能够在你拥有足够的历史数据而又不知道其中规律的情况训练出能够预测结果的算法。
但是必须这个要做的事情是有规律的(只是你不知道或者太过复杂),而且你的训练集必须包含所有“有效因子”。
有效因子这个词是我造的了。比如说你的历史数据里有50%是会影响结果的,有另外50%跟结果一毛钱关系都没有。这是神经算法允许的。
但是如果这50%的数据里没有包含所有导向结果的所有因素,那么结果就会差别很大。
假设说福利彩票(又来了) 有一个因素是空气质量(假设!),比如没雾霾的情况下出现某个数字的概率很高。
然而你的训练集中没有加入这个因素,那么结果就非常不准确了。
目前存在的问题
目前BP算法有两个明显问题:
1. 容易陷入局部最小值
比如下图:
明显有个更深的坑,结果探索过程中掉进次深的坑了。
整个BP算法就类似求解这个函数的最小值。
但是我们看到这个函数有2个最小值,实际的情况是可能有非常多个极小值。
当我们从右到左调整权值时会到达第一个低谷。然后继续调整权值后发现误差值变大了,算法就误以为找到了最小值解。然而却没有拿到全局的最优解。
这就是所谓的陷入局部最小值。
2.过拟合问题
过度的符合训练集。就像刚才我举例说有50%的训练数据是无关结果的。所以算法最佳的结果其实是忽略掉这50%无用训练集。但是问题在于我们不知道规律是什么,不知道那些训练集是有效因子(知道了就不会搞出来一个BP算法了)。
所以过度的符合训练集也是错误的。
PS:BP算法数学的推导过程我这里有一个PDF。
这里是下载地址:点击下载PDF
这个算法在人工智能领域还是算入门了,升级版还有卷积算法。
涉及的数学概念非常多,尤其是统计学方面。
附上BP算法相关内容的思维导图
转载请注明出处