1
シンギュラリティ株式会社
TensorFlowを用いた様々なRNNの実装(1)
TensroFlow勉強会 第5回
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
2 2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
 自己紹介
新村拓也
- シーエイトラボ株式会社 代表取締役
- シンギュラリティ株式会社 取締役CTO
- 機械学習のための数学塾
- RNN camp
3
RNN campについて
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
- 浅川伸一先生によるRNNに特化したハン
ズオン形式の勉強会
- 現在第二回
- http://connpass.com/event/37205/
4
概要
 何やら最近案件でRNNを使うことが、、
 RNN campもあって、自分なりに色々とRNNのTensorFlow実装につ
いて試してみた
 結論から言うとTFでRNN実装はドキュメント不足などもあり実装がやや
こしいので幾つかのパターンで実装のノウハウをまとめてみた
 TF実装の話になるので、RNNの説明などについては割愛
 時間的に全部説明しきれないので残った分は次回
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
5
RNNとは(一応)
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
入力1 入力2 入力3
中間1 中間2 中間3
出力1 出力2 出力3
中間層を時間方向に展開させることにより時系列
情報をニューラルネットワークで扱えるように。
入力-中間層の重み
中間-中間層の重み
共有重みを用いている
6
TensorFlowにおけるRNN実装
 インポートするべきパッケージ
 tf.nn.rnn_cell・・・各時間の中間層における挙動を定義
 tf.nn.rnnなど・・・入力とrnn_cellを受け取って、その出力を管理する
 基本的なRNN構築手順
 入力データ整形
 cellを定義してラッピングなどをして各時間での挙動を定義
 cellと入力データを元に、RNN全体で順伝播
 出力を加工して出力層を作成
 誤差計算、学習
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
今日の話は上記3つについて幾つかのパターンで
7
 cellを定義してラッピングなどをして各時間での挙動を定義
 cellと入力データを元に、RNN全体で順伝播
 出力を加工して出力層を作成
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
8
rnn_cell の役割
ニューラルネットワークでcellというと・・・
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
x1
x2
x3
入力 出力
w1
w2
w3
b 入力を受け取って、一つの値を返す
一方TFにおけるrnn_cellは・・・
入力 t
状態 t-1 状態 t
出力 t
入力と前の状態を受け取って、出力
と新しい状態を返す、ある一種の層
の役割を持つ。
単層やドロップアウト無しの場合出
力 tと状態 tは同じ
ただしLSTMの場合は出力ゲートが
あるため出力tと状態tは異なる。
9
rnn_cellの役割
 扱えるrnn_cell
 BasicRNNCell・・・基本的なrnn_cell(これを基準に解説)
 BasicLSTMCell・・・ピープホールやクリッピングのない基本的な
LSTM用のcell
 LSTMCell・・・いろんな機能が使えるLSTM用のcell
 GRUCell・・・GRUが扱えるcell
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
10
rnn_cellの役割
 定義したcellのラッピングが可能
 MultiRNNCell・・・中間層を多層にできる。
 DropoutWrapper・・・中間層にドロップアウト機能を追加
 その他、後いくつか
 例えば3層のLSTM、ドロップアウトの中間層を定義したければ
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
11
 cellを定義してラッピングなどをして各時間での挙動を定義
 cellと入力データを元に、RNN全体で順伝播
 出力を加工して出力層を作成
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
12
tf.nn.rnnなどの役割
 実際tf.nn.rnnの機能を使わなくてもcellと、for文、reuse_variablesを駆
使すれば可能(PTBのチュートリアルはそうなってる)
 定義したcellを時間方向に展開して各時間でのrnnの出力を行う。
 tf.nn.rnn・・・一般的なrnn実装。
 tf.nn.dynamic_rnn・・・可変長RNN実装(これをメインで使う)
 tf.nn. bidirectional_rnn等々
 今回はseq2seqは扱いません(おそらく次回)
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
これらの関数は出力として、
(各時間の出力, 最後の時間の中間層)のタプルを返却
13
rnnとdynamic_rnn
 tf.nn.rnnとtf.nn.dynamic_rnnがある
 rnn ・・・シーケンス長が固定
 dynamic_rnn・・・シーケンス長が動的
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
入力1 入力2 入力3
中間1 中間2 中間3
出力1 出力2 出力3
・・・・・・
14
rnnとdynamic_rnn
 それぞれのメリット・デメリット
 tf.nn.rnnは固定長グラフ構築を行うためモデル構築が遅い。
