Real World Annotator

Machine Learning, Statistics, Finance, and Everyday Life.

機械学習初学者がつまずく理由

機械学習は正直難しい(こういうと物理屋さんとか数学屋さんに怒られるかもしれないけど). 機械学習を勉強して4年経っても未だに難しいと思う. ただここ最近,何で難しく思えるのだろうか,そしてそもそもどういうポイントで躓くのかについて,なんとなく考えてみたので,ここで書いていきたいと思う.

記法の非統一性

勉強する本によって記法が統一的でないことが多々ある. もちろん同じことであっても違う本・違う著者で違う文字を置く,というのはしょうがない部分であるかもしれない. バックグラウンドの異なる著者が自分の慣習,そして何かしらの意図をもって置いているのだから. 時間をかけ,慣れればそう大きな問題ではない. しかし,やはり初学者にとってその対応関係を見抜くのは至難の技である. まだ機械学習をはじめて間もなかった筆者はかつて次のような記述をとある本*1で読んだ:

(前略)入力ベクトル$\bm{x}$と対応する目標変数$t$があり,出力変数$t$はクラス$C_k$のいずれかを表す.(中略)与えられた$\bm{x}$に対し,各クラスの事後確率 $$ p(C_k | \bm{x}) $$ を求めたい.(後略)

また次のような記述もよく見かける:

(前略)ここで,データ$\bm{x}$に対応するラベルを$y$とおき,データ$\bm{x}$のラベルが$y$である確率を $$ p(y | \bm{x}) $$ とする.(後略)

そのとき筆者は考えた. 「ラベル?クラス?これらは異なるものなのだろうか.まあ$C_k$と$y$と文字も違うし,別物なのかな?」と. しかしそのあとの議論はほぼ同じ展開. 「???」が頭の中をよぎる. よう分からんので,ネットで調べるとMulticlassとMultilabelは全く別のタスクであることが分かった. 「じゃあやっぱり違うのか...!?」 さらに調べると$y$を「訓練出力」などと呼んでいる本もあった.

こうやって筆者は記法や名称の果てしない迷宮の中に彷徨いこんでしまった. このような本による記法の差は間違いなく初心者の心をくじけさせる要因になっていると思う.

ではどうすれば良いのか. 正直,本の著者達が出版する前に一回名称や記法を統一する会を開くのが最も良い. しかし,これはあまりにも非現実的である. 結局この点に関して初心者ができることがあるとすれば,身の回りに機械学習の詳しい人にたくさん聞くことくらいだろうか.

うーん,もう少し良い方法がないだろうか...

様々な「流派」の本の出回り

これは前節と似たような話かもしれないが,それぞれの本にはそれぞれの「流派」がある. 例えばかの有名な「パターン認識機械学習(PRML)」の著者であるBishopさんは典型的なベイズ論者だ. ゆえにPRMLの中身はかなりベイズに偏っている. PRMLは今や機械学習界の名著であり,輪読会なども各地で行われているが,この一冊を通読することは果たして本当に有意義なのかは筆者は疑問である. 特に初心者にとって最も重要なのは「どのような問題設定があるのか」「どのような手法があるのか」を知ることなので,特定の流派に偏った本を通読するのはあまりいただけない.

そこで機械学習初心者に筆者がオススメしているのが「広く浅く」見ることである. 特定の本に縛られず,「つまみ食い」をした方が視野が広まるし,そっちの方が挫折しにくい. 「なんとなく」概要を掴んで,後日自分の興味のある部分について掘り下げた方が遥かに有意義である.

過度な省略

個人的にこれは今も苦しんでいる部分であるが,専門家による過度の省略が横行している気がする. その代表例が期待値だと思っている. さて,以下はとある本の記述なのだが,みなさんどう考えるだろうか: $$ \mathbb{E} [L(f(x), y)] $$ 初学者だった筆者「ふむふむ,なるほど,損失関数があって,それについての期待値をとるのね.簡単〜!」 しかし後日他の本でまた以下のような別の記述を見つけた: $$ \mathbb{E}_{p(y|x)} [L(f(x), y)] $$

この筆者はこう思った「あれ,そういえばこれって何についての期待値なのだろうか...」と. 上の式とその次の式の差は一体何だろうか.同じなのだろうか. それぞれの本の文脈的に照らし合わせると答えとしては1本目の式は$(x, y) \sim p(x, y)$と,$(x, y)$についての期待値であり,2本目の式は$x$を一つ固定し,$y \sim p(y|x)$についての期待値ということになる. 似たような式だが,それぞれが意味することは全く異なるのだ.

