読者です 読者をやめる 読者になる 読者になる

機械学習ことはじめ

機械学習

2017年1月から勉強開始

目標など

論文を読んで実装するところまでを目標とすると、 以下が最短コースになるのかなと考えて実行中

  • 日本語の入門書で機械学習の概念を理解する
  • 英語の入門書で機械学習の用語へ慣れてその概念の確認をする
  • 日本語のちゃんとした教科書で、数式を理解する

読んだ本

機械学習

ニューラルネットもしくは深層学習

統計

読んだ論文

触ったライブラリ

  • scikit-learn
  • keras(Tensorflow)

作ったもの

今のところ特になし。 なにか作りたい。

モチベーション維持用の読みもの

www.slideshare.net

【MLP 深層学習】第7章 再帰型ニューラルネット

深層学習、通称青イルカ本の学習メモ。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

知らなかったことや重要だと思ったところをQ&A形式にして自分が復習しやすい形にしてある。

これまではサンプルの次元が固定のニューラルネットを扱ってきた。
しかし本章では、系列データの分類問題を扱う。
系列データとは、個々の要素が順序付きの集まりとして与えられたものであり、サンプルごとに系列の長さが異なる。

こうした系列データを扱うために以下のネットワークを使っていく。

  • Recurrent Neural Network(RNN)
    • 系列長が異なるサンプルの予測・学習
  • Long Short-Term Memory(LSTM)
    • 系列長が非常に大きいデータの予測

再帰ニューラルネット(RNN)とは?

内部に閉路を持つニューラルネットの総称。 RNNは、過去のすべての入力から1つの出力への写像を表現する。

f:id:yusuke_ujitoko:20170318105635p:plain

入出力定義
  • 入力層ユニット
    • 入力 {\boldsymbol{x^{t}} = (x_{i}^{t})}
  • 中間層ユニット
    • 入力 {\boldsymbol{u^{t}} = (u_{j}^{t})}
    • 出力 {\boldsymbol{z^{t}} = (z_{j}^{t})}
  • 出力層ユニット
    • 入力 {\boldsymbol{v^{t}} = (v_{j}^{t})}
    • 出力 {\boldsymbol{y^{t}} = (y_{j}^{t})}
重み定義
  • 入力層と中間層間の重み {\boldsymbol{W^{(in)}} = (w_{ji}^{(in)})}
  • 中間層から中間層への帰還路の重み {\boldsymbol{W} = (w_{jj^{\prime}})}
  • 中間層と出力層間の重み {\boldsymbol{W^{(out)}} = (w_{kj}^{(out)})}

RNNの順伝播計算は?

中間層の入力

時刻 {t} における中間層の各ユニットへの入力は、 {t} に入力層から伝達されるもの + 時刻 {t-1} の中間層の出力、となる。 {} $$ u_{j}^{t} = \sum_{i} w_{ji}^{(in)} x_{i}^{t} + \sum_{j^{\prime}} w_{jj^{\prime}} z_{j^{\prime}}^{t-1} $$

中間層の出力

中間層の出力は、活性化関数 {f} を施したものとなる。 {} $$ z_{j}^{t} = f(u_{j}^{t}) $$ よって、 {} $$ \boldsymbol{z_{t}} = \boldsymbol{f}(\boldsymbol{W}^{(in)} \boldsymbol{x}^{t} + \boldsymbol{W} \boldsymbol{z}^{t-1}) $$

ネットワークの出力

$$ \boldsymbol{y_t} = \boldsymbol{f^{(out)}}(\boldsymbol{v})^{t} = \boldsymbol{f^{(out)}}(\boldsymbol{W}^{(out)} \boldsymbol{z}^{t}) $$

RNNの逆伝播計算方法は?

BTRL法とBPTT法がある。

  • BTRL法
    • realtime recurrent learning
    • メモリ効率が良い
  • BPTT法
    • backpropagation through time
    • 計算が高速
    • シンプル

簡単なので省略.

RNNで勾配が不安定になるのはなぜ?

RNNは系列データの入力履歴の長さに応じて、層が深くなる。
層が深くなると、誤差逆伝播法により勾配を計算するとき、層を遡るにつれて勾配が消失するか爆発してしまう性質がある。
RNNでは短期的な記憶は実現できても、より長期にわたる記憶を実現するのは難しいと表現することもできる。

