naoya_t@hatenablog

いわゆるチラシノウラであります

Coursera始めてみた

(see also: 今週のCoursera


そんなに楽しいものがあるというのならちょっと見てみようと思ってですね

Education for Everyone - Coursera

誰でもオンラインで大学教育が受けられる。

その手のものではOpenCourseWareが有名だけれど、どこを覗いてもあまり面白いなーと思うことがなかった。iTunes Uも同様。TechCrunch曰く「PDFを電子書籍だと言い張るような態度」とは言い得て妙である。
Courseraはどうだろう。トップページを見る限りでは

  • Stanford University
  • Princeton University
  • University of Michigan
  • University of Pennsylvania
  • University of California, Berkeley

辺りが参加している模様。講義内容も

  • Automata
  • Algorithms
  • Computer Vision
  • Cryptography
  • Social Network Analysis
  • Statistics
  • Game Theory
  • Basic Behavioral Neurology
  • Introduction to Finance
  • Greek and Roman Mythology
  • Introduction to Sociology
  • ...

コンピュータサイエンス系が多いが人文系のクラスもちらほら見られる。

Courseraの発音は「こーせら」みたいな感じかな。見た目はフランス語の動詞"courser"の単純未来3人称単数っぽいけど。

とりあえず何か講義を取ってみよう

まずはStanfordのAndrew Ng准教授のMachine Learningのクラスに参加してみた*1

  • 1本5分〜15分程度のビデオ数本で構成されている。(1週間分のビデオ分量は合計3時間弱)
    • 空き時間に少しずつ進められるし、この時間なら集中力も切れにくい。新しいアニメを第1話のAパートだけ試しに観てみる程度の気軽さ。
    • 講義は英語です みたいな残念な事もあるけど頑張る
    • スピード調整が出来る。0.25倍刻みで、スピードを変えると音質がいまいちなのとで、分かり切ってるところを早送り気味に観るには良いかなという感じ
    • クローズドキャプション(CC)、というか英語字幕がon/offできる。字幕の信憑性はイマイチ
  • ビデオの途中に理解確認のための4択程度のクイズがある(ビデオが停止し4択を選んで再開)
  • それとは別に復習テスト(Review Questions; 簡単な計算問題あり。満点を取れるまで何度でも*2どうぞ)とか、プログラミング演習(Programming Exercises; プログラムを書いて送信すると割とすぐに判定が出る*3)とかで理解度が測れる
  • 教科書の購入など不要(自己完結型)

馴染みのある分野だという事もあるが、この講義は分かりやすいと思う。
とりあえず第2週までのビデオ視聴と、復習テスト、プログラミング演習まで済ませたところ。

今のところ英語で何か書かされることも(喋らされることも)ないので何とかなってる感じだけれど今後どうなるのかな…

Octave推しのNg先生

ところで、Ng先生のクラスではプログラミング言語Octave*4が指定されている。

GNU Octave

Ng先生が言うようにRapid prototyping用言語として考えたときに、機械学習で必要な行列演算を数式のイメージからできるだけ近い形で記述できるMATLAB互換のOctaveは悪くないチョイスだと思う(GNUだし無料だし割と速い*5し)。日本でなら日本語が通るRの方が使い勝手も受けも良い気がする。とはいえこのクラスのプログラミング演習のシステムがOctaveを前提としているのでまあとりあえずインストール。使ったことないし。

「それNumPyで出来るよ」「それRで」「それEigenで」「それLis(ry」とか言いたい人も多いと思うけれど、Octaveで動くのを確認してからPythonなりC++なりJavaなりで実装すればいいじゃん的な。全くその通りだと思う。数式、というか行列式をプログラムに翻訳するのに必要な脳クロック数は(少なくとも学習段階では)少なければ少ないほうがいい。かつてPRMLを読みながらSchemeで行列演算とか色々やってて(可能か不可能かでいえばもちろん可能ですよ。Lispは神の言語ですから)さすがに時間がもったいない気がしていた。Python+NumPy+SciPy+Matplotlib、とか個人的には好きだけれど

array([[1,  2,  3,  4],
       [5,  6,  7,  8],
       [9, 10, 11, 12]])

って書くより

[1 2 3 4;
 5 6 7 8;
 9 10 11 12]

って書けてそのまま使えた方が(少なくとも学習段階では)有難い。
皆さんお馴染みのw=(\phi^T\phi)^{-1}\phi^Tt*6もNumPyなら

import numpy
import numpy.linalg

w = solve(dot(PHI.T, PHI), dot(PHI.T), t))  # w = dot(dot(inv(dot(PHI.T, PHI), PHI.T), t)

と書く*7ところをOctaveなら

w = pinv(PHI' * PHI) * PHI' *t

で済む*8。Ng先生が"Because the Python, NumPy syntax is just slightly clunkier than the Octave syntax."とか言ってるのもまあその辺りの事かと。

数式をベクトル演算に翻訳し、Octaveのコードに落とす辺りの話も講義ビデオでカバーされていて有難い*9。■

*1:Ng先生はCourseraのfounderの1人です

*2:100回までらしい

*3:但し言語はOctave限定

*4:英語だとアクティヴ、みたいな発音に聞こえる

*5:Ng先生曰く

*6:PRML 3.15

*7:inv()よりsolve()の方が速いそうです

*8:逆行列が取れない場合があるのでinv()でなくpinv()を使うべしとのこと。Ng先生の講義ではパラメータにθを、design matrixにXを、targetにyを使っているためtheta=pinv(X'*X)*X'*y

*9:PRMLなんかでもAppendix辺りに@shuyoさんの「数式をnumpyに落としこむコツ」http://d.hatena.ne.jp/n_shuyo/20111117/machine_learning みたいな記事を載せるべきと思った