Goalist Developers Blog

機械学習・学ぶアルゴリズムの3つの大事な部分

チナパです! ちょっと久しぶりに機械学習に本格できるようになりましたので、大好きなところから始め、論文を読んでました。 そこで、皆さんにもシェアしたいのがありましてーーーここ!

A few useful things to know about machine learning - Pedro Domingos https://homes.cs.washington.edu/~pedrod/papers/cacm12.pdf

とシェアしたら、「英語のハードルが!!」と言われそうでしたので、こうして日本語でまとめます!(優しいでしょう?)

分類系の機械学習(分類器? 難しい日本語だな。クラシファイアの種類です!)に集中していますが、とりあえず始めましょう。

学ぶ者(アルゴリズムね)の3つの部分

f:id:c-pattamada:20190125203246p:plain
こんな感じです!

機械学習がとても大きな箱です。その中にあるそれぞれの手段、技術などはどう分担すればよいのでしょうかとずっと思っていたところで、この論文で綺麗にまとめられました。

「機械学習 = Deep Learning = Neural Network」と思う方(昔の私)もいるかもしれないが、実際はこんな感じです。

表現

分類器(クラシファイア君)を作るためには、コンピュータが理解できる言語で作られた何らかの形を選択する必要があります。これはクラシファイア君の「表現」と言われます。 ニューラルネットワークはもしかして一番有名な表現かもしれません、つまり

f:id:c-pattamada:20190125202443p:plain
ニューラルネットワーク

こんな感じの表現です。生のデータげ左に入って、複数のレイヤーでフィーチャーの関係を見つけ出して答えにたどり着くような表現です。

ニューラルネットワークの他に、以下のような決定木もよく使われます。

f:id:c-pattamada:20190125202544p:plain
決定木

こちらでは、順番の判断によって結論にたどり着きます。

それぞれは得意分野と弱点を持っています。なんでかというと、表現によって見つけられる答えが限られてきます。なぜなら、それぞれの表現には「仮説スペース」があるからです。仮説スペースに入っていない答えを見つけるのが不可能です(鍵を車に忘れている場合、いくら家に探しても見つからないでしょう?そういうものです。)

他の表現の例は

ナイブベイズ K-最近傍法 (kNN) SVM などなど。

機械学習は一般的にこの「表現」についてまとめられるのが多いですが、他の部分もとても大事です。

もう、表現について長く語りました。次に移しましょう。

評価

形がどうであれ、機械学習にはデータを利用して仮説を改善し、正しい答えに近づこうとするのが共通です。「改善」ができる前に、まずは現状況の良さ・悪さを把握しなければなりません。

場合によって「正答率」のが一番直感かもしれませんが ここ で書いたように、正答率は全てではありません。悪人判定しようとしながら、「99.99%の人は悪人でないから、とりあえず「悪人ではない」と言えば99.99%正解じゃん!」という無意味なプログラムを釣りたくはないでしょう。

Fバリュー(Precision and recall)についても書いたことがありますが、それ以外にも評価のやり方がたくさんあります。

developers.goalist.co.jp

クラス分類ではなく、連続分布からのバリューを予想とするときは二乗誤差(Squared error)なども使えます。

改善・最適化

現在の表現で見つけている答えの質を評価できた上で、そのモデルを変更して改善することが可能となります。

Deep Learning でよく使われてるのが最急降下法(Gradient Descent)です。偏微分を使って、現在の状況に比べて、少しだけの変更でどう「評価」改善できるかを計算するアルゴリズムです。

例えをしますと、坂登りで、めを閉じる場合にも下り道が分かるではないか(危険ですよ、実際に転び落ちたことがあります)、最急降下法それに似ています。この例えでは周りに比べてた「最善」が坂の底です。

上記のGradient Descent(最急降下法)の他にも改善のやり方があります。

Greedy SearchとBeam Searchでもあります。(辞書にも出てこないですけど!欲深い検索ではありません!)最急降下法と違って、こちらの二つはいくつかの有限な選択肢をよりよく組み合わせようとする方法です。

巻き

書き始めた時には、5つぐらいのトピックはこの記事で書こうと思ってましたが、もう結構長いですね。

上記には、機械学習、いわゆる「学ぶプログラム」を作成するための大事なみつの部分について説明しました。

詳細書きすぎたかも知れませんが、この続きには機械学習のモデルなどを作る時に重要なポイントを他にも説明します。

次回は「一般化できるか?」と長くなければ「データだけでは足りぬ!」というワクワクできそうなトピックを書きたいです!

以上チナパでした!