Lesson 3

機械学習概論

Lesson 3 Chapter 1
機械学習の基礎

機械学習とは

Lesson 3 では機械学習の基本を学んでいきます。機械学習とは、Lesson 2 で学んだように、AIの4つのレベルのうちレベル3にあたるものです。 ビッグデータを用いてAIが自動で学習して(このとき与えられるデータを訓練データといいます)、未知のデータについての推論ができるようにします。

Lesson 4で学ぶ深層学習を理解するためにも、機械学習の基礎を学ぶことは重要なので、ここでしっかり身に着けましょう。

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

機械学習は、どのようにデータを用いて学習するのかという観点から、大きく3つに分類されます。 それぞれの具体例などについてはChapter2以降で詳しく説明していきますが、まずはそれらが概観してどのようなものであるかを簡単に述べておきます。

最も基本的で理解しやすいのが、教師あり学習です。 これは「入力」とそれに対する正しい「出力」を組にしたデータ(正解データなどといいます)を(大量に)与えて学習させるやり方です。 学習した結果、未知のデータが入力されたときにも正しい出力を出せるようにすることが目的です。 正解データを使って学習することから教師あり学習と呼ばれます。

教師あり学習と対極に置かれるのが教師なし学習です。 学習のときに与えられるデータに「正解」というものが含まれていないような機械学習の手法のことを言います。 それでは何も学習できないのではないかと思うかもしれませんが、データそのものが持っている特徴などを分析して抽出することが目標になります。

最後が強化学習です。 強化学習では、ある環境が与えられて、エージェントがその中で行動したときに対応する報酬が与えられるので、それをもとにもらえる報酬を最大化するように学習します。 色んな行動を試して良い行動の仕方を見つけていくので、「報酬をたくさんもらえるようにAIが試行錯誤する」というイメージが近いかもしれません。

以上の3つが機械学習の大きな分類です。 これらの用語は頻繁に登場するので、Lesson 3 のこれ以降の説明も合わせてしっかりその区別をつけておきましょう。

L3C1_class.svg 機械学習の分類

機械学習の一般的な手順とワークフロー

機械学習に対する理解の見通しを良くするために、ここで機械学習が一般的にはどのような手順で行われるのかを説明しておきます。 各ステップにおいて具体的にどのような手段を用いるのかは後ほど説明していくので、 その際に「今勉強しているのは機械学習においてどういう役割を持つのか」ということが分からなくなったら、ここに戻ってくると良いでしょう。

機械学習を行うには、まずはどのような問題に対して機械学習を適用するのか決まっていることが前提になります。当然のことではありますが、問題によってこの後どのような手法をとるのか変わってくるからです。

問題が決まったら、学習のためのデータの準備をします。機械学習では基本的に大量のデータが必要になるので、それをどのように準備するかはかなり重要な問題です。

次に、モデルを組みます。ここでいうモデルというのは、AIの本体部分、あるいはAIの構造を具体的に記述したものと捉えてもらって構いません。 したがって良いAIを作るためには良いモデルを組むことが必要不可欠です。

学習のためのデータとモデルが用意できたら、いよいよ学習に入ります。また、学習がある程度進んだら、どれくらい学習できているかを判断するための評価を行います。 通常、学習と評価を何度も繰り返していき、評価時にある一定の水準が満たされていたらそこで学習をやめるというやり方がとられます。

学習が済んだら、それでおしまい、という訳ではもちろんありません。せっかくAIを作ったのですから、問題に対して実際に適用していくことが必要になります。 作成したAIをどのように用いるかはさまざまですが、例えば世界に公開したいというのであれば、そのAIを組み込んだプロダクトを何らかのプラットフォーム上で公開する手順が必要になります。

AIを使い始めて以降もやらなければいけないことがあります。 それは、AIがちゃんとその後も期待通りに動き続けているかどうか評価することや、世の中の変化などに応じて対象の問題に変化が生じてきたときに、AIの方も何かしらの変更が必要になるかどうか、また必要ならどのように変更すればよいかを考えることなどです。 場合によってはAIの学習、あるいはモデルの決定やデータの用意からやり直すこともあります。 AIを作ることにはそれなりの責任が伴う(Lesson 2参照)ので、こういったことも機械学習では重要です。

以上が機械学習の基本的な流れになります。これから詳しく学んでいく際の指針とするだけでなく、実際に自分で機械学習によってAIを作りたいというときにも参考になるでしょう。

L3C1_workflow.svg 機械学習の手順

訓練データとテストデータ

ではここから機械学習の中身に入っていきます。まずは訓練データおよびテストデータについて説明していきます。訓練データは学習のためのデータで、テストデータは学習した結果を評価するためのデータですが、これらをどのように使うかを学びます。 なお、基本的には教師あり学習を前提とした説明にはなりますが、強化学習など他のやり方にも通じる考え方が出てくるので、しっかり身に着けていきましょう。

損失関数

これまでデータを使って「学習」させると言ってきましたが、具体的にこの「学習」は何をするのでしょうか。その一つの答えが損失関数の最適化です。

損失関数にもいくつか種類があるのですが、基本的には「ある入力に対するモデルの出力」と、「対応する正解のデータ」とがどれくらい異なってしまっているかということを表しており、 端的に言ってしまえば「誤差」のことです。 したがって、損失関数を小さくすることは、より正解に近い出力をするモデルにするということと同じです。最適化というのは、この値を小さくすることを言っています(機械学習に限らずさまざまな場面で最適化という言葉が出てきますが、 いずれの場合もある目標に向かって計算の仕方やモデルの修正を行うことを指します)。

以下では2つの損失関数の例を見てみましょう。

2乗和誤差

2乗和誤差とは、文字通り誤差の2乗の和をとったものになります。より正確にいうと、全訓練データに対して、モデルの出力と対応する正解データとの誤差を求め、2乗してからすべて足し合わせたものを指します。

