2008年4月20日 星期日

小強學程式設計

一個開心的事情,記一下。

以前在魔力認識的小強,認識他的時候他還是國小,那個時候大家都知道我寫程式,小強有一天跟我說他想要學程式,我開了一本書給他,他也真的去找了書來看,不過找書的過程非常的辛苦就是,就是他住的地方不知道是太偏僻還是怎樣的,像是金石堂那種書店是完全沒有,他必須先訂書,而且能買到的書還很有限,最後他終於買到一本 C++ 的書了(C++ 其實不適合初學者寫,但是沒辦法,這個語言我最熟,也是我唯一敢「教人」的語言,如果他在學習的過程上出現問題,那我一定可以解決),但是不是我開的那本,一開始我是沒有很開心,因為覺得一本好書對初學者來說很重要,要是選到不好的書,真的會差很多,但是現在比較能理解他那個時候其實也才多小,買不到書也很正常。

他也就開始看了,他學習的過程可以說是蠻辛苦的。

有的時候會在 MSN 問我問題,其實有的時候我正在忙,或是我可能心情不太好,不是很想回應,也有的時候我覺得他怎麼一個簡單的迴圈都要弄好久,就不是很開心,但是我還是耐著性子講完,很多時候我覺得這些東西照道理說書上會講的很清楚,我不懂為什麼有看書了還會問這些問題,或是不太理解為什麼學習的進度這麼慢。當然現在是知道他的課業真的很忙,沒有什麼時間再去學課外的東西。日子慢慢過去,其實我也忘記我教過他幾次了,我只是希望他趕快把基本的語法摸熟,然後體會用自己的程式去解決問題的感覺,並沒有想很遠說他以後會把程式寫的很好怎樣的。

小強前兩天丟我,跟我說他去參加了學校的程式設計初選。

哇!他現在已經是高中生了耶,而且還會去參加程式設計賽!當然題目都是不難的三秒題,但是會去參加程式設計比賽就是對程式有愛啦~聽到這件事情,其實就可以知道他以後有很大機會會把程式寫的很好,因為對程式的愛是把程式寫好的第一條件喔 ^^。看到他會去參加比賽,我就突然整個熱血都來了說,很想盡量教他我會的東西,我覺得只要稍微訓練一下,他就可以很輕鬆的在區域賽拿到名次,然後就可以參加全國比賽,這對保送是很有幫助的。唉,高中的時候沒有去參加程式設計比賽可是我很大的遺憾呢,難得小強有這個機會哩。話說小強給了我一個網址,說是他們老師在 google 論壇開的一個討論區(他有一個好老師),我也去申請加入了,可以的話想要盡量幫助小強,讓他能多從我這邊拿到一些東西。

好,重點,重點就是,我真的很感動,就是密寶說得那種「改變一個人的人生」的感覺,沒想到我也能改變別人的人生 ^^,雖然說還不一定啦,但是我覺得機會很大喔,希望小強以後也變成高手 ^^

2008年4月16日 星期三

語言分化,種族優越,利他

關於論文的東西,又有一線曙光了。

之前花了些時間,但是卻沒有抓到那個點,我一直不太清楚我的問題的關鍵點在於哪裡,雖然我知道應該有一個「動力」在促使語言分化,但是我一直去想的,都是「保持距離」這件事情,而不是「增加距離」這件事,但是我之前並沒有很清楚的區別這兩點,感覺上我就是一直搞錯點。上次中鎮來了,跟他聊過以後,他幫我點出這個地方,我覺得這是一個重要的事情,不過糟糕的是,在把問題釐清楚之後,真正的困難來了,就是我發現我對於這個分化的力量的來源,完全沒有想法,我不知道他是哪裡來的,不知道為什麼語言能夠這樣分化開來。我會這樣想:如果一個社會好好的,那他根本就沒有必要分化阿,為什麼語言會分開呢?沒有道理阿……