LSTM

わかるLSTMを参照すると,本当にわかる.
このスライドも大変参考になる.

CTC(Connectionist Temporal Classification)

入力と出力の系列長が異なるときに用いられる。
任意のRNNやLSTM等の出力に適用できる。

出力に何も出力しなことを示す空白を導入し、許容することで系列長の違いを吸収する。
これにより単語数や音素数が入力音声特徴ベクトルの数に比べて少なく、固定長でないような出力を表現できる。

前進・後退法(forward backward method)

正解文字列を順番に生成する確率を求める。
コスト関数:全パスの生起確率の負の対数尤度

【MLP 深層学習】第6章 畳み込みニューラルネット

深層学習、通称青イルカ本の学習メモ。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

知らなかったことや重要だと思ったところをQ&A形式にして自分が復習しやすい形にしてある。

CNNは生物の脳の視覚野のどこをヒントにしている?

  • 受容野(receptive field)の局所性
  • 単純型細胞(simple cell)と複雑型細胞(complex cell)の存在

単純型細胞と複雑型細胞はいずれも特定の入力パターンにのみ反応するが、位置選択性が異なる。 単純型細胞は位置選択性が厳密。 一方、複雑型細胞はそれほど厳密ではなく、入力パターンが少しずれても反応する。

畳み込みの積和演算とは?

{} $$ u_{ij} = \sum_{p=0}^{H-1} \sum_{q=0}^{H-1} x_{i+q,j+q}h_{pq} $$

Lpプーリング表記でMaxプーリングや平均プーリングを意味することが何故できるのか?

{} $$ u_{ijk} = \left( \frac{1}{H^{2}} \sum_{(p,q) \in P_ij} z_{pqk}^P \right)^{\frac{1}{P}} $$

上式でP=1とすると平均プーリングとなる。
上式でP=∞とするとMaxプーリングとなる。

局所コントラスト正規化層とは?

減算正規化と除算正規化がある。 減算正規化は領域内の濃淡値の平均を0にする操作。 除算正規化はさらに分散を正規化する手法。

【MLP 深層学習】第5章 自己符号化器

深層学習、通称青イルカ本の学習メモ。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

知らなかったことや重要だと思ったところをQ&A形式にして自分が復習しやすい形にしてある。

(前提知識の整理)自己符号化器の概要

入力層から中間層への計算において、 重み行列を {W} 、バイアスを {b} 、活性化関数を {f} とし、入力層に {x} が入力された時の中間層のベクトルを {y(x)} とすると

$$ y(x)=f(Wx+b) $$ となる。 さらに出力を {\hat{x}(x)} とすると、中間層から出力層への計算は、

$$ \hat{x}(x)=\tilde{f}(\tilde{W}y(x)+\hat{b}) $$

と表せる。 まとめると、 {x} が入力された時の自己符号化器の出力 {x(x)}

$$ \hat{x}(x)=\hat{f}(\hat{W}f(Wx+b)+\hat{b}) $$ となる。 このとき、出力 {\hat{x}(x)} が入力 {x} に近いならば、 中間層の {y(x)}{x} の「特徴」をより上手く抽出した符号と言える。

データを抽出した「特徴」って何?

入力層に施して中間層を得るときの最初の変換(重み行列 {W} )のことを特徴という。 これは自己符号化器が学習によって求めるパラメータ。

{y} の計算は、重み行列 {W}{x} の積から始まるが、これは {W} の各行ベクトルと {x} との内積の計算であって、そこでは入力 {x}{W} の各行ベクトルが表す成分がどれだけ含まれているか取り出していると言える。

(別の言い方をすると、) 同じデータをより少ない次元で表したときの、 その少ない次元の基底ベクトルのことを特徴という。 元の基底ベクトルの空間ではなく、{W}の行ベクトルを基底ベクトルとした空間で {x} を見て、その空間での各成分が {y} である。 符号化することで見る空間が変わる。

中間層の次元を入力層と同じにしない理由

中間層の次元が入力層の次元と同じだと、 入力の値を単純にコピーすることとなり、出力層にて入力を再現できてしまう。 つまり {\tilde{W}W = I} となり逆行列を作れてしまうので、 {x} が単に恒等写像されただけになり、全く意味のないモデルになってしまう。