数式を使って説明してみましょう。訓練データがn個あるものとして、それらを$(x_i, y_i)_{1\le i \le n}$とします。$x_i$が入力、$y_i$が$x_i$に対する正解のデータです。 また入力$x_i$に対するモデルの出力が$\hat{y_i} (1 \le i \le n)$であったとします。$x_i$、$y_i$などはひとまず単なる数であるとします。つまり今考えているモデルは、「数を入力として受け取って何らかの数を出力するモデル」ということになります(1変数関数を近似することに相当します)。 このとき2乗和誤差 SSE(Sum of Squared Error)は以下のようになります。 \[ SSE = \sum_{i=1}^n (y_i - \hat{y_i})^2 \]

ところで、なぜ誤差を2乗するのかという疑問を抱くかもしれません。それを考えるために簡単な例を見てみましょう。先ほどの説明を流用して、$n=2$、$y_1=3$、$y_2=3$、$\hat{y_1}=1$、$\hat{y_2}=5$であったとします。 このとき、SSEは$(3 - 1)^2 + (3 - 5)^2 = 8$となります。一方誤差を2乗しなかった場合は$(3 - 1) + (3 - 5) = 0$になってしまいます。モデルの出力が正解と異なるにも関わらず誤差が0になっていることがわかるでしょう。 つまり、正の誤差と負の誤差が打ち消しあってしまうのを避けるために、2乗して誤差が常に0以上になるようにしているのです。

似たような損失関数

2乗和誤差には似ている損失関数がいくつかあります。例えば2乗和誤差をそのまま使うのではなくデータの個数で割った平均2乗誤差MSE(Mean Squared Error)、 誤差を2乗する代わりに絶対値をとっている平均絶対誤差MAE(Mean Absolute Error)などです。また2乗和誤差SSEとしては、先ほど述べたものを2で割ったものが使われることもあります (これは微分したときに式が綺麗になるようにするためで、特に違いを気にする必要はありません)。 \begin{align*} MSE &= \dfrac{1}{n} \sum_{i=1}^n (y_i - \hat{y_i})^2\\ MAE &= \dfrac{1}{n} \sum_{i=1}^n |y_i - \hat{y_i}|\\ SSE &= \dfrac{1}{2} \sum_{i=1}^n (y_i - \hat{y_i})^2 \quad (2で割る場合) \end{align*} 他にもHuber損失などがあるので、興味のある人は調べてみましょう。

交差エントロピー誤差

交差エントロピー誤差は、主に分類タスクにおいて用いられます。 例えば犬の画像と猫の画像が(大量に)あって、いずれかを入力したときにそれが犬の画像なのか猫の画像なのかを判定するタスクなどが考えられます。 このとき、モデルはどのようにするかというと、入力は画像、出力はワンホットベクトルと呼ばれるものになるのが一般的です。 ワンホットベクトルとは、長さ(次元の数)が分類の数になっていて、いずれか1つの要素が1、それ以外が0になっているようなベクトルです。 犬・猫の画像分類の場合、分類の数は2なので、$[1, 0]$や$[0, 1]$がワンホットベクトルになります。例えば出力が前者なら「この画像は犬である」と、後者なら「この画像は猫である」とモデルが推論したと解釈します。 また正解データとしては$[0.7, 0.3]$などが与えられます。これは「この画像が犬である確率は0.7、猫である確率は0.3である」ということを示しています。これらはいずれも確率ベクトルと呼ばれるものです。

では、交差エントロピー誤差CEE(Cross Entropy Error)はどのようになるのかを数式で見てみましょう。 クラス(分類のことです)の数をk、データの個数をn、訓練データを$(x_i, y_i)_{1\le i \le n}$(画像分類であれば$x_i$は画像になります)、入力$x_i$に対するモデルの出力を$\hat{y_i} (1 \le i \le n)$とします。 このとき交差エントロピー誤差は次のようになります。 \[ CCE = -\sum_{i=1}^n \sum_{j=1}^k y_i^{(j)} \log \hat{y_i}^{(j)} \] 先ほどの例のようにクラスが2つの場合は、$y_i$や$\hat{y_i}$が単にある一方のクラス(例えば犬)に$x_i$が属する確率を表しているものとすれば、次のように書けます(確率の総和が1になることを用いています)。 \[ CCE = -\sum_{i=1}^n (y_i \log \hat{y_i} + (1-y_i) \log (1-\hat{y_i})) \] これらの式にどういう意味があるかは、すぐにはわからないかもしれませんが、 重要なこととしては、交差エントロピー誤差は$y_i$と$\hat{y_i}$とが近いほど小さく、逆に異なるほど大きくなる性質があるということです。 よって損失関数として交差エントロピー誤差を用い、それを最適化する(小さくする)ように学習させることで、モデルの出力を正解データに近づけることができます。

もっとこの式の意味を知りたいという方は、情報量や対数尤度といった言葉について調べてみると良いでしょう。

数式に向き合う

いきなり数式が出てきて戸惑っている方もいらっしゃるかもしれません。 Lesson 7 最低限必要な数学の知識については説明するので、もし現段階で意味がよくわからないとしても問題はないので安心してください。 大切なのは、数式にしっかり向き合うことです。AIや機械学習を学ぶのに数式に触れることは避けては通れません。 すぐにはわからなくても、最終的には理解できるようにすることが大事です。

Lesson 3 Chapter 2
教師あり学習

Chapter 2では、教師あり学習についていくつかの例と共に学んでいきましょう。 なお、有名な手法についてここでは述べますが、最低限の説明になっているので、詳しく知りたい方はそれぞれ調べてみてください。

回帰分析の基礎

回帰分析とは、ある変数$X$とそれに応じて変化する(と考えられる)変数$Y$について、$Y=f(X)$と表せるような関数$f$を求める統計的手法です。 関数$f$は、これまで学んできたモデルに対応します。気づいた方もいるかもしれませんが、回帰分析はまさに教師あり学習の一つで、大事な基礎になります。この$X$を独立変数や説明変数、$Y$を従属変数や目的変数といいます。

なお、独立変数が1つの場合を単回帰、複数の場合を重回帰といいます。

線形回帰

線形回帰とは、独立変数と従属変数との間に線形の関係があると仮定して行う回帰のことです。「線形」の意味を知らない方は、とりあえず「直線」のようなものだと思ってください。

