未分類

RNN/LSTM

/*最近TensorFlowを動かして遊んでいますが,GPU使える環境じゃないので学習に3時間とかかかります.30万円くらいほしいものです.*/
時系列データの学習に興味が湧いてきたのでググって調べたことをまとめようと思います.
参考:
Understanding LSTM Networks

わかるLSTM ~ 最近の動向と共に

ひとつ目のサイトは図が非常にわかりやすいのでおすすめです.

RNN

RNNはRecurrent Neural Networkの略で,時刻t-1の隠れ層の出力を時刻tの入力として扱うものです.こうすることで過去のデータを考慮して現在の出力を出すことができます.

LSTM

LSTMとは

単純なRNNは理論上「長時間の相関」を考慮することができますが,実験的には短時間の相関しか考慮できませんでした.例を挙げると文章を見せて次にくる単語を予想する問題で”the clouds are in the”のあとは”sky”が来ることはわかっても”I grew up in France…(長文) I speak fluent”の後に”French”が来ることは予想できませんでした.この「長時間の相関」を考慮した出力を行うために改良されたRNNがLSTMです.LSTMはLong Short Term Memoryの略です.

用語

LSTMは普通のニューラルネットワークと比べて若干複雑な構造を持っており,いくつか用語が出てくるのでまず簡単に説明をします.

  • LSTMブロック・・・通常のニューラルネットワークでは第N層に変数がベクトル状に存在していて,({\mathbf h}_N),それらと重み行列の積が活性化関数を通して第N+1層の入力となる(a\left({\mathbf h}_N^T W+{\mathbf b}_N\right))構造をしています.LSTMではこのように単純には出力が決定されず,「ゲート」と呼ばれる構造が出力を制御しています.ゲートの集まりをLSTMブロックと言って,通常のニューラルネットワークにおける層間のつながりを複雑化したものです.
  • 状態・・・LSTMは状態を持っており,これが長時間の相関を見出す役目を持っています.状態はベクトル状の変数で,時刻0から時刻tまでずっと毎時更新されながら受け渡されていきます.
  • ゲート・・・出力と状態の制御を行う構造です.時刻t-1の状態と時刻tの入力から時刻tの状態と出力を決定します.

仕組み

Screenshot from 2016-04-10 17-28-26
参考サイトより引用

まずこの図をご覧ください.Xtが入力,htが出力です.黄色い四角がゲート,⊗や⊕は要素ごとの積や和を表します.左からひとつずつ説明します.

過去の状態と出力

Screenshot from 2016-04-10 17-36-09

この2本の矢印は時刻t-1から状態と出力{\mathbf h}_{t-1}を引き継いでいることを表します.上が状態,下が出力です.

忘却ゲート

Screenshot from 2016-04-10 17-38-47.png

時刻t-1の出力は時刻tの入力と結合されて一つのベクトルとなります.それに行列をかけてバイアスを加えたあとシグモイドに通し,時刻t-1の状態と要素ごとの積をとります.要素ごとの積を取る際に忘却ゲートの結果が0であればその要素のことを忘れて,1であれば完全に覚えたままということになります.

入力ゲート

Screenshot from 2016-04-10 17-51-23

二個目の黄色い四角が入力ゲートです.計算式としては忘却ゲートと同じになりますが,使われる重み行列とバイアスが違っています.また,隣のtanhは新たな状態の「候補」を計算する部分です.この候補と入力ゲートの結果を要素ごとに掛け算し,先に忘却処理した状態と足し合わせることで時刻tの状態を計算します.

出力ゲート

Screenshot from 2016-04-10 17-56-35

最後に時刻tの出力を決定しなければなりません.出力ゲートの計算式も忘却ゲート・入力ゲートと重み/バイアス以外同じです.その結果と時刻tの状態をtanhに通したものと要素ごとの積をとって時刻tの出力とします.

Peephole

以上がLSTMの基本構造ですが,上で述べた仕組みには,時刻t-1の状態が時刻tの状態の更新過程に関与していないという欠点がありました.Peepholeはこれを解消するもので,下の矢印を「時刻t-1の出力,時刻tの入力」から「時刻t-1の出力,時刻tの入力,時刻t-1(出力ゲートに関しては時刻t)の状態」に変更します.

最後に

