算法是啥

关注:灰质,有趣有料的AI技术分享

9f5bde4462f947c91c132530974149de.png

说到人工智能大家经常会提到算法,算法也是被认为当代人工智能兴起的三大要素“算法、算力和数据”之一,但是算法的历史远比人工智能悠久的多,而且不同行业对于算法的定义不尽相同,或者说用到的算法类型差别很大,今天我们来聊聊算法那些事。

前言

“算法”(algorithm)一词的英文名得名于波斯数学家花拉子密。公元9世纪,这位数学家写过一本书,讨论用纸笔解决数学问题的技巧。[书名为“al-Jabrwa’l-Muqabala”,其中的“al-jabr”就是后来“algebra”(代数)这个词的前身。]不过,最早的数学算法早于花拉子密。在巴格达附近出土的4000年前的苏美尔人泥板文献上,就刻有一幅长除法示意图。算法的中文名则起源于中国古代的《周髀算经》,是中国最古老的天文学和数学著作,约成书于公元前1世纪。

在计算机领域、数学领域、逻辑学等方面对于算法都有相关定义与描述,总的来说算法指的就是计算的方法,计算机通过程序实现,数学通过公式推导实现(其实在希尔伯特将数学机械化、抽象化之前,数学还有很多自然的表达方式,更加直观易懂),逻辑则通过逻辑推理描述。

数学和逻辑的角度,算法本质上是一种逻辑关系的推理,面向现实问题的时候就要选择一套比较符合现象描述的逻辑关系,比如咱们从小学习的四则运算,以及与或非这些逻辑关系,都是与现实问题的描述比较契合的,在这个基础上做逻辑关系的推理,就可以形成一套逻辑运算过程,来指导实际问题解决的步骤。

计算机的角度,算法通常指由计算机执行的一系列指令,即所谓的程序,有明确的输入和输出,用于解决输入给计算机的问题,计算机中的算法表述方式有自然语言、伪代码、程序语言等。其背后的原理可以由信息论和数学来支撑,主要描述的对象是现实世界,现实世界的现象和问题可以尝试用算法来描述,但未必都是精确和最优的解,有时候仅是可行的解,甚至未必有解。

所以玩算法不要脱离现实世界,实事求是比较好,同时要训练好数学、信息论和编程,这是算法的基本功,数学和信息论是内功,编程是招式和技巧。

万物皆可以在一定程度上转化为算法问题,不过也别指望着算法能够解决一切问题,因为理论上,并不是所有问题都可以计算,可以计算的问题也未必能在有生之年计算出来,即使将来有了量子计算机也不一定行。

关于算法的基础理论知识有一门课叫做计算理论,有本经典的书大家可以翻一翻《计算理论导论》,非常抽象,都是计算机领域的大佬们思考的深刻问题,像是什么问题是可以计算的,计算的效率怎么度量和预测等等,一般人稍微知道点常识就可以。搞这个领域的基本都是图灵、哥德尔、希尔伯特这些数学家和数理逻辑学家。比如衡量算法好坏的标准有时间复杂度、空间复杂度等,同时还要考虑算法解决问题的效果,即算法在特定问题中的性能指标。在人工智能领域还提出了算法的可解释性、健壮性、鲁棒性、安全可信等要求。

说到这里就能看出来了,算法的出现时间远早于人工智能,而且其含义也远超过人工智能的概念。那么算法发展到现在大概经历了哪些阶段,主要有哪几类呢。

一、算法的前世今生


粗略的说一下算法相关的发展过程。


考古发现的最早时期,可以说是古代各个文明在日常计数、制定天文历法时所用到的方法,产生了十二进制、六十进制等计数方式。


后来在古希腊的很多形而上学的研究中,算法以数学的形式产生了巨大的进步,包括欧几里得、阿基米德等人提出了很多新颖但没有具体用途的计算方法,欧几里得的几何原本、素数判断方法等。


现实之中对算法的需求主要产生于军事和商业,军事情报传递中对加密的需求促进了密码学的发展,商业之中对货物价值的计算,包括几何之中面积和体积的计算等。都是算法发展的主旋律。


