Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2018年01月27日 TensorFlowでRNN-LSTMを実装してみた

1,977 views

Published on

発表日:2018年01月27日
イベント名: AITCオープンラボ TensorFlow勉強会シリーズ2 成果報告会
イベントURL:http://aitc.jp/events/20180127-OpenLab/info.html
タイトル:TensorFlowでRNN-LSTMを実装してみた
発表者:西野 貴志氏 鈴木 悠斗氏

Tensorflowのサンプルコードを例に、RNNの概要や、LSTMの核となるアイディ
アの理解に挑戦しました。

Published in: Internet
  • Be the first to comment

2018年01月27日 TensorFlowでRNN-LSTMを実装してみた

  1. 1. AITC TensorFlow勉強会 TensorFlowによる RNNの実装について 2018年1月 AITC会員 ⻄野、鈴⽊ TensorFlow, the TensorFlow logo and any related marks are trademarks of Google Inc. 1
  2. 2. リカレントニューラルネットワーク(RNN) • 接続に戻りがあり閉路を持つニューラルネットワーク • ⼊出⼒データが(⻑さ不定の)「列」の場合に利⽤ 例:機械翻訳、⾳声認識、評判分析など • 隠れノードに”状態“(=過去の履歴を集約した情報)を保持 Hidden Input Output 一時刻先への 伝播 最も一般的な構造 (Turing完全) Hidden Input Output Outputから戻る構造 状態の学習に逐次の正解を使 えるので効率がよい 2
  3. 3. Backpropagation through Time (BPTT) • ネットワーク構造: • ot = Vht+C 、ht = φ(at)、 at = Wht-1+Uxt+B • 勾配: • L = + = + L W htの勾配は時間を遡って計算できる • ! =∑ # = ∑ L • $ = ∑ ht % = ∑ L ht&1 ' = ∑ L xt Hidden Input Output 時間軸を展開 ht-2 xt-2 ot-2 ht-1 xt-1 ot-1 ht xt ot ht+1 xt+1 ot+1 ht+2 xt+2 ot+2 重み共有 W U V U VW 3
  4. 4. サンプルコード • Qiitaの以下の記事からの流⽤: 「TensorFlowのRNNを基本的なモデルで試す」 http://qiita.com/yukiB/items/f6314d2861fc8d9b739f • 変更点 • Tensorflow 1.2以降に対応 • accuracyをグラフで定義してTensorBoardで変化を⾒える化 • state_is_tuple=Falseがdeprecatedになるそうなので、Trueで動くように改訂 • BasicLSTMCell版に加えてBasicRNNCell版も作成し、違いを確認できるように • ⼊⼒層/隠れ層間の重み計算は、Cell内でやっているので、不要と判断 • 例題: Xk = 0 or 1の数値が⼊⼒された際の,それらの合計値を出⼒する。 たとえば,X = [0, 1, 1, 0, 1, 0, 0, 1, 0, 0] に対して、このリストの合算値であ る Y = 4 を正しい出⼒とする。 4
  5. 5. パラメタ • I: num_of_input_nodes • H: num_of_hidden_nodes • O: num_of_output_nodes • S: length_of_sequences • B: size_of_mini_batch • U: BasicRNNCell/LSTMCellのデフォルト • V: weight_var & bias_var • W: BasicRNNCell/LSTMCellのデフォルト h0 x0 o0 h1 x1 o1 h2 x2 o2 hS-1 xS-1 oS-1 U VW I H O S … 5
  6. 6. BasicRNNCell版のグラフの構造 6 I: num_of_input_nodes H: num_of_hidden_nodes O: num_of_output_nodes S: length_of_sequences B: size_of_mini_batch 0 1 0 1 1 0 1 0 1 …in1/in2 B I h0 h1 h2 h3 h4 hS-1 0 0 0 istate_ph H O B B H … 1 1 0… 0 0 1… 0 1 1… B S input_ph 注: 隠れ層への活性関数はtanh in1は3次元Tensor in2は2次元TensroのList I …B H rnn_output output_op weight_varを掛けて bias_varを足す 活性関数は無し
  7. 7. Long Short-Term Memory (LSTM) • RNNは、 t = t-1 t により過去の記憶を指数的に忘れてしまう • “状態”には重みを掛けず、代わりに“忘れる”スイッチを付ける σ ✕ + ✕ tanh ✕ tanh σσ Input LSTMセル Output 1時刻前の状態 (c_state) 1時刻前の出⼒ (m_state) f i o σ:シグモイド関数 ✕:要素毎の積 +:ベクトル和 f:forgetゲート i:inputゲート o:outputゲート 通過するベクトルに 0/1のベクトルを掛けて フィルターする 重みを含む All the cool kids are using LSTMs. (Brad Neuberg@Dropbox) 7
  8. 8. c_state_ph BasicLSTMCell版のグラフの構造 8 0 1 0 1 1 0 1 0 1 …in1/in2 B I h0 h1 h2 h3 h4 hS-1 0 0 0 H O B B H … 1 1 0… 0 0 1… 0 1 1… B S input_ph I …B H rnn_output output_op m_state_ph …0 0 0 B H LSTMStateTuple
  9. 9. Tensorflowによる実装 9
  10. 10. におけるグラフ構造の定義 引数 返り値 static_rnn 入力データ列 (長さN) in2 RNNの 初期内部状態 istate_ph cell RNNの種類 cell 出力データ列 (長さN) RNNの 最終内部状態 cellcell t=1 t=2 t=N • グラフ構造の定義には、 static_rnnメソッドを使う • 時系列データや、単語列などを RNNに順番に入力し、 計算された出力結果を得る • バッチ学習に対応しており、 入力データは [バッチサイズ, 次元数] のtensorのリスト(in2) • cellには、RNNCellクラスの インスタンスを指定可能 • BasicRNNCell • BasicLSTMCell • GRUCell … etc # 隠れ層の定義 cell = tf.nn.rnn_cell.BasicLSTMCell(num_of_hidden_nodes, forget_bias=forget_bias) # グラフ構造の定義 rnn_output, states_op = tf.nn.static_rnn(cell, in2, initial_state=istate_ph) サンプルコード
  11. 11. 主な • • H個の基本hiddenセルを生成する。 • • H個の基本hiddenセルを生成する。 • • 展開構造を構築する 11
  12. 12. 主な とグラフとの関係 • • H個の基本hiddenセルを生成する。 12 0 1 0 1 1 0 1 0 1 …in1/in2 B I h0 h1 h2 h3 h4 hS-1 0 0 0 istate_ph H O B B H … 1 1 0… 0 0 1… 0 1 1… B S input_ph I …B H rnn_output output_op
  13. 13. • • H個の基本hiddenセルを生成する。 13 c_state_ph 13 0 1 0 1 1 0 1 0 1 …in1/in2 B I h0 h1 h2 h3 h4 hS-1 0 0 0 H O B B H … 1 1 0… 0 0 1… 0 1 1… B S input_ph I …B H rnn_output output_op m_state_ph …0 0 0 B H LSTMStateTuple 主な とグラフとの関係
  14. 14. • • 展開構造を構築する 14 0 1 0 1 1 0 1 0 1 …in1/in2 B I h0 h1 h2 h3 h4 hS-1 0 0 0 istate_ph H O B B H … 1 1 0… 0 0 1… 0 1 1… B S input_ph I …B H rnn_output output_op 主な とグラフとの関係
  15. 15. の 層について • 引数 • num_units 右図のLSTM構造を何個持つか • forget_bias バイアス。出力の微調整(bf) • activation 内部状態の励起関数(tanh) • state_is_tuple 内部状態の受け取り方 Trueが推奨 Forget_bias Activation
  16. 16. サンプルコードの解説 - SimpleRNNbyTensorFlowBasicRNN.py - 16
  17. 17. ログディレクトリ/パラメータ設定 17 ログディレクトリの指定 TensorBoardを--logdir=LOGDIRで起動すれば、 そのサブディレクトリの内容を比較できる ※TensorBoard実行中だとプログラム実行エ ラーになるので注意 各パラメータの定義 ・入力層、隠れ層、出力層のノード数 ・学習率 ・正答閾値 etc.
  18. 18. RNN層の設計/実装 18 隠れ層の定義 ・num_of_hidden_nodes=隠れ層の数 RNN構造の作成 ・cell=定義した隠れ層の指定 TensorBoard
  19. 19. 損失関数 19
  20. 20. 精度の評価 20
  21. 21. まとめ • RNN/LSTMは時系列データを扱うことができる • 機械学習はソースコードから理解すると早い • 今後はRNNを応⽤したseq2seqモデルについても解明していきたい 21
  22. 22. ご静聴ありがとうございました! 22

×