dynamic_rnnは実行時に動的に実行する。代わりに実行が若干遅
い気がする。
 tf.nn.rnnは入力が(バッチサイズ, 入力サイズ)のtensorのリストで
ないといけないためデータ構築が面倒。dynamic_rnnは(バッチサ
イズ,シーケンス, データ長)のtensorで良いのでplaceholderで定義
しやすい。しかし、後述するがrnn出力を整形するフェーズになる際
にtf.nn.rnnの形の方が手間がかからないこともある!
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
個人的にはrnnにできてdynamic_rnnにできないことはないので
dynamic_rnnを採用しています。
15
tf.nn.dynamic_rnnの使い方
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
tf.nn.rnn_cellと入力データを引数にして各時間での出力、最終状態を返却
time_majorを用いたのtensor shapeの変更は後ほどの出力の整形でも効いてくる。
16
 cellを定義してラッピングなどをして各時間での挙動を定義
 cellと入力データを元に、RNN全体で順伝播
 出力を加工して出力層を作成
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
17
RNNのややこしいところ
 普通のニューラルネットワークなら、、、、
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
出力を用いてすぐに誤差関数を定義可能
18
RNNのややこしいところ
 一方RNNは
 (バッチサイズ, 時間, 中間層ユニット数)のtensorが
tf.nn.dynamic_rnnにおける出力
 この後出力層を定義するが、そのままoutputを使うことができない
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
適切にデータを整形する必要がある
19
様々なRNNの形
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
今日はこの二つを解説
20
many to one
 必要なのは最終ステップの出力のみ
 例:1行ずつ画像を読み込んで行って、その画像のクラス分類
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
入力1 入力2 入力3
中間1 中間2 中間2
出力3
21
many to one実装
 ポイントはtf.nn.dynamic_rnnの出力の最終時系列のデータだけを
引っ張ってくること
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
Tensor操作になるのでちょっと手間
22
ちなみに
 tf.nn.rnn を使うと
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
時系列インデックスの配列で帰ってくるので普通に配列の最後にアクセスする
だけ
23
many to many
 全ての中間層出力を相手にしないといけない
 例:次に来る単語の予測
 ややこしいのは各中間層出力にそれぞれ新たな共有重みを作用させる
ところ
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
入力1 入力2 入力3
中間1 中間2 中間3
出力1 出力2 出力3
24
many to manyの実装
 ポイントはバッチサイズと時系列情報を消して、単なる中間層出力を並
べたtensorに整形してから処理を行い元に戻す
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
擬似的に共有重みを実現!
おそらくtf.nn.rnnでやると配列なのでめんどくさい
25
まとめと次回
 再帰的ニューラルネットワークの実装の基本と2つくらいの例の実装の
解説してみました
 実はこれだけだと学習はできるけど実際に学習したモデルを実験する
時に困ったりします(many to manyのほう)
 次回は別のケースの実装を色々と扱うつもりです(seq2seqとか)
 PBを使ったデータセット構築(TFRecord)とかもやりたいなぁ
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
26 2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved
ご静聴ありがとうございました!
27
お問い合わせ
ご興味のある企業・団体・個人様は、以下までお問い合わせください。
シンギュラリティ株式会社
http://snglrty.net
東京都港区浜松町 2-7-15 三電舎ビル6F
Tel 03-5425-2545
取締役/CTO 新村拓也
E-mail:info@snglrty.net
2016/9/27
Singularity Copyright 2016 Singularity Inc. All rights reserved

Tf勉強会(5)