機械学習とかDeep Learningを学ぶ前に知っておくべき基礎の基礎
はじめに
数年ほど前から、「機械学習」や「Deep Learning(深層学習)」という言葉をよく聞きます。
どうやらこれを使えば売上予測ができたり画像の識別ができたり自動運転の車が実現できたりする、
すごい技術といわれています。
たしかにすごそうな技術だということはわかるのですが、「機械学習や深層学習をやってみよう!」
と思い立って、適当にググってTensorFlowとかをはじめようとすると、
いきなり壁にぶち当たるのではないでしょうか。(自分は当たった)
「機械学習でコンピュータが、猫がどういうものであるか人間に教えられること無く理解したんです!」
とかいわれても、いまいちピンときません。
機械学習は最近注目されていますが、1951年に最初のニューラルネットワーク(後述)が作成されたそうで、
それなりに歴史のある技術のようです。
やはりここは機械学習とかその周りの技術や用語についてゼロからある程度理解していないと無理だろう
と感じて、私は機械学習の概要や用語を理解するところからはじめました。
この記事では、
「とりあえず機械学習とかDeep Learningって何なのか概要を知りたい」
というひと向けに、
機械学習とかDeep Learningとそれに関連する技術や用語について、
自分が調べた内容を元になるべく易しい言葉で紹介していきます。
人工知能(AI)とは
人工知能(artificial intelligence:AI)という言葉が登場したのは1956年だそうです。
AIとは、「人間が行っている知的作業をコンピュータで模倣したソフトウェアやシステム」です。
例えば、下記のようなことができるコンピュータを指します。
- 人間の話す言葉を理解する
- データから論理的な推論を行う
- 経験から学習する
また、AIには大きく2種類あり、
- 人間の感性や判断能力を持った「汎用AI」
- ある特定の作業において人間と同等かそれ以上の処理能力を持つ「特化型AI」
があります。
本記事で話題にしている「機械学習」とは、特化型AIが処理能力を向上させるための手法です。
なお、後述するDeep Learning(深層学習)もAIを実現するための技術の1つになります。
AIは、後述する機械学習やDeep Learningを包括する概念なので、
下記のような関係になります。
AI ⊃ 機械学習 ⊃ Deep Learning(深層学習)
機械学習
AIの処理能力を向上させる技術的手法である機械学習とは、
「人間が経験をして学習することをコンピュータで実現しようとする技術」
です。
もう少し具体的にいうと、
「データから反復的に学習を行い、パターンや特徴を見つけ出して未知のデータに対して予測を行う」
ことができます。
機械学習でよく例題として出される画像認識でいうと、
車の画像を学習させることで画像の特徴を見つけ出し、
未知の画像(自分がスマホで撮影した車の画像や手書きの車の画像など)に対しても
「それが車の画像である」という推論をさせることが可能になります。
では次に、機械学習における学習方法についてみてみましょう。
機械学習における学習方法
機械学習の学習方法はいくつかの種類があります。 これらについて簡単に説明します。
教師あり学習(supervised learning)
事前にデータと特徴を紐付けておき、未知のデータがどこに分類されるか予測する手法です。
これは「過去のデータから未来に発生する可能性がある事象を予測する」のに使用します。
※例えば、「スパムメール判別」とか「明日の天気予報」など
もう少しプログラム的に言えば、教師あり学習とは「入力と出力の関係」を学習するものです。
事前データを元に入出力データの間の関数を作成しますが、
いかに目標とする出力データに近づく関数をつくれるかがポイントです。
そして、未知のデータに関してもその関数を適用して予測します。
そのため、一般的に事前データが多ければ多いほど予測精度があがります。
教師なし学習(Unsupervised Learning)
この学習方法は、出力データが学習時に与えられない学習方法で、
正解となる出力を与えず、データから規則性を発見していくのが特徴の手法です。
(教師あり学習は、「出力すべきもの」も入力で与える必要がある)
例えば、ECサイトなどでのレコメンド機能やオーダー履歴によるユーザーのグルーピングなどは
教師なし学習によって行います(教師あり学習をつかうこともある)。
強化学習(Reinforcement Learning)
少し前にGoogleのAlphaGoという囲碁のAIがプロ棋士に勝ったというニュースがありましたが、
これは強化学習を使用して鍛えたAIを使用したそうです。
強化学習も教師なし学習と同じく明確な答えは与えません。
そのかわり、「行動」と「報酬」を与えます。
この結果、「どのような行動をとれば累積報酬が最大となるか」
を学習していきます。
例えば、ゲーム(環境)の自動操作であればプレイキャラクター(エージェント)が
ミスせずにゴールまで近づいた距離を報酬として与えます。
このようにすると、「どうすればミスなくゴールへ近づけるか行動をいろいろ試してみる」
というように操作プログラムを自分で変更していきます。
結果的にゴールへ近づける(最終的にゴールできる)ようになり、
具体的なゴール方法は教えていないにもかかわらず、目標を達成することが可能になります。
後述するDeep Learning(ニューラルネットワーク)と強化学習を組み合わせ、
「深層強化学習」とよぶこともあります。
なお、強化学習はゲームの自動操作やロボットの行動制御、囲碁や将棋のAIなどで使用されています。
アルゴリズムは「Q学習(Q-Learning)」や「モンテカルロ法」、「SARSA」など
いろいろな種類があります。
Deep Learning
さて、ここからDeep Learningの話です。
Deep Learningとは機械学習を発展させたもので、
人間の神経細胞をモデルにした「ニューラルネットワーク」を用いて、データの分析や学習を行う手法です。
実用例としては、下記内容については、Deep Learningによって特に大きな精度向上があったようです。
- 物体検出
- セマンティックセグメンテーション(画像に対してピクセルレベルで分類)
- 画像キャプション生成
- 画像スタイル変換
- 自動運転
この学習方法で大量のデータを学習することにより、
データのどの部分に注目すればよいかを自ら学習して賢くなっていきます。
ニューロンとパーセプトロン
では、Deep Learningの根幹をなす重要な技術、ニューラルネットワークについて解説します。
ニューラルネットワークとは、人間の脳内にある神経細胞(ニューロン間の結びつき)を
コンピュータ上にモデル化したものです。
別の神経細胞から受け取った信号を、閾値を超えたときに限って
次の神経細胞へ伝達するという仕組みをモデル化したのが始まりらしいです。
そして、このニューロンを並列に組み合わせてから多数のニューロンで束ねるという構造を
パーセプトロンとよび、パーセプトロンをつなげたものがニューラルネットワークとなります。
[ニューロン]
神経系を構成する細胞。脳にある多数の神経細胞の結びつきにより情報が伝達される。
神経細胞は細胞体/軸索/樹状突起から構成される。
ニューラルネットワークにおいてニューロンといった場合、
神経回路網を数式モデルで表現した人工ニューロンを指すことが多い。
[パーセプトロン]
ニューラルネットワーク(ディープラーニング)の起源 となるアルゴリズム。
複数の信号を入力として受け取り、ひとつの信号を出力する。(ex.1 or 0)
[重みとバイアス]
ニューラルネットワークでの重み(w)とは、結合の強さを表しています。
その値は学習によって変化していきます。
バイアス(b)という値は、ニューラルネットワークが持つ持ち味というか独自性のようなもので、
値を偏らせるために使います。
上の図にあるパーセプトロンでは何をしているのかというと、
次の式にしたがった計算が行われています。
[latex] y = x1 * w1 + x2 * w2 + b [/latex]
x1,x2は入力値、w1,w2は重み、bはバイアスです。
この計算結果をうけて最終的な出力(ex.1 or 0)を行います。
ニューラルネットワーク
さきほどのパーセプトロンをたくさんつなげたものがニューラルネットワークとなります。
ニューラルネットワークは図のように
- 入力層
- 隠れ層(中間層とも呼ばれ、何層にもできる)
- 出力層
から構成されます。
上の図にあるように、個々のニューロンは単純な仕組みになっています。
しかし、そのニューロンを多数組み合わせる事によって複雑な関数近似
(ある関数を別の関数で大差がない結果になる方法で表す)を行う事ができるようになります。
また、ニューラルネットワークの隠れ層は多層にする事が可能で、
Deep Learningとは、
「隠れ層が多数存在する多層構造のニューラルネットワークを用いた機械学習」
のことをいいます。
なお、ニューラルネットワークにはいくつか種類があり、
- 畳み込みニューラルネットワーク(CNN)
- 再帰型ニューラルネットワーク(RNN)
- 長・短期記憶ユニットニューラルネットワーク(LSTM)
などがあります。(ほかにも多くの種類がある)
とりあえずここでは、ニューラルネットワークにはいろいろ種類があって目的別に使い分けたりする
くらいの理解でいましょう。
ニューラルネットワークにおける学習
ニューラルネットワークでの学習とは、教師あり学習と教師なし学習のことを指します。
具体的には、出力層で正解が出るように、パラメータ(重みとバイアス)を調整する作業になります。
ニューラルネットワークを学習させる際には「誤差逆伝播法」が使用されており、
また重みの更新には「勾配降下法」が使用されているのですが、
このあたりのもう少し詳しい話はこことかここを参照してください。
Deep Learningは他の機械学習と何が違うのか
さきほど
機械学習 ⊃ Deep Learning(深層学習)
といったように、Deep Learningは機械学習の一部なので、別物というわけではありません。
ニューラルネットワークの隠れ層が複数になっているのがDeep Learningであり、
これによってデータの特徴を深く学習できるようになります。
そして、このニューラルネットワークに学習用データ(画像やテキストデータなど)を学ばせた結果、
データの特徴を自律的に学習していきます。
この「データの特徴を自律的に学習」というのがポイントで、
データのどの部分に注目すればよいのかを人間が指定する必要がありません。
例えば、リンゴと梨を画像から判別させたい場合、機械学習では「色を特徴にしよう」と人が指定しますが、
Deep Learningの場合は学習用データから自律的に「色を特徴としよう」と見つけ出すことができます。
(リンゴか梨か、という最終的な出力の教師は与えるが、それを判別するための特徴量は与えない)
こういった仕組みによってDeep Learningは高い精度を実現しています。
まとめ
さて、本稿ではAIの説明からはじまり、機械学習やニューラルネットワーク、
Deep Learningの概要についての説明をしてきました。
ここまできて、機械学習やDeep Learningについて基礎の基礎くらいは
知ることができたかと思います。
これでようやく前提となる最低限の知識くらいはついたので、
次は実際に機械学習ライブラリをつかって実際に機械学習を試してみたり、
ニューラルネットワークの詳細(けっこう端折った箇所もあるので)について
確認しようかと思います。
この記事を書くため参考にしたサイト
ニューラルネットワークとは?人工知能の基本を初心者向けに解説
ディープラーニングに入門するためのリソース集と学習法(2018年版)
強化学習入門 ~これから強化学習を学びたい人のための基礎知識~
この記事をかくまでに調べた用語メモ
- NumPy
数値計算のためのPython用ライブラリ。
高度な数学アルゴリズムや行列を操作するためのメソッドが用意されている。 -
Matplotlib
グラフ描画のためのPython用ライブラリ。
結果の可視化や、また、ディープラーニングの実行途中のデータを視覚的に確認できる。 -
Caffe/TensorFlow/Chainer/Theano
機械学習ライブラリ -
活性化関数
ニューラルネットワークに表現力を持たせるために出力を調整する関数。
入力を非線形に変換することで、ニューラルネットワークに線型結合では表現できない表現力を持たせることができる。 -
非線形関数
線形でない関数。
線形関数とは、下記を満たす関数。
f(x+y) = f(x)+f(y) f(ax) = af(x)
上の条件のどちらかもしくはどちらも満たさない関数。
-
シグモイド関数
活性化関数の一つでり、非線形関数。
ニューラルネットワークでよく用いられる活性化関数のひとつ。 -
ステップ関数
階段みたいな結果になる関数。 -
ReLU(Rectified Linear Unit) 関数
活性化関数の一つでり、非線形関数。
入力が0を超えていれば、その入力をそのまま出力し、0以下ならば0を出力する関数。 -
ソフトマックス関数
活性化関数の一つでり、非線形関数。
出力が0〜1.0の間の実数になる関数。なお、この関数の出力の総和は1になるので確率として使用できる。 -
ネイピア数
通常「e」という記号で表される、次の「数学定数」と呼ばれる定数。
[e = 2.71828182845904523536…… ]
一般的なのは「連続複利の元利合計」
自然対数の底ともいわれる
https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0 -
訓練データ(教師データ)
学習を行うためのデータ -
テストデータ
訓練したモデルの実力を評価するためのデータ -
汎化能力
まだ見ぬ未知のデータ(訓練データに含まれないデータ)に対しての能力。
この汎化能力を獲得することが機械学習の最終的な目標になる。 -
過学習(overfitting)
あるデータセットだけに過度に対応した状態。過学習を避けることは、機械学習の重要な課題となる。 -
損失関数
ニューラルネットワークの学習では、「指標」によって現在の状態を表す。
その指標を基準として、最適な重みを探索する。
損失関数はニューラルネットワークの性能の「悪さ」を示す指標。
(現在のニューラルネットワークが教師データに対してどれだけ適合していないかを示す) -
勾配(勾配ベクトル)
二変数関数 f(x,y) に対して,その偏微分
(特定の一つの変数のみを少し動かしたときの関数fの変化の割合)
を並べた二次元ベクトルを勾配ベクトルといい、 その向きは,今いる点から少し動いたときに関数の値が一番大きくなる向きとなる。 -
微分
ある関数の各点における傾き(変化の割合) -
one-hot 表現
正解ラベルを1として、それ以外は0で表す表記法 -
Deep Q-Network
強化学習においてエージェントが、行動価値関数と呼ばれる関数が最適になるように学習する。
その関数を近似するためにDeep Learningを使用する。 -
閾値
パーセプトロンで、結果が一定の数値を超えていれば
アクションするという処理に使われるための判断ルール。 -
重み
入力値の重要性を数値化したもの。
この値が大きいほどその入力値は学習のための特徴に深く関連している = 重要である
入力値に対する重みがゼロなら、その入力値は考慮されない。
例えば、一枚の画像について、人の顔かどうかを認識するのに、
画像の端にある風景は判断材料にならないため重みは0になって考慮されない など。