AI合宿 プログラミング体験 2

講師:大森田不可止



機械学習




spaceshift + space での操作が快適です。

表示が変な場合はリロードF5してください。

「機械学習プログラミング」

Data mining 概要

  • 英語: mining は、mine の現在進行形、又は名詞。mine は多義的で、一人称所有代名詞であり、鉱山を表す名詞であり、採掘する、収穫を上げる、地雷を設置するという動詞でもある。"Data mining" は語義的には「データを掘り起こすこと」という感じ。
  • 定義: 「明示されておらず今まで知られていなかったが、役立つ可能性があり、かつ、自明でない情報をデータから抽出すること」、「データの巨大集合やデータベースから有用な情報を抽出する技術体系」などである。
  • 歴史: 1989年に起きた"Knowledge Discovery in Databases"(データベースからの知識発見)と呼ばれる学術研究分野が、データマイニングの直接の起源である。1990年代に至り、データ量は爆発的に増大した。データウェアハウスがデータの蓄積に用いられ始めた。 これに伴い、データベースにおける大量データを処理するための手法として データマイニングの概念が現れ、統計解析の手法や人工知能分野での検索技術等に応用されるようになった。2010年代には膨大なデータを利用してデータマイニングを行うビッグデータ解析を用いた実用的なサービスが多数登場して提供されている。

データマイニングのマーケッティングでの利用

  • 【予測】 ロジスティック回帰分析 … 発生確率を予測する手法。例えば、DMを送った場合に購入する確率が、各顧客毎に分かっていれば、効率的にDMを送ることができる。
  • 【関連性】【分類】 主成分分析 … 主成分分析は、説明力の高い情報=主成分を導き出すことで、そのデータを要約するものです。主成分分析を行なうと、より少ない情報でデータの特色をつかむことができます。マーケティングの現場では、優良顧客を定義する際に主成分分析がよく活用されています。
  • 【分類】 クラスター分析 … 各データが有する情報を、その類似性に基づき分類する分析手法です。似ている者同士をまとめる手法です。F1層(20~34歳女性)、F2層(35~49歳女性) などの分類。
  • 【分類】【予測】 決定木分析 … IF THEN(もし~が発生したら、その次に~が発生する)形式で、データを分類して予測する手法です。
  • 【関連性】 アソシエーション分析 … 商品の相関性を見つける手法。amazon のリコメンド機能などで使われていて、ロングテール販売に貢献してる。普及学 alibaba経営分析

データマイニングから機械学習

  • データマイニングはデータの中から法則性を推定する技術である。最初の事例:
    米国の大手スーパーマーケット・チェーンで販売データを分析した結果、顧客はビールとおむつを一緒に買う傾向があることがわかった。調査の結果、子供のいる家庭では母親はかさばる紙おむつを買うよう父親に頼み、店に来た父親はついでに缶ビールを購入していた。そこでこの2つを並べて陳列したところ、売り上げが上昇した。

  • そのデータから得られた知見を、コンピュータプログラムにフィードバックして、AIシステムが自らのふるまいや知識を改良できるようにするのが 機械学習 (machine learning) である。

  • データマイニングの成果が得られたために、機械学習に進化したと言える。従って、データの中から法則性やパターンを見つけるアルゴリズムを構成する手法は共通している。

機械学習の実例

  • Google Mail のスパム検知。
  • Google 翻訳
  • Googleのロボットカー(自動運転車両)。
  • Alpha Go
  • 郵便番号の数字認識。
  • iPhone Siri の会話理解。
  • 顔検出 - iPhoto などのソフトに搭載されている。
  • 人物判別
  • 医療診断

3種類の機械学習

  • 教師なし学習(unsupervised learning) … 正解なし。データのみ。
  • 教師あり学習(supervised learning) … 正解(label)付きデータ。
  • 強化学習(reinforcement learning) … 正解ではなくヒント付き。