最初に挙げた参考サイトは非常によくまとまっているので参照されることをおすすめします.Qiitaの記事はLSTM技術全体を俯瞰できる良い記事です.

未分類

PRML読破

こんにちは.
夏休み有り余る時間を利用してPattern Recognition and Machine Learningを読み終わりました.
演習は一応すべて目を通し,自明でない問題に関しては自力で解こうと試みました.
難しい問いは一部解けずに答えを参照したので理解度としては60%位だと思います.
後々必要に応じて読み返すことになると思います.

これからの勉強予定としてはまずPRMLの技術を必要と考えた部分に関して実装してみようと思います.
これにはあまり時間を取られたくないのでざっと振り返るくらいにしたいと思います.
実装が終わって機械学習への理解が深まったらDeep learningに関する論文等を読んでいこうと思います.
どこまで首を突っ込むかはわかりませんがライブラリを使うにしても理論面を一応理解しておいたほうが良いと思うからです.
論文を読み出したら自分なりにポイント等をこのブログで紹介していこうと計画しています.

ということでPRMLの実装のためにしばらくまたいなくなりそうです笑

未分類

PRML

お久しぶりです.

毎日数アクセスあってコンテンツのなさに呆れて帰っている様子が目に浮かんで心が傷んでいますww

学校が夏休みに入ったのでひたすらいわゆるPRML,「パターン認識と機械学習」という機械学習におけるバイブルを読んでいます.

Bengio先生のWeb教材で学んでも能力はつくと思うのですが,執筆途中ということもあり読み終わったと思った章に加筆されたりと,若干使いづらくなってきたのでPRMLに移りました.

現在は上巻を読み終わって下巻の6章,「カーネル法」に入っています.

上巻にはニューラルネットワークの章があり,Deep learningへの足がかりはつかめたと思っていますが,一応下巻まで読み通そうと思っています.

というのは先日たまたまDeep learningの研究をされている院生の人とお話する機会があって,「Deep learningだけ理解できます,と他の研究者に言ったら流行りものばかり追うミーハーと思われる」と言われたためです.

僕は研究者レベルまで行こうとは(行けるとは)思っていませんが,視野を広げるためにも必要と納得しています.

PRMLは理論的なお話がメインで一切実用的なコードは出てきません.

しかし,理論が理解できればコードに落としこむのは些細な事柄を除いて(演算に伴う誤差をどう減らすかとか,コードを走らせるマシンのOSは何にするかとか,GPU計算の特殊性とか)問題は発生し得ないので十分かと思います.

数式は線形代数と解析が学部教養レベルあれば付録と合わせて読み進められるレベルになっています.

序盤(1~2章)はかなり式展開が丁寧で,演習なんかはほとんど答えと思えるヒントが書いてあるので簡単についていけます.

それ以降は序盤ほど手取り足取りではありませんが,省略が少なく,あっても演習に回されていたりと教科書にありがちな「これは読者への課題とする」という文章は出てきません.

解答はwwwマークがついている問題は筆者のページで用意されていて,ついていない問題でも頑張ってググればオフィシャルの解答を発見することが出来ます.

僕の読み方としては,基本的には非自明な式は自分で導出しながら本文を読み進めていって,演習に当たればそれを解く,といった感じです.

演習は今は時間があるので全部取り組んでいます.

2章の計算なんかはかなりハードでした(まだ下巻にも難関が待っているらしいですね).

難しい問題になると1時間ほど考えてダメだった場合はWebの解答を見ています.

学期が始まったらおそらく簡単な問題以外はすぐに解答を見ることになると思っています.

よりよい方法があるならぜひ教えて下さい.

今は機械学習を使ったアイデアだけ浮かんできて早く実装したくて仕方ないのですが,しばらく辛抱していこうと思います.

未分類

更新

このブログを少し読んでいただくとわかるかと思いますが,4月以降更新出来ていません.

大学の学期中は忙しくて手を付けることが出来ませんでした.

7月半ば以降からまた少しずつ勉強していこうと思います.

万が一更新を待っている人がいたら,すみません.

未分類

一般化、容量、過剰適合、過小適合

/*「当てはめ過ぎ」は「過剰適合」が既に訳語としてあったのでこれからはそっちを使うようにしました.「当てはめなさすぎ」はまだ訳語が見つかっていないので過剰適合にあわせて「過小適合」を用いることにしました.*/

