算法,天使还是魔鬼?
?隨著算法的誕生,智人似乎終于制造出了一種可以實(shí)現(xiàn)一切愿望的工具。?
如今,算法已經(jīng)無孔不入,我們的工作、社交、醫(yī)療、工業(yè)、運(yùn)輸、貿(mào)易無不有算法的重大參與。各種算法正改變著自然科學(xué)和人文科學(xué),讓技術(shù)不斷突破“不可能”的極限。
但是,算法也令人擔(dān)憂:
某些制造業(yè)消失了,歸根結(jié)底是算法摧毀了這些職業(yè);
保險(xiǎn)公司應(yīng)賠償事故中的受害者,然而一個(gè)“冷酷無情”的算法降低了賠償金額;
股市暴跌,算法是這場災(zāi)難的操盤手;
法律限制公民自由,政府用算法監(jiān)視我們;
在國際象棋或圍棋大賽上,算法擊敗了人類,機(jī)器很快將凌駕于我們之上。
算法,到底是天使還是魔鬼?我們?cè)谙硎芩惴◣Ыo我們魔力的同時(shí),為什么要指責(zé)算法帶來了磨難?因?yàn)樗惴ù騺y了我們?cè)镜牧?xí)慣?或許吧。但還有另一個(gè)原因:
人們經(jīng)常使用算法,卻不了解它們的本質(zhì)是什么,又是如何運(yùn)作的。
什么是算法?今天,我們邀請(qǐng)小伙伴們一起探究一下算法的本質(zhì)。
我
你好,機(jī)器人,請(qǐng)給我解釋一下什么是算法。
機(jī)器人
好的。但與此同時(shí),我還會(huì)告訴你算法、計(jì)算機(jī)和程序之間的聯(lián)系。
我
我知道。當(dāng)我們找到一種算法時(shí),需要將它寫成程序的形式,而我們對(duì)計(jì)算機(jī)的要求也不只是單純地為我們工作。
機(jī)器人
完全正確。
我
有了算法,一切皆有可能嗎?
機(jī)器人
并非如此……但是,無限的可能或許就是算法極具魅力的原因吧。
想理解什么是算法,我們要先設(shè)想一個(gè)場景。
幾千年前,一位祖先憑著他對(duì)已故祖母如何做面包的記憶,嘗試自己做面包。但是,他真的不知道該怎么做。他猶豫著,一開始先將麥仁放入沸水中,然后對(duì)自己說,這也許是個(gè)糟糕的想法。
這位祖先的困境,正是我們都會(huì)面臨的情況——遇到某一個(gè)問題,卻又不知道該如何解決。我們想著解決方法,去嘗試,反復(fù)探索實(shí)驗(yàn),順便有了一點(diǎn)點(diǎn)意外發(fā)現(xiàn),直至成功……或者失敗。
然而,真正的面包師并不是這樣做的。他們不會(huì)給每爐面包都重制一個(gè)烘焙食譜,因?yàn)樗麄円呀?jīng)掌握并牢記了面包的烘焙方法,擁有了面包食譜。
事實(shí)上,人類文明的發(fā)展不僅源于有些人的發(fā)明創(chuàng)造,也因?yàn)榱碛腥恕皬?fù)制”了這些發(fā)明,才使其得以改進(jìn)。
但是,我們忘卻了面包食譜的寶貴之處。首先,食譜降低了不確定性:多虧了它,面包師知道,除非突遭一場災(zāi)難,否則面包將會(huì)在晚餐時(shí)準(zhǔn)備好。有了這個(gè)食譜,不需要什么想象力或是天賦,任何人都可以做面包。就拿我們普通人來說,我們對(duì)面包烘焙沒有任何天賦,但仍可以從網(wǎng)頁上找到恰巴提的食譜,運(yùn)用適當(dāng)?shù)暮兔媪Χ?#xff0c;借助更富有想象力和才華的面包師們寫下的方法,做出面包。最終,這個(gè)食譜成為了人類遺產(chǎn)中的一部分,在幾千年的歷史長河中,代代相傳。
食譜就是一個(gè)算法,我們就此有了“算法”概念的初步定義:一個(gè)算法是解決一個(gè)問題的進(jìn)程。我們并不需要每次都發(fā)明一個(gè)解決方案。
從這個(gè)定義不難看出,自人類歷史初期,我們就一直在發(fā)明、使用和傳播著各種各樣的“算法”,用來烹飪、雕琢石器、釣魚、種植扁豆及小麥,等等。
Ⅰ 進(jìn)程和符號(hào)
有些算法與面包食譜不同,它們能解決書寫符號(hào)的問題,例如數(shù)字、字母等。算法匯集在一起,形成蘊(yùn)含不同含義的數(shù)目、詞語、句子及文本。
例如,二分查找算法的用途是在字典中搜索某個(gè)特定詞。二分查找法從字典中間開始查找,對(duì)比目標(biāo)詞與中間詞的位置,根據(jù)目標(biāo)詞位于中間詞的前或后,來選擇字典的前半部分或后半部分作為新字典,然后再用二分查找法繼續(xù)查找,以此類推,直到找到目標(biāo)詞為止。這一算法解決涉及一種書寫符號(hào)——字母的問題。還有一些算法可以實(shí)現(xiàn)加法、減法等,解決涉及另一種書寫符號(hào)——數(shù)字的問題。這類算法被稱為“符號(hào)算法”。
計(jì)算機(jī)科學(xué)家往往將“算法”一詞的含義限定為此類“符號(hào)算法”??紤]到這種限制,自然,我們就不能將算法的歷史追溯到文字發(fā)明之前了。然而,廣義上的算法概念其實(shí)與文字同樣古老。從迄今人類所發(fā)現(xiàn)的最古老的書面蹤跡表明,古代書吏已經(jīng)開始使用算法了,例如用于記賬的加法和乘法。文字可能就是因此而發(fā)明的。
Ⅱ 算法和數(shù)學(xué)
數(shù)學(xué)家們從很早便開始關(guān)注算法的設(shè)計(jì)了。比如,大約公元前300 年的歐幾里得算法可以計(jì)算兩個(gè)整數(shù)的最大公約數(shù)。
我們簡單說明一下。讀者若是在攀登數(shù)學(xué)高峰時(shí)感到吃力,大可以直接跳過這一段,或把以下內(nèi)容當(dāng)作一首深?yuàn)W的詩,盡量去理解。
一般來說,一個(gè)算法會(huì)在輸入端接收數(shù)據(jù),這些數(shù)據(jù)構(gòu)成了算法的參數(shù)。在歐幾里得算法中,輸入數(shù)據(jù)就是兩個(gè)不為零的整數(shù),設(shè)為a 和b,且a 大于b,例如a 等于471,b 等于90。通常,算法會(huì)在輸出端返回另一些數(shù)據(jù)。在歐幾里得算法中,輸出數(shù)據(jù)是一個(gè)整數(shù),即a 和b 的最大公約數(shù)。
將歐幾里得算法應(yīng)用在整數(shù)471 和90 上,即有:
用90 和21 替代471 和90,
然后用21 和6 替代,
接著用6 和3 替代,
再用3 替代,這時(shí)3 即為所求。
在上述例子中,算法的每一步都需要計(jì)算a 除以b 的余數(shù)r,隨后用被除數(shù)b 替代除數(shù)a,余數(shù)r 替代被除數(shù)b。因此,由471=5×9 + 21 可知,471 除以90 的余數(shù)為21。在第一步中,第一個(gè)數(shù)471 被90 替代,而第二個(gè)數(shù)90 則被余數(shù)21 替代,以此類推。但有一個(gè)例外:當(dāng)余數(shù)為0時(shí),就停止計(jì)算,且數(shù)b 即為最終結(jié)果。這種情況出現(xiàn)在上述例子中的最后一步:我們用6 除以3,余數(shù)為0,那么3 即為所求。
算法也是中世紀(jì)西方數(shù)學(xué)家所關(guān)注的核心問題。數(shù)學(xué)家們引進(jìn)了印度- 阿拉伯?dāng)?shù)字,以及與這種數(shù)字系統(tǒng)配套的算法。其中一本著作是通曉阿拉伯語的波斯數(shù)學(xué)家穆罕默德·穆薩·花拉子米在9 世紀(jì)撰寫的《印度計(jì)算法》(Algoritmi de numero indorum)一書。“花拉子米”(al-Khuwārizmī)一名源自作者的出生地花剌子模地區(qū),今屬烏茲別克斯坦。有文獻(xiàn)證明,自1230 年起,花拉子米這個(gè)名字就成了“算法”(algorithm)一詞的來源。
Ⅲ 用語言來表達(dá)
算法會(huì)自然而然地運(yùn)用到與數(shù)學(xué)有關(guān)的對(duì)象上。其實(shí),人類的一切活動(dòng)中都有算法的身影,算法概念涉及到方方面面。但我們要先解決一個(gè)關(guān)鍵問題:如何描述算法?
假設(shè)我們想從巴紐火車站到達(dá)位于卡尚鎮(zhèn)的巴黎薩克雷高等師范學(xué)院。幾十個(gè)學(xué)生和教師每天早上都走同一條道路:首先沿著杜邦皇家大道走,接著是布里昂城堡大道。在不知不覺中,他們可能就用到了算法——一種從火車站到校園的程序。
谷歌地圖提供了這個(gè)算法的圖形形式:
同時(shí)也有一個(gè)文本形式:
如果我們給一個(gè)大學(xué)生解釋這個(gè)算法,用一個(gè)簡明扼要的方式就能表達(dá)清楚,但如果要給一個(gè)小孩子解釋,就需要更詳盡的細(xì)節(jié)。因此,講解算法的方式是一個(gè)社會(huì)學(xué)問題,取決于談話對(duì)象和談話對(duì)象擁有的常識(shí)水平。
同樣,歐幾里得算法也可以用文字形式表達(dá):
計(jì)算a 除以b 的余數(shù)r,
當(dāng)r 不為0 時(shí),
用b 替代a,
用r 替代b,
繼續(xù)計(jì)算a 除以b 的余數(shù)r,
當(dāng)余數(shù)r 為0 時(shí),b 即為所求。
維基百科又提供了一種圖形表達(dá)式:
所以,一種算法可以有不同的語言表達(dá)形式。然而,有一種表達(dá)形式不依賴于語言。
一名學(xué)生沒睡醒就去了校園,走起路來晃晃蕩蕩,就像在夢(mèng)游,他運(yùn)行的這個(gè)隨機(jī)算法沒有任何語言表述。
還有一個(gè)例子能更好地說明這一令人困惑的現(xiàn)象。
螞蟻尋找食物時(shí),使用了非常復(fù)雜的算法,在空間里進(jìn)行定向。偵察蟻開始隨機(jī)瀏覽蟻穴四周。當(dāng)其中一只螞蟻發(fā)現(xiàn)食物的時(shí)候,便會(huì)在返回自己蟻群的一路上留下跟蹤信息素。受到跟蹤信息素的指引,其他路過此區(qū)域的螞蟻會(huì)沿著這條路徑前行。當(dāng)螞蟻帶著食物返回蟻穴時(shí),也會(huì)一路留下自己的跟蹤信息素,以增強(qiáng)軌跡信息。
如果有兩條路徑都能到達(dá)同一個(gè)食物源,那么在同一時(shí)間內(nèi),沿最短路徑行走的螞蟻往返蟻穴與食物之間的次數(shù)將比沿著長路徑走的螞蟻更多。于是,前者也會(huì)留下更多的跟蹤信息素。這時(shí),最短路徑的信息將會(huì)更強(qiáng),也越來越具有吸引力。跟蹤信息素是有揮發(fā)性的,如此一來,被冷落的最長路徑最終會(huì)消失。
蟻群利用一個(gè)復(fù)雜的算法確定了最短路徑。早在蟻學(xué)家用語言記下這種現(xiàn)象之前,螞蟻就很好地運(yùn)用了這個(gè)進(jìn)程。
確切地說,人與螞蟻之間的區(qū)別在于,我們會(huì)嘗試用語言表達(dá)、存儲(chǔ)、傳輸、理解和改進(jìn)算法。然而,我們有時(shí)也會(huì)用到不知該如何用語言表達(dá)的算法。比如,我們很容易就能辨認(rèn)出貓和狗,卻難以解釋是如何做到的:是計(jì)算腿和耳朵的數(shù)量呢?還是觀察頭的形狀或毛發(fā)的紋理呢?
我們的大腦和身體會(huì)用很多算法來思考、運(yùn)動(dòng)、做事,但不管是符號(hào)算法,還是其他算法,我們并不總知道如何解釋。
Ⅳ 指令序列之外
從巴紐火車站到高等師范學(xué)院的算法可以表示成一個(gè)包含四個(gè)基本動(dòng)作的邏輯序列:“取道東南方,向上朝著蘭斯街的杜邦皇家大道”“然后……”“接著……”“再然后……”。歐幾里得算法表達(dá)式中也出現(xiàn)了一些基本指令,比如賦值:“用b 替代a”。此外還有將這些指令封裝成邏輯序列的句法結(jié)構(gòu),比如“這樣做,然后那樣做”,以及循環(huán)體,比如“當(dāng)某條件為真時(shí),重復(fù)此操作”。我們還可以添加條件測試語句:“如果此條件為真,那么這樣做。”
這種方式聽起來有點(diǎn)不尋常。事實(shí)上,只要很少的句法結(jié)構(gòu),就足以表達(dá)所有的符號(hào)算法,例如上述四個(gè)句法結(jié)構(gòu):賦值、邏輯序列、循環(huán)體、條件測試語句。算法的寶貴之處并不在于其組成有多么復(fù)雜,而恰恰在于這種將幾個(gè)簡單成分封裝在一起的方式。
這就好比化學(xué)分子:數(shù)十億個(gè)化學(xué)分子組成了我們所熟知的幾十種化學(xué)元素;而這些化學(xué)元素本身僅由三種基本粒子——質(zhì)子、中子和電子組成。
然而,盡管構(gòu)建算法的基本元素在理論上非常充足,人們卻很少從頭開始構(gòu)建算法:算法往往由其他一些已知的算法構(gòu)成。例如,我們用算法描述了從巴紐地鐵快線站到高等師范學(xué)院的路線。如果我們現(xiàn)在想從盧森堡公園到達(dá)校園的話,那么一個(gè)簡單的算法就是:先乘坐地鐵快線從盧森堡站到巴紐站,然后再運(yùn)用先前的算法——這個(gè)算法被看成是一個(gè)整體。此時(shí),一個(gè)全新的算法就這樣形成了。我們并不清楚先前算法的細(xì)節(jié),而是把它視為一個(gè)新的基本指令。
Ⅴ 算法和數(shù)據(jù)
能夠解決符號(hào)信息問題的算法,更注重這些符號(hào)信息的呈現(xiàn)方式。例如,為了更好地執(zhí)行加減乘除運(yùn)算的算法,用阿拉伯?dāng)?shù)字形式的算式123 × 456,比寫成羅馬數(shù)字的算式CXXIII × CDLVI 更好。同樣,在字典中查找單詞,用字母表查找比用象形文字查找更簡單。
尋找從一個(gè)點(diǎn)到另一個(gè)點(diǎn)路徑的算法,同樣在意數(shù)據(jù)的表達(dá)形式。如果某個(gè)城市的地圖像照片一樣,一個(gè)像素接一個(gè)像素地被給出,那就很難找到想要的路徑。最好可以用綜合的方法去描述,比如整合各個(gè)十字路口,通過連接街道,賦予每一段路一個(gè)長度。這樣一來,與其費(fèi)力地從一個(gè)像素移動(dòng)到另一個(gè)像素,不如從一個(gè)十字路口跳到另一個(gè)十字路口的算法來得輕巧。
Ⅵ 算法的方法
已知的算法有很多,例如“分治法”“枚舉測試法”“貪心算法”“隨機(jī)算法”等。
“分治法”是把一個(gè)復(fù)雜的問題拆分成兩個(gè)較為簡單的子問題,進(jìn)而兩個(gè)子問題又可以分別拆分成另外兩個(gè)更簡單的子問題,以此類推。問題不斷被層層拆解。然后,子問題的解被逐層整合,構(gòu)成了原問題的解。高德納曾用過一個(gè)郵局分發(fā)信件的例子對(duì)“分治法”進(jìn)行了解釋:
信件根據(jù)不同城市區(qū)域被分進(jìn)不同的袋子里;每個(gè)郵遞員負(fù)責(zé)投遞一個(gè)區(qū)域的信件,對(duì)應(yīng)每棟樓,將自己負(fù)責(zé)的信件分裝進(jìn)更小的袋子;每個(gè)大樓管理員再將小袋子里的信件分發(fā)給對(duì)應(yīng)的公寓。
高德納
高德納(又譯唐納德·克努斯)生于1938 年,是著名的計(jì)算機(jī)科學(xué)家,也是現(xiàn)代算法的先驅(qū)之一。他的系列巨著《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》在計(jì)算機(jī)科學(xué)界享譽(yù)多年。
多年前,高德納對(duì)現(xiàn)有的數(shù)學(xué)文本處理工具感到不滿,于是創(chuàng)建了自己的工具TeX 和Metafont。如今,這兩個(gè)工具成為廣泛應(yīng)用的免費(fèi)軟件。
很多著名的算法都以他的姓氏命名,如克努斯- 莫里斯- 普拉特算法、羅賓遜- 申恩- 克努斯算法、克努斯-本迪克斯算法。
“枚舉測試法”列舉出待解決問題的所有可能解,然后逐一進(jìn)行檢驗(yàn),最后從中找出符合要求的解。舉個(gè)例子:
一位旅行推銷員必須依次訪問幾個(gè)不同城市拜訪客戶,他通常會(huì)尋找?guī)讉€(gè)城市之間的最短回路,來安排自己的旅程。尋找最短回路的算法旨在計(jì)算所有可能的回路。
例如有10 個(gè)客戶,依次拜訪10 個(gè)客戶共有3 628 800 種回路組合方式,分別計(jì)算每種組合方式的回路長度,然后選擇最短的那條。
當(dāng)枚舉測試法所需的計(jì)算量太大時(shí),使用“貪心算法”能夠找到一個(gè)合理的解決方案,使問題結(jié)果最優(yōu)化。
比如,當(dāng)旅行推銷員有20 位客戶要訪問時(shí),用枚舉測試法可能需要測試超過2 兆條可能的路線。與其這樣一個(gè)個(gè)枚舉,不如就地運(yùn)行另一個(gè)算法:推銷員每次都從當(dāng)前所在城市選擇去往距離自己最近的下一個(gè)城市,以此類推。
這個(gè)算法會(huì)選擇當(dāng)前最短距離作為計(jì)算的公里數(shù),而且,永不退回到曾經(jīng)選擇過的路線上。一般來說,貪心算法找到的解決方案可能不是最好的,但卻是“合理的”。
我們之前見過一個(gè)使用“隨機(jī)算法”的例子:為了找到食物,偵察蟻從隨機(jī)瀏覽蟻穴四周開始。同樣,許多其他算法也用到了隨機(jī)源。比如,“蒙特卡洛算法”能確定正方形內(nèi)一個(gè)復(fù)雜圖形的面積:在正方形中隨機(jī)抽取一個(gè)點(diǎn),就像扔飛鏢一樣,飛鏢落在哪個(gè)點(diǎn)就取哪個(gè)點(diǎn);大數(shù)定律告訴我們,這些點(diǎn)落入復(fù)雜圖形內(nèi)的頻率接近于復(fù)雜圖形面積和正方形面積之比。
Ⅶ 機(jī)器學(xué)習(xí)
我們要討論到的最后一個(gè)方法是“學(xué)習(xí)程序”。學(xué)習(xí)做面包、在字典中查找單詞,人類對(duì)此習(xí)以為常。但很多人可能想不到,算法也可以學(xué)習(xí)。就像面包師每天能從自己的工作中學(xué)習(xí)、提高一樣,算法也可以從重復(fù)相同的任務(wù)中學(xué)習(xí)、進(jìn)步。
音樂、視頻、圖書分享平臺(tái)上使用的“推薦算法”就是一種會(huì)學(xué)習(xí)的算法。系統(tǒng)程序會(huì)向用戶推薦:“如果你喜歡《亞瑟王》,那你應(yīng)當(dāng)也喜歡《彼得·格里姆斯》?!?/span>
提出這樣的推薦,系統(tǒng)并不是基于亨利·珀塞爾和本杰明·布里頓之間的聯(lián)系A(chǔ)。簡單地說,系統(tǒng)的判斷是基于對(duì)之前用戶的聽歌記錄的分析:事實(shí)上,那些聽過《亞瑟王》的用戶之中,確實(shí)有很多人也聽了《彼得·格里姆斯》;或者,算法嘗試尋找一些我們可能并不認(rèn)識(shí),但品味卻與我們接近的用戶。在這兩種情況下,算法學(xué)習(xí)、發(fā)現(xiàn)、統(tǒng)計(jì)了歌曲之間或者用戶之間的相似性。從這樣的學(xué)習(xí)程序出發(fā),算法可以預(yù)測用戶可能喜歡什么樣的音樂,并因此會(huì)忍不住收聽或者購買其他哪些作品。
這些會(huì)學(xué)習(xí)的算法有助于我們重新審視自身的學(xué)習(xí)方式。推薦算法既沒有認(rèn)識(shí)到珀塞爾和布里頓之間的聯(lián)系,也不需要擁有任何專業(yè)的音樂史知識(shí)。它只是對(duì)用戶的選擇進(jìn)行觀察,并從所見所聞中學(xué)習(xí)。事實(shí)上,這與一個(gè)孩子學(xué)習(xí)母語的過程沒什么兩樣——從觀察周圍說話的人開始,然后用大量時(shí)間去模仿,不需要理解語法、動(dòng)詞變位和動(dòng)賓搭配的問題。一個(gè)小孩知道應(yīng)該說“我去學(xué)?!?#xff0c;而不是說“我走學(xué)校”,卻無法解釋為什么。正如推薦算法會(huì)向用戶推薦本杰明·布里頓,卻不能解釋為什么用戶可能喜歡這個(gè)作曲家。
有些學(xué)習(xí)程序的問題很難解決。假如我們要識(shí)別物體,如一只狗、一只貓、一張桌子,等等。在一張圖像中,數(shù)據(jù)以像素的形式呈現(xiàn),通過統(tǒng)計(jì)分析圖像中的黑色或者藍(lán)色像素點(diǎn),很難區(qū)分這是一只狗還是一張桌子。這時(shí),必須使用更復(fù)雜的學(xué)習(xí)算法——深度學(xué)習(xí)算法。深度學(xué)習(xí)算法首先嘗試從圖像中找到直線、圓、爪子、腿、桌腳……然后再尋找越來越復(fù)雜的物體對(duì)象。
算法同樣也是逐步建立越來越抽象的圖像表達(dá),最終找到被識(shí)別的物體。難點(diǎn)是,算法如何知道需要識(shí)別哪一種元素?是爪子、腿,還是桌腳?沒關(guān)系,算法會(huì)通過自身的經(jīng)驗(yàn)進(jìn)行學(xué)習(xí)。例如,深度學(xué)習(xí)算法可以讓下圍棋的程序取得巨大進(jìn)步,打敗最優(yōu)秀的人類圍棋選手。
Ⅷ 寫在最后的話
算法自身是沒有任何企圖的,它們由人類設(shè)計(jì),我們希望算法是什么樣的,它們就會(huì)以什么樣的姿態(tài)呈現(xiàn)。
∑編輯?|?Gemini
來源 | 校苑數(shù)模
算法數(shù)學(xué)之美微信公眾號(hào)歡迎賜稿
稿件涉及數(shù)學(xué)、物理、算法、計(jì)算機(jī)、編程等相關(guān)領(lǐng)域,經(jīng)采用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
總結(jié)
以上是生活随笔為你收集整理的算法,天使还是魔鬼?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 21天早起计划,奖你1000+元!
- 下一篇: 改变世界的十位算法大师