在IC DoC的第一個學期

在帝國的第一個學期算是結束了, 收穫頗豐.

因為第一個學期主要還是很多入門課, 前半學期編程教了Haskell, 無奈因為之間寫過一點Scala和SML的緣故Haskell學起來並沒有想像中困難. 大概理解了Monad, 然而遺憾的是課上沒有太多的擴展, 打算接下來自己研究一下Monadic Parser以及Applicative, 爭取可以寫一些有實際價值的程序來鞏固概念.

這學期去上了大二的Compiler, 然後自己也用OCaml寫了這門課的Lab (我們學校要求實現一個叫做WACC的語言, 本來是一個Group Project但是我簡化了一些實現的細節同時用了LLVM, 於是一個人做完了.) Compiler裡面很多概念我覺得放到其他的領域都很實用. 特別是Dataflow Analysis的部分其實可以啟發做一些類似於簡化dependency graph的東西 (比方說Apache Spark裡面的RDD dependency graph). 很遺憾的這門課對於後端的優化感覺講的還不夠深, 也沒有碰SSA這些現代編譯器離不開的基本概念. 希望以後可以去上Advanced Compiler然後深入了解這方面.

另一方面我的大部分精力還是放在了Machine Learning上面. 本來說今年還想試著完成之前Synergy Graph的Continuation, 但是出現了意外沒有拿到學校的cluster usage permission. 不過最近了解到DoC有Condor這種神器可以用. 打算利用這個假期改Hill Climbing部分的代碼實現平行化. 在此之前需要了解如何使用BLAS/LAPACK, 希望這個假期有所進展.

這個學期還寫了一個小的Chess AI, 利用這個小項目的兩周時間粗略的了解了增強學習這個領域. 算是能夠理解所謂的Deep Reinforcement Learning (DRL) 和傳統的Q-Learning之間的區別. 我的學習方式是先從之前DeepMind來我們學校介紹他們做的Deep Reinforcement Learning的講座為線索往前推(slides 在這裡), 讓後往前追溯先是看了Mitchell講Q-Learning的部分, 然後粗略的看了TD-Gammon的論文 (主要是想看如何有神經網路來做TD-Lambda), 然後翻看了Sutton Reinforcement Learning的前幾章. 大部分的著作都提到了Watkins但是我沒有繼續深究下去了.

我在嘗試用RL來擴展我的Minimax AI的evaluation heuristic的時候曾經想用NN來實現其中的function approximator. 無奈的是NN在優化的時候不能保證Bellman Equation的收斂. 嘗試了用Monte Carlo Sampling來做Q-Learning, 但是8*8的棋盤太大因此即便trial number很高的時候整個search space的sampling還是很sparse. 這個地方衍生出來的一個engineering challenge是如何保存一個這麼大的search space. 我hack了一個最簡單的Java ConcurrentHashmap實現但是並不好用. 最理想的是類似一個像parameter server的東西. 這樣的話問題就轉化成了為了追求performance在非同步條件下證明Bellman Equation是否仍然收斂的問題. 數學不好暫時沒有深究這部分的細節. (最後我就用一個半吊子Minimax去參加系裡的比賽, 竟然還拿了第四, 還好沒人深究我做了GC Tuning以及repo裡面那一堆奇怪的RewardServer, SqliteRewardServer, HashMapRewardServer的奇怪的類 >_< )

下個學期估計仍然會將主要精力放在機器學習上面. 主要會考慮上Statistical Inference and Machine Learning 以及 Advanced Machine Learning. 如果還有時間的話就研究Pintos和xv6. 還想做一些分散式系統的研究然後自己寫一個類似parameter server的東西. 分散式系統學習的主要的參考對象是MIT 6.824, 目前讀到了GFS的論文.

感覺大學提供的平台是之前的環境給不了的, 遂要好好珍惜.

推薦閱讀:

計算機專業學子將一統天下!還不快膜拜!
2016---我的書單
火柴人是什麼?
調試程序時,設置斷點的原理是什麼?
怎樣學好計算機?

TAG:計算機 | 機器學習 |