中間層の次元が入力層よりも小さいときには、 単位行列{\tilde{W}W} で表せない。

自己符号化器の目的は?

特徴の学習を通じて、サンプル {x} の別な「表現」である {y} を得ること。 ただし、何が良い表現となるかの明確な定義はない。 直感的には、{x} をそのまま使う代わりに変換した {y} を用いると対象とする問題がうまく解けるようなもの。 例えば、SVMを使ってクラス分類を行う場合、 {x} をその対象とするよりも、 {y} を用いたほうが性能が向上するなどの場合。

主成分分析(principal component analysis:PCA)とは?

教師なし学習の一つ。 データの分散(ばらつき)が大きいところ(主成分)を見つける操作。 分散が大きいところが大事で、小さいところは気にしないようにし、 既存の変量を組み合わせて分散が大きくなる新たな変量を見つける。

  • PCAのアルゴリズム
    1. 全データの重心を求める(平均値)
    2. 重心からデータの分散(ばらつき)が最大となる方向を見つける
    3. 新しいデータ表現軸として、2.で求めた方向を基底とする
    4. 上記でとった軸と直交する方向に対して分散が最大となる方向を探す。
    5. 2.~3.をデータの次元分だけ繰り返す

  • PCAの目的
    • データの特徴抽出
      • データのバラつきが大きい部分に着目することでよいデータを識別しやすくする
    • データの次元圧縮
      • データのバラつきが少ない部分はデータに共通するパターンなのであまり意味をなさない
    • 多次元特徴量の可視化
      • 多次元データは人間には認識不可
      • データのバラつきが大きところを見ることでデータの関係性を把握

主成分分析がなぜ分散共分散行列を対角化する固有値問題となるか?

訓練データ {x_{i} = (x_{i1}, .. , x_{id})^{{T}}(i = 1, .. ,N)}分散が最大になる方向を求める。
{N} 個のデータからなるデータ行列: {X = (x_{1}, .. x_{N})^{\mathrm{T}}}
{N} 個の訓練データの平均ベクトル: {\bar{x}=(\bar{x_{1}} .. ,\bar{x_{d}})^{\mathrm{T}}}
平均ベクトルを引き算したデータ行列: {\bar{X}=(x_{1} - \bar{x} .. ,x_{N} - \bar{x})^{\mathrm{T}}}
とすると、平均化訓練データ行列の分散は

$$ \sum = Var({\bar{X}}) = \frac{1}{N}\bar{X}^{\mathrm{T}}\bar{X}\ $$

で定義される。

単位ベクトル: {a = (a_{1} \cdots a_{d})^{\mathrm{T}}} とすると、{N}個のデータ {x_i - \bar{x}}の単位ベクトル {a} への正射影は {} $$ s_i = (s_{1}, .. ,s_{d})^{\mathrm{T}} = \bar{Xa} $$

となる。 この変換後のデータの分散は、 {} $$ Var({{s}}) = \frac{1}{N}{s}^Ts = \frac{1}{N}(\bar{Xa})^{\mathrm{T}}(\bar{Xa}) = \frac{1}{N}{a}^T\bar{X}^{\mathrm{T}}\bar{Xa} = a^TVar({{\bar{X}}})a $$

となる。この分散が最大となる単位ベクトル {a} は、係数ベクトル{a} のノルムを1となる制約があること利用して、 ラグランジェの未定乗数法を使って求める。

$$ E(a) = a^TVar({{\bar{X}}})a - \lambda(a^T a - 1) $$

を最大にする{a}を見つければよい、{\lambda}はラグランジェ未定定数である、{a}微分して0としておけば、

{\frac{\partial E(a)}{\partial a} = 2 Var({{\bar{X}}})a - 2\lambda a = 0} より {Var (\{\bar{X}\})a = \lambda a}

となる。 この式は元のデータの共分散行列に関する固有値問題を解くことに等しいので、 分散最大となる単位ベクトル {a}固有値問題を解けば得られることを示している。

スパース正則化とは?

いくつかの中間ユニットの出力をゼロにする。 そうなるように学習するよう操作する。

KL

