Advertisement
Advertisement

More Related Content

Slideshows for you(20)

Advertisement

Recently uploaded(20)

Advertisement

Tf勉強会(5)

  1. 1 シンギュラリティ株式会社 TensorFlowを用いた様々なRNNの実装(1) TensroFlow勉強会 第5回 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved
  2. 2 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved  自己紹介 新村拓也 - シーエイトラボ株式会社 代表取締役 - シンギュラリティ株式会社 取締役CTO - 機械学習のための数学塾 - RNN camp
  3. 3 RNN campについて 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved - 浅川伸一先生によるRNNに特化したハン ズオン形式の勉強会 - 現在第二回 - http://connpass.com/event/37205/
  4. 4 概要  何やら最近案件でRNNを使うことが、、  RNN campもあって、自分なりに色々とRNNのTensorFlow実装につ いて試してみた  結論から言うとTFでRNN実装はドキュメント不足などもあり実装がやや こしいので幾つかのパターンで実装のノウハウをまとめてみた  TF実装の話になるので、RNNの説明などについては割愛  時間的に全部説明しきれないので残った分は次回 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved
  5. 5 RNNとは(一応) 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間3 出力1 出力2 出力3 中間層を時間方向に展開させることにより時系列 情報をニューラルネットワークで扱えるように。 入力-中間層の重み 中間-中間層の重み 共有重みを用いている
  6. 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. 7  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved
  8. 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. 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. 10 rnn_cellの役割  定義したcellのラッピングが可能  MultiRNNCell・・・中間層を多層にできる。  DropoutWrapper・・・中間層にドロップアウト機能を追加  その他、後いくつか  例えば3層のLSTM、ドロップアウトの中間層を定義したければ 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved
  11. 11  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved
  12. 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. 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. 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. 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. 16  cellを定義してラッピングなどをして各時間での挙動を定義  cellと入力データを元に、RNN全体で順伝播  出力を加工して出力層を作成 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved
  17. 17 RNNのややこしいところ  普通のニューラルネットワークなら、、、、 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved 出力を用いてすぐに誤差関数を定義可能
  18. 18 RNNのややこしいところ  一方RNNは  (バッチサイズ, 時間, 中間層ユニット数)のtensorが tf.nn.dynamic_rnnにおける出力  この後出力層を定義するが、そのままoutputを使うことができない 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved 適切にデータを整形する必要がある
  19. 19 様々なRNNの形 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved http://karpathy.github.io/2015/05/21/rnn-effectiveness/ 今日はこの二つを解説
  20. 20 many to one  必要なのは最終ステップの出力のみ  例:1行ずつ画像を読み込んで行って、その画像のクラス分類 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved 入力1 入力2 入力3 中間1 中間2 中間2 出力3
  21. 21 many to one実装  ポイントはtf.nn.dynamic_rnnの出力の最終時系列のデータだけを 引っ張ってくること 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved Tensor操作になるのでちょっと手間
  22. 22 ちなみに  tf.nn.rnn を使うと 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved 時系列インデックスの配列で帰ってくるので普通に配列の最後にアクセスする だけ
  23. 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. 24 many to manyの実装  ポイントはバッチサイズと時系列情報を消して、単なる中間層出力を並 べたtensorに整形してから処理を行い元に戻す 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved 擬似的に共有重みを実現! おそらくtf.nn.rnnでやると配列なのでめんどくさい
  25. 25 まとめと次回  再帰的ニューラルネットワークの実装の基本と2つくらいの例の実装の 解説してみました  実はこれだけだと学習はできるけど実際に学習したモデルを実験する 時に困ったりします(many to manyのほう)  次回は別のケースの実装を色々と扱うつもりです(seq2seqとか)  PBを使ったデータセット構築(TFRecord)とかもやりたいなぁ 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved
  26. 26 2016/9/27 Singularity Copyright 2016 Singularity Inc. All rights reserved ご静聴ありがとうございました!
  27. 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
Advertisement