「教師あり学習」による未来予測

  • ラベル付けされたトレーニングデータ(訓練データ・学習データ)からモデルを学習し、未知のデータや将来のデータを予測できるようにすること。
  • 「教師あり」は、望ましい出力データ(ラベル)がすでに判明してるサンプルの集合(コーパス)を指している。
  • スパムフィルタの場合、コーパスはラベル付けされたメールであり、スパムとスパム以外に正しく分類されている。このコーパスで教師あり機械学習を適用すれば、「新しいメールがどちらに分類されるか」を予測するモデルについてトレーニングできる。
  • この場合、予測値は離散的なので 分類 (classification)と呼ぶ。出力信号が連続値になる場合は 回帰 (regression) と呼ぶ。

クラスラベルを予測するための分類

  • スパムフィルタは 二値分類(binary classification) の典型的な例である。
  • 下図はサンプルが30個の二値分類の概念図。30個のラベル付けされた2次元トレーニングデータにより、教師あり学習のアルゴリズムで、破線で示されてるルールを学習する。新しいデータが来ても、このルールで2つのクラスに分類出来るようになる。
  • 手書き数字を学習するような場合は、 多クラス分類(multi-class classification)の例となる。

教師あり学習で連続性を予測する回帰

  • 回帰分析(regression analysis)では、複数の予測変数(predictor varibale)と連続値の応答変数(response variable)が与えられ結果を予測できるようにそれらの変数の関係を探る。
  • 例えば、試験勉強の時間と点数のデータがあれば、点数を予測するモデルが学習できる。
  • 下図は、線形回帰の概念図。予測変数\(x\)、応答変数\(y\)としてサンプル点との距離の自乗を最小にする直線から、新しいデータの応答変数を予測できるようになる。最小二乗法という。

強化学習による対話問題の解決

  • 強化学習(reinforcement learning)の目標は、環境(environment)とのやり取りに基づいて性能を改善するエージェント(agent)と呼ばれるシステムです。
  • 一般に、環境の現在の状態に関する情報には、いわゆる報酬(reward)信号も含まれる。これをトレーニングデータとして教師あり学習を行う。チェスの場合、報酬は「勝ち」「負け」である。

「教師なし学習」による隠れた構造の発見

教師なし学習は、ラベル付けされてないデータや構造が不明な(unknown structure)データを扱う。

クラスタリングによるグループの発見

  • クラスタリング(clustering)は、大量の情報を意味のあるグループ(クラスタ)として構造化出来る探索的データ解析の手法である。「教師なし分類」とも呼ばれる。
  • 以下の図は、ラベル付けされてないデータを構造化するにあたり、クラスタリングをどのように応用できるかを示している。特徴量の \(x_1,x_2\) の類似性に基づき、データを3つのグループに分割している。

データ圧縮のための次元削減

  • 教師なし学習には、次元削減(dimensionality reduction)というサブフィールドもある。
  • 高次元のデータを扱う時に、大量のデータを機械学習に適応する場合に、処理を軽減するために、特徴量の前処理として良く使用されるアプローチ。データからノイズを取り除き、関連する大半の情報を維持した上で、低い次元の部分空間に圧縮する。
  • 以下の例では、3次元の「ロールケーキ」を新しい2次元の特徴量の部分空間に圧縮するため、非線形の次元削減を行っている

基本用語と表記法

  • 右の図は、機械学習分野の代表的な例である Irisデータセットからの抜粋である。150枚のアヤメの花の計測データが収録されている。これらのデータは、Setosa、Versicolor、Virginica の3つの品種に分類される。花のサンプルはそれぞれデータセットの1つの行を表しており、花びらの測定データが特徴量として格納されてる。
  • データは行列やベクトルを用いて表す。花のサンプルはそれぞれ特徴行列 \(\mathbf{X}\) の行として表し、特徴量はそれぞれ別の列に格納する。

Iris の行列データ

Iris データセットは 150個のサンプルと4つの特徴量で構成されるため、150x4の行列で以下のように記述できる。