独立変数の数をp個とし、それらを${X_k}(1\le k \le p)$とします。また従属変数を$Y$とします。このとき線形回帰は次のような式(モデル)で表されます。 \[ Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p + \varepsilon \] $\beta_0$、$\beta_1$、$\beta_2$, $\cdots$, $\beta_p$は回帰係数と呼ばれるもので、これらの値を独立変数と説明変数との間の関係に「フィット」させることが目的です。 なお$\varepsilon$は誤差項などと呼ばれます。いわゆる「ノイズ」で、綺麗な線形関係からのずれを表しています。

先ほど「線形」は「直線」のようなものと言いましたが、それは$p=1$の時を考えるとよくわかります。$p=1$のときの線形回帰の式は次のようになります(わかりやすさのため誤差項は省略しています)。 \[ Y = \beta_0 + \beta_1 X \] これは中学で習う一次関数の式と同じ形で、XとYが直線関係になっていることがわかると思います。

L3C2_regression.svg $p=1$のときの線形回帰の例

さて、回帰変数の値を独立変数と説明変数との間の関係に「フィット」させる、と言いましたが、これはどのようにやるのでしょうか。 これには最小2乗法というものが用いられます。これは2乗和誤差を最小にする手法のことですが、線形回帰の場合は、与えられたデータの下で2乗和誤差を最小にするような回帰変数の値を解析的に求めることができます。 「解析的に求められる」というのは、何らかの公式のようなものがあって、それに与えられたデータの値を代入するだけで答えが正確に求められる、というような意味です。 その公式についてはここでは省略します。

線形回帰を用いる場合の注意点としては、線形関係が仮定できない場合精度が低くなることや、外れ値(他のデータとは著しく性格の異なるデータ)の影響を受けやすいことがあります。

ロジスティック回帰

ロジスティック回帰は、機械学習の分類問題において、従属変数が二値である場合に適用される手法で、非線形回帰の代表例です。二値とは0か1のいずれか一方をとる値のことです。 従属変数が2つ以上の場合には、多クラス分類に対応するために拡張された手法が用いられますが、とりあえず1つの場合を考えます。

ロジスティック回帰は、従属変数が1になる確率を求めるものです。 確率ということで、出力が負になったり1を超えたりするようなモデルを使うのは避けたくなります。 そこで先ほどの線形回帰を0~1の値を出力するように上手く変換した次の式が用いられます。 \[ P(Y=1) = \dfrac{1}{1 + e ^ {-(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p)} } \] 左辺は$Y=1$になる確率を表します。このような確率の書き方はよく出てくるので覚えておきましょう。

ロジスティック解析の場合、回帰変数は最尤法によって求めることが多いです。 これは与えられたデータから尤度(もっともらしさ)を最大にするような係数を推定する方法のことです。 詳しいやり方はここでは省略します。

ロジスティック回帰も線形回帰と同様に外れ値に敏感なので、注意しましょう。

決定木

先ほどまでは回帰分析について説明してきましたが、続いては決定木分析という手法を紹介していきます。 決定木とは、データの分類や回帰を行うための機械学習の手法です。 データを分割するためのルールを木構造(グラフのうち、閉路がないものです)で表現します。 ルートノードから始まり、各ノードで条件に基づいてデータを分割し、葉ノードまでたどり着くと、そのデータの分類や予測結果が決定されます。 種類として、分類問題を解くものである分類木、数値を推定するものである回帰木があります。

決定木を構築するためのいくつかのアルゴリズムが考案されており、ID3アルゴリズム、C4.5アルゴリズム、CARTアルゴリズムといったものがあります。 ここではそれらの詳細には立ち入らず、分類木の例を示すにとどめます。 以下は、患者のデータ(体温、頭痛、性別)があるときに、そのデータを用いて患者の疾患を診断するための分類木を構築した例です。

L3C2_tree.svg 分類木の例

決定木は、データの理解が容易であることや、データの前処理が少なくても優れた精度を発揮することができるなど、その解釈性や使いやすさから広く用いられています。 また、決定木は特徴量の重要度を評価することができるため、特徴量選択にも利用されます。

ただし、決定木は過学習に陥りやすい傾向があります。過学習とは、学習データにあまりに適合しすぎて、未知のデータに対応できなくなっている状態のことを指します。 分類木でいえば、本質的でないような条件分岐が無駄に入れられてしまっている状況などが考えられます。

ランダムフォレスト

先ほど決定木は過学習に陥りやすい傾向があると学びましたが、ランダムフォレストはその欠点をカバーしようとしたものです。

ランダムフォレストでは、複数の決定木を構築し、それらの結果を組み合わせることで予測を行います。 各決定木は、ランダムに選ばれたサンプルと特徴量を用いて構築されます。 これにより、決定木の過学習を防ぎ、汎化性能(未知のデータに対してどれだけ対応できるかの指標)を高めることができます。 具体的には、ランダムフォレストによる予測の手順は以下のようになります。

  1. ランダムに、元のデータセットから複数のサンプルを生成する。
  2. 生成したサンプルから、ランダムに選ばれた特徴量を用いて決定木を構築する。
  3. ステップ1、2を複数回繰り返し、複数の決定木を構築する。
  4. 構築された複数の決定木の結果を組み合わせ、最終的な予測を行う。

ランダムフォレストは、高い精度と汎化性能を持ち、データの前処理が少なくても優れた結果を出すことができます。 しかし良いことばかりではありません。ハイパーパラメータの調整や決定木の数の設定など、設定が複雑であるため、時間がかかることが欠点になります。 場合によって使い分けましょう。

Lesson 3 Chapter 3
教師なし学習

Chapter 3では、教師なし学習について学びます。例を見ていきましょう。

クラスタリング

クラスタリングは、教師なし学習の代表例で、データセットを似たようなグループ(クラスター)に分ける手法です。 類似度の高いデータ点を同じクラスターにまとめ、逆に類似度の低いデータ点は異なるクラスターに割り当てるようにします。 クラスタリングにはさまざまなアルゴリズムがあるので、以下でいくつか紹介します。

