LogoMark.png

MachineLearning

機械学習

Machine Learning

機械学習(Machine Learning:ML) とは、データサイエンス、あるいは人工知能研究における手法の一つで、大量のデータを利用した反復的な学習(人間が行っている学習と同様のプロセス)によって、コンピュータ上にパターン認知や推論のためのモデルを構築する技術です。

コンピュータに与えるのは、学習ルールと、学習素材のデータセットで、コンピュータ自身が大量のデータから推論のルールを自動的に学習します。例えば、ヒト、犬、猫の大量の画像と、その画像がヒトか、犬か、猫かの「答え」です。この画像はヒト、この画像は犬・・と大量に与えていくことで、識別する能力が学習され、その「経験」が豊富になることで、識別能力が上がっていくのです。小さな子供に「これは犬です」、「これは猫です」・・と教えていくのと同じ手順です。

このときコンピュータの中に自動的に出来上がる「入力と出力の関係づけ」のことを「モデル」というのですが、与えるデータが画像であれば、画像認識モデルができあがり、音声を与えつづければ、音声認識モデルができあがります。

従来、物事の判別は人手によるプログラミング( if 条件文)で実装していましたが、現在の AI 、例えば自動運転における画像解析、買い物行動の動作解析、オンラインショップのレコメンド機能、スパムメールの検知など、いわゆるパターン認知機能と呼ばれるものの大半は、この機械学習によって実装されています。

機械学習で可能になるのは大きく2つ、「予測」と「発見」です。


CONTENTS


はじめに

機械学習の位置づけ

「機械学習」の周辺には、データサイエンス、データマイニング、AIなど、様々な用語があり、それぞれの領域が交錯するため、位置付けが理解しづらいものになっています。基本的には「機械学習」はデータサイエンスの一手法で、その応用先として AI がある・・という感じです。
 機械学習とデータマイニングの関係ですが、機械学習の立場からは、データマイニングは「教師なし学習」に位置付けれられる手法であり、データマイニングの立場からは機械学習はその一手法・・となります。
 両者の目的の違いから言うと、機械学習の主目的(昨今の話題の中心)が、パターン認知のためのモデルをつくること、すなわち入力データを「既知」の特徴と照合させる(「教師あり」で訓練)ことにあるのに対し、データマイニングの目的は、データから「未知」の特徴を発見する(「教師なし」)ことにある・・と説明することができます。応用先という視点で言えば、機械学習の(今話題の)応用先は AIシステム。データマイニングの応用先は新たなビジネス・・ということができます。

機械学習の応用先

機械学習のタイプ

機械学習には、大きく4つのタイプがあります。

教師あり学習|Supervised learning

教師あり学習とは、学習のときに正解のラベルを使う手法で、既知の情報を用いて未来を予測する予測器を作ることを目指します。一般に問題(説明変数)と答え(目的変数)のセットからなる大量のデータを必要とします。主にカテゴリを予測する「分類」と、実数値を予測する「回帰」があります。手法としては、ニューラルネットワーク、線形回帰などがあります。

今最も実用化が進んでいるのがこの分野です。要するに、大量の過去のデータから現象を記述するモデルを作成し、それを用いて未来に起こることを予測する・・。これは基本的には、私たちの脳が「経験を積むことで、未来予測ができるようになる」という話と同じですが、コンピュータの記憶容量と処理の高速化が進んだことで、それが人知を超えたレベルで実現できるようになったのです。


教師なし学習|Unsupervised Learning

教師なし学習とは、学習のときに正解のラベルを使わずに、機械学習モデルに自力でデータの法則性を見つけさせる手法で、サンプルをグループ分けする「クラスタリング」や、高次元の変数(多変数)を低次元に減らす「次元削減(次元圧縮)」などがあります。k-means法、PCA などの手法があります。

半教師あり学習|Semi-supervised learning

半教師あり学習とは、学習の際に少量の正解ラベルつきデータとラベルのない大量のデータを使う手法を指します。正解ラベルつきのデータを用意するのにコストが掛かりすぎる場合などに有効です。


強化学習|Reinforcement learning

強化学習とは、正解ラベルの代わりに「報酬」を使う手法です。とるべき「行動」に無数の選択肢があり、明確な「答え」をあらかじめ与えることが難しい場合、「報酬」の大きな行動に高いスコア、「報酬」の少ない行動に低いスコアを与えていくことで、どう振る舞えば最大の報酬が得られるかを学習する・・というタイプのもので、囲碁や将棋などの AI に利用されています。Q-Learning や DQN(Deep Q Network)といった手法があります。