\[ \begin{pmatrix} x_1^{(1)} & x_2^{(1)} & x_3^{(1)} & x_4^{(1)} \\ x_1^{(2)} & x_2^{(2)} & x_3^{(2)} & x_4^{(2)} \\ \vdots & \vdots & \vdots & \vdots \\ x_1^{(150)} & x_2^{(150)} & x_3^{(150)} & x_4^{(150)} \end{pmatrix} \]

機械学習システムを構築するロードマップ

下図は 予測モデリング(predictive modeling)に機械学習を使用する場合の一般的なワークフロー図である。


前処理:データ整形

  • 生のデータが機械学習アルゴリズムの性能を最適化するのに必要な形式で提供されることは滅多にない。従って、データの前処理(preprocessing)が重要になる。
  • 画像からだけが Iris の生データだとすると、色調・明度・サイズなどの特徴量を抽出しなければならない。
  • これらの値は正規化する必要があり、特徴量を \([0,1]\) の範囲に変換するか、平均 0 分散 1 の標準正規分布に変換する。
  • 特徴量で相関が高いデータがあれば、次元削減が可能かを検討する。

予測モデルのトレーニングと選択

Abraham Maslow 「ハンマーしか持っていなければ、すべてが釘に見える」


  • 様々な問題を解決するために、様々な機械学習のアルゴリズムが開発されている。
  • たとえば、分類のアルゴリズムにはそれぞれ本質的に特徴がある。どれを使うかは、データの形式を検討して、数種類を選び、比較することが不可欠。このとき、比較するための指標を事前に決めておく必要がある。よく使用されるのは正解率である。間違った場合のペナルティが大きい、顔認証や病気診断などでは間違い率が指標となる。
  • テストデータの取扱も工夫が必要。すべてのデータを学習に使うと、学習の評価のためのデータが無くなってしまう。データを分割して、学習用・評価用として使う必要がある。ただ、これだけではデータを効果的に活用できない。同じデータでも、分割の仕方を変えた、複数のデータセットとして、活用することを考慮する。





パーセプトロン

パーセプトロン

  • Frank Rosenblatt がMCPモデルに基づくパーセプトロンの学習規則を発表したのは1957年。
  • ローゼンブラットのアルゴリズムは、最適な重み係数を自動的に学習した後、入力信号と掛け合わせ、ニューロンが発火するかを判断する。すなわち、「教師あり学習」の「分類」に相当する。
  • この問題は二値分類タスクと捉えることができる。便宜上、2つのクラスを 1(陽性)、-1(陰性) と呼ぶことにする。そうすると、 活性化関数(activation function) である \(\phi(z)\) を定義できる。この関数は、特定の入力値 \( \mathbf{x} \) と対応する重みベクトル \(\mathbf{w}\) の線形結合を引数として受け取る。この場合の \(z\) は、総入力(net input)である。( \(z=w_1x_1+\ldots+ w_mx_m\) )
    \[ \mathbf{w} = \begin{bmatrix} w_1 \\ \vdots \\ w_m \end{bmatrix} , \quad \mathbf{x} = \begin{bmatrix} x_1 \\ \vdots \\ x_m \end{bmatrix} \qquad z = \mathbf{w}^T \mathbf{x} \tag{2.1.1}\]

パーセプトロン(2)

  • サンプル \(\mathbf{x}^{(i)}\) と重みの掛け合わせが指定したしきい値 \(\theta\) よりも大きい場合は 1 のクラスを、それ以外では -1 のクラスを予測する。サンプル \(\mathbf{x}^{(i)}\) の活性化関数 \(\phi(z)\) は単純な 単位ステップ関数(unit step function)である。単位ステップ関数は ヘビサイド関数(Heaviside step function) とも呼ばれる。Heaviside は人名。
    \[ \phi(z) = \begin{cases} 1 & (z \ge \theta) \\ -1 & (z < \theta) \end{cases} \tag{2.1.2} \]
  • 話を単純にするために、しきい値 \(\theta\) を左辺に移動する。\(w_0 = -\theta, x_0 = 1 \) として、インデックス0の項を追加する。
    \[ z = w_0x_0 + w_1x_1 + \ldots + w_mx_m = \mathbf{w}^T \mathbf{x} \quad and \quad \phi(z) = \begin{cases} 1 & (z \ge 0) \\ -1 & (z < 0) \end{cases} \tag{2.1.3} \]

