神经网络制作素数识别器

来源:互联网 发布:淘宝买家秀兼职骗局 编辑:程序博客网 时间:2024/05/17 01:31

在知识工程中心打酱油,花了一周的时间学习了下神经网络。老师安排了个题目,让我试着做做,简单的做了一点,进行了几组试验,写了个总结报告,就在这贴出来吧。

经过一周多的试验,对于这个问题有了一个简单的认识,下面是我对于这个问题的想法。近两天突然感觉问题似乎清晰了好多。

       我认为,现在要解决的首要问题并不是网络的预测能力,而是如何在一个闭区间内,采用适当的方法训练网络,以使得网络在这个闭区间内具有良好的素数识别能力。

       我虽然不知道素数的空间维度,但是可以肯定,对于更大范围内的素数,其空间维度必定很高。我查阅了相关的文献,高维度的空间需要密集的样本数据才能进行很好的学习。而这样的密集样本在高维中是很难找到的,因此产生了维数灾。维度的增加还将导致复杂度呈指数级的增长,从而引起高维空间中一致随机分布点的空间填充性质退化。总之,定义在高维度空间的函数是很可能远远比定义在低维度空间上的函数复杂的多,并且这些复杂的东西是难以区分的。

       上面的结论是我结合试验进行的一个猜想,我感觉到要解决这个问题,突破“维度爆炸”将是关键,下面是我的分析过程。

       我们不知道素数的维度到底是多少,但是根据我的经验以及接触的资料表明,它很复杂。这个问题有点像宇宙有多大一样,没有试验或者理论能确切的证明宇宙无限大,但是以我们目前的经验以及掌握的一切资料表明他是无限大的。我试着想象,在一定的范围内,素数维度的增长是平滑的,如果这个猜想成立,在一定范围内预测素数将成为可能。接下来我对于1~pow2(10)范围内的所有尾数为1379(偶数和5因为可以被25整除而被排除掉)的数字作为样本进行了训练,之后进行了封闭性的检测,识别率结果在99%以上之后,对于下一个区间进行预测。例如对于pow2(10)~pow2(11)pow2(11)~pow2(12),……,发现素数的识别率在一点点下降,从最好的30%左右一直到最后的10%。对于类似的试验我变换网络结构以及训练样本空间,进行了几组测试,发现所有的结果都是随着预测范围的增加,我们的素数识别率在进行近似线性的下降。引发上述现象的原因可能是素数的维度在随着范围的扩大进行增长,当然我现在也无法排除其它的因素。

比如:因为小范围内的训练过度而使得训练结果出现“过拟合”。因为网络对于样本学习的太好了,所以近乎是学“死”了,一个极端的情况是对于输入的判断完全成为了一个类似于对于训练样本“查表”的过程。这样导致一些本来是局部范围可能存在的规则(这个规则并不适用于其它范围内的素数)成为了判断依据,导致预测结果不理想。但是因为这种情况往往需要对于远远比要求网络复杂的网络进行过度的训练才会导致,而我选取的网络结构是遵循从简单到复杂试验的过程,从诸多的网络结构中选取效果最好的,所以这种情况出现的概率不大,但是我无法提供确切的证据完全的排除掉。但是可以肯定一点,并不是封闭测试表现最好的网络才是预测能力最好的网络!当然封闭测试结果也不可以太差,这样会导致网络的学习能力不够,无法对于样本进行充分的学习,从而导致以后也不可能得到什么好的预测结果。

另一种情况是维度真正的增加了,以至于我们根本无法仅仅凭借着上一个范围内的样本得到良好的识别网络,诚如您上次所说,样本提供的信息量不够。针对这个问题我没想到什么好的解决方案,因为这个是素数本身的复杂性造成的,想要解决的确很困难。我想既然素数这么困难,那么是不是能够对于已知范围内的素数进行乘积堆累,产生要预测空间内的合数,通过合数的判定来“筛出”素数。为了验证这个设想,我又对于这个想法进行了更加“宽泛”的试验,即对于预测空间内的一组样本(其中包括素数)进行再训练,得到的结果与再训练之前的网络的预测结果进行比较。令我超级郁闷的是,这样做并不能取得良好的预测效果,恰恰相反,结果反而没有进行在训练前的网络表现的好!!!当然我仅仅进行了几组试验,这个不能当成结论。分析原因,可能存在对于某一个空间内过度逼近的问题。因为BP神经网络进行训练主要是一个全局的逼近,这样得到的网络预测能力也往往是最好的。但是如果过度的强调某一个点或者某一个区间的逼近,全局的优化就会退步,这样得到的结果是,网络在某一个区间上的表现能力比较好(在再训练样本的封闭性测试中可以达到70%的正确率),但是在其它区间上的拟合或者预测能力都会变差。(能不能这样解释,由于网络学习了新规则而把旧规则给了,那么这样就可以通过改变网络结构解决这个问题,这么想问题会变得更复杂了,我没有深入进去)还有就是,即使我们能够做到加入新规则,不忘老规则,我们也只能提供关于合数的信息,而对于素数的信息我们无法加入。我没有仔细的去想过利用这样的“反筛法“去识别素数的困难,但是可以预计,这样做将不会比素数识别碰到的困难更小(对于人类来讲这样的学习方式可能看似更加的简单,但是对于机器学习来讲其困难程度应该是等同的)。那么可不可以这样,凭借网络对于下一个区间的预测结果,通过检测,排除掉非素数结果,再结合一些已知的合数样本进行再训练。当然如果前面的问题能够得到良好的解决,这样做从道理上来说应该是可行的。