L3C3_clustering.svg クラスタリングの例 クラスターごとに色分けしている

k-means

k-means法は最も基本的なクラスタリングの手法と言えます。その手順は以下のようになります。

  1. クラスターの数を決めておく
  2. すべてのデータ点にランダムにクラスターを割り当てる
  3. 各クラスターの重心を求める。
  4. すべてのデータ点に対して、各クラスターの重心との距離を計算し、重心が最も近いクラスターに割り当て直す
  5. ステップ3、4を複数回繰り返し、すべてのデータ点が属するクラスターが変わらなくなったら終了する

簡単に言えば、最初はとりあえずランダムにグループ分けをしておいて、後からだんだんいくつかのグループがまとまっていくようにしています。

k-meansの応用例としては、マーケティングにおいて、顧客データを用いて顧客を似た属性を持つグループに分ける、などといったことがあります。

また注意点として、クラスターの数を適切に選ばなくてはいけないことや、最初にランダムにクラスターを割り当てる都合上、結果が毎回異なる可能性があることなどがあります。

収束という概念

k-means法について、「すべてのデータ点が属するクラスターが変わらなくなったら終了」と書きました。 このように、何らかの値の更新を繰り返していったあとで、最終的に値が(ほとんど)変わらなくなることを「収束する」といいます。 機械学習においては、基本的に収束したところが学習の終了地点を示すことになります。

階層クラスタリング

階層クラスタリングは、データセットを類似度に基づいて階層的に分割するクラスタリング手法の一つです。 階層クラスタリングには凝集型と分割型があるのですが、ここではよく用いられる凝集型について説明します。

凝集型の階層クラスタリングは、最初は各データ点を1つのクラスターとし、距離が最も近い2つのクラスターを結合していくことで、データ点が1つのクラスターにまとまるまで階層的にクラスターを結合していく手法です。 クラスター同士の距離をどのようにとるかについては、2つのクラスターの中で最も近いデータ点同士の距離をとる単一連結法、2つのクラスターの中で最も遠いデータ点同士の距離をとる完全連結法、2つのクラスター内のすべてのデータ点の距離の平均をとる平均連結法などがあります。

階層クラスタリングの例を示します。左下は、説明のための簡単な2次元グラフで、各データは特徴量XとYによってプロットされています。 これを階層クラスタリングした結果が右下です。

L3C2_graph.svg 2次元のグラフ L3C2_level.svg 階層クラスタリング

左右をよく見比べると、凝集型の手法に沿って、距離が近いクラスター同士を階層的に結合していくことで、データ点が最終的に1つのクラスターになるようにしていることがわかります。 なお、結合している線のうち縦の線の長さがクラスター同士の距離を表していますが、横の線に関してはその長さは特に意味を持たないことに注意しましょう。

既に気づいている方もいるかもしれませんが、階層クラスタリングでは、クラスター数を事前に決定する必要はありません。 階層構造として表された結果は見た目にもわかりやすいだけでなく、その結果を見てどの程度の数のクラスターに分けるべきかを判断できます。 ただし、データセットが大規模な場合、計算コストが非常に高くなる可能性があるので、注意しましょう。

階層クラスタリングの利用例は幅広く、例えば生物学において、階層クラスタリングを用いて似た遺伝子を持つ生物をグループ化することができます。

DBSCANクラスタリング

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)クラスタリングは、その名の通りデータ点の密度に着目して行うクラスタリングの手法です。 これまで紹介してきた手法よりやや複雑ですが、順を追って説明していきます。

まず、DBSCANを行うには以下の2つのパラメータを定める必要があります。

  • $\varepsilon$:クラスターの半径を表すパラメータ
  • MinPts:クラスターを形成するために必要な最小のデータポイントの数を表すパラメータ

以下では(注目している点を中心とする)半径$\varepsilon$の円の内部のことを$\varepsilon$-近傍と呼びます。 また、ある2点について、一方の$\varepsilon$-近傍にもう一方が入っているときそれらは近接しているということにします。

データ点を以下の3つに分類します。

  • Core points:MinPts 以上のデータ点が近接しているデータ点
  • Border points:近接しているデータ点が MinPts 未満だが、Core points に近接しているデータ点
  • Noise points:Core points でも Border points でもないデータポイント

では実際の手順について説明します。以下のようになります。

  1. マークされていないデータ点をランダムに選択する
  2. 選択されたデータ点に近接している全てのデータ点を取得する
  3. 近接しているデータ点が MinPts 未満の場合、選択されたデータ点を Noise point としてマークする
  4. 近接しているデータ点が MinPts 以上の場合、選択されたデータ点を Core Point としてマークし、選択されたデータ点およびそれに近接しているデータ点を新しいクラスターに追加する。そして、近接しているデータ点についてステップ2~4を実行する (ただしこの繰り返しの時は新しくクラスターを作ったりその点自身をクラスターに追加したりすることはしない)
  5. マークされていないデータ点が存在する場合、ステップ1に戻り、マークされていないデータ点がなくなるまで繰り返す

DBSCANを用いる利点は、クラスターの数を事前に決めなくてもよいことのほかに、クラスターが球状であることを仮定しなくても使えることがあります。 ただし、$\varepsilon$や MinPts を適切に設定しないとあまり良い結果が出にくいという欠点があります。

動画で確認

上記の説明があまりよくわからなかったら、それぞれの手法をインターネットで検索して、クラスタリングが行われる様子を動画で確認してみると良いでしょう。

結果の解釈

クラスタリングの手法はいくつかありますが、それらはいずれも単に「データをいくつかのグループに分ける」ということをしているのに過ぎないので、 クラスタリングの結果をどう解釈するかは我々次第です。それぞれのグループがどんな特徴を持っているのかをしっかり判断する必要があります。

次元削減

教師なし学習の代表例としては、クラスタリングのほかに次元削減というものがあります。 次元削減とは、高次元のデータを低次元のデータに変換することを指します。 高次元のデータは、多くの特徴量を持っているため、分析や可視化が難しくなったり(我々が通常のやり方で可視化できるのは3次元までです)、過剰適合や計算時間の増加などの問題が発生することがあります。 そのため、次元削減は、データの可視化や特徴量の圧縮、機械学習の高速化などに役立ちます。なお、次元削減によってデータの持つ情報が失われてしまう可能性があることには注意です。