パーセプトロン(3)

  • 左の図は、総入力 \(z=\mathbf{w}^T\mathbf{x}\) がパーセプトロンの活性化関数によって二値出力(-1 または 1)のいずれに押し込まれるかを示している。右の図は、線形分離可能な2つのクラスを区別するにあたって、それをどのように使用できるかを示している。

パーセプトロンの基本概念図






パーセプトロンを実装する

Python のライブラリ

Python で機械学習を実装する場合、以下のライブラリを利用する。

パーセプトロンを実装する

Code: Perceptron.py File: perceptron.py

  • クラス Perceptron の初期化には、指定された学習率 eta と、エポック数 n_iter を使用する。
  • fit メソドを使用して、self.w_ に格納されている重みをゼロベクトルに初期化。
  • その後、トレーニングデータの全てのサンプルを順番に処理し、重みを更新する。
  • クラスラベルは predict メソドによって予測される。各エポックでの誤分類の個数はリスト self.errors_ で収集する。
  • net_input メソドで使用される np.dot 関数はベクトルのドット積(内積)を計算する。

Iris データセットでトレーニング

pandas ライブラリを使用して、UCI Machine Learning Repository から Iris データセットを DataFrame オブジェクトに直接読み込む。

貴重な本家のサーバに負荷をかけないように、omorita.comサーバから読み込む。


import pandas as pd
df = pd.read_csv('http://techc.omorita.com/data/iris.data', header=None)
df.tail()
            

次に、Iris-setosa の50枚の花と Iris-versicolor の50枚の端に対応する先頭の100個のクラスレベルを抽出。クラスレベルを 1(versicolor) と -1(setosa)に変換。100個のトレーニングサンプルの特徴量の列から1列目(萼片の長さ)と3列目(花びらの長さ)を抽出して、それらのデータを特徴行列 \(X\)に代入して散布図で可視化。

Iris データセットでトレーニング(2)


                 import matplotlib.pyplot as plt
                 import numpy as np
                 y = df.iloc[0:100, 4].values
                 y = np.where(y == 'Iris-setosa', -1, 1)
                 X = df.iloc[0:100, [0, 2]].values
                 plt.scatter(X[:50,0], X[:50,1], color='red', marker='o', label='setosa')
                 plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor')
                 plt.xlabel('sepal length [cm]')
                 plt.ylabel('petal length [cm]')
                 plt.legend(loc='upper left')
                 plt.show()
            

Iris データセットでトレーニング(3)


               %run perceptron.py
               ppn = Perceptron(eta=0.1, n_iter=10)
               ppn.fit(X, y)
               plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
               plt.xlabel('Epochs')
               plt.ylabel('Number of misclassifications')
               plt.show()
              

  • 横軸をエポック数、縦軸を誤分類の個数とするグラフを表示させる。
  • このグラフからわかるように、6回めのエポックで、パーセプトロンは収束しており、トレーニングサンプルを完璧に分類できてる。

データセットの決定境界

簡単なサポート関数をつくる。 plot_decision_regions.py File: plot_decision_regions.py

  • colors と markers を複数定義した後、ListedColormap を使って色リストをからカラーマップを作成する。次に、2つの特徴量の最小値と最大値を求め、それらの特徴ベクトルを使ってグリッド xx1 と xx2 のペアを作成する。これには、NumPy の meshgrid 関数を使用する。
  • 2次元の特徴量でパーセプトロンの分類器をトレーニングしたため、グリッド配列を1次元にし。Iris トレーニングサブセットと同じ個数の列を持つ行列を作成する必要がある。そのために、predict メソッドを使って対応するグリッドポイントのクラスレベルをZ を予測する。
  • クラスレベル Z を予測した後は、xx1 および xx2 と同じ次元を持つグリッドに作り変えた上で、等高線図を描画できる。これは、matplotlib の contourf 関数を使用し、グリッド配列内の予測されたクラスごとに、決定領域をそれぞれ異なる色にマッピングする。