雖然 inspire 我的是 Axelrod 那篇關於種族優越的論文,但是其實昨才是第一次認真看完他,只能說有看有差,人真的要多唸書。我一邊看,一邊思考,仔細的在想這個過程當中本質上影響互助的關鍵在哪裡,但是更好玩的,剛我看到關於實驗結果的地方,他拿實驗結果來跟「完全沒有種族差別」的群體作比較,完全沒有種族差別的實驗其實結果很明顯,在 one-shoot prisoner's dilemma 裡面所有的人都會偏向背叛對方,也就是大家都是極度自私的人,這其實是很直覺的事情,但是讓我自己意外的是,我沒想到「多一個 marker」就會有這麼大的改變,就是說「有標籤」,竟然就是會比「沒標籤」的群體還要過的更好,顯然這個標籤給他們「有機會去對某些人好」而且這個對別人好的行為,是可以獲得回報的。這蠻神的,當然我也想過背後的原因,很明顯的,這個要成立,必須要有「區域性」這個要素來支援,不然是不可能演化出這種結果的。好,等等,這邊我要跟自己補充一下,如果是 iterated prisoner's dillema 的話,那其實不把 agnet 放到 2-D lattice 上面(沒有考慮空間的連續性)也沒有關係,一樣可以演化出利他行為。Axelrod 這個模擬的過程,其實很類似古早孫春在上課講到的東西(很感謝孫春在老師阿,上課講到的東西就是這邊的關鍵,不然我自己想不知道要想多久)也就是聖人跟聖徒的關係。聖人(利他者)在充滿壞人的環境下,其實是無法生存的,因為他肯定會被壞人吃得屍骨無存,但是當聖人被聖徒(選擇性利他主義者)所包圍保護起來的時候,其實就可以生存,因為聖徒對聖人來說,也是聖人,但是聖徒對壞人來說,就是壞人,這會形成一個保護層,把聖人跟壞人隔絕開來。上面講的這個,不管在 2-D lattice 的 iterated prisoner's dilemma 或是在種族優越意識模型裡面,都是共通的(果然學問到最後都是一樣阿~)。

好,現在我們知道「有區別」是一個可以形成「利他」的條件,因為選擇性利他主義者可以當作無條件利他主義者跟自私者的緩衝區,那麼,加上 game theory 的設定,只要我讓「利他」可以提高一個遊戲平均的生存優勢(講白話就是讓一個個體利他的時候,付出的成本低過被幫助者所獲得的好處,也就是設計一個「正和」遊戲),這樣我就可以演化出利他行為啦~

不過這只是其中一塊石頭,不是我的論文,我現在要想辦法基於這點上面,去演化我的群體,讓他們會「傾向去區分彼此」,如果我能做到這件事情,然後我再設定我的模型是以「語言」來當作區分彼此的的標籤,這樣他們就會傾向去讓彼此的語言有區隔,這個也就是我語言分化的動力來源了!不過我不是很確定我能不能設計出能演化出這樣結果的模型。這邊 note 一下想到的應該要具有的點:要做到的幾個點,首先,我的 agents 要放在 2-D lattice 上面,然後他們要具有區分對方語言是不是跟自己一樣(或是很類似,唷,這邊我可以用相似的程度來決定 agent 是不是要合作的機率?阿!不對!也可能對?我這邊要怎麼設計 encoding?)的能力,然後在區分的過程當中,這邊我要怎麼設計這些 agent 的顏色跟機制阿?顏色是要可以改變的嗎?有限的顏色還是無限的顏色?是可以後天學習的?還是先天決定,但是策略是可以變的?(策略不用可以變吧,因為策略不好的自然會死)這樣設計真的可以引導出最後大家都偏向「有差異」嗎?這邊講的真的好模糊喔,什麼叫做有差異阿?是「喜歡有差異」?還是有差異?我想應該是要「喜歡有差異」這樣才能把一個語言一分為二?這樣的話,我的 encoding 就要包含「喜歡有差異」跟「不喜歡有差異」兩種情形的可能性。這個 OK。可是這邊我還不是很清楚,怎樣的基因叫做「喜歡有差異」,恩,果然這個機制的設計還是問題,希望能想好這個點,這個應該就是目前最需要突破的關鍵吧。這邊又想到,如果 agents 都喜歡有差異,那會不會導致最後演化的結果是整個語言幾乎是完全散亂的?應該不會吧,但是也有可能,我不是很確定,我希望這個點可以在 agent 喜歡跟相似的人合作然後得到好處的這個現象底下被消除掉,會不會這麼順利?

假設以上都很順利好了,但是還有一個更麻煩的地方,那就是我要怎麼做出語言的分化樹?好像沒有辦法,目前看起來,即使以上一切順利,我也只能驅使語言分化,但是這跟要建出「語言分化樹」還真的是差蠻遠的,唉唉,傷腦筋,還是要把題目定小一點呢?定成「語言分化有助於群體生存」好了?這樣還可以間接跟 natural 那篇關於語言分化樹的 paper 佐證,但是就不像一開始計畫的是什麼直接的關係了……

