機械学習学んでる

そういえば最近は、Coursera のMachine Learningのコースで機械学習の勉強してる。去年の秋くらいにも社内でこのコースの勉強会が開催されてたんだけど、その時は乗り遅れたので、最近はじまった回から参加することにした。チームのエンジニア何人かで細々とやってる。

まずは教師ありの分類手法を勉強していて、線形回帰、ロジスティック回帰と学んで今はニューラルネットワークを勉強するところまでやってきた。課題をやっていくと自然と手書き文字の自動認識とかできるようになっておもしろい。

↑ たしかに3。

数学をそこそこ使うけど、先生がとにかく丁寧におしえてくれるし、難しすぎるところは理解に支障がない程度にすっとばしてくれるので、まったくわからなくなって途方にくれるということがなくて穏やかな気持ちでいられる。

今日あったおもしろできごととしては、計算のベクトル化というのがあって、例えば、

X = [1,2,3,4,5]
Y = [6,7,8,9,10]

みたいな二つの列の同じindexの要素の積の和をもとめたいときに、素朴には

SUM = 0
for i = 1:5
  SUM = SUM + X(i) * Y(i)
end

とかやるんだけど、XとYを行列とみなすと以下のようにかける(`は行列の転置)。

SUM = X * Y'

こういうのを計算のベクトル化というらしい。工夫するともう少し複雑な計算をいっぺんにするのに使える。みためがおしゃれなだけではなくて、行列計算の最適化が結構効くようになるってのが良いみたい。

今日解いていた、ニューラルネットワークの学習の課題だとforを使った実装だと580秒くらいかかってたのが、ベクトル化した実装だと12秒になった。50倍くらいはやくなっていてすごい。プロセスの様子をみてたら、forの実装だとCPU一個しか使ってなかったのが、ベクトル化した実装だと複数のCPUを使ってた。なるほどな〜。