2010年4月21日 星期三

[Note]Ray Tracing with Haskell using package:parallel

[草記=只是暫時紀錄,整篇會重寫]


這兩天都在弄ray tracing的事情
找了好幾個C/C++版本的code來參考
不過, 幾乎是看沒有懂
最後當然還是決定投靠haskell, XD

找了幾個版本的範例程式
其中一個用gtk作ui
這個版本暫時擱置
因為我gtk一直怪怪的,跑不出東西 Orz

另一個是平行版本

剩下一個是這個這個

除了gtk那個, 剩下都是直接輸出ppm檔
所以沒有parallel的那兩個都不需要特別題什麼
而且他們也沒有import什麼package進來
簡直就是一整個貼心 XD

parallel那個就囧了
一開始compile一直說 parse error
所以把L49和L5?的兩個"!"給砍了
然後就發現package有問題
所以灌了 AC-vector 1.2.2 和 parallel-2.2.0.1
compile以後, 還是有問題
他說*<>沒定義而且*|重複定義...
弄了好一會兒以後發現
因為原作者是用AC-vector 1.1.1
而AC-vector每次改版都大改... @@
所以又用 ghc-pkg hide AC-Vector-1.2.2
把新版的AC-vector disable掉
一番折騰之後
終於ok了
但是跑一下發現, CPU 只吃了50% @@
所以想說該不會是因為沒有開ghc的選項
所以找了一下以前的資料
在ghc --make ....... 後面加上一個「-threaded」
然後跑程式的時候加上 +SRT -N2 的選項
e.g. ./ray4-hs 5 50 +RTS -N2 > out.ppm
btw, parallel這個程式需要兩個參數, 遞迴的次數 和 邊長

而David J. King的那個版本則是>./ray 500 > out.ppm
500也是邊長參數

ps - .ppm閱讀 :
有人推薦xv, 不過因為它是x window所以難用
最後我裝了ToyViewer
雖說有一點點鈍鈍的
但是目前還不錯用

2010年4月9日 星期五

[Temp]Parallel Functional Programming

http://www.mathematik.uni-marburg.de/~eden/
資料蠻多的
值得一試

2010年4月8日 星期四

[AI]Learning categories in neural network

今天終於釐清了兩年前遇到的問題:程式在做參數式學習的時候都會需要根據已知的情況去調整參數向量,但是應該要「看完整本書在學起來?」還是「看完一段就學一次?」這一直是當時在實作Perceptron的時候卡到的小疑惑。不過那時候不是很熟悉整個情況,所以也說不出個很顯著的所以然來。最後是根據給定的演算法去做。

今天又遇到這個問題了,不過這次有比較清楚的腦海地圖了。

舉個例子來解釋:假設今天某個classify system吃3個參數作為input,所以該system應該具有一個weight vector長做這樣:

並且我們有三個classified instance:




而每一次W(weight vector)乘上(inner product)其中一個X(input instance(again, it is a vector))然後產生一個O(output),並且我們已知該instance X具有一個正確的結果T。根據某個函數f(T-O), 我們可以得到∆W:「W目前應該更新的程度值」。舉例如下:

這表示產生出來的∆W的意思是「僅需要更新bias值」。

但是這裡就有個問題了,因為大多的learning model都會需要一再的對整個instance space去做運算。所以到底是每看完一筆instance就更新?

還是看完整個instance space以後再去更新?


前面這種稱為針對資料做逐一學習的方法稱為:Incremental Learning,而相對地,對全部資料作一次性的學習稱為:Batch Learning

另Batch Learning a.k.a. Epoch Learning
而Incremental Learning則又被稱為
1. Pattern Learning
2. Instantaneous Learning

不過Pattern Learning會容易和Pattern Recognition產生混淆,而Instantaneous Learning容易造成「以為learning的行為是instantaneously」的誤會。所以兩者現在都已經不常使用了。