線形回帰の例では訓練データの平均二乗誤差を最小化するような計算を行いましたが,本来の目的は未知のデータに対して誤差を小さくすることであるはずでした.

ここで「一般化」という概念が出てきます.

一般化というのはこれから現れる未知のデータは訓練データと同じ確率分布に従っているものと考えて,未知のデータに対する出力を予想するものです.

従って,うまくAIが一般化できれば未知の入力に対しても損失関数を最小化できることが期待されるのです.

容量はイントロダクションでも紹介した通り,訓練データを与えられたときどれだけ正しく答えを出せるかを表すものです.

前回の例では線形回帰,つまり一次近似を行いましたが,二次とか十次近似を行うと多くのデータにうまく式を当てはめることができて容量を上げることができます.

しかし容量を上げすぎてしまうと過剰適合の問題が出てきてしまい,式の次数を上げることが一概によいこととは言えません.

さて,容量を測る指標としてVC dimension(Vapnik–Chervonenkis dimension)があります.

VC dimensionは二項分類の問題で定義されるもので,訓練データのうち正しく判定できたデータの数を表すものです.

ただし,もし訓練データが全部同じラベルを持っていたら,それによって訓練されたアルゴリズムは無限に大きな訓練データを正しく判定できることになってしまうので,訓練データは2つのラベル両方を含むものとします.

厳密にはVC dimensionとは次のような条件を満たす最大のmです.

\min_{\bf{X}\in \mathbb{R}^{m\times n}} \max_{y \in{\{0,1\}^m}} \min_{\bf{\theta}} \sum^{m}_{i=1}|f(\bf{X}[i,:];\bf{\theta})-y_i|=0

容量を減らす方法としては,複数の層を持つニューラルネットワークにおいては,中間層の数や訓練の繰り返し回数を変化させる,「正規化」というテクニックを使う,などがあります.

/*正規化については後々説明があるそうです.*/

容量の大きさと一般化能力のトレードオフはよく問題になりますが,これは古くからの考え方「オッカムの剃刀」に関連しています.

オッカムの剃刀とは物事を説明する仮説がいくつかあるときは,一番単純な仮説を採用するのがよいという考え方です.

ここではデータを説明するのに使う関数は過小適合を起こさない程度に低次元の式を用いた方がよいということになります.

統計学ではオッカムの剃刀をVC dimension等を用いてより厳密に定量化し,容量と「過剰適合によるミス数と過小適合によるミス数の差」(optimismともいいます)との関係を示しています.

それによれば,「容量とトレーニング数の比」とoptimismは増減が一致します.

適合不足によるミス数は容量が大きくなるに従って減っていくので,「過小適合によるミス数+optimism=過剰適合によるミス数」は下に凸のグラフになります.

/*optimismの増え方は過小適合によるミス数の減り方よりある地点から大きくなるそうです*/

このグラフの底が最適な容量の大きさということになります.

optimismは容量とトレーニング数の比の増減に一致するので,トレーニング数が増えればoptimismは減少します.

「過小適合によるミス数+optimism=過剰適合によるミス数」であるので,容量を固定してトレーニング数を変化させていけば最適容量(=過剰適合によるミス数が極小となる容量)が増加していきます.

/*よくわからないのでとりあえず次に進みます…*/

これはより多くトレーニング数を積めばより複雑なモデルでも学習できるという直感を裏付けています.

未分類

例:線形回帰

機械学習の単純なモデルとして線形回帰を見てみます.

タスクT

訓練データがn次元の特徴量ベクトルで,出力がスカラーである問題を次の式でモデリングし,未知の値に対する出力を予測します.

y=\bf{w}^\mathrm{T}\bf{x}

ここでwは係数,xが入力でyが出力です.

性能評価P

訓練データとは別のm個のテストデータと正解を用意し,平均二乗誤差の大小で性能を評価します.

正解を縦に並べたベクトルを\bf{y},回帰式の出力を縦に並べたベクトルを\bf{\hat{y}}とすると

MSE=\frac{1}{m}\sum_{i}(\bf{y}-\bf{\hat{y}})^{2}_{i}=\frac{1}{m}||\bf{y}-\bf{\hat{y}}||^2

となります.

/*MSEはmean square errorの頭文字です*/

wの決定

