【入門】イメージ分類モデルから入門する機械学習の基本概念まとめ

どうも、コンサル部のテウです。 本記事は前回の記事の続きとなっており、「機械学習のチュートリアルコードは実行してみたんだけど、これだけで理解できるわけないじゃんー!」と思った方のための記事となります。
2020.02.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも、コンサル部のテウです。

本記事は前回の記事の続きとなっており、「機械学習のチュートリアルコードは実行してみたんだけど、これだけで理解できるわけないじゃんー!」と思った方のための記事となります。

目次

始める前に

機械学習を入門するための方法として紹介されてある記事は既に多く存在すると思います。なぜイメージ分類モデルから機械学習を入門するの?って聞かれたら、「僕のバックグラウンドとしてイメージ分類タスクをやってましたので、これを活かしたアプローチが説明しやすい」と答えられます。あと、個人的な感想ですが、画像は視覚的にすぐ分かりやすいので複雑な Vector Space (Feature Space) のことを理解するのにも効果的な分野だと思います。

まぁ、しょうもない話より、早速ひとつづつ説明させていただきたいと思いますー!

機械学習の一般的なプロセス

ml

機械学習の一般的なプロセスを見せてくれる素晴らしい図ですね。本記事を読んでいらっしゃる皆さんには、馴染みのある図だと思います。 ですが、この図を何度もみても、正直、具体的なイメージは思いつけませんよね?

もちろん全体的な機械学習の流れを理解していることは大事ですし、このフレームによって、より効率的な仕組みを作ることもできますが、入門者向けにはどうしても足りてないところが多いかと思います。

なので、本記事ではこのプロセスの中で、少し具体的なテクニックや学習すべきポイント等を紹介させていただきます。

イメージ分類モデルから理解する機械学習

データセットの準備

イメージ分類タスクを行うために一番最初にする作業はデータセットを用意することですね。パブリックデータセットも多いので、先ずはパブリックデータセットから大量のデータを学習して、自分の問題に最適化するためにファインチューニング(Fine tuning)をすることもありですね。データセットを用意するのは一番時間がかかるところなので、効率的に学習するためには、

大量のパブリックデータセットから学習 → データ量が少ない problem-specific なデータを再学習

のパターンが業界の定論になっている気がします。例えば、パブリックデータセットは一般的なイメージ種類が(車、服、食べ物、顔等、種類は多いほど一般化されます)を含まれているので、一般的な分類モデルを学習することができます。あと、自分の問題が車モデルを分類するタスクだったら、softmaxレイア(あとで細かく説明します、ここでは実際に分類させる最終のレイアと理解するだけでOKです)を変更させて、車モデルデータセットでもう一度学習(転移学習)することで、モデルがオーバーフィット(Overfit)されることを防げます。

モデルがオーバーフィットされたら、データーセットで含まれていない新しいデータについては正確度が下がってしまいます。ちなみに、このように既存モデルからファインチューニングさせて細かいタスクに最適化する方法を「トランスファーラーニング (転移学習, Transfer Learning)」と言ったりします。ファインチューニングと転移学習の違いについてはこのブログをご覧になってください。

転移学習とファインチューニングの違い

パブリックデータセットはググってみるとすぐ出ますが、一応以下のサイトを参考にしていただければと思います。

データの前処理

機械学習モデルによって、データを学習するための前処理が必要になります。データの前処理も大事な段階のひとつですが、本記事では機械学習のコアなテクニックの紹介に集中したく、スキップさせていただきます。

データの前処理で扱うテーマの例は、誤ったデータの探知、空いてるデータの処理、不均等なデータの処理等、とても大事なトピックが含まれていますので、是非今後勉強して頂ければと思います。

機械学習の一番有名な言葉ですが、

Garbage In, Garbage Out

を常に意識しましょう!

モデルの選択

今ならイメージ分類モデルはニューラルネットワーク(Neural Network)をよく使いますが、何年前まではそうでもなかったそうです。 コンピューティングパワー、ハードウェア(GPU等)の値段、各種Deep Learningテクニックの発展等様々な要素により、現状はディープニューラルネットワーク(DNN, Deep Neural Network)によるイメージ分類モデルの方が、多くの分野で一番良いことが証明されましたと存じます。

ですが、機械学習入門のためなら、他の分類モデルも勉強しておいた方が良いです。何故なら、機械学習で使われるテクニックは、Deep Learningも、非Deep Learning系の他のモデルも一緒な為です。