個人的に,期待値はこのように分かった気にさせるランキング1位の数学概念だと思っている. 大学入って間もない頃はその定義の簡単さから,さらっと勉強を終わらせてしまうが,いざ機械学習や統計の専門的な部分になってくると,途端に意味が不明瞭になってくる.

なぜこのような現象が起こるのか. 個人的には過度な省略が原因だと思っている. 期待値というのは確率変数ありきで,どの確率変数について期待値を取るかによって意味が全く異なってくる. 今でも論文読んでて,「これって何について期待値取ってるんだろう...」と迷うタイミングが多々ある. 個人的には $$ \mathbb{E}_{Y \sim p(Y|X=x)} [L(f(X), Y)], \ \mathbb{E}_{(X, Y) \sim p(X, Y)} [L(f(X), Y)] $$ とまで書いてもらうのがありがたいのだが,なんとかならないものだろうか... また,最適化問題における最適化変数の省略など,過度な省略由来のとっつきにくさも機械学習挫折の大きな一因になっている気がする.

範囲の広さ

機械学習を勉強する上で一体何の知識が必要なのだろうか. 最適化?確率?統計?線形代数微積分?だけで十分だろうか. 確かに,機械学習を勉強する上で線形代数などの比較的応用部分をいちいち勉強しなくては行けなくて大変... しかし,残念ながら機械学習は上の分野で収まるような甘い分野ではない. 今まで筆者が機械学習を勉強してきて,「これを勉強すれば良かったな...」と思える分野を列挙していくと:

うーん...最適化や確率などの「ベタな数学」以外にも色々な数学があるのかと感心. さらには物理とかも絡んできたりするのか... もちろんここまでくると機械学習上級者なのかもしれないが,やはり「最低限」として要求される知識が多いのは間違いない.

こればかりは「勉強する」こと以外に方法はない気がする. しかし,そこまで深くのめりこまず,「広く浅く」勉強することが大切な気がする.

アルゴリズムと実装との乖離

機械学習では様々なアルゴリズムが紹介されるが,いざ実装しようとすると案外難しい. 筆者が初めて実装しようとしたアルゴリズムSVMで,よく本やwebサイトなどで,

以下の最適化問題二次計画法を用いて解くことができる. $$ \begin{aligned} \min_{\bm{w}, \bm{\xi}}\ \frac{1}{2} || \bm{w} ||^2 + \lambda \sum_{i=1}^n \xi_i \ \ \ \mathrm{s.t.}\ \ \ \xi_i \geq 0,\ \ \ \xi_i \geq 1 - y_i(\bm{w}^\top \bm{x}_i + b)\ \ \ (i = 1,2,\ldots, n) \end{aligned} $$

と書いてある. 「二次計画法を用いて解くことができる」とあたかも簡単なように一言で書いてあるが,果たしてこれを見てすぐに実装できるのだろうか. ちなみに当時の筆者には無理でしたw これは機械学習には良くある話で,最後にさらっと「〜と解けば良い」と書いてあるが,そこが意外にハードルが高いことが多い. また数学的な部分をオブジェクト指向のコードに反映させるのも慣れが必要である(特にchainerやpytorchなどのディープラーニングフレームワークにおいて).

これに関しては,とにかく玄人の書いたコードをたくさん読むのがベストプラクティスだと思う. また,何がパッケージ化されてて何がパッケージ化されていないのかをある程度把握しておくのも大切である(例えば,上の二次計画問題であればCVXOPTなどのパッケージがあるのでそれを利用するなど).

まとめとメッセージ

以上若干愚痴の部分もあったが,筆者が思った機械学習の挫折するポイントとその原因分析である. 以下は筆者が機械学習初心者に向けたメッセージである:

  1. 機械学習は難しい・深いことを認識せよ.ネット上では「カンタン」などと謳う記事が横行しているが,甘い心構えだと「返り討ち」になる可能性が高い.やるからには腰を据えて構えるべし.
  2. 機械学習について詳しい友人を味方につけること.特に初心者は勉強していくうちにたくさんの疑問が生じるので,それを解決してくれる良い仲間を手に入れると勉強が捗る.
  3. 広く浅く.分からなければ飛ばしてよし.人に聞いても良く分からない場合だってある.そしたら思い切って飛ばせば良い.色々なことを勉強した後に読み返すと意味が分かることだってたくさんある.
  4. 細かい手法の部分よりも手法ごとの長所短所を意識せよ.初心者はすべてを「すごい」と思いがちだが,物事には全て表と裏がある.その両方を知ってる人の方が後々強い.
  5. 実際に手を動かして自分の手で実装してみること.実装することで見えてくることも多い.他の人の実装を見て・真似て・実装することで,アルゴリズムだけでなく,実装スキルも向上させよ.

niltatsu