最近因为论文需要,研究了下神经网络,重点看了BP网络。
学习过程中,我不得不感叹造物主的神奇和人类智慧的魅力,同时我也产生了一些想法想写出来跟大家交流。
大家在刚开始学习神经网络的时候可能会比较难理解这种算法原理,我也不例外,但好在还有点高数和数值分析的功底,在拜读了好几篇大牛的文章后,勉勉强强对BP网络有了个大概的认识。
我写这篇博文的目的主要是想让更多的神经网络初学者能加深自己对神经网络的理解,对神经网络有个宏观整体的认识。
大家都知道学习算法应该是“知其然并知其所以然”,只有这样才能真正领悟算法的思想。网上关于BP网络的资料有很多,大多都是从数学的角度给大家介绍BP网络的结构、算法步骤以及为什么这么做。从数学的角度好处是逻辑清晰,思维严谨,可以证明算法的每一步都是正确的,而且还有利于编程,但是从数学角度理解算法,往往是晦涩难懂的,一个个复杂的公式摆在人眼前,想不晕都难,而且不利于大家理解这些公式背后到底代表什么样的意义。
于是我想是否可以举个日常生活中的例子,从这个例子中的现象来解释下神经网络这么做的意义?
答案是肯定的毋庸置疑,毕竟我们讲的神经网络是“人工”造出来的,它们不是人类的创举,人类通过自己的智慧发现了自然神经网络背后蕴藏的数学奥秘并加以应用(可以说是“仿生学”)。
这里强调下:因为我重点学习了BP网络,所以下面的例子都是围绕BP网络展开讲的。下面讲的例子不涉及复杂的公式,也不涉及神经网络算法的具体步骤,只谈谈神经网络在这个例子中的表现。因为不是用严谨的数学去表述,只是通俗化的理解再加上我文笔太菜,所以在表述上可能会不精确,大家关键理解其中的意思(如果你觉得有更好的表述可以在下方评论)。
我举地例子是小孩学习乘法表。为什么举这个例子呢?
因为比较有代表性咯,小孩子的大脑尚在发育阶段,其中的神经网络可以看做是未训练过的。而且大家也都是过来人,比较熟悉。
下面开始说:
如果我现在问你7乘8等于多少,你肯定脱口而出56,但是你还记得小时候背乘法表时候的痛苦吗(如果你忘了,可以去网上看看那些小萌娃被乘法表折磨的视频,太可爱了)。
现在假设输入样本是“乘数+被乘数”,一个是7,一个是8,人脑看成 一个简单的BP网络,输出的积是56,即:
(7,8)→大脑(BP)→56
再介绍下例子的主人公:小明和小明的母亲。
小明拿到乘法表,当看到“7x8=56”的时候,在心里默念“7 8 56...7 8 56”,这个阶段在小明大脑中发生的对应过程我们可以理解为是BP网络训练的第一步:前向传播。这个过程主要是为了让小明大脑对“7x8”有个印象,当小明再次看到“7x8”的时候能做出一个不会偏离太远的应答,至于这个应答是否正确是后面考虑的事(这其实很好理解,如果你从来没有接触过乘法表,当问起你“7x8=?”的时候,你会是什么反应,“=1?,=2?还是=一朵花?”,你的答案可能会偏出正确答案很多,但如果你背过“7x8=56”,即使现在不记得正确答案了,你可能就在56附近纠结,是55还是57)。
小明花了半天时间,硬着头皮记住了乘法表。开心地找他妈妈汇报说:“妈妈,乘法表我记住了,可以出去玩了吗?”(真是个贪玩的小孩)小明的母亲听小明说记住了乘法表,所以想考考小明,说:“我提的问题你都答对了,就可以出去玩了”,小明点点头,他母亲就开始问,前面几个问题小明都答对了,当被问到“7x8=?”时候,小明脑海中浮现的数字开始模糊,只记得答案是“5”开头的数字,但是具体多少就是想不出来,于是他蒙了个数字,“54?”,母亲摇摇头。
注意:如果此时母亲对小明给出的答案不做任何反应,小明是无法知道自己的答案是否正确的。母亲的反应实质是对小明给出的54的一种反馈,这种反馈目的是为了使小明意识到自己的错误。同理当我们使用BP网络前向训练完一组样本时候,我们要看网络的输出值是否符合我们的要求,什么是符合要求的?就要拿预期输出值与实际输出值进行比较,相等自然最好,但是现实往往只需要满足一定精度就可以了。再看这个例子,小明母亲对小明给的答案的反馈只是摇摇头,这种反馈传达给小明的信息只是“自己给出的答案错了”,但是没有传达给小明任何关于“如何修改自己答案”的信息,小明就会纠结“我给出的54是大了还是小了,我应该怎么修改”。反馈是有方向的,好的反馈还是坏的反馈?生物中也有正反馈和负反馈,反馈的信息量越大,网络的修正就能更迅速。BP网络第二阶段:反向传播。第一阶段:前向传播是为了输出一个实际值,第二阶段:反向传播通过实际值与预期值的残差(就是一种反馈,如果研究过这个残差公式,会发现残差是有正负之分的,也就是反馈有正负之分)来修正网络,使得再次输入“7x8”时候能得到更接近56的答案。实际值与预期值的残差在反向传播过程中会按照对应的权重先传递给隐藏层再传给输入层,这其实也好理解,电视上犯罪团伙判刑看到过吧,这么多人一起造成的犯罪事实,最后量刑程度是不同的,你会发现参与犯罪的程度越深,造成的影响越恶劣的主犯判刑往往更重,这里的参与度就好比BP网络的权重,简单点说就是,你造的孽越多,你的责任就越大。BP网络的误差反向传播就是这个原理。
在反向传播修正网络的过程中还涉及一个学习率或者步长的问题。说回小明背乘法表的例子,如果母亲反馈说54低了,那小明就会往比54大的答案答(反向传播为的就是这个效果,使误差尽量的小)。这时候就有一个问题,小明是该从54一个数一个数的往上加,还是56、58..的答法,这就是“步长”的问题了(说明下,在BP网络中,学习率或者步长是在更新权重和偏置的时候才会用上的参数,而我在这里说的“步长”其实是BP网络中权值或者偏置更新对最后网络输出结果的影响)。“学习率”或者“步长”选的好,小明就会越快得出正确值。他如果选“步长”为1,那就要修正两次;如果是选“步长”为2只要修正一次就得到正确答案了。越是复杂的神经网络,训练起来就越慢,所以参数的选择很重要,当然,“步长”也不是越大就越好,你迈的步子越大,不一定越快到达目的地,所谓“欲速则不达”。小明如果选择“步长”为3,那么修正一次后他给出的答案变成了57,这时母亲就会说57太大了,小明只好往比57小的数答,他选了“步长”为2,那么这一次给出的答案变成了55,还是不对。如此反复几次,小明好不容易答对了56,期间由于“步长”选择太大,修正了好几次。同理BP网络中如果学习率或者步长选择过大,就会产生类似小明这种反复的现象,叫做“震荡”——在一个极值附近徘徊,但是就是得不到极值(也是痛苦)。
最后经过一番波折,小明得到了正确答案56,也如愿的出去欢快地玩耍了,但是故事还没有结束。第二天,小明的母亲又问起了乘法表,当问到“7x8=?”,小明又答错了,第三天,第四天。。。。小明母亲每天问一次(orz),小明每次都答错(小明你是不是傻?)我估计再耐心的家长都要疯了(教育孩子不容易啊)“你看看隔壁老王的儿子小王,乘法表一学就会,记住了就不会忘,你再看看你“7x8=56”就是记不住”(“妈妈再打我一次”,什么鬼)。长辈都是喜欢聪明小孩子的,什么叫聪明?一学就会,一点就透。反映在神经网络中,就是网络训练,收敛速度要快,相同的输入样本能更快地得到预期值,我们也更喜欢这种收敛快的网络。
神经网络训练的快慢跟以下因素息息相关:
1.参数(权值,偏置,学习率等)
2.网络结构(层数,每层节点个数)
不知道大家发现没有,我没有从这个例子去讲参数,网络结构的初始化,那是因为不同人,不同的生长阶段,大脑的构造,神经元分布是不同,自然,参数和网络结构也因人而异。
3.要解决的问题
神经网络算法发展有一段时间了,但是对于不同问题还是无法明确什么样的网络才是最适合的,人们只有不断去改进选择的网络,不断去尝试。这其实也好理解,不同的人擅长的领域不同,你可能比较擅长数学,他可能在音乐方面更有造诣,不同的人大脑构造不同,学习不同的事物是有快慢之分的。
4.算法
不同的网络学习过程是不同的,如BP网络采用了反向传播算法来修正网络,但是即使相同网络结构,不同算法也有不同学习速率。上面的小明大脑采用的可能是“最速梯度下降算法”,小王的则可能采用“共轭梯度算法”。
打了这么多字,手都酸了,相信大家眼睛也看酸了(果然还是数学更简洁)。
最后来白话下:
不同的人不同的大脑结构(参数初始值不同,网络结构与算法不同),决定了你在不同领域的天赋(网络收敛快)不同,天赋高应该怀有一颗感恩之心,天赋低也不要气馁,要努力学习(网络训练),不要怕犯错,你去学了就不会错太多(前向传播),犯了错要反思,要改正(反向传播),错的多需要改的就多(更新参数),改完以后继续尝试,直到不再犯错(网络训练结束)。
希望我的这篇博文能让你在学习BP网络的过程中加深对BP网络的整体认识。
简单的表面背后隐藏的是复杂的真相。我们在追寻真相的过程中,是否应该将表象与真相结合起来?