Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

4 481 vues

Publié le

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

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

Publié dans : Internet
  • Soyez le premier à commenter

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

×