分類モデルとして一番有名だったモデルは SVM (Support Vector Machine) です。

SVM

svm

今の機械学習モデルはインプットデータの確率分布まで学習させ、その確率分布によるデータ分類はもちろん、みたことも無い新しいデータを生成すること(例:GAN, Generative Adversarial Networks) まで出来るのですが、SVM はデータの確率分布には興味がなく、ただ分類させる線を探すだけのモデルとなります。上の図をみると、H1やH2よりはH3の方が2種類のデータを一番よく分類させる線ですね。

Kernel Method (Kernel SVM)

上のSVMモデルはリニア(linear)モデルなんですが、リニアモデルだけでは解けない分類モデルが多いかと存じます。 例えば、以下の図の左側のデータの分布をみると、リニアSVMでは解けなく、非リニアモデルによって解ける分類タスクなのが分かりますね。

svm_kernel

ですが、非リニアモデルは、一般的には 直接 アプローチすることが非常に難しくて使えません。 なので、非リニアな問題をリニアな問題に切り替えて考えるアプローチが良いです。ここからちょっと理解が難しくなりますが、簡単に言うと、データを元スペース(元の確率分布)から任意の確率空間にトランスフォーム(Transform)させて、元々は非リニアなアプローチしかできなかった問題をリニアなアプローチで扱いする方法ができます。数式的に表現すると、

P'(X) = f(P(X))

  • X : データポイント
  • P(X) : データポイントが存在していた元の確率分布(スペース)
  • f() : 任意の確率スペースにトランスフォームさせる関数
  • P'(X) : P(X) が f() によりトランスフォームされた確率分布(スペース)

となります。なので、上の図で右側のデータは、この f() 関数によりトランスフォームされ、リニアSVMモデルにより解けるタスクになりました。 ちなみに、このような f() 関数を カーネル関数 (Kernel function) と呼び、このようなカーネル関数を使って問題にアプローチする方法を カーネルメソッド(Kernel method)と呼びます。このカーネルメソッドをもっと深く理解するためには 線型代数学 の知識が必須です。あと、このような非リニア問題をリニア問題に切り替えて考える手法は機械学習の一番有名なテクニックの一つであるため、勉強すべきトピックだと思います。

このカーネルメソッドを適用したSVMは Kerenl SVM と呼ばれますので、カーネルメソッドを理解するために Kernel SVM を勉強することも良いと思いましたので、紹介させていただきました。

Naive Bayes classifier

SVM はデータの確率分布には興味が無い分類モデルだと説明致しました。今回はデータの確率分布に興味があり、このデータの確率分布よりデータを分類させる 単純ベイズ分類器(Native Bayes Classifier)を紹介させていただきます。

単純ベイズ分類器を理解するためには確率分布の知識が求まれますが、簡単に言うと「条件付き確率分布」のことです。「ベイズ理論」を元に誕生された分類器だけあって、ベイズ理論をそのまま使ってます。

bayes_theorem

  • P(B|A) : イベントA(事件)が発生した場合の イベントA が発生する確率
  • P(A|B) : イベントB が発生した場合の イベントB が発生する確率
  • P(A) : イベントA が発生する確率
  • P(B) : イベントB が発生する確率

ここで、AとBを単純ベイズ分類器のコンテクストに合わせて改めて定義すると以下のようになります。

naive_bayes

  • 前提:データを分類させるクラスはN個あったとします。例えば、車分類モデルの場合、クラスの例は「TOYOTA」、「セダン」、「BMW」等になります。
  • C_k : k番目のデータのクラス(C, class)
  • x : インプットデータ
  • P(C_k | x) : インプットデータ x がデータが与えられた時(発生した時)に、このデータ x が k番目のクラスに該当される確率
  • P(C_k) : データに関係なく、全体データに対して、k番目のクラスの比率(確率)
  • P(x | C_k) : k番目のクラスが分かるデータの中で、データをとって、このとったデータが x だった確率
  • P(x) : 一つのデータをとって、このデータが x だった確率

はい、複雑に見えますね。ですが、一応理解すると、こんなに難しい内容では無いです。なぜ P(C_k | x) を計算するためにこうするのかについては、「P(C_k | x) を直接計算することは非常に難しく、できませんので」と答えられます。

これでどうやって分類するのかを答えますと、インプットデータ x が与えられた時に、先ず全てのN個のクラスに対して P(C_k | x) を計算します。その中で一番値が大きな確率(スコア)のクラスが、このデータ x の分類結果となります。

