機械学習とニューラルネットワーク

機械学習の概要

機械学習とは、既知のデータ(訓練データ)を基に、”機械”に”学習”させて、未知のデータに対する分類や予測などを行う技術のことです。

大きく分けると以下の3つに分類されます。

  • 教師あり学習
  • 教師なし学習
  • 強化学習

教師あり学習では訓練データと正解データ(教師データ)を与えられて学習を行います。一般的なクラス分類や線形回帰などはこちらに属します。

教師なし学習は訓練データのみで学習を行います。クラスタリングなどがこちらに属します。

強化学習は環境に対して行動をとり、その結果をフィードバックして行動を学習します。これは例えば、将棋でAIとプロ棋士が対局するイベントがありましたが、あのような場で用いられる高レベルなAIには強化学習が使用されている場合が多いです。

”古典的”機械学習の手法

機械学習分野はコンピュータが普及し始めたころから研究がなされており、様々な手法が存在しています。

例としてSVM(サポートベクターマシン)などが挙げられますが、これらには長年の研究で、数理的な理論がしっかりと存在しています。
(元々数理的なアプローチによる手法開発が多かったとも言えます。)

近年では深層学習がもてはやされていますが、これらの”古典”(失礼な呼び方かもしれませんが)手法も数理的根拠に基づいた方法であり、実はこれらの手法を適用するだけで十分に解決できる問題というのは意外とあります。

では、なぜ深層学習がこれほど発展したのかというと、深層学習はデータをそのまま入力してもそれなりに良い結果が得られるからです。

というのも、従来の機械学習で一番難しいのは特長ベクトルの選び方です。(と私は思っています。)

例1:手書き文字の認識

例として、手書き文字の画像認識を考えてみます。

これは有名なMNISTという手書き文字データセットから持ってきたもので、書かれているのは1から9までの数字です。サイズは28×28ピクセルです。

単純には28×28ピクセル =784次元のベクトルに変換し、この784次元空間に1-9に属するベクトルを分離する超平面を決定します。

簡単に言うと、「縦1、横1のピクセルが10以上50以下かつ、縦1、横2のピクセルが100以上150以下かつ・・・・縦28、横28のピクセルが5以上20以下」であれば画像に書かれている数字は1です。というような範囲を決めます。

この、範囲を決めるための方法というのは従来から研究され、数理的で論理的で合理的な方法がいくつも提案されています。

一方で、そもそもこの784次元のベクトルというものは、ぱっと見で多いです。上に示した通り、手書き文字の画像はとても小さいにも関わらずこのベクトルサイズです。

しかも実際の画像は縦横につながっており、むしろこのつながりが大切ですが、ベクトルにすると最早位置は関係ありません。極端な話、外周から渦巻き状にベクトルの要素として行ってもよいわけです。

それであれば、例えば縦線の数や横線の数などをベクトルの要素とすればより少ないベクトル要素数で、より精度良く分類ができるのではないかと直感的に感じます。

例2:犬と猫を見分ける。

これは例えば、画像認識で犬と猫を見分けるという場合でも同じで、画像のデータをそのまま使うよりも、上手く画像を処理して耳の長さ、口の大きさ、目の大きさ、それぞれの位置、毛の長さ、体の模様などをベクトルとしてあげればより精度良く分類できます。

では、画像から目の大きさを計算するにはどうすればよいでしょうか。

「目は黒いはずだから、黒くて丸いものを検出して・・・」など、考えれば色々方法はあると思いますが、実はこれもなかなか難しい問題です。


このように、機械学習では分類するための特徴ベクトルと、その特徴ベクトルを求めるための手法を決定するのが一番の難関となります。

上でも書いたように、深層学習ではこの特徴ベクトルの決定までネットワークが行ってくれます。これにより学習の精度が飛躍的に高まりました。

逆に、適切な特徴ベクトルを取り出すことのできる問題では、わざわざネットワークを構成するまでもなく、古典的な手法で十分な結果を得ることができます。

ニューラルネットワーク

ニューラルネットワークも機械学習の一手法です。脳の構造を作っている、ニューロンという神経細胞の働きを模した要素がネットワークを構成しているのでニューラルネットワークと言います。

ニューラルネットワークでは、ニューロンは下図のように層状のネットワークを形成しています。(図中の左から右に層が2層重なっています。文献によっては3層と表現する場合もあります。)

(MultiLayerNeuralNetwork english.png;Wikipedia Commonsより引用)

各ニューロンは前の層からの入力を受け取りますが、これらの入力(図中の矢印に相当)にはそれぞれ重み付けがされており、重み付きの入力がすべて合算されます。

合算された入力がある値を超えるとニューロンが活性化され、次の層のニューロンに出力が送られます。(次の層から見ると入力です。)

これを繰り返し、最終的な出力が得られます。

出力は、例えば犬猫の分類であれば出力層(一番最後の層)のニューロン数を2つにして、1つ目が犬の割合、2つ目が猫の割合という風にすれば、犬である確率60%、猫である確率40%という風に表すことができます。

ただし2クラス分類であれば通常は出力層のニューロンを1つにして出力x=0~1として、犬である確率x,猫である確率(1-x)という風にします。

ニューラルネットワークの出力は教師データと比較され、その誤差を誤差逆伝播(バックプロパゲーション)という手法で層を遡るように学習を行い、ニューロン間の重み付けを更新していきます。

ニューラルネットワークの細かい動きや数式については割と文献を見れば載っていますので、あえてここで長々とは書きませんが、機会があれば自身の復習としてまとめてみたいと思います。

ニューラルネットワークは各層で入力の重み付和を計算しているので、次の層に入力されるときには元の入力ベクトルは処理されて別のベクトルになっています。

これは入力ベクトルを別の特徴ベクトルに変換しているということですので、前述した様な各分類等に向いたベクトルを求めてくれているようなものです。

このことから、このニューラルネットワークの層を多くしていけば、ベクトルが上手く変換され、分類も適切に行われることが期待されます。

しかし、実際には近年(と言っても10年ほど前)まではニューラルネットワークの深層化は難題で、深層化すると上手く学習ができないという問題がありました。

これを解決し、深層化を行うことで分類の精度を飛躍的に向上した手法が深層学習です。

次回はニューラルネットワークの問題点と、深層学習について書いていきたいと思います。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です