それでは次元削減のためのアルゴリズムをいくつか紹介します。

Locally Linear Embedding(LLE)

LLEは非線形な次元削減手法の1つで、局所線形性を仮定してデータを低次元空間に埋め込む手法です。 データの局所的な構造を保持したまま次元を削減することができるため、特に非線形な構造を持つデータに有効です。

以下がLLEの手順になります。

  1. 各データ点のある近傍をとる。ここでは$K$個の点が含まれるようにとることにする
  2. 各データ点をその近傍にある$K$個の点の重み付き線形和として近似する。その重みは元のデータ点と重み付き線形和の距離が最小になるようにとる。
  3. 低次元空間内での各点の座標を計算する。このとき、再構築誤差が最小になるように、低次元空間内での各データ点の座標を求める。

少し補足説明をしておきます。$N$をデータ点の総数とし、それらを$\mathbf{x_j}(1 \le j \le N)$ ステップ2はどういうことかというと、あるデータ点$\mathbf{x_j}$とその近傍にあるK個の点$\mathbf{ x_{j_i} }(1 \le i \le K)$に対し、 \[ \left|\mathbf{x_j} - \sum_{i=1}^K w_i \mathbf{ x_{j_i} }\right|^2 \] が最小になるような$w_i(1 \le i \le K)$を求めるということです。またステップ3についてですが、再構築誤差とは以下の$L$です。 \[ L = \sum_{j=1}^{N}\left|\mathbf{y_j} - \sum_{i=1}^K w_i \mathbf{ y_{j_i} }\right|^2 \] $\mathbf{y_j}(1 \le j \le N)$は$\mathbf{x_j}$を低次元空間に移した点のことです。$L$が最小になるように$\mathbf{y_j}(1 \le j \le N)$を決定します。

先ほども述べたように、LLEは非線形な構造を持つデータの次元を削減するのに適しています。 しかし、各点の近傍をどのようにとるかを事前に決めなければいかないことや、局所線形性が仮定できないときには精度が期待できないことなどに注意する必要があります。

t-distributed Stochastic Neighbor Embedding(t-SNE)

t-SNEは、LLEと同じく非線形な次元削減手法の一つです。 しかしその詳しい仕組みを理解するためには後の Lesson で学ぶような知識がいくつか必要になってくるのでここでは概念的な説明にとどめます。 大まかな手順は以下の通りです。

  1. 高次元空間において、各データ点の類似性を計算する
  2. 低次元空間において、各データ点の類似性を計算する
  3. 高次元空間と低次元空間における類似性の差を最小化するように、低次元空間におけるデータ点の位置を更新する
  4. 収束するまでステップ3、4を繰り返す

t-SNEは非線形な構造を捉えるのに非常に向いています。また2次元または3次元への圧縮が得意で、データの可視化にも向いています。 欠点としては、計算時間が長くなることや、perplexityというパラメータ(どれくらい近くまでの点を近傍とみなすかの指標と解釈できます)が変わると全く異なる結果になりうることなどがあります。

主成分分析(PCA)

主成分分析(Principal Component Analysis, PCA)は、これまでの2つとは異なり、線形変換によって次元を削減する手法です。 データの最も重要な情報を持つ主成分を抽出することで、データの次元を削減するというねらいがあります。

まず「最も重要な情報を持つ主成分」とはどのように定式化できるでしょうか。 その1つの答えが、「最も分散が大きい軸を探す」ということになります。 分散とは簡単にいえばデータの散らばりです。 もしある軸(特徴量)について、データ間の散らばりが小さい場合は、その軸はあまり重要でないといえるでしょう。 逆にデータ間の散らばりが大きい軸は、重要な情報を持っていると考えられます。

では具体的な手順を見てみましょう。

  1. 与えられたデータから、各特徴量の分散共分散行列を算出する
  2. 分散共分散行列の固有値と固有ベクトルを求める
  3. 対応する固有値が大きい順に固有ベクトルを並べる
  4. 並べた順にいくつかの固有ベクトルを選び、それらを新しい軸とする(例えば2次元に圧縮するときは2つ選ぶ)

途中で固有値や固有ベクトルという用語が出てきましたが、これらについては Lesson 9 で説明します。 重要なのは、固有値というものの大小によって軸に関する分散の大小がわかり、したがって主成分となる軸が求められるということです。

主成分分析は、その名の通り主成分を分析することに長けているので、情報がなるべく失われないように次元を削減することができます。 またそのためにノイズの除去に用いることができるという利点もあります。 しかし、主成分に対応する軸が得られても、それがどういった意味を持つかということを解釈するのは少し難しいです。 また、非線形な構造にはあまり対応できません。

Lesson 3 Chapter 4
強化学習

Chapter 4 では、強化学習について学んでいきます。

強化学習の基本的な概念

強化学習は、機械学習の1つであり、 リアルタイムでの意思決定や自律的な行動を必要とする多数の応用に役立っています。 例えば、自動運転車、ゲームAI、ロボット制御などの分野で利用されています。 教師あり学習や教師なし学習に比べ、強化学習では上手く学習を行うのが難しいとよく言われますが、 とはいえその概念そのものはさほど難しくありませんので、基本的なところから学んでいきましょう。

強化学習において、行動する主体のことをエージェントといい、エージェントのいる世界を環境と呼びます。 また、エージェントの行動によって変化する環境の要素を状態と呼びます。 エージェントが起こした行動の結果は、一般に状態によって異なり、状態に応じて行動の良さが変わってきますが、その良し悪しを判断するための指標が報酬です。 良い報酬をもらうには、エージェントは次の行動を現在の状態に応じて決める必要があります。 このときの戦略、詳しくは「ある状態である行動を行う確率」を方策と呼びます。 強化学習の目的は、もらえる報酬が多くなるような方策を求めることということになります。 エージェントは将来の報酬すべてを含めた報酬和(収益)を最大化するように学習します。