どうやったらwを決定できるかですが,訓練データのMSEを最小化すればうまくいきそうだということが直感的にわかります.

/*テキストの次のセクションで正当化するそうです.*/

訓練データのMSEが最小化されるのはMSEのwに関する勾配が零ベクトルとなればよいので,/*二次の条件を見ないでいいのはMSEが明らかに極大値を持たないからですね*/

\nabla MSE=\bf{0}

\frac{1}{m}は計算に関わってこないので無視し,\bf{\hat{y}}=\bf{Xw} \ \mathrm{where}\ \bf{X}=(\bf{x_1} \bf{x_2} ...)^\mathrm{T}であることを用いれば

\nabla(\bf{Xw-y})^\mathrm{T}(\bf{Xw-y})\\    =\nabla((\bf{Xw})^\mathrm{T}\bf{Xw}-2(\bf{Xw})^\mathrm{T}\bf{y}+\bf{y}^\mathrm{T}\bf{y})\\    =\nabla(\bf{w}^\mathrm{T}\bf{X}^\mathrm{T}\bf{Xw}-2(\bf{Xw})^\mathrm{T}\bf{y}+\bf{y}^\mathrm{T}\bf{y})\\    =2\bf{X}^\mathrm{T}\bf{Xw}-2\bf{Xy}=\bf{0}\\    \Rightarrow\bf{w}=(\bf{X}^\mathrm{T}\bf{X})^{-1}\bf{Xy}

となります.

未分類

タスク,性能評価,経験

機械学習アルゴリズムとは

経験Eを積み重ねながらあるクラスのタスクTを処理するコンピュータアルゴリズムで,何らかの方法Pでそのアルゴリズムの性能を評価すれば,Eをより多く積み重ねていくにつれて性能が上がるもの

とあります.

タスクT

Tには次のような種類があります.

  • 分類
  • 入力値がところどころ欠けた分類
  • 回帰
  • 転写(複数の出力を持つ分類)
  • 確率密度推定
  • 異常検知
  • 模倣
  • 欠損値の予測

/*確率密度推定はここに挙げた他のすべてのタスクを一般化したものです.他のすべてのタスクは結局確率密度推定に行き着くらしいです*/

性能評価P

AIの性能の評価方法としては,トレーニングデータとは別に用意したテストデータでどれだけうまく結果を出せるかというのを見ます.

その「結果」というのはタスクTに関連した「損失」(分類の失敗回数,回帰によって得られた式からのテストデータの乖離等)がどの程度になるかによって測られます.

しかし,損失の決定方法を決めるのは時に難しいことがあります.

例えば回帰において,全データから平均して近い式を得ることをよしとするのか,幾つか外れ値があってもその他のほとんどのデータでうまく当てはまった式を得れば良いのか,といった場合です.

また,性能を上げていくためにはなめらかなシグナル(勾配など)を利用する必要がありますが,しばしばシグナルがなめらかでなかったりします.

例えば,分類を行わせる場合,評価関数のパラメータにごく僅かな変化を加えても分類結果は全く変化しないでしょう./*つまり,損失の大きさは変わらない,と*/

したがってどのようにパラメータを変更すればより性能が上がるのか検討をつけることが出来ません.

このように直接的に性能評価しづらい場合には間接的に性能評価を行う「代理の性能評価関数」を使います.

経験E

経験にも様々な種類がありますが,最もシンプルなのは例題となるデータセットをアルゴリズムに観察させるものです.

/*active learningやreinforcement learningではより豊かな経験を詰むために追加データを要求したり環境とやりとりし続けたりするらしいです*/

データセットは対象となるデータの特徴量を集めたものです.

例えば画像だったら輝度などがデータセットの構成要素となります.

例となるデータの特徴量ベクトルを行ベクトルとする行列を計画行列(design matrix)といいます.

/*このテキストでは各アルゴリズムが計画行列をどのように処理するかということを解説していくそうです*/

計画行列を得るためにはデータが特徴量ベクトルで表せる必要がありますが,画像サイズが異なるなどうまくベクトルに出来ない場合もあります.

そのような場合にも対処法は存在し,後ほど述べられます.

また,各例データにはラベルが付与されることがあります.(人が写った写真には0,車が写った写真には1など)

ラベルは数値であることもあれば文字列であることもあります.