2008年4月15日 星期二

Learning and Planning

最近繼續想到關於 learning 跟 planning 的差異(跟結合?)我想明白這兩個的「差異」到底在哪裡?因為這影響到我為什麼要採取 learning 或是 planning,而我認為這是釐清 learning 本質的關鍵,也就是說我應該什麼時後來用 learning,怎麼用 learning,learning 又能幫我做到什麼?

我在想,人類遇到問題的時候,到底都是怎麼解決的?雖然直覺上 learning 可以解決所有的問題,不過事實上人類的確是有使用 planning 在解決問題的,那哪些時候是人類會使用 planning 呢?我目前能想到的,是從我對 learning 的理解開始出發,learning 沒辦法做到太長遠的預測,應該說,今天根據 learning 來作決策的話,大部分所做出的決策,其實都只有考慮到很短暫的未來。有的狀況,只看但短暫未來是不足夠的,也許這種時候就需要 planning,但是話說回來了,事實上 learning 也可以解決需要長遠預測的問題,只是就是需要非常豐富的經驗,一點一點的在學習的過程當中,倒推回來,然後來決定現在的策略。

想到這邊,那我就很好奇,說到底,什麼問題都可以用 learning 解決,那 planning 要幹嘛?完全不用了?可是不對阿,因為我們真的有在用到 planning,邱中說:「人類的 learning 是用來累積 planning 所需要的資料庫。」我想這個說法差不多了,只是還有一些點沒點清楚,「既然 learning 就可以解決問題,我們又何必用 learning 來累積 planning 所需要的資料?我們根本不必用到 planning 阿~」我能想到的是:「有的時候,我們已經面對一個問題了,但是我還沒學過這個問題應該怎麼解決,也就是說,其實我還沒學到從目前的狀態怎麼到達目標的的那條 path,就是說我還沒有走過那條 path,所以我還不知道目前要做什麼」,像這種時候,大概我們就會開始進行 planning 的動作,嘗試著把中間這些我們不曾經歷過(或經歷不夠)的狀態給補齊。

我想到,當我們在進行 planning 的過程,每次我們走到一個新狀態,我們在思考下一步的動作的時候,其實也是評估各個可能性,然後選出比較好的解,不過我們怎麼知道哪些動作比較好?我們不知道,我們進行更深一層的搜索,一直重複這個過程,直到我們發現某個動作可以帶領我們到達某個我們熟悉的狀態,然後我們知道那個狀態是好的,這個時候我就會 back trace 回去,幫我這一連串的狀態都加分。

講到這裡,那其實跟 learning 的過程根本就很類似嘛,只是這一連串的動作是在「腦中」虛擬的,模擬的進行。好,也就是說,learning 跟 planning 的差異是,今天我就要解決一個問題了,但是我還沒學過這個問題要怎麼解決,那我就在腦中模擬這個過程,模擬這個「學習的過程」,想到這裡我還蠻怕自己想錯的,因為我竟然認為 planning 跟 learning 本質上是一樣的東西,只是一個沒有真的去作,這跟我以前的想法還差蠻多的,不過我也很開心自己會有新的想法。
先不管對錯吧,讓我繼續往下想。

如果我想到這邊是對的,那 planning 的好處之一,就是你不用付出真正執行動作所需的代價,以我經濟學那部份的腦袋來舉例的話:一個投入經濟市場的人,在經過了大量的經驗以後,他會學到一些策略,然後會賺到很多錢。不過這樣做的缺點就是,你要投入市場,然後用錯誤嘗試的方法來學到經驗,這個過程非常的昂貴,因為你必須「真正的在市場當中採取那些可能會讓你賠錢的行為」,好,那如果一個人對市場,或是說對某個遊戲有基本的認識,可以在腦中模擬(進行推導以預測)所採取的動作對市場的影響,以及市場未來的走向的話,那麼他就不必真的付出這個成本,而可以擁有好的策略,只要他「在腦中學習」就可以了。