以上が強化学習の基本的な概念になります。これらの用語の意味をしっかりおさえておきましょう。

方策勾配法

方策勾配法は、強化学習において方策を学習する手法の一つです。 方策は、先ほど軽く述べましたが、状態に応じて行動を選択する確率分布を表します。 方策勾配法では、方策のパラメータ$\theta$を更新して最適な方策を学習します。

アルゴリズムとしては以下のようになります。 まずランダムにパラメータ$\theta$を設定します。 また目的関数として、方策関数$J(\theta)$を定義します。 これは方策$\pi_\theta$の下での収益の期待値です。 強化学習の目的は$J(\theta)$を最大化することといえますが、それは収束するまで勾配法によって$\theta$を更新していけばよいことになります。 勾配法については Lesson 4 で解説しますが、考えたいこととしては「$\theta$をどのように変えたら$J(\theta)$が大きくなるのか」であり、それは$J(\theta)$の勾配$\nabla J(\theta)$が求まればわかります。

では勾配$\nabla J(\theta)$はどうやって求めるのかですが、これは方策勾配定理と呼ばれる定理により以下の式で求められます。 \[ \nabla J(\theta) = \mathbb{E}\left[\nabla \log \pi_\theta (a|s)Q^\pi (s, a) \right] \] $\pi_\theta (a|s)$は方策$\pi_\theta$の下で状態sのときに行動aを選択する確率、$Q^{\pi_\theta} (s, a)$は方策$\pi_\theta$の下で 状態sにおいて行動aをとることの価値を表す行動価値関数(Q値といいます)です(詳しくは省略)。

方策勾配法のアルゴリズムは以上です。

Q学習

Q学習とは、状態と行動の組み合わせに対してその価値を評価するQ値を更新して、最適な行動を選択することで、環境とのやりとりを通じて最適な方策を学習する手法です。 先ほど出てきたQ値は方策$\pi$に依存していましたが、Q学習においては単に状態と行動のみの関数です。 状態を縦軸に、行動を横軸にとった表を使えば、Q値を表で管理できます。 これをQテーブルといい、Q学習はこのQテーブルを「埋めていく」作業にあたります。

具体的には、各状態sと行動aについて、以下の式を用いてQ値を更新していきます。なお状態sで行動aをとったときの次の状態をs'、その時の報酬をrとします。 \[ Q(s, a) \leftarrow (1 - \alpha)Q(s, a) + \alpha(r + \gamma \max_{a'} Q(s', a')) \] ここで$\alpha$は学習率といって、どれくらいQ値を更新するかの指標です。また$\gamma$は割引率と呼ばれるものです(後で解説します)。 この式は、「現在のQ値と次の状態での最大のQ値を$1-\alpha:\alpha$で重みづけて足したものを新たなQ値とする」というように解釈できます。

上記の方法によるQ値の更新は色んな状態で色んな行動を試すことによってできるので、方策を用意する必要がありません。 ただし、状態数や行動数が多いと試すことが多くなり、Q値が収束するのにはかなり時間がかかります。

割引率$\gamma$

