搜索

被“误解”的人工智能 何时能正确被应用

gecimao 发表于 2019-05-31 19:33 | 查看: | 回复:

  人类在数百年的发展中,以蒸汽机为代表的工业革命,以电为代表的电力革命和以互联网为代表的第三次技术革命,都带来了生产力的大爆发。纯粹的体力劳动已经变得越来越不重要,而人工智能的技术升级,是否能在未来的几十年时间里,让人类也彻底的解放生产力呢?

  从1950年马文·明斯基的大四学生与他的同学邓恩·埃德蒙一起,建造了世界上第一台神经网络计算机,到现在人工智能的发展到现在已经经历了三个阶段。第一阶段我们叫做计算智能,这个阶段要解决的事情就是能存会算。第二个阶段是感知智能,这个阶段是能听会说,能看会认。第三个阶段往下发展是认知智能,要能够理解、会思考,但这个阶段还需要努力才可以达到。

  进入21世纪以来,在全球范围内,随着大数据处理技术逐渐成熟,一些新算法如深度学习等的出现,使人工智能得到前所未有的发展。到了2019年,人工智能在全球的科技热潮中持续升温,国内更是诞生了众多知名的初创企业,如旷视科技、商汤科技、极链科技Video++、依图科技、云从科技等。可以预见,人工智能已经逐渐在向第三阶段进发。

  大数据的日益成熟,带来了许多全新的算法,也为企业提供了许多便利。人工智能与大数据主要的区别在于大数据是需要在数据变得有用之前进行清理、结构化和集成的原始输入,而人工智能则是输出,即处理数据产生的智能,作为一种计算形式,它允许机器执行认知功能,例如对输入起作用或作出反应,类似于人类的做法。这也是两者本质上的不同。

  国内很多行业的供需关系不平衡,就是因为它们只是运用大数据进行连接,例如中国的三甲医院,医生的数量是固定的,就算把全国的医生都连接上也没有用,因为医生一天看病人的数量是固定的,所以这些领域,大数据的帮助是有限的。再比如快递行业,大数据可以帮你找到最适合的路线、可以分配给你最短距离的送货地址,但是依然需要人力去送。

  数十年来,人们一直在担心机器人可能会通过一些方式改变我们的生活,而对人工智能有一定的误解。20世纪40年代,人类与人工智能之间的广泛互动似乎还很遥远,但美国科幻小说家Isaac Asimov却在那时提出了著名的机器人三大定律,定律可以说是非常完美,它不仅确保了机器人以为人类服务为目的,也顾及到的机器人的自身发展,到现在为止都被认为是机器人学的三大金科玉律。

  人类大脑经过了数万年的进化,包含了大量的信息和数据,这些人工智能开发者想仅靠模拟神经网络运算就达到和人类相同的智能水准,这想法太过自大。但是随着未来社会生产力的极大释放,人工智能极有可能会使一些工种被替代,大量易标准化、重复性、没技术含量、不具独创性的工作肯定会被裁掉或大幅减员。而这种被替代绝不是根据薪资多少或是岗位高低。例如基金行业的量化投资工作,未来智能投顾的自动化交易会让大多数基金经理和交易员都不再被需要。幼儿园老师或心理咨询师,这些需要情感沟通的工作,人工智能也很难去替代。

  我们根本无需杞人忧天,对人工智能时代的到来而感到恐慌。历史的发展告诉我们,在不同时期,会需要人类做不同的事情。农业社会需要许多的农民,而到了工业社会,则需要更多的工人,而到了现在这个时代,又催生出了很多IT行业的岗位。未来,人工智能时代一定会催生出一些新的工种,也会产生更多需要人类的工作。

  小结:未来,一旦拥有了局部不弱于人类的人工智能,机器就会产生强大的功能,不仅能够实现更准确、智能化的生产,提高单位生产线的生产效率,而且还能不知疲倦进行全天工作,这也在另一方面降低了企业的工业生产人力成本。人工智能或许会导致某些领域的人类失业,但是随着社会生产力的巨大释放,不需要那么多人力去维护社会的基础生产和运行时,也许会给人类带来另一番难以想象的未来世界。

  磨刀不误砍柴工rn“磨刀不误砍柴工”这句老话用在C++身上是再合适不过了。如果把C++比喻成一把刀,那么它会是一把材质和形状都非常好的刀——只是没有开锋。所以我们要“磨刀”。rnC++这把刀材质坚硬,强度也高,或许还进行过表面处理。那自然很难磨,费时费力。不过,一旦磨好,便锋利无比,持久耐用。这还是值得的。rnC++的“磨刀”实际上就是开发库,各种可能的库,从基础库开始,到各类应用库。库越多,刀磨得越快。当然了,开发库是有代价的。需要花时间,花精力,以及无限的耐心。rn此时,我们便需要做一些估计和四则运算,以便选择如何磨这把刀。rn最关键的因素,是某件工作被重复的次数,或者近似的工作的数量。某件工作被重复的次数的含义很明显,如果一再重复自己已经做过的事,明显是愚蠢的行为。“copy-paste神功”利用源代码的可复制性,很容易地避免了重复编码。但是,这也只是稍稍“不那么愚蠢”而已。rn当这些被重复的代码发生变化,那么,每一处paste的地方都需要被修改或替换。于是,聪明的人们发明了子程序、函数、类、继承、多态、模板等等五花八门的技术手段。目的便是消除这种“愚蠢”或“不那么愚蠢”的做法。一旦某件工作被做成子程序、函数、类、模板等,实际上便形成了一个库,只是库的应用范围有所差异而已。rn相比之下,近似的工作的含义则复杂、含混得多。我们编码时,时常会发现某些工作具有不同程度的相似性。比如,我们写一个排序算法,用于int类型;下次写同样的排序算法,用于double类型;…。有多少需要排序的类型,就要写多少次算法。这些算法并非完全相同(在类型上有所差异),但其结构完全一样。由此,我们可以用一个泛型算法实现所有类型的排序(暂不考虑性能问题和类型concept需求)。rn当然,并非所有的代码都具有如此高的相似性。代码的相似性越少,创建抽象的库代码的难度越大。所以,库是有限度的。综合考虑创建库的代价和效用,便可以指导我们是否建立库,或者如何建立库。rn对于完全一模一样的代码重复,自不必说,只管做成库代码。因为做这些库代码的工作量,只比编写一次代码的工作量多那么一点。修改也是如此。rn而对于相似的代码,情况则复杂得多。一般而言,如果这些相似代码仅有少量的出现,比如3、4处,通常没有必要创建相应的库代码。特别是这些相似代码的相似程度较小,或者代码复杂的时候。此时,创建库的代价很大,但获得的收益也仅有这么3、4处而已。rn但必须指出的是,我们在考虑是否创建库时,还必须认真地考虑其他项目,或者未来项目中应用的可能性。如果是某个非常常用的功能,尽管在当前项目中只出现一次,考虑到未来其他项目的应用,也应当将其开发成库。rn回到砍柴的比喻。一把没有开封的刀,在一定程度上也能砍下一些树枝,只是砍起来费劲些,也无法砍下较粗的树枝。如果我只需要砍那么几根枝丫,不需要很多,而且以后也不会再去砍柴。那么,一把钝刀也够用了。在这种情况下,如果还费劲地磨刀,着实是一种浪费。相反,如果我今天要砍一整担柴火,或者需要日复一日地砍柴。那么,我最好还是把刀磨磨好再说。rn磨刀也有难有易。材质坚硬(俗称“钢火”好)的刀,磨起来费力。但更锋利,更耐用。材质较软的刀,尽管磨起来快。但要使其锋利和耐用,比较困难。(因为材质软的刀,在磨到一定程度后,刃口会向上卷起。如果再反过来磨,又会向反方向卷)。rnC++就属于那种材质坚硬的刀。(而且生产厂家出于成本考虑,也没有为其开锋)。于是,作为“职业砍柴人”,有必要好好地磨砺一下这把好刀。(当然啦,也有很多“职业砍柴人”转而使用那些容易磨,或者出厂时已经开锋的“软质刀”)。rn磨刀也是有讲究的。(呵呵,我自认为在磨刀方面还是有那么一两手的)。越是硬的刀,越是不能急,一般需要循序渐进。为了不耽误柴火的产量,只能磨一点,用一点。一开始先用大角度,在锋口上磨出快口。尽管大角度的锋口不如小角度的来的锋利,但要比没开锋来得好。更重要的是,大角度锋口所花的时间要比小角度的少很多。由于我手中的是一把好刀,在砍柴的过程中,基本上不会有什么损耗。等到第二天,我再以小角度磨刀。同样,也不打算在第二天就全部搞定,继续用磨了一半的刀砍柴。经过第二天的磨砺,刀会比第一天好用些。然后第三天同第二天一样。以此类推,直到若干天后,刀完全磨好。此后,只需定期打磨一下,维持刀具的锋利即可。相比之下,那些软质的刀则需要更频繁地磨,以维持锋利程度。rn好了,刀就磨到这里吧。我们来看看如何“磨”C++。这里就用一个现实的案例来加以说明吧。rn现在很多应用软件,特别是MIS类软件,都需要访问数据库,然后把数据提取出来,进行进一步加工,或者直接显示在界面上。下面这样的代码,在软件中想必是随处可见的:rnvoid OnQueryClicked()rnrn DataConnection dc_(…);rn Rowset rs_(dc_, “select … from …”Number());rnrn while(rs_.MoveNect())rn rn for(int i=0; i

  被误解的C++rn传统上认为,C++相对于目前一些新潮的语言,如Java、C#,优势在于程序的运行性能。这种观念并不完全。如果一个人深信这一点,那么说明他并没有充分了解和理解C++和那个某某语言。同时,持有这种观念的人,通常也是受到了某种误导(罪魁祸首当然就是那些财大气粗的公司)。对于这些公司而言,他们隐藏了C++同某某语言间的核心差别,而把现在多数程序员不太关心的差别,也就是性能,加以强化。因为随着cpu性能的快速提升,性能问题已不为人们所关心。这叫“李代桃僵”。很多涉世不深的程序员,也就相信了他们。于是,大公司们的阴谋也就得逞了。rn这个文章系列里,我将竭尽所能,利用一些现实的案例,来戳破这种谎言,还世道一个清白。但愿我的努力不会白费。rnrnrn软件工程rnrn一般认为,使用Java或C#的开发成本比C++低。但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。rn造成这种差别的就是C++的软件工程性。在Java和C#大谈软件工程的时候,C++实际上已经悄悄地将软件工程性提升到一个前所未有的高度。这一点被多数人忽视,并且被大公司竭力掩盖。rn语言在软件工程上的好坏,依赖于语言的抽象能力。从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。但在实践中,人们发现面向对象无法解决所有软件工程中的问题。于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。(实际上,面向对象和泛型编程的起源都可以追溯到1967年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。rn一个偶然的机会,我突发奇想,试图将货币强类型化,使得货币类型可以采用普通的算术表达式计算,而无需关心汇率换算的问题。具体的内容我已经写成文章,放在blog里:。(CSDN的论坛似乎对大文章有些消化不良)。下面我只是简单地描述一下问题,重点还在探讨语言能力间的差异。rn当时我面临的问题是:假设有四种货币:RMB、USD、UKP、JPD。我希望能够这样计算他们:rnRMB rmb_(1000);rnUSD usd_;rnUKP ukp_;rnJPD jpd_(2000);rnrnusd_=rmb_; //赋值操作,隐含了汇率转换。usd_实际值应该是1000/7.68=130.21rnrmb_=rmb_*2.5;//单价乘上数量。rnukp_=usd_*3.7;//单价乘上数量,赋值给英镑。隐含汇率转换。rndouble n=jpd_/(usd_-ukp_);//利用差价计算数量。三种货币参与,隐含汇率转换。rn而传统上,我们通常用一个double或者currency类型表示所有货币。于是,当不同币种参与运算时,必须进行显式的汇率转换:rndouble rmb_(100), usd_(0), ukp_(0), jpn_(2000);rnrnusd_=rmb_*usd_rmb_rate;rnukp_=(usd_*usd_ukp_rate)*3.7;rndouble n=jpd_/((usd_*usd_jpd_rate)-(ukp_*ukp_jpd_rate))rn很显然,强类型化后,代码简洁的多。并且可以利用重载或特化,直接给出与货币相关的辅助信息,如货币符号等(这点我没有做,但加上也不复杂)。rn在C++中,我利用模板、操作符重载,以及操作符函数模板等技术,很快开发出这个货币体系:rntemplaternclass Currencyrnrnpublic:rn Currency& operator=(count Currency& v) rn …rn rnpublic:rn double _val;rn…rn;rntemplaterninline bool operator==(currency& c1, const currency& c2) rn…rnrn rntemplaterninline currency& operator+=(currency& c1, const currency& c2) rn…rnrntemplaterninline currency operator+(currency& c1, const currency& c2) rn…rnrn…rn总共不超过200行代码。(当然,一个工业强度的货币体系,需要更多的辅助类、函数等等。但基本上不会超过500行代码)。如果我需要一种货币,就先为其指定一个int类型的常量值,然后typedef一下即可:rnconst int CT_RMB=0; //也可以用enumrntypedef Currency RMB;rnconst int CT_USD=1;rntypedef Currency USD;rnconst int CT_UKP=2;rntypedef Currency USD;rnconst int CT_JPD=3;rntypedef Currency USD;rn…rn每新增一种货币,只需定义一个值,然后typedef即可。而对于核心的Currency和操作符重载,无需做丁点改动。rn之后,我试图将这个货币体系的代码移植到C#中去。根据试验的结果,我也写了一篇文章(也放在blog里:)。我和一个同事(他是使用C#开发的,对其更熟悉),用了大半个上午,终于完成了这项工作。rn令人丧气的事,上来就碰了个钉子:C#不支持=的重载。于是只能用asign()泛型函数代替。之后,由于C#的泛型不支持非类型泛型参数,即上面C++代码中的int CurrType模板参数的泛型对等物,以及C#不支持泛型操作符重载,整个货币系统从泛型编程模式退化成了面向对象模式。当然,在我们坚持不懈的努力下,最后终于实现了和C++中一样的代码效果(除了那个赋值操作):rnassign(rmb_, ukp_);rnassign(usd_, rmb_*3.7);rn…rn我知道,有些人会说,既然OOP可以做到,何必用GP呢?GP太复杂了。这里,我已经为这些人准备了一组统计数据:在C#代码中,我实现了3个货币,结果定义了4个类(一个基类,三个货币类);重载30个算术操作符(和C++一样,实现10个操作符,每个类都得把10个操作符重载一遍);6个类型转换操作符(从两种货币类到第三货币类的转换操作符)。rn这还不是最糟的。当我增加一个货币,货币数变成4个后,数据变成了:5个类;40个算术操作符重载;12个类型转换操作符重载。rn当货币数增加到10个后:11个类;100个算术操作符重载;90个类型转换操作符重载。rn反观C++的实现,3个货币时:1个类模板;1个赋值操作符重载模板;10个算术操作符重载模板;外加3个const int定义,3个typedef。rn10个货币时:1个类模板;1个赋值操作符重载模板;10个算术操作符重载模板;const int定义和typedef分别增加到10个。rn也就是说C++版本的代码随着货币的增加,仅线性增加。而且代码行增加的系数仅是2。请注意,是代码行!不是类、函数,也不是操作符的数量。而C#版本的代码量则会以几何级数增加。几何级数!!!rn这些数字的含义,我就不用多说了吧。无论是代码的数量、可维护性、可扩展性C++都远远好于C#版本。更不用说可用性了(那个assign函数用起来有多难看)。rn我知道,有些人还会说:货币太特殊了,在实践中这种情况毕竟少见。没错,货币是比较特殊,但是并没有特殊到独此一家的程度。我曾经做了一个读取脚本中的图形信息,并绘图输出的简单案例,以展示OOP的一些基本概念,用于培训。但如果将其细化,可以开发出一个很不错的脚本绘图引擎。其中,我使用了组合递归、多态和动态链接,以及类工厂等技术。就是那个类工厂,由于我使用了模板,使得类工厂部分的代码减少了2/3,而且没有重复代码,更易维护。关于抽象类工厂的GP优化,Alexandrescu在其《Modren C++ design》中,有更多的案例。同样的技术,还可以推广到业务模型的类系统中,优化类工厂的代码。rn如果还不满意,那么就去看看boost。boost的很多库实现了几乎不可想象的功能,比如lambda表达式、BGL的命名参数等等。它为我们很多优化软件代码新思路,很多技术和方法可以促进我们大幅优化代码,降低开发成本。rn最后,如果你认为C#的最大的优势在于台,那我可以告诉你,这个世界上还有一种东西叫C++/CLI,完全可以满足.net的开发,而且更好,足以擦干净.net那肮脏的屁股。不过,这将会是另外一个故事了…rn

  百度地图开发(五)之公交信息检索 + 路线万+转载请注明出处:     在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容。 公交信息检索     实际上,公交信息检索与POI检索、在线建议检索非常相似,也...

  09-04阅读数 7万+相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是: ⑴ 找出算法...

  10-14阅读数 1万+在压测过程中jmeter报内存溢出,可能的原因有很多。要注意下面三点: 1、单击压测过程中使用过多的线。具体看机器的配置和启动应用的情况。(A single JMe...

  11-16阅读数 65万+强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...

  11-25阅读数 52万+jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  03-16阅读数 1万+测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执...

  10-29阅读数 15万+上一篇文章讲解了SNMP的基本架构,本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1、v2c、v3)进行区别! 四、SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Age...

本文链接:http://ticatfans.com/duibiducaozong/408.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部