从上面的叙述中可以看出,我用来支持结论的确切一句并不多,并不完全是我有意的偷懒(当然这个原因不能删去^_^)不进行试验,而是我对于神经网络的掌控程度还不是很好,要确定一个问题往往要进行大量的穷举式的试验,变换一切可以影响结果的训练参数,以期望得到一个满意的网络(即使这样我也并不信任我的结果)。而训练神经网络又是一个比较耗时的工作,往往一个看似很小规模的网络要训练很长的时间才能收敛(训练参数使用不当)。当然在试验的过程中,我也积累了不少所谓的训练经验,对于比较简单的多项式我可以做到很好的拟合(我做过几次试验了,真的不错),我也感觉到,神经网络更像是艺术,经验与直觉往往会帮助我节省很多的时间。

再有就是因为神经网络本身的不确定性,使得“天资“(初始权值或者训练样本的差异)不同的网络,即使使用相同的训练参数,训练的结果也不会相同。因为网络种种的未知表现,极大的降低了我对于数据的敏感程度,我不能确定微小的数据改变的原因,只能通过更多的试验取弥补。

但是,如果我上面的猜想能够得到验证,我们要解决的首要问题正如开篇所说,对于一个更大范围内的样本进行训练,如果能够得到一个好的网络,结合再训练方法,将能够得到一个在一定范围空间内预测能力表现良好的网络。但是究竟,这样扩展下去,是不是可行呢?当然有一个前提,由于高维度的素数空间,将使得训练异常的难于收敛,维度爆炸在理论上无法避免,我们仅能够尽量的推迟爆炸的时间,取不能避免爆炸。因此,无论素数的空间维度特征表现的如何,能够在高维空间上训练出优秀的网络将是首要的入手点,否则BP网络是死路一条!

我翻阅了一些资料,试图找到解决的方法,经典的方法无法两条路:

加入更多人类现有的知识。我用来整整一天的时间研究这个方法的可行性,发现基于人类知识的素数样本要比素数分布更加的稀疏(事实上是超级稀疏),如何利用这样的少量样本去训练网络已经超出了我对于机器学习的理解。

再有就是去增加拟合函数的平滑度,这个的确是可以节省很多计算时间。因为其中涉及到比较复杂的高等数学以及高等代数知识,我没有进行深入的理论学习(事实上是我现在的数学知识非常的有限)。

说道这里,我认为现阶段,能够制造一个在大尺度范围内的素数识别器的意义要远远超过去分析素数分布空间维度的意义(事实上后者的分析也需要前者作为基础),这样主要的工作就是应该放在去更加深入的研究与分析神经网络(这个过程有点令人头疼)。

上面就是我对于这个试验题目的简单看法了,会存在很多的问题,也可能我的猜想与实际大相径庭,但是总归是提供了一个解决问题的方案与思路,这个也许是进行试验最主要的目的吧。

通过这几天的学习,我稳定了曾经忐忑不安的心神,我能够安下心来读书,写程序,观察数据,真正的做一些有意义的事情,而不是将时间荒废着焦急与不安的揣测之中。有的时候yy自己好像个科学家,虽然我没有表现出任何对于这个问题的狂热……

试验就好像是在一棵未知的树上搜索我需要的节点,我只有两种选择深度与广度搜索。如果执意的进行深度探测,可能走入死胡同,找了半天什么收获也没有,最后需要回溯,重新再来。如果仅仅去追求广度则有可能陷入无限的yy中,试验得不到进展。理想的状态是适度的深度与广度结合,这个需要对于数据的充分理解以及比较深入的领域。同时这些知识还可以进行大量的剪枝截断。当然知识与搜索速度会有冲突,对于小规模的问题当然可能需要太多的领域知识,穷举一下似乎更快。总之,敏锐的洞察力是一切试验成功的基础。

上面就是几天研究工作的体会。

 

原创粉丝点击