基于python的神经网络,使用python实现深度神经网络
当谷歌的AlphaGo战胜人类顶尖棋手后,人工智能开始更多地进入大众视野。谷歌AI教父认为:“AlphaGo有一个接近大脑的直觉神经网络”。
几千年来,人类试图理解智能的机制,并将其复制到有思维的机器上。从不满足于在机械或电子设备的帮助下做一些简单的工作,例如,用打火石生火,用滑轮吊起一块大石头,用计算器做算术。
相反,我们希望自动执行更具挑战性和相对复杂的任务,例如将相似的照片分组,从健康的细胞中识别出患病的细胞,甚至是下一盘优雅的象棋。这些任务似乎需要人类的智能来完成,或者至少需要人类思维中某种更深层次、更神秘的能力来完成,而这些能力在计算器等简单机器中是找不到的。
具有类似人类智能的机器是如此吸引人和强大的想法,以至于我们的文化对它充满了幻想和恐惧,比如斯坦利库布里克导演的《2001: A Space Odyssey》中的HAL 9000(它有很大的能力,但最终对人类构成了威胁),动作电影中疯狂的“终结者”机器人和电视剧《Knight Rider》中性格冷静的chatterbox KITT car。
1997年,卫冕世界象棋冠军和国际象棋特级大师加里卡斯帕罗夫被IBM的深蓝计算机击败。在庆祝这一历史性成就的同时,我们也对机器智能的潜力感到担忧。
我们如此渴望智能机器,以至于有些人忍不住使用欺骗手段。比如臭名昭著的象棋机器火鸡,就是用一个人躲在柜子里!
20世纪50年代,人工智能学科正式成立。这个时候人类雄心勃勃,对人工智能非常看好。最初的成功让人们看到计算机可以玩简单的游戏和证明定理。所以有人认为人类级别的人工智能会在十年左右出现。
然而实践证明,人工智能的发展困难重重,进度一度停滞。上世纪70年代,人们在学术界挑战人工智能的雄心受到了毁灭性的打击。接下来,人们削减了人工智能的研究经费,对人工智能的兴趣消失了。机器冰冷的逻辑,绝对的一和零,似乎永远无法实现生物大脑微妙的、有机的、有时甚至模糊的思维过程。
有一段时间,人类未能原创,未能取得长足进步,未能将机器智能的探索带出既定轨道。之后研究人员灵光一现,试图通过复制生物大脑的工作机制来构建人工大脑?真正的大脑有神经元,没有逻辑门。真正的人脑有着更优雅、更有机的推理,而不是冷冰冰、非黑即白、绝对的传统算法。
或者蜜蜂大脑的简单性和它执行复杂任务的能力之间的巨大反差启发了科学家。只是十分之几克的大脑似乎可以做很多事情,比如导航,适应风向,识别食物和捕食者,快速决定是战斗还是逃跑。现在的电脑有很多廉价资源。他们能模仿并改善这些大脑吗?一只蜜蜂大约有95万个神经元。今天的计算机,拥有G比特和T比特的资源,能比蜜蜂表现得更好吗?
但如果用传统方法解决问题,即使计算机有巨大的存储和超快的处理器,鸟类和蜜蜂用相对微小的大脑做的事情也无法实现。在仿生智能计算的推动下,出现了神经网络,神经网络已经成为人工智能领域中最强大、最有用的方法之一。
今天,谷歌基于神经网络的Deepmind可以做一些奇妙的事情,比如让计算机学习如何玩视频游戏,并且在人类历史上第一次在极其多变的围棋比赛中击败了世界级大师。如今,神经网络已经成为日常技术的核心,比如自动车牌号码识别、手写邮政编码解码等。
055-79000是关于神经网络的,让你知道神经网络是如何工作的,帮助你制作自己的神经网络,训练神经网络识别人类手写字符。如果用传统的方法来执行这个任务,会非常困难。
神经网络是如何实现的?
计算机的核心部分是计算器。这些计算器运算速度很快。它适用于执行与计算器匹配的任务,例如添加数字来计算销售额,使用百分比来计算税收,以及绘制现有数据的图表。
即使是在电脑上看网络电视节目或听流媒体音乐,也只是一遍又一遍地执行简单的算术指令。你可能会感到惊讶,互联网上用来向计算机发送1和0并重建视频帧的算法并不比你在中学时做的加法更复杂。
计算机能以相当快的速度在一秒钟内将4位数甚至10位数相加,这可能令人印象深刻,但它不是人工智能。人类可能很难快速加法,但是加法的过程并不需要太多智慧。简单来说,它只要求计算机具有遵循基本指令的能力,这正是计算机中的电子设备所做的。
现在我们转到事情的后面,打开电脑的卡。我们来观察下面这张图,看看你能在里面认出什么。你和我都看到了脸、猫和树的照片,并且认出了它们。
事实上,我们可以很快做到这一点,而且精确度非常高。在这方面,我们通常不会出错。我们可以处理图像中包含的大量信息,我们可以成功地识别图像中的内容。但是对于计算机来说,这种任务并不容易。其实挺难的。
我们怀疑图像识别需要人类的智能,而这正是机器所缺乏的。无论我们制造出多么复杂和强大的机器,它们仍然不是人类。但是,因为计算机速度很快,不知疲倦,我们只是希望计算机能更好地解决图像识别等问题。人工智能讨论的所有问题都是为了解决这类问题。
当然,计算机永远是由电子器件构成的,所以研究人工智能的任务就是寻找新的方法或算法,使用新的工作方法并尝试解决这类相对困难的问题。即使计算机不能完美解决这些问题,我们只需要计算机足够优秀,给人一种智能在起作用的印象。
一个简单的预测器。
让我们从建造一个超级简单的机器开始。想象一个基本的机器接受一个问题,做一些“思考”并输出一个答案。正如我们在上面的例子中所做的那样,我们从眼睛输入图片,用大脑分析场景,得出场景中有哪些物体的结论。
这是这台机器的样子。
请记住,计算机不会真正思考,它们只是被包装起来的计算器,所以让我们用更合适的词来描述这个过程。
计算机接受一些输入,执行一些计算,然后弹出输出。以下内容对此进行详细解释。计算机处理“34”输入。这个处理可能是把乘法转换成一组相对简单的加法,然后弹出答案“12”。
你可能会想,“这没什么大不了的!”没关系。在这里,我们用简单而熟悉的例子来介绍我们将在后面看到的更有趣的神经网络概念。
让我们增加一点复杂性。想象一下一个把公里换算成英里的机器,如下图。
现在假设我们不知道公里和英里之间的换算公式。我们只知道它们之间的关系是线性的。这意味着如果英里数增加一倍,代表相同距离的公里数也增加一倍。这个很直观。如果这不是事实,那么这个宇宙就是不可思议的。
而英里和公里的这种线性关系为我们提供了这种神秘计算的线索,即它的形式应该是“英里=公里 c”,其中c是常数。现在,我们不知道常数c是什么。
我们仅有的其他线索是一些正确的km/mi匹配数字对的例子。这些例子就像用于验证科学理论的真实世界观察实验一样,展现了世界的真实情况。
计算缺失常数c应该怎么做?我们手头有一个随机值,让机器试试吧!让我们试试用C=0.5,看看会发生什么。
这里我们作出:mile=km c,其中km为100。目前我们猜测c是0.5。
这台机器能得到50英里的答案。嗯,考虑到我们随机选择了C=0.5,这个表现还不错。但是2号真题告诉我们答案应该是62.137,所以我们知道这是不准确的。我们还差12.137。这就是我们列举的例子的计算结果和真实值的差异,是误差。即:
误差值=实际值-计算值
=62.137-50
=12.137
接下来我们要做什么?我们知道哪里出了问题,也知道问题有多严重。我们不需要对这个错误感到失望。我们可以利用这个误差来指导我们得到c的第二个更好的猜测值。
再看看这个误差值。我们还差12.137。由于公里转换成英里的公式是线性的,即英里=公里 C,我们知道增加C可以增加产量。
让我们将C从0.5稍微增加到0.6,看看会发生什么。现在由于将C设置为0.6,我们得到英里数=公里数C=1000.6=60,比之前50的答案要好。我们取得了显著进展。
现在,误差值变小了,2.137。这个值甚至可能是一个我们乐于接受的误差值。
这里很重要的一点是,我们用误差值来指导如何改变c的值,我们希望输出值从50开始增加,所以我们稍微增加了c的值。
我们不必试图用代数方法来计算C需要改变的确切量。让我们继续用这个方法来提高c的值,如果你仍然不能被我说服,它足够简单,可以计算出精确的答案,那么请记住,没有简单的数学公式可以将输出与输入联系起来。这也是为什么我们需要神经网络这种相对成熟复杂的方法。
让我们再次重复这个过程。60的产值还是太少了。我们再微调一下C,从0.6调整到0.7。
妈的!太糟糕了,结果超过了已知的正确答案。之前的误差值是2.137,现在的误差值是-7.863。这个负号告诉我们,我们不是不足,而是超调了。记住上面的公式,误差值等于真实值减去计算值。
所以,C=0.6比C=0.7好得多。我们可以在这里结束这个练习,欣然接受C=0.6带来的小误差。但是,让我继续说一小段。为什么不用更小的量,微调C,把C从0.6调整到0.61?
这比之前的回答好多了。我们得到的输出值是61,只比正确答案62.137差1.137。
所以这最后一次尝试告诉我们,C的值要适当调整。如果输出值越来越接近正确答案,也就是误差值越来越小,那么就不应该做这么大的调整。这样就可以像以前一样避免超调的结果。
同样,读者也不需要为如何精确计算C值而分心。请继续关注这种不断细化误差值的思路。我们建议将修正值作为误差值的百分比。直观来看,这是正确的:大的误差意味着需要大的修正值,小的误差意味着我们只需要稍微微调c的值。
信不信由你,我们刚才所做的只是略读了一下神经网络学习的核心过程。我们训练机器,让它的输出值越来越接近正确答案。
这个方法值得读者停下来想一想。我们没有像在学校解决数学和科学问题时那样一步到位、准确地解决问题。而是试图得到一个答案,并多次改进,这是一种非常不同的方法。有人称这种方法为迭代,意思是一点一点不断完善答案。
分类器和预测器没有太大区别。
因为上面提到的简单机器接受一个输入,做出应有的预测并输出结果,所以我们称之为预测器。根据与已知实例比较所得的误差,调整内部参数,使预测更加准确。现在,我们来看看园中懵懂美人的实测长宽。
上图中,可以清晰的看到两组懵懂的美女。毛毛虫又细又长,瓢虫又宽又短。你还记得这样一个例子吗?在给定公里数的情况下,预测器试图找出正确的里程数。该预测器的核心具有可调线性函数。当lhzdmj画出输入与输出的关系时,线性函数输出的是一条直线。可调参数c改变直线的斜率。
如果我们在这张图上画一条直线会发生什么?虽然在把公里换算成英里的时候,我们不能用和以前一样的方法,但是我们也许可以用直线把不同性质的东西分开。
上图中,如果一条直线能把毛毛虫和瓢虫区分开,那么这条直线就能根据测量值把未知的无知的美女分类。因为毛毛虫和瓢虫各有一半在分割线的同一边,所以上面说的直线并没有做到这一点。让我们再次调整斜率,尝试不同的直线,看看会发生什么。这一次,这条直线真的没用了!根本分不清两种无知的美女。让我们再试一次:
这条直线好多了!这条直线清楚地区分了瓢虫和毛虫。现在,我们可以用这条直线作为无知美女的分类器。我们假设没有其他类型的无知美女没有被发现。现在,这个假设是没有问题的,因为我们只想解释构建一个简单分类器的想法。
想象下一次,计算机会用机械臂抓取一个新的无知美女,测量它的宽度和长度,然后它就可以用上面的分割线正确地将无知美女分类为毛毛虫或瓢虫。看下图,可以看到未知的懵懂美女躺在直线上,所以是毛毛虫。这个分类很简单,但是很强大!
我们已经看到了如何使用线性函数在一个简单的预测器中对以前未知的数据进行分类。然而,我们忽略了一个至关重要的因素。我们如何得到正确的斜率?怎么才能提高这两个无知美女的分割线?这个问题的答案就在神经网络学习的核心。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。