割引率は、上記のQ学習に限らず、強化学習全体としても重要な概念です。 強化学習における収益は、将来の報酬すべてを含めた報酬和のことであるとしましたが、これにはやや問題があります。 なぜなら、現在得られる報酬とかなり遠い将来に得られる報酬とを同一の指標で測ることになるからです。 通常、同じ報酬であれば将来よりも現在において得られた方が良いとされます。 そこで、将来の報酬の収益に対する寄与を小さくする意味で、割引率$\gamma (0 割引率は、将来の報酬を評価する際に重要なパラメータであり、最適な方策を学習するために適切に設定する必要があります。 適切な割引率の設定には、報酬の性質やタスクの目的などが考慮されます。

デュアルネットワークQ学習

デュアルネットワークQ学習とは、ニューラルネットワークを用いたQ学習の1つです。 先ほどのQ学習は暗に状態と行動が離散的であって、連続的な値をとるものではないことが仮定されていました。 ニューラルネットワークを用いることで、それらが連続的な場合にも対応できます。 また、状態をそのままニューラルネットワークに入力するので、高次元な状態に対しても利用できます。

デュアルネットワークというのは、状態を入力として受け取り、「価値」と「方策」の両方を出力するニューラルネットワークのことを指します。 具体的には、「価値」はその状態のエージェントにとっての良さ、「方策」は次にどんな行動をするのかを確率分布で表したものです。

また、通常ニューラルネットワークによるQ学習では2つのニューラルネットワーク(Main Q-Network、Target Q-Network)を用意し、 Main Q-Network が現在の状態における価値や方策を推定し、パラメータを更新していく一方で、Target Q-Network はしばらくの間同じパラメータを保持することで「教師」としての役割を果たします。 これにより、Main Q-Network の推定誤差が Target Q-Network に反映されることを防ぎ、学習の不安定性を抑えることができます。 なお、ある程度の間隔で Main Q-Network と Target Q-Network を同期させます。

学習の流れとしては、デュアルネットワークの出力に従って行動を選択することを繰り返し、そうしてできた行動と収益の履歴データを学習に用いることになります。

ニューラルネットワークや深層学習についてまだ学習していない段階なので、十分な説明をすることはできませんが、最先端のボードゲームAIにも用いられている手法なので、 より知識を磨いた後でまたデュアルネットワークによる強化学習について自分で調べてみると良いでしょう。

Lesson 3 Chapter 5
機械学習の課題

ここでは、機械学習一般に議論される課題について説明します。 ここまでに紹介してきた機械学習の手法には、常にデータに関するさまざまな問題が生じてしまいます。 これらをどのように解決していくのかということが良い機械学習モデルを作ることに繋がります。

データ不足による過学習

過学習については既に少し触れましたが、ここで詳しく解説します。 過学習とは、機械学習において、訓練データに対してモデルが過剰に適合してしまい、新しいデータに対してうまく対応できない現象を意味します。 なお、未知のデータに対してもある程度対応できることを汎化といい、その程度を汎化性能といいます。 通常、機械学習においては、モデルが訓練データにのみ対応しても意味はなく、汎化性能を高めることが重要視されます。

過学習の原因はいくつか考えられますが、代表的なものとして学習データが不足していることが挙げられます。 これは、データが少ない場合、モデルが訓練データ中に存在するランダムなノイズや偶発的なパターンに過度に反応してしまうためです。 例えば、画像分類の場合、訓練データに特定の種類Aの画像が少ないと、モデルは存在する画像のパターンに過度に適合してしまい、種類Aに属する新しい画像に対してうまく汎化できなくなることがあります。

過学習を防ぐためには、学習データが不足しないようにする、つまり学習データの数を増やすことが先決です。

データの偏りによるバイアス

先ほどのデータ不足の話にも関係しますが、学習データは、対象とするデータの分布を満遍なく含んでいることが期待されます。 なぜなら、もし学習データの多くがデータの分布の一部分から取り出され、学習データに偏りが生じてしまうと、モデルはそのようなデータに対してしか学習できず、バイアスが生じてしまい、 未知のデータを入力したときにも対応できる可能性は低くなります。

学習データは偏りのないようにし、バイアスが生じないようにモデルを学習させることが重要です。

Lesson 3 Chapter 6
モデルの評価とチューニング

モデルの評価指標と評価方法

ここでは、学習済みのモデルをどのように評価するのかについていくつかの例を説明します。 色々なモデルを比較して最終的にどれを用いるのかを適切に判断するためにも、モデルの評価指標をなるべく多く知っておくことは重要になります。

混同行列

混同行列とは、機械学習や統計学において、分類問題における予測結果の正確さを評価するための表です。 簡単のため、ここでは2つのクラスに分類する問題(2値分類)について考え、一方のクラスを陽性、もう一方を陰性と呼ぶことにします。 このとき、混同行列は、真のクラス(正解)と予測クラス(モデルが出力したクラス)の組み合わせを表す4つのセルからなります。 以下に例を示します。

予測クラスが陽性 予測クラスが陰性
真のクラスが陽性 真陽性(TP) 偽陰性(FN)
真のクラスが陰性 偽陽性(FP) 真陰性(TN)

真陽性(True Positive、TP)、偽陰性(False Negative、FN)、偽陽性(False Positive、FP)、真陰性(True Negative)は いずれも混合行列に関する重要な語なので、その意味を上の表を使ってしっかり覚えましょう。

適合率

適合率(Precision)は、分類タスクを行うモデルの評価指標の1つで、混合行列中の値を用いて次の式で表されます。 \[ Precision = \dfrac{TP}{TP + FP} \] 上の式をよく考えると、適合率は、陽性と予測したデータが実際に陽性である割合を表しています (TP+FPは「陽性と予測した数」を表していることに注意しましょう)。 したがって、適合率が高い場合、モデルが陽性と判断する際に誤判定(=偽陽性)が少ないことを意味し、ある意味では信頼性の高いモデルであると言えます。

ただし、適合率が高いだけでは意味がありません。 なぜなら、モデルが非常に確信度の高いときのみ陽性と判断し、それ以外は陰性とするという場合、基本的にあまり良いモデルとはいえません(タスクにもよります)が、適合率は高くなってしまうでしょう。 つまり、適合率が高いだけでは、偽陰性が多いという可能性は排除されないことになります。

再現率

再現率(Recall)も、分類タスクを行うモデルの評価指標の1つです。次の式で表されます。 \[ Recall = \dfrac{TP}{TP + FN} \] 上の式から、再現率は、陽性のデータのうちモデルによって陽性と予測されたものの割合を表すことがわかります (TP+FNは「陽性のデータの数」です)。 よって再現率が高いということは、モデルが陰性と判断する際に誤判定(=偽陰性)が少ないということになります。 しかし、「すべてのデータに対してモデルが陽性と判断すれば再現率は1(最大)になる」という事実からわかるように、 再現率が高いというだけでは、偽陽性が多いという可能性もありえます。

F値

適合率と再現率はいずれも重要な指標ではありますが、上の説明からわかるように、単に適合率だけを高くしようとすれば再現率は低くなり、 逆に再現率だけを高くしようとすれば適合率は低くなってしまうという関係があります(トレードオフの関係であるといいます)。 考えるタスクによっては、一方がある程度低くてももう一方が高ければそれでよいという場合もありますが、両方が同程度に重要であるという場合もありえます。

このとき有用なの指標がF値(F score)です。従来使われてきたF値は現在F1値(F1 score、$F_1$)と呼ばれており、まずはそれを紹介します。 F1値は適合率と再現率の調和平均というもので表されます。具体的には次のようになります。 \[ F_1 = \dfrac{2 * Precision * Recall}{Precision + Recall} \] 調和平均の性質から、適合率と再現率がバランスよく高くないとF1値はあまり高くなりません。 例えば、適合率と再現率のいずれか一方が極端に低いと、もう一方が大きくてもF1値は小さくなってしまいます(適合率が0.01、再現率が1の場合を考えてみましょう)。 このことなどから、F1値は適合率と再現率を同等に重視したいときに役立ちます。

なおF値には、F1値の一般化である重み付きF値($F_{\beta}$)と呼ばれるものもあります。 \[ F_1 = \dfrac{(1 + \beta ^2) * Precision * Recall}{\beta^2 * Precision + Recall} \] これは、「適合率と再現率をそれぞれどのくらい重視するか」ということを$\beta$というパラメータによりF値に反映できるようにしたものです。 例えば、適合率を重視したいときには$\beta$を0.5に、再現率を重視したいときには$\beta$を2に設定します。 なお$\beta$を1にすればF1値に一致します。

分散説明率

分散説明率(Variance Explained)とは、あるモデルが、データの分散をどの程度説明できているかを表す指標です。 回帰分析や主成分分析において、モデルの精度を検証するために用いられます。

目的変数を$y$、モデルによる予測値を$\hat y$とすると、分散説明率$VE$は以下のように定義されます。 \[ VE = 1 - \dfrac{Var(y - \hat y)}{Var(y)} \] ここで、$Var(x)$は一般に$x$の分散を表します。 誤差$y - \hat y$の分散の$y$の分散に対する割合を1から引くことで、モデルによる予測値の分散、つまりモデルによって説明される分散の割合を求めています。

決定係数$R^2$

決定係数$R^2$は、あるモデルがデータにどれくらい適合しているかを表す指標です。 分散説明率も似たような概念ですが、実用上は決定係数の方が用いられることが多いです。以下の式で表されます(Nはデータの数)。 \[ R^2 = 1 - \dfrac{\sum_{i=1}^N (y_i-\hat{y_i})^2 }{Var(y)} \]

分散説明率と決定係数の違い

先ほども述べたように、分散説明率よりも決定係数の方が用いられやすいのですが、分散説明率には決定係数にはない特徴があります。 それは、モデルの誤差に系統的な偏りがあるとき、つまり誤差の平均値が0でないときにも対応できる点です。 分散説明率の式をよく考えると、誤差を中心化しているので(分散説明率と決定係数の定義における違いはここだけです)、モデルが偏った誤差を持つときも利用できます。
なお、誤差の平均値が0になるときは分散説明率と決定係数は一致します。

モデルのチューニング方法

モデルをチューニングするとは、機械学習モデルの性能を向上させるために、何らかの工夫を施すことをいいます。 通常、機械学習モデルのチューニングというとハイパーパラメータと呼ばれるものを調整することを指しますが、 他にも機械学習においてよく用いられる工夫をいくつか紹介します。 ただ単にモデルを学習させてそのまま用いるのではなく、チューニングを行うことでより良いモデルを作ることができます。

ハイパーパラメータのチューニング

ハイパーパラメータとは、学習によって調整するものでは"ない"パラメータのことです。 つまり、学習の際に人手で事前に決定するパラメータのことです。 学習率やエポック数(学習のループ数と学習データの数の比)、ニューラルネットワークの層の数などが基本的なもので、他にも学習の手法によってさまざまなものがあります。 ハイパーパラメータはモデルの精度に大きくかかわってくるので、その調整は重要です。

ハイパーパラメータのチューニング方法としては、グリッドサーチとランダムサーチが有名です。 グリッドサーチでは、予め設定された値の組み合わせをすべて試して、最も性能が良かったものを選択します。 一方、ランダムサーチでは、ハイパーパラメータの値をランダムに選択して、複数回試行して最も性能が良かったものを選択します。 他にもベイズ最適化という方法もあります。こちらはやや複雑ですが、興味のある人は調べてみましょう。

データの前処理

モデルを学習させる前に、データの処理を適切に行うことは、学習後のモデルの性能の向上に大きく関わってきます。 データの前処理として考えられるものをいくつか挙げておきます。

  • 問題に合わせて適切なデータを収集する
  • データの欠損値、異常値、重複値、外れ値などを処理する(クレンジング)
  • データをモデルに適した形式に変換する
  • 不要な特徴量を削除する
  • クラスの不均衡などに対処するためにサンプル数の調整などを行う(バランシング)

データの前処理は、モデルの性能の向上に寄与することもありますが、逆効果になることもあります。 また、モデルの性能を良く見せるために不正なデータ処理を事前に行うことは決してしてはいけません。 こういったことは、意図せずに行ってしまうこともあるので、データの前処理については本当にそれが適切なものかよく考えましょう。

アンサンブル学習

アンサンブル学習とは、複数の学習モデルを組み合わせることで、より高い予測精度を得る手法のことです。 どのように複数のモデルを組み合わせるかについてはいくつかのやり方があるので、紹介します。

バギングは、複数のデータセットをランダムに抽出(復元抽出)して、それぞれのデータセットで学習した複数のモデルを組み合わせる手法です。 これにより、学習データが偏ってしまうことによる過学習を防ぐことが期待できます。

ブースティングは、弱い学習モデルを組み合わせて、より強いモデルを構築する手法です。 前のモデルで誤った予測に着目し、そのデータに重みをつけて、次のモデルでより正確に予測するように学習する、ということを繰り返します。

スタッキングは、複数の学習モデルを組み合わせて、より高い予測精度を得る手法です。 複数のモデルの予測結果を入力として、最終的な予測を行うモデルを構築します。 なお、複数のモデルの出力をまた複数のモデルに入力する、ということを繰り返すことで、複数段階のスタッキングを行うこともあります。

アンサンブル学習は、一般に個々のモデルよりも高い予測精度を得ることができるため、機械学習の分野で広く使用されています。 しかし、複数のモデルを組み合わせるために、より多くの計算リソースが必要となるという欠点があります。

オンライン学習

オンライン学習とは、データが順次流れてくるような状況で、一度にすべてのデータを扱わずに、データが到着するたびに逐次的に学習を行う手法のことです。

この手法にはいくつかの利点があります。 まず、データを1つずつ学習に用いるため、メモリなどの使用量を抑えることができます。 またデータを受け取るごとに逐次的に学習を行うので、データの分布が変化する場合に動的に対応することができます。 しかし、逆に言えば新しいデータの影響を受けやすいということであり、また外れ値などの影響を受けやすいということには注意する必要があります。

バッチ学習・オンライン学習・ミニバッチ学習

バッチ学習は、機械学習における基本的な学習方法で、学習対象となるデータを全てまとめて一括で処理する方法になります。 これはオンライン学習の対極におかれます。
ミニバッチ学習は、それらの中間に位置する学習方法です。 具体的には、すべての学習データを均等に分割して、各ミニバッチに割り当て、1つのミニバッチに含まれる複数のデータを同時に用いてモデルの学習を行います。 ミニバッチ学習には、時間短縮(複数のデータを同時に処理するために、モデルの学習にかかる時間を削減することができる)、 メモリ消費量の削減(オンライン学習と同様に、一度に扱うデータの数が少ないため)、 学習の安定性の向上(各ミニバッチのデータの平均を使ってモデルのパラメータを更新するため、バッチ学習よりも安定した学習ができる。またオンライン学習よりもデータの偏りに対して頑健) といったメリットがあります。