少し前にolivaの帰社日で、K-Nearest Neighbour(KNN)についてLT発表を行いました。内容としては、数字と演算子が書かれている画像をKNNというアルゴリズムを使い学習させ、数字と演算子を認識して解答するという内容になります。
※ KNNというのは判断するデータから一番近いデータN個を判断して多数決で結果を決めるアルゴリズムです。
今回のブログはそのLT発表時に受けた質問に対しての回答をしようと思います。

 

前提

AI関連の技術であるマシンラーニング(Machine Learning)とディープラーニング(Deep Learning)の関係は以下のようになります。

マシンラーニングには以下のようなアルゴリズムがあります。

  • Regression(回帰)
    • Linear
    • Multivariate
    • Logisticなど
  • Classification(分類)
    • K-Nearest Neighbour(KNN)
    • Support Vector Machine(SVM)
    • Naive Bayes
    • Decision Tree
    • Random Forest
    • Gradient Boostingなど
  • Clustering
    • K-Means
    • M-Medians
    • Principal Component Analysis(PCA)など

 

ディープラーニングはニューラルネットワーク(パーセプトロン、誤差逆伝播(Backpropagation)など)から階層を入れるアルゴリズムになります。基本的にはマシンラーニングのGredient Descent(最急降下)から始まります(以前ブログで線形回帰から始め、最急降下までを説明した理由です)。

 

LT発表時の質問と回答

質問1:試演時に実行したコードが止まってしまい、解答が出なかった理由は、全てのデータの距離を計算するためですか?

答え:そうではなく、学習自体に時間がかかった。
KNNは、解答を出す際には、基本的に距離を計算し、近いデータ集団を探索します。ライブラリーでは「近いデータ」を探索するアルゴリズムはDTreeかBallTreeを使用します。そのため私が使用したライブラリーはKNNモデルインスタンスを生成する際、設定するN数を探索するまでBallを伸ばします。その後対象のデータのみの距離を計算します(私はこう理解しましたが、アルゴリズムの実装についてはマシンラーニングライブラリー使用法、ディープラーニングライブラリー使用法とデータ前処理など全般的なことを学習してからする予定なのでその時もっと詳しく検証する)。
では、どうしてコードが止まってしまったのでしょうか。

それについて調べた結果、KNNはLazy Learning(instance-based learning)であり、Lazy Learningというのはメモリーに全ての学習データを持ち、判断すべきデータが入ってからメモリーにあるデータから答えを出すようになっています。この理由でKNN(KNNだけではなくinstance-based learningの全て)のデメリットの一つが次元の呪い(Curse of Dimensionality)ということです。距離の計算についてはBallTreeのアルゴリズムを使用すると質問のデータを中心にボールを広げながら周りに学習データが設定した数分あるかを判断するため、学習データの量が膨大であっても、解答を出すときに全件サーチのような動きはしません。

 

前回のLTでは、28*28の画像データを使用しました。784(28*28)次元の空間にデータの座標をメモリーに持つような動きになります。それを6万件のデータを使いましたので学習する時点でColabの無料枠のリソースに結構負担をかけ、うまく動かなかったと思います。実際自分のローカルPCで動かした結果問題なく動きました。

Dimensionality Reduction(次元削減)で次元を減らす方法については、LTで使った数字も画像は白黒がメインだったため各画像データを一番説明できるFeature(特徴)を抽出することは難しいかと思います。

※Dimensionality Reduction(次元削減)についてはまだ概要的なところまでの知識なのでもっと学習したら現在の認識が変わるかもしれないです。

 

ここからはディープラーニングでの質問についてです。

質問2:階層増やせば増やすほど結果がよくなるか

結論から言うと必ずそうなるとは言えません。誤差逆伝播で傾きを修正しながら前に戻ると傾きの値が消えてしまう(vanishing greadient)問題が発生するからです。この問題はシグモイド関数を使う時に起きやすいため一般的にシグモイド関数を補完した他の関数が使われています(とはいえそれでもこの問題が解消したとは言えないです)。

 

質問3:ディープラーニングモデルを無限に回せば結局100%になるか

前のブログに書いてありますが、誤差を微分して最小(0)になる傾きを調べるので逆伝播で最適な傾きを探せばその後は何回回しても結果の値は変わらないです(今回の結果と前回の結果を比較して値が変わらない場合、モデルを止めるようにします)。

質問2、質問3双方に言えることですが、AI技術では「過剰適合(Overfitting)」は十分気を付けなければならない問題です(「過少適合(Underfitting)」も同様)。学習データを完璧に学習し、正確率を上げると学習データだけに適切なモデルは作れるのですが、
実際に使用する際に、投入するような、学習データと関係ない新しいデータをAIモデルに投げると間違った結果になりがちです。(実用できないモデルになってしまう)

 

最後に

今回のブログを書くために色々調べましたが、自分の知識はまだ深いところまで進んでないことがわかりました。入門書を終え、マシンラーニングについて詳細について勉強していますが、数学の知識が不足していて大変な状況です。それでも実際動かして結果を出すなどの作業は楽しいのでこれからも諦めず進もうと思っています。