任何學電腦的人,都必需學編程,而編程則必須掌握處理數據的方法,這稱之為 Algorithm,中文譯作「算法」(不是計「算」,應作盤「算」之謂)。入門的算法不難,掌握幾套典型純熟運用便可,較進取的則嘗試優化個別算法的運行表現。那麼,進階的算法學習甚麼呢?答案是,如何處理現行算法都無法解決的問題!
「無得解」問題並不罕有
原來,不少情況不但沒有人想得出簡明有效的處理方法,更甚者,個別問題已被證明根本是不可能有便捷的解決辦法的;通常這些問題數目稍大,所需計算量便激增,如是者投入更大量的運算能力,問題也無法解決。70年代,電腦理論界不少的精力都花在鑒定這類型「無得解」的問題,發現大量例子,情況一度令人擔心,因為這類問題本身又是在應用情況中常常遇到。一個例子是所謂「背包問題」,假設某人有一個固定容量的背包,有很多不同大小和價值的東西要放進去,他要把總數達到某一價值的東西收入內,而不能超越背包體積的容量。這問題已證明沒有便捷的解決方案。
但這困難卻沒有窒礙算法研究的發展,反而提供有用的研究目標。若然無法獲得完整的算法,那可否設定一些約略的算法,這就促成90年代以來日漸成熟的所謂 approximation algorithm (近似算法)的發展,目標在於把問題解決達致某一程度的準繩,雖然並非十全十美,但卻不失為實際可行的方案。因為這些問題往往跟成本有關,就是不能得出「賺到盡」的方案,這些算法仍然能算得出究竟少賺了多少,於是可以把這負數分擔。
算法應用層面廣泛
一個國家或公司擁有對算法的知識,能夠有效解決其他人未能解決的問題,那當然對競爭有利。如果技術就是我們對環境開發的掌握,算法也是技術的一種。以技術為基礎,可以發展創新的企業,這是我們所應大力鼓勵的。我們日常所聽聞的創新,好像別人搞網上打的,我們亦搞,這些只能稱之為一個項目。真正的創新,必須是社會關係的改造,而這每每建基於技術的突破。
談到電腦學中的算法,我說算法也是一種技術,能愈高競爭力必然愈強。舉幾個應用的例子。例如數碼相機,可以自動辨別人臉,甚至鎖定人物焦點,這內中就是一個算法,鏡頭傳入來的景象數碼轉化後,存儲在記憶體的矩陣,那裏的數據相等於人臉,這必定有程序計算出來。2000年代初期,掌握這計算方法,做出來的產品,必然比人優勝。
幾年前,我在歐洲見到一個產品,用特製的筆在紙張上書寫,寫成的每頁內容自動存儲入電腦之內。這種筆是特製的,在筆尖有一個小型鏡頭,這不難,但這不足以把手寫的內容全然記錄,還有一個關鍵的算法。原來,雖然只是普通印刷的紙張,但印有特別設計的網點;這網點並非平均分布,而是按一定的規律變化,每個範圍的形狀不同,亦不重複。這樣的網點圖型全部開展出來,據說面積幾近足球場那麼大,因此印在A5的拍紙簿上,每頁都不重複,筆上的鏡頭便可轉化為電子筆跡。這是北歐一家公司的發明,關鍵在於生產這種網點的算式(大概是一個周期很長的函數)。當然,怎樣把技術變為成功的產品那是另一回事。
90年代初,一個成功的例子是華人社會趨之若騖的中文手寫板。用者以筆桿寫在觸感板上,筆觸化為點陣數據,怎樣計算出每一筆跡最近似的中文字呢?這屬於 machine learning 的題目,現在看來沒有多大的困難,打開教科書都大概找到答案,但20年前這還是較尖端的算法問題,當時台灣的業者比較掌握這個算法,推出的產品結果風行華人地區(特別是香港,原來香港人的輸入法最差,於是手寫板大賣)。
大數據與算法
近年盛行的大數據亦極需算法的開發。所謂大數據,當然不只是雲端上儲存一大堆數據,真正的目的是發掘內中的知識,以轉化為行動。例如網上的電影租賃,假如我們已知用者的一些動向,例如在那裏消費、購物內容等,能否推斷那部電影最合適?若然配合用者的朋友資料,推斷的機率可提升,但又能否在有限的時間內完成運算?凡此等等,都是現時電腦學研究十分活躍的題目。美國 IEEE學會每年辦有名為 KDD 的活動,內中設有這種算法的比賽,採用真實的大數據,要成功奪標必須算法(理論)和程式(實踐)的能力兼具。
美國在911之後動員大量人力物力進行反恐,相信是促進大數據研究的一個動力。若然大量的數據能推算用者對電影的喜好,那麼同樣的方法能否找出潛伏的敵人?不過,並非每一個電腦學者都願意參與這方面對開發。情況令人想起40年代的物理學界,並非所有人都願意參加原子彈的開發。日後出現所謂 concerned scientist(科學家關注社會)的聲音,反思技術應用的目的和後果。
原刊於《信報》網站,獲作者授權轉載。