看到這篇《The Only Truly Failed Project》,其中有兩段話寫得很棒:
Failure is a wonderful teacher. But there’s no need to seek out failure. It will find you.
The only truly failed project is the one where you didn’t learn anything along the way.
最近觀察不少數據和實驗結果,推翻之前許多猜想,不過我沒有像碩士做研究時那般痛苦,反而有些興奮。大概是因為沒有發論文的壓力吧,加上先前讀過費曼的言論,覺得這是理所當然的情況,我們知道得本來就很少,想法通常也是錯的。然而,重點在於如何從錯誤的嘗試中學習?
昨天晚上不斷思索這堆錯誤的嘗試告訴我什麼,仍未有定論。忽然想到愛迪生的話,當他實驗千種材料失敗後,他說,至少我明白這千種材料不能作為燈炮的材料。
於是心裡又更踏實了。但這不表示可以隨意的嘗試,在沒有有效的驗證方式之前,無謂的嘗試無法提供任何訊息。
印象中費曼提過,他不和人討論無法驗證的想法,那是沒有意義的行為。提出猜想後,我會思考如何驗證。直到有辦法進行驗證前,我會先保留想法,改試別的作法。或是將原問題先拆成幾個小問題,讓小問題能夠被驗證。待各個擊破搜集到一些資訊後,再回頭看是否能驗證原本的想法。
能夠驗證的想法,才能從中學習。不然結果出來後,我們無從判斷結果有多接近目標,自然也無法從中學習,進而做修正。舉例來說,如果要做 AI 下棋的搜尋,要怎麼知道目前的策略有效?和人下棋是個辦法,可是沒有無法頻覆進行,也就不能確保方法的可靠程度。另一方面,光看評估盤面函式的輸出值也無用,沒法確認分數高確實是有利的盤面。
換個想法,提兩個策略,互相對戰。至少可以確定每次都贏的策略,是相對來說較好的策略。一個策略可以用 greedy algorithm,另一個用自己想的特別方式。雖然我們預期特別的方法會贏,但若結果相反,也能從中明白新東西:像是 greedy algorithm 比想像中的有效,可從中找到好點子;或是特別的方法不如預期地有效,也就不用再和人下棋,減少後續測試的成本。若擔心兩個方法自動對戰變化有限,可以引用不同棋譜的中盤局面,再引入兩個方法擔任不同角色,觀察好的方法是否在各種相同局面裡,無論擔任那一方,都能下得較好。
再舉解魔術方塊的例子。為了能夠驗證,可以先將解好的盤面一步步弄亂,記下正確的還原步驟和所需步數。準備好多組測試盤面(即最後弄亂的樣子),測試演算法解的效果,步數和預期步數相差多少?那一步發展變得不同?於是有確實的數據可以分析,明白問題出在那。有未知的大進步時(只花了預期的一半步數),也方便觀察出原因(如弄亂盤面時做了不當的重覆操作),不會不小心高估方法的成效。
看起來理所當然的事,沒想到我這麼遲才明白,驗證是如此的重要。而這個觀點卻是從 coding 那邊先萌芽,才接著在研究這邊確實實行。不論是研究還是coding,我認為重要性是: 需求 (動機) > 驗證 > 想法 (解法) > 實作。如《管理是什麼》書裡提到,管理即為客戶創造價值 -- 相當含糊的定義,可是卻非常精闢。不論是研究還是寫程式,也要先確保能滿足某種需求,之後的發展才有意義。接著,在天馬行空地想解法前,先確保有方法驗證方法的好壞、達到目標的程度、有辦法分析結果,之後才能確實地落實想法。於是,即使失敗仍能有所收獲。
2009-09-06 Update
經 LCamel 一提,發現英文的用詞很有趣,Verification and Validation 裡這麼解釋:
It is sometimes said that validation can be expressed by the query “Are you building the right thing?” and verification by “Are you building the thing right?” “Building the right thing” refers back to the user’s needs, while “building it right” checks that the specifications be correctly implemented by the system.
意即:
- 滿足需求 = validation = do the right thing.
- 驗證作法 = verification = do the thing right.
語言真是奇妙啊,用一句話來總結,就是「Are the do you right thing right?」
沒有留言:
張貼留言