カルバック・ライブラーダイバージェンス(カルバック・ライブラー情報量、カルバック距離) http://www.aoni.waseda.jp/y.fujimoto/index_files/r_mle.html

白色化

白色化の狙いは訓練サンプルの成分間の相関をなくすこと。 すなわち {D} 次元空間にあるサンプル {x = (x_{1}, \cdots, x_{D})} の任意の二成分 {x_p}{x_q} 間の相関がなくなるようにする。 訓練サンプルの成分間の相関は共分散行列で表せる。 {} $$ \Phi_{X} \equiv \frac{1}{N} \sum_{n=1}^{N} x_{n} x_{n}^{T} = \frac{1}{N}XX^{T} $$

ここで {X = (x_{1}, \cdots , x_{N})} とする

「成分間で相関がある状態=非対角成分が0でない」となるため、
対角成分を0にするように変換を施す。
そこで、各サンプルに {D * D}行列{P}による線形変換 {} $$ u_n = Px_n $$

としたとき、変換後の {u_n} の共分散行列 {} $$ \Phi_{X} \equiv \frac{1}{N} \sum_{n=1}^{N} u_{n} u_{n}^{T} = \frac{1}{N}UU^{T} $$

が対角行列になるようにPを定める。
よくある対角化の問題と一緒。

このとき {P} が満たすべき式は、 {U = PX} を代入すると {} $$ P^{T} P = \Phi_{X}^{-1} $$

となる。 このとき、{\Phi} は対称行列であり、 対称行列はは直交行列で対角化可能なので、固有値固有ベクトルを用いて、 {} $$ \Phi_X = E D E ^T $$

と表せる。ただし、 {D}{\Phi_{X}}固有値 {\lambda_{1}, \cdots, \lambda_{D}} を対角成分に持つ対角行列。 {E} は直交行列。 {} $$ \Phi_{X}^{-1} E D^{-1} E^{T} $$

と変形でき、これが {P^{T} P} に一致するので、求める {P} は、 {} $$ P = Q D^{-½} E^{T} $$

【MLP 深層学習】第4章 誤差逆伝播法

深層学習、通称青イルカ本の学習メモ。

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

知らなかったことや重要だと思ったところをQ&A形式にして自分が復習しやすい形にしてある。

連鎖律とは?

中間層のユニットjへの入力{u_j^{(2)}}は、このユニットとつながりを持つ出力層のユニットk(=1,2,3)に伝わるので、 これら3つのユニットそれぞれの総入力{u_{k}^{(3)}}に影響する。

{E_n}{u_{k}^{(3)}}の関数であるので、{E_n}{u_j^{(2)}}に関する微分は、
連鎖律を使うと、下記のように表せる。 {} $$ \frac{\partial E_{n}}{\partial u_{j}^{(2)}} = \sum_{k} \frac{\partial E_{n}}{\partial u_{k}^{(3)}} \frac{\partial u_{k}^{(3)}}{\partial u_{j}^{(2)}} $$

イメージ的には、{u_j^{(2)}} を微小に変化させると、 {u_{k}^{(3)}}がそれぞれ微小に変化する。
{u_{k}^{(3)}}がそれぞれ微笑に変化すると、{E_n}もそれらの和であるので、微小に変化するといった感じ。

順伝播と逆伝播は非線形計算?線形計算?

順伝播と逆伝播の計算はいずれも層ごとの行列計算として表現することができ、 形式的にはよく似ている。

ただし、両者の間には重要な違いがある。 順伝播は非線形計算であるのに対し、逆伝播は線形計算である点である。

順伝播計算では、各層への入力はユニットが持つ活性化関数を経由するので、活性化関数が非線形ならば、この層の入出力関係も非線形性をもつ。 この結果、例えばロジスティック関数の場合には各層の出力は常に[0,1]の範囲に制約され、値が過大に発散することはない。

一方、逆伝播計算は線形計算となる。 線形な計算を何回繰り返しても線形なので、出力層から入力層へ向かって、全体が線形なものになる。 その結果、各層の重みが多いと、勾配は各層を伝播するうちに急速に大きくなり、また逆に重みが小さいと、急速に消失し、0になってしまう。 いずれの場合にも、重みの更新がうまくできなくなり、ひいては学習が困難になってしまう。