那人是不是一直都在學習?我的意思是說,當我們在做 planning 的時候,其實我們也是在學習嘛,但是 planning 似乎是針對某個特定問題的?嘗試往那邊前進的,learning 不一定有什麼 goal,只是想要找到在所有狀態下的最好的策略,這邊 inspire 我一點東西,就是 planning 找到的是不是最好的解?阿,這個先不管,我先寫下之前想到的,關於 learning 是用來解決具有 uncertainty,因為 planning 沒辦法解決這個問題,不過後來我發現這個想法不是完全正確,因為事實上人類也在用 planning 解決很多具有 uncertainty 的問題。我修正過的想法是,當 uncertainty 比較高的時候,learning 就比 planning 更適用,但是後來發現還是不太對,有的時候我們就是需要解決問題,而這個問題可能是有高度隨機性的,但是我們依然可以找出「比較」好的策略不是嗎?頂多就是在這個 planning 的過程當中,我們用了更多的成本去作更多可能的分支的搜索跟評估。這邊 note 一下我的點在於「planning 也可以解決具有不確定性的問題,所以 learning 跟 planning 的關鍵差異不在這邊」好,回到剛剛說的 planning 不一定找到最好解,可能只是足夠好的,其實我真正想要講的是「當我們時間很多的時候,我們總可以用 learning 找到最佳解」。ㄟ,不過這好像也不是完全正確,應該說,如果我用 learning,那我可以用很多時間去把每一個狀態都求好,但是用到 planning 的時機,就是我現在就要解決一個特別的問題,我沒這麼多時間可以去算了,我要「攻克」這個問題,我要攻擊這個點!好!就是剛剛冒出來的新想法,寫這麼多就是希望把自己的思緒過程保留下來,我剛剛想到的新想法是:「planning 的重點在於,我要在有限的時間(僅能付出有限的成本)之內,要解決這個問題,那我就要在短短的時間之內,學習(現實或是模擬)怎麼解決這個問題。也就是,接下來我要探索的,我要評估的狀態,要盡可能的落在我目前的狀態跟我的目標之間,如果我能夠趕快找到一條 path(或是在具有不確定性狀態空間裡面的某一片具有足夠高的 accessibility 的區域)連通我目前的狀態跟我的目標,那我這個 planning 就完成了!」

恩,所以我的系統應該是這樣運作:當我沒有特定目標(或是目標緊急性不高)的時候,我的系統會進行類似隨機的嘗試,過著很正常的生活,不會刻意要求出某些特定狀態跟動作的分數,但是當系統遇到一個就要解決的問題,系統就會嘗試著把心思放在那些比較有可能是答案 path 的狀態上,嘗試把這些 path 的值都補滿(做出足夠好的 evaluate)。

好,我現在釐清 learning 跟 planning 的差異了,那你前面說想弄清楚 leaning 能做什麼,你現在有什麼想法了嗎?我想一想……想到的是任何時候其實都在作 learning,而當遇到需要 planning 的時候,我們就把資源集中到那些特定的狀態上面去作 learning,找出 plan。等等,這樣其實也可以反過來說,怎麼說?也就是說,其實 learning 也可以被看作是「其實我們可以隨時隨地的在做 planning,然後一直把 plan library 存起來,存放在對應的 state 上面。只是當沒有急迫任務的時候,我們隨便找任務來解,當有特殊任務的時候,我們就專心解那個特殊任務。」

OK,那 learning 在這邊有什麼優勢嗎?特別以 reinforcement learning 來講(其實前面講的 learning 也都是講 reinforcement learning 而不是 NN 那種 classify 的問題)最大的好處就是處理不確定性,不過這樣的話,其實 planning 領域應該也有在不確定環境當中進行 planning 的研究,雖然我對 planning 不熟,不過我想應該是有的,所以說學問到最後都是互通的?我覺得好像 reinforcement learning 對於問題的泛用性比較好?我不確定,也許我應該以第一種想法為主,也就是以 reinforcement learning 為主要 paradigm ,然後當遇到問題的時候專注起來解決問題。

這邊想到兩件事寫下來,因為我快睡著了,寫下來免得自己忘記,一個是「如果是第一種 paradigm 的話,那當我遇到問題的時候,我要怎麼去鎖定我該把心思放在哪?我的意思是說,我怎麼去辨識哪些狀態比較可能在我要解決的問題的 path 上面?」初步想到的是把狀態向量拿來當作距離值,然後選一些距離目前狀態跟目標狀態比較近的狀態來評估。另一個問題是「怎麼學會更快?(還真是大哉問XD)」特別想到的是 transfer learning,因為之前接觸到的都是這些,所以想到的也是這些(不過我心中隱隱有個想法是「答案在 approximate reinforcement learning 上面」但是怎麼做到這件事情,目前還是完全沒有想法,因為最直覺的模型好像就是 SLP 或是 MLP,但是這兩個東西都已經被顯示不是很好……)

慢慢想……

好,睡覺,明天早上找要給小帥看的東西……