在这个过程中,伴随着计算方法的日益丰富和生产力的进步,逐渐出现了专门做数学研究的人才,很多出于兴趣,或者自己有足够的财富积累,或者有富人予以财富支持,可以成为数学领域的集大成者,如西方的欧拉、莱布尼茨、牛顿等人,中国的程大位(算法统宗)和阿拉伯世界的帕奇欧里等。其成果也广泛应用于军事和商业生活。


以上的算法发展过程大都是以数学的形式体现。


以哥德尔不完备定理、邱奇的lamda算子,以及图灵机的提出(1936年)和艾尼阿克计算机的诞生(1946年)为标志性事件,计算机逐渐发展与完善,算法又多了一种展现形式,“计算机程序”。与此同时,算法也伴随着计算机在通信信息编码和压缩、情报信息加密、金融交易等领域的发展变得越来越复杂且重要。


近些以来,神经网络类算法大行其道,以其强大的数据拟合能力,可以逼近极为复杂的数据变化规律,在图像识别和生成、语音识别和生成、序列决策函数求解等方面展现出前无来者的出色表现,成为非常重要的一类算法,由于其表现出的很多能力类似于人类的一些单项能力,又带动了一个古老的概念“人工智能”随之复兴。


时至今日,神经网络算法也遇到了非常多的困境,如大数据依赖、可解释性差、泛化能力弱、算力要求高等,于是又有重新回到数学领域和现实问题,探索更加高效算法的趋势,如系统动力学、因果计算、图神经网络等。


总之,对于能够解决现实问题的更加高效、更加优化算法的追求,是算法研究的主旨,不论是数学、计算机科学、复杂性科学等各个学科的发展,还是在机器人、互联网等领域的应用。

二、算法的一些核心问题

算法,或者叫计算模型,背后的核心问题既是数学问题,也是计算机科学问题。自莱布尼茨发明步进计算器之后,希尔伯特提出了数学公理体系的三大疑问,完备性、一致性和可判定性的存在。这个疑问的核心目的是为了确认是否一切问题都可以用数学来解决,如果数学公理体系具备完备性、一致性和可判定性,那么所有问题都可以转换为数学问题进行计算。

遗憾的是,哥德尔、邱奇和图灵陆续都给出了否定的证明,即数学公理无法描述全部现实问题,总是存在超出数学公理体系计算能力的问题。哥德尔认为无论数学的理论系统基于什么规模的公设,都有超出这个命题系统范围的问题无法被这个理论系统本身所证明。图灵则通过图灵停机问题的逻辑推理,用反证法说明图灵停机问题不可判定,不可计算。

计算耗时问题,即P?=NP问题。我们已经知道了计算机的能力是有限的,无法解决所有的现实问题,那么,仍然有一个极限问题,即在有限时间内是否能够算出来,要说明一下,咱们这里提到的有限时间是对多项式时间的粗略表述,多项式时间的概念涉及计算复杂度与指数时间、阶乘时间、常数时间的对比,我们就不多说了。

P指的是一个问题可以用确定性图灵机(咱们现在所用的计算机就是基于图灵机概念建立的)在有限时间内完成计算和验证,NP问题则是指数级以上复杂度的问题,无法用确定性图灵机在有限时间完成计算,典型代表是旅行商问题、背包问题等。

P?=NP问题的意思是,是否可以说,NP问题是否可以转化为P问题,P与NP是否等价?

之所以提出这个问题,主要是因为如果可以等价转换,那么NP问题的计算就简单多了了,想办法转换为等价的P问题即可,否则就不用费劲计算了,因为求解耗时会太长而无法接受。目前这个问题仍然是世界几大难题之一,类似于费马大定理一样,有待解决。

不过不用太气馁的是,虽然NP问题的最优化求解非常困难,但是仍然存在很多启发式算法可以求出可行解,近似的求解最优答案,但是目前还没有办法说清楚这个近似解与最优解之间到底有多大的偏差。启发式算法很多,下一章会介绍到,包括现在的神经网络都属于启发式算法的范畴。

三、算法的主要流派


对算法的分类是个挺复杂的问题,有问题的角度、解题思路的角度以及算法本身的特点。


针对问题的角度,也就是干啥用的算法,比如经典的排序问题、搜索问题、加密问题、规划问题等。