教師あり学習の手法

大きく2種類、主にカテゴリを予測する「分類(クラス分類)」と、実数値を予測する「回帰」があります。

分類

分類(クラス分類)とは、あるサンプルが与えられたときに、そのサンプルが所属するカテゴリを予測するものです。以下のような手法があります。

回帰

回帰とは、あるサンプルが与えられたときに、そのサンプルに関する何らかの数値を予測するものです。例えば、複数の都市サンプルの情報、例えば「人口」、「面積」、「税収」といった特徴と「犯罪率」をセットにしたデータで学習を行い、未知の都市の特徴からその犯罪率(実数値)を予測する・・といったものが回帰の問題です。以下のような手法があります。

教師なし学習の手法

クラスタリング

クラスタリングはサンプルを自動的にグループ分けする手法ですが、事前にカテゴリーを定義するのではなく、データの特徴のみを使って、それらをいくつかのグループに分ける・・というものです。よく似た言葉に「クラス分類」がありますが、クラス分類はカテゴリーが事前に決まっている「教師あり学習」に属するものです。
 クラスタリングでは「いくつに分けるか」という「分類数」のみを分析者が事前に決定して、結果として見えてくる個々のグループに対しては、事後的に命名がなされます。「このデータは◯◯カテゴリーに属する」というような教師データ(事前データ)が存在しないのが、クラスタリングの特徴です。
 以下のような手法があります。

次元削減

次元削減とは文字通り「データの次元数を減らす」ことですが、例えば「生徒」を説明するのに「国語・数学・理科・社会」という4つのデータ(これを4次元データと言います)を使うところを、「理系得点・文系得点」という2つのデータ(2次元)に落とし込んで説明するような操作を意味します。
 一般に、説明変数(特徴量)が多いと対象を捉えて識別することが難しくなりますが、例えば数学と理科の点数のように「連動する(相関が高い)」もの同士をまとめて「理系得点」として一つの数字で表現すれば、対象を捉えやすくなります。次元削減はこのような処理を大量のサンプルを使って自動的に行うものです。以下のような手法があります。

用語解説

説明変数と目的変数

関数モデルを y = f(X) と書いた場合の、X が説明変数で、y が目的変数です*1

目的関数と損失関数

教師あり学習では、入力 x に対して成分 w を用いて目的関数 y = f ( w , x ) を構築するとともに、正解 y に対する損失 L ( y , f ( w , x ) )を定義して、これが最小となるように成分を調整していきます。
 目的関数の最適化問題を解くことは、すなわち、損失関数(誤差関数)を最小化すること・・と言えます。
 例えば回帰問題では、一般に以下のような「二乗損失」を用います。


活性化関数

ニューラルネットワークにおいて線形変換(重み付き入力の総和)後に最終的な出力を決める関数のことを「活性化関数(Activation Function)」と言います。中間層と出力層では用いる関数が異なるのが一般的で、以下のように分類できます。

最適化アルゴリズム(オプティマイザ)

ニューラルネットの文脈では、最適化とは「出力の誤差が最小になるように調整すること」を意味します。誤差を表す関数は何らかのカーブを示しますが、このカーブをたどって、最下点に至るように、パラメータを調整するわけです。その方法には様々あります。以下リンクで紹介します。

学習用データとテストデータ

機械学習(教師あり)では、手持ちのデータを「学習用データ」と「テストデータ」で分けるのが一般的です。
 手持ちのデータを全て学習用データとして使うと、そのデータに過度に適合したモデルができてしまい(過学習)、現実の予測に使おうとした場合に逆に精度が低くなってしまいます。そこで、一般には学習用データとテストデータに分割して、学習状況をテストデータでチェックしながら、テストデータに対して最も良い性能が出るように調整を繰り返します。
 データの分割には、以下のような方法があります。




サンプルプログラム|手書き文字認識

MNIST.jpg

ニュー ラルネットワーク(教師あり学習|分類)の技術で「0 〜 9 の手書き数字認識モデル」を生成するプログラムを紹介します(ライブラリには TensorFlow を使用しています)。手書き数字の画像データ(28 × 28px) と正解ラベルのペアを学習用 60,000個、評価用 10,000個をセットにしたデータサンプル「MNIST」を使用します。