実は単純ベイズ分類器はフィーチャー間の独立性が保証される時のみとの前提がある等、多くのケースで一番良い結果を出すことには使えないと思いますが、機械学習のベースラインモデルとして結果を出してみて、他のモデルとのパフォーマンスを比べる用途としてのユースケースにはありですね。

Neural Networks

はい、皆さんが一番気になったはずのニューラルネットワークですね。NN(Neural Networks, ニューラルネットワーク)を理解するのに一番難しいことは、隠れ層(Hidden Layer)の存在ではないかと思います。

nn

しかも、この隠れ層もいろんな種類があって、それぞれの機能と役割があることもいまいち分かりづらいところがあるかと思います。隠れ層の正体については今でも活発に研究されています。ですが、いろんな研究結果により、今はある程度の正体は分かった気がします。

イメージ分類のためのNNはCNN(Convolutional Neural Network)がGOTOモデルになっていますが、CNN の隠れ層についてはこのブログを参考にしていただければと思います。英語ですが、図が多くて分かりやすいかと思います。

その他

今回ご紹介させていただきました分類モデル意外にも多くの分類モデルがあると存じますが、機械学習やDeep Learningに入門するためのモデルとしては、十分な気がします。(入門後には必要によって勉強していただければと思います)

(Deep Learning限定)レイアについて

Deep LearningはNNの隠れ層を増やしたモデルを学習する方法のことを言いです。隠れ層もいろんな種類があるため、層(レイア)毎に役割や目的をまとめておいた方が楽です。レイア(層)の種類は大きく以下の通りです。

  • Input Layer
  • Convolution Layer
  • Pooling Layer
  • ReLu Layer / Dropout Layer
  • Fully Connected Layer
  • Output Layer

これ以外にも多くありますが、イメージ分類のためのニューラルネットワーク(CNN)はこのぐらいを知っておけばと思います。

CNNとレイアの詳細についてはこのブログが良いと思います。

あと、NNの動きを視覚化した作品があり、紹介させていただきたいです。最後の Output Layer をみると面白いですね。

Visualize MNIST Github

visualizeMNIST

パラメーターチューニング

選択したモデルによって、モデルに必要なパラメーターもチューニングする必要があります。詳細については、この記事をみると簡単に説明されていて分かりやすいですね。

去年の12月、AWS re:Invent 2019 に発表された Amazon SageMaker AutoPilot を使うと、この面倒な作業の工数が下がると思います。

モデル学習

入門者の観点で、おそらく機械学習のトピックの中で一番難しく感じられることが、まさにモデル学習ではないかという気がします。モデルを実際に学習する為には数学の最適化問題を解けないといけないですが、これが様々な数学知識の総体であり、しかもこの最適化をプログラミング的に解ける為には、数値微分の知識と経験を要する為です。ですが、入門者向としては何個かの一番有名な学習アルゴリズムだけを知っておけば良いと思います。

オプティマイザー(Optimizer)の概念との種類を理解することは、機械学習を深く理解する為に一番重要なことだと思います。一応このブログの一読をおすすめしますが、一回で理解するのは難しいと思い、他の資料も参考にしていただければと思います。

実はですね、ここまで勉強するようになったら、大学の機械学習のコースに従って勉強することも良いと思います。「機械学習 OCW」ってググったらいっぱい出ると思いますが、英語で理解できる方なら、海外の大学の資料も多くありますのでご参考になってください。

検証

検証のため、学習前にデータセットを学習用と検証用のデータに分けます。ですが、このデータの分け方は一番良い結果を出す分け方だとは言えません。なので、K-分割交差検証(k-fold cross validation)という方法によって、モデルの結果を信頼できるようになります。簡単にいうと、ランダムにデータセットをk個に分けて、k回学習を回して、k回の学習結果がほぼ一緒であればオーバーフィットやアンダーフィットがなかったことが分かります。

K-分割交差検証についてはこの記事を読んでみてください。

最後に

機械学習は分かれば分かるほど面白い分野だと思います。ですが、何年前までは数学やツールの壁(ラーニングカーブ)が非常に高かったのが事実です。今は数学が知らなくても、Keras 等を使ったらすぐ試してみることができますよね。あと、AWSのSageMaker Studio等の登場でツールや様々なテクニックによる壁も下がりました。

この機会に機械学習に入門して、一年後にはビジネスにも適用してみるのはいかがでしょうか?

以上、みんなの機械学習への入門を楽しみにしながら本記事を書いた、コンサル部のテウでした。