从计算理论的角度来说,算法可以按照是否有限和确定来分类。就是这个算法是不是可以在有限时间内跑完,输出的结果是不是确定的。有人说,算法还能跑不完或者输出结果不确定吗?当然的,典型的遗传算法就是可能跑不完和没有确定结果的,因为这个东西是模拟生物一代一代遗传的特点,通过与环境的一种交互方式的设定来让算法自己迭代,如果不去设定明确的终止条件,这个算法可以一直跑下去,要是想看看跑一千次之后啥状态,就把终止条件设定为一千次迭代终止。


从解题思路方面的角度算法分类也挺多,这种分类可能大家听说的比较多,比如递推法、递归法、穷举法、贪心算法、分治法、动态规划法、迭代法、分支界限法、回溯法等等,包括神经网络也算是图算法的范畴,即网络形态的计算方法。


咱们就从解题思路的角度看看几个比较经典的算法思想,很多地方都是相通的,具体问题还是要具体研究的,这里只是粗略的解释一下基本概念。

先说一个算法度量的专用指标,“时间复杂度”和“空间复杂度”,这两个指标的意思就是我们做了一个解决问题的算法,那么这个算法的效率如何,需要占用多少存储空间、算多久。

递归,这是非常古老且经典的方法,简单说就是不断重复自己,直到达到终止条件。经典的例子就是套娃问题,比如在套娃里有个糖果,我们要打开套娃找个这个糖果,那么递归方法的思路就是打开套娃,查看糖果,如果没有就继续打开套娃,不断循环调用自己。递归方法的设计主要有两个点,一是递归条件;二是基线条件,递归条件就是何时调用自己,基线条件就是何时结束。这个方法的主要优点就是思路清晰易懂,而且现实中很多问题都可以用这种递归的思路去解决。

分治,简单说就是分而治之,把复杂问题分成可解决的一个个小问题,各个击破。分治不是具体的方法,而是一种解决问题的思路,通常用于一下子想不清楚的问题。这时候把整个问题先划分为多个部分,把看明白的先放一边,重点解决看不明白的部分,再把这部分继续分解,这里其实还是一个递归的过程,基线条件就是最后可以把看不明白的部分解决掉,再加上前面分出去的看明白的部分,整个问题就解决了。

图算法,顾名思义就是画图,把问题抽象为网络图,按照连线是否有方向分为有向图和无向图,然后根据问题进行计算,如广度优先搜索、深度优先搜索、狄克斯特拉算法等,典型的应用场景就是导航中的路径规划,需要找最短路径、最快路径等等的时候就会用到不同的算法。图算法在实际问题中也是非常有用的,路线、连接关系的优化都可以用到,交通网络、信息网络、社交网络场景中优化和搜索等问题中都能用到。

动态规划,是一种求解多阶段决策的方法,这个方法将一个大问题划分为两个主要部分,已经发生的历史状态和接下来的将要发生阶段,这种方法强调历史状态无关性,即从现在开始求解的即将发生的状态是最优解即可,不必考虑历史状态。典型的应用方式就是逆序求解最优解,如路径规划中,从起点需要经过5步到重点,那么最后一步的最短路径与前面怎么走没有关系,那么就可以一步一步的做倒序最优解计算,最终求出的5步累加最短路径就是全局最优了,这个原理叫做贝尔曼最优化原理。这里面计算的主要技巧是用空间换时间,也就是把前面最优解的计算都存储下来,那么,每到下一步的计算就直接调用前面的计算结果,而不需要重复做计算了,这样减少了重复计算量,缩短了计算时间。所以动态规划准确的名字应该叫分阶段递归优化,但是为什么名不副实的叫动态规划,据说是贝尔曼在兰德公司给美国空军打工时,军方主管威尔逊不喜欢数学相关的词语,所以贝尔曼打了个编程的旗号,把这个方法的名字叫DP(Dynamic Programming)

贪婪算法,也叫贪心算法,简单说就是走一步看一步,因为很多问题目前没办法给出全局的最优解,只能在局部上寻求最好的办法,再组合起来形成可以解决问题近似解,但不能保证全局最优。这种情况在真实世界中往往是最普遍的情况,因为实际情况太过复杂,连完整的问题都经常难以定义,所以这种办法很简单可行。不过也存在很多局限性,就是虽然找到了一种解决思路,但经常还可能存在更好的办法。通常来说贪婪算法适合于对于解决时间有要求,但不要求最优解的情况,找到大致可行的解决方案即可,是不是很现实的感觉?

四、生活中的算法