Python ソースコード

mnist.py などの Python ファイルとしてお試し下さい。

#1. Load Data
from tensorflow.python.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

#2. Reshape X
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train/255.
x_test = x_test/255.

#3. Reshape  Y
from tensorflow.python.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

#4. Model Setting
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
model = Sequential()
model.add( Dense( units=64, input_shape=(784,), activation='relu ') )
model.add( Dense( units=10, activation='softmax') )

#5. Model Compile
model.compile(optimizer='sgd', 
                         loss='categorical_crossentropy',
                         metrics=['accuracy'])

#6. Train
model.fit(x_train, y_train, 
               epochs=10, batch_size=32, verbose=2, validation_split=0.2)

#7. Result : Accuracy
score = model.evaluate(x_test, y_test, batch_size = 1)
print("accuracy =", score[1])

#8. Check 100 Test Data : Confusion Matrix
import numpy as np
from sklearn.metrics import confusion_matrix
predict_classes = model.predict_classes(x_test[1:100,])
true_classes = np.argmax(y_test[1:100], 1)
print(confusion_matrix(true_classes, predict_classes))


出力結果

Epoch 1/10
 - 2s - loss: 0.7345 - acc: 0.8129 - val_loss: 0.3914 - val_acc: 0.8964
Epoch 2/10
 - 1s - loss: 0.3720 - acc: 0.8965 - val_loss: 0.3191 - val_acc: 0.9114
Epoch 3/10
 - 1s - loss: 0.3199 - acc: 0.9099 - val_loss: 0.2861 - val_acc: 0.9203
Epoch 4/10
 - 1s - loss: 0.2905 - acc: 0.9183 - val_loss: 0.2666 - val_acc: 0.9260
Epoch 5/10
 - 1s - loss: 0.2693 - acc: 0.9239 - val_loss: 0.2497 - val_acc: 0.9315
Epoch 6/10
 - 1s - loss: 0.2515 - acc: 0.9295 - val_loss: 0.2384 - val_acc: 0.9339
Epoch 7/10
 - 1s - loss: 0.2364 - acc: 0.9335 - val_loss: 0.2252 - val_acc: 0.9379
Epoch 8/10
 - 1s - loss: 0.2231 - acc: 0.9370 - val_loss: 0.2159 - val_acc: 0.9404
Epoch 9/10
 - 1s - loss: 0.2119 - acc: 0.9401 - val_loss: 0.2071 - val_acc: 0.9430
Epoch 10/10

- 1s - loss: 0.2018 - acc: 0.9427 - val_loss: 0.1999 - val_acc: 0.9453
10000/10000 [==============================] - 2s 176us/step
accuracy = 0.9434

[[ 8  0  0  0  0  0  0  0  0  0 ]
 [ 0 14  0  0  0  0  0  0  0  0 ]
 [ 0  0  7  0  0  0  0  1  0  0 ]
 [ 0  0  0 11  0  0  0  0  0  0 ]
 [ 0  0  0  0 13  0  1  0  0  0 ]
 [ 0  0  0  0  0  6  1  0  0  0 ]
 [ 0  0  0  0  0  0 10  0  0  0 ]
 [ 0  0  0  0  0  0  0 14  0  0 ]
 [ 0  0  0  0  0  0  0  0  2  0 ]
 [ 0  0  0  0  0  0  0  0  0 11 ]]


解説

付録:JupyterNotebook

同様のサンプルを ipynb(JupyterNotebook)形式で GitHubに置いています。レンダリングがタイムアウトする場合は、下の nbviewer 経由でご覧下さい。

サンプルプログラム|画像認識

MobileNetの学習済みモデルと TensorFlow.jsを利用して、画像の対象物を推論するサンプルです。手元の画像のドラッグ&ドロップで、対象を推論するサンプルです。上位4件の候補を、その確率とともに表示します(人や人物の顔は対象外なので、人物の画像を投入すると「T-シャツ」や「ネクタイ」が検知されます。)。




APPENDIX

関連ページ

PAGES

GUIDE

DATA


*1 一般に入力の方が数(次元)が多いので y は小文字、X は大文字で書いたりします。y が値とすれば、X(大文字のエックス)はベクトル、 y がベクトルとすれば、Xは行列・・というイメージです。
Last-modified: 2019-11-12 (火) 18:00:41