データセットの決定境界(2)


               run plot_decision_regions.py
               plot_decision_regions(X,y,classifier=ppn)
                 plt.xlabel('sepal length [cm]')
                 plt.ylabel('petal length [cm]')
                 plt.legend(loc='upper left')
                 plt.show()
              





ADLINE

ADALINE の学習と収束

もう1種類の単一層ニューラルネットワークである ADALINE(ADAptive LInear NEuron) について見ていく。

  • 1960年 Bernard Widrow と博士課程学生 Tedd Hoff によって ADALINE が発表された。これはコスト関数の定義と効率化の概念が含まれる。
  • パーセプトロンとの違いは、重みの更新方法にある。単位ステップ関数では無く、線形活性化関数に基づいて重みが更新される。ADALINE では、この戦型活性化関数 \(\phi(z)\) は単に総入力の高等関数であり、\(\phi(\mathbf{w}^T \mathbf{x}) = \mathbf{w}^T \mathbf{x} \) となる。
  • 線形活性化関数は重みの学習に使用されるが、クラスラベルの予測には 量子化器(quantizer) を使用する。

勾配降下法によるコスト関数の最小化

  • 教師あり機械学習のアルゴリズムを構成する主な要素の1つに、学習過程で最適化される 目的関数(objective function) を定義することがある。多くの場合、この目的関数は最小化したい コスト関数 である。ADALINE の場合は、重みの学習に用いるコスト関数 \(J\) を定義できる。それらの重みは、計算結果と本当のクラスラベルとの 誤差平方和(Sum of Squared Error: SSE) として学習される。 \[ J(\mathbf{w}) = \frac{1}{2} \sum_i (y^{(i)} - \phi(z^{(i)}))^2 \tag{2.5.1}\]
  • この連続値の線形活性化関数の主な利点は、単位ステップ関数とは対照的に、コスト関数が微分可能になることである。コスト関数のもう一つの特徴は、凸関数であることだ。このため、 勾配降下法(gradient descent) を用いてコスト関数を最小化する重みを見つけ出すことができる。勾配降下法は、単純ながら強力な最適化アルゴリズムである。

勾配降下法

  • 以下の図に示すように、勾配降下法の原理は、コストが局所的または大局的最小値に達するまで「坂を下る」というものだ。イテレーションのたびに勾配に沿って1ステップ進むが、その距離は勾配の傾きと学習率によって決定される。

勾配降下法(2)

  • 勾配降下法を使って重みを更新するには、コスト関数 \(J(\mathbf{w})\) の勾配 \(\nabla J(\mathbf{w})\) に沿って1ステップ進む。 \[\mathbf{w} := \mathbf{w} + \Delta \mathbf{w} \tag{2.5.2}\]
  • 重みの変化である \(\Delta \mathbf{w}\) は、負の勾配に学習率 \(\eta\) を掛けたものとして定義される。 \[ \Delta \mathbf{w} = - \eta \nabla J(\mathbf{w}) \tag{2.5.3}\]
  • コスト関数の勾配を計算するには、重み \(w_j\) ごとにコスト関数の変微分係数を計算する必要がある。 \[ \frac{\partial J}{\partial w_j} = - \sum_i (y^{(i)} - \phi(x^{(i)})) x_j^{(i)} \tag{2.5.4}\]
  • それにより、重み更新を以下のように記述できるようになる。 \[ \Delta w_j = -\eta\frac{\partial J}{\partial w_j}= \eta \sum_i (y^{(i)} - \phi(x^{(i)})) x_j^{(i)} \tag{2.5.5} \]

参考リンク

  • Deep Learning -- 今だけ読める日本語翻訳途上の書籍