综上可以发现,算法不是万能的,人生不可能靠算法来解决,但是可以利用算法让人生过得更好,举几个例子。

谷歌的搜索排序算法,PageRank为代表的,大幅提高了普通人在庞大的互联网世界中寻找需要的信息的效率。谷歌的算法帝国演化到现在已经非常庞大且复杂,现在已经融合了非常多的深度学习和强化学习方法,这不今年连DeepMind都盈利了,因为DeepMind很多成果都用于谷歌的搜索、翻译等场景之中了。

地图导航中的路径规划算法,想当年在大城市里开车还要拿出地图,用手比划着找路,现如今各种导航软件都已经把道路信息化,然后利用路径规划算法给出各种可行的路径,时间最短、路程最短、红绿灯最少等等。

打车/外卖软件中的调度算法,打车软件中把车辆和乘客信息化之后,可以通过各种属性的匹配与计算,实现对车辆与乘客的快速匹配,可能是基于距离最近、信誉较好、积分最高等等,从而大幅提高供需的匹配效率,减少了传统的出租车路边扫活儿、餐馆电话订餐等方式的资源浪费。

更复杂的自动驾驶、工业机器人等场景中更是利用了非常复杂的算法模型,正在高速发展之中,就不一一列举了。

五、算法的未来

从算法本身的发展来看,整体上在向着解决越来越复杂问题的方向发展,即复杂性科学的范畴,以前科学技术研究的经典方式是把问题简化,简单到当下能够解决的程度,然后在逐步引入新的变量,再尝试解决。复杂性科学尝试着把以前认为几乎没有办法解决的更多变量引入研究问题,让人觉得很复杂,想不清楚怎么解决,从这个角度,复杂性科学也可以叫困难科学,难者因为不会,会者就不难了。就好像大家都觉得,人工智能领域的很多问题在没解决之前叫做人工智能,一旦解决之后就不是人工智能了,复杂性科学大概也是如此,没解决之前叫做复杂性科学,解决之后大概就是复杂性科学了。

计算本身是一种工具,没有好坏,伴随着巨大的算力设施、庞大的数据量发展,算法的能力正在快速发展,影响力也将极其深远,人类对其利用和管理的方式将会产生巨大的影响。

在这个信息化和智能化的时代里,孙子兵法中“多算胜,少算不胜”的思想将不是个人能够完成的了,人与计算机的合作将成为常态,就好像很多人现在开车都需要导航软件辅助一样,再也不用拿出地图一点点的寻找路线。

对于个人而言,多学点算法当然是很有用的,如果知道了一些问题存在最优解,那么可以拿来主义,我直接把最优解的方案用到我的问题中就可以了。尤其是现实中很多问题存在不确定性,比如一场比赛的输赢,虽然可以做最大的努力,但是中间仍然有非常多的不确定因素,或许是因为我们测量和计算的能力限制,也或许是根本无法预测的,所以在现有的条件下最最优解的努力,就算是一种不留遗憾的过程控制,结果很多时候都要交给时间。与此同时,还有一大类算法是来自于自然,也是一种非常智慧的算法,就是可行但未必最优解的一类算法,即启发式算法、近似解算法等,俗称摸着石头过河,或者叫改变我们自己能够控制的事情。因为很多现实问题极其复杂,在计算理论上并没有办法给出最优解,那么找到可行的办法就已经足够好了,学会向现实妥协,不是消极懈怠,而是明知不是最好的,也要做最大的努力。

算法并不是万能的,算法的输入来自于测量和编码,算法的计算需要算力的支撑,把每个人看成一个算力节点的话,那么个人已经远远比不上现在的超级计算机集群了,而且算法的执行还需要物理设备的配合,因此,也不要把算法神秘化,算法就是寻找问题解决方案的一种有效手段。但是问题的定义、解题的准备和答案的付诸实践都还是需要人类以及诸多因素的配合,而且这些过程都存在很高的复杂性,变数很大,都不是算法一定能够解决好的,至少目前的算法能力还很有限。

一点关于算法习的粗浅认识,班门弄斧,如果觉得还行,请给咱们支持一下吧,点赞、分享、收藏各种走起,在此多谢啦!

交流合作

请加微信号:yan_kylin_phenix注明姓名+单位+从业方向+地点,非诚勿扰。

7a6900ab1f70d10ae27ac41b14e19537.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值