ディープラーニングのフレームワークを
使った自然言語処理研究の実装の知見
寺西 裕紀
奈良先端科学技術大学院大学 自然言語処理学研究室
2017年9月1日(金)
第15回SVM勉強会
• 自己紹介
• 機械学習は難しい
• 実装の工夫
– Logging
– Application
– Preprocessing
– Dataset
– Loader
– Model
– Training
• 実例
• おまけ
9/1/17
...
• Background
– 大学(商学部) → 社会人(Web/アプリエンジニア)
→ NAIST松本研 (M2)
– 機械学習・深層学習 / NLP 歴 : ちょうど1年ぐらい
• 研究内容
– 並列句解析: https://www.sli...
• 学習しない!→ 原因の切り分けが難しい
– データが悪い
• データの量が悪い・質が悪い
• 前処理に問題がある
– モデルが悪い
• バグがある(ある程度動いてしまう)
• モデルそのものが悪い(表現力 ↔ 汎化性能)
– 学習方法が悪い...
• 前提・目的 : adhocな実装を避ける
– adhocな実装はバグを生みやすい
→ モデル実装以外のバグで悩みたくない, バグを減らしたい
– adhocな実装は学習がうまくいかない原因を探るのが大変
→ 原因 : 設定(データ, モデル...
9/1/17
Example: BiLSTM POS tagger
6
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
• 原因特定のためには最も重要
• 機能の作り込み
– ファイルと標準(エラー)出力への書き込み
• 異なるログレベルを設定可能にする
– ログファイルのユーティリティ
• フォーマットの見直し
– 日付+タイムゾーン, プロセスごとの識別子,...
※Pythonの場合
• 標準ライブラリのロガーを拡
張
• モデルのアーキテクチャは
__repr__ を実装して表現
• コマンドライン引数やmain()
への引数は薄いラッパーを
使って呼び出し側でロギング
すると楽
• main()はt...
• ログから実験の再現ができそう
9/1/17
Logging
9
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
• 統合的な役割
– コマンドライン引数の処理
– 設定ファイルの読み書き
– ロガーの初期化
– 環境設定の切り替え
– デバッグモードの切り替え
– 命令の実行
– 例外ハンドリング
– シグナルハンドリング
9/1/17
Applicat...
• 実行したい関数をラップするだけ
9/1/17
Application
11
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
• 汎用的な前処理
– 表層形の処理
• lowercase化, 数字のトークン化
– 単語のID化, 未知語処理
– IDから単語のlookup
– パディング
– pretrained embeddingの読み込み
• 2種類のファイル形式...
• 汎用的なミニバッチの処理
– samplesのバッチイテレーション
– samplesのシャッフル
– sampleの属性ごとのバッチ化
• [(word, pos, label), ...]
で初期化したデータを
(words, char...
• Loader
= FileReader
+ Preprocessing
+ Dataset
• 実装・機能
– readerからitemsを
イテレート
– filterとmapを継承して
itemを変換
(preprocessorを呼ぶ)...
• よくある実装
9/1/17
Model
15
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
• モデルのforward計算でlossを計算させない
– predict時にはlossの計算は必要ない
– 本来predict時には正解データは必要ない
→ forwardメソッドの引数に正解データを入れたくない
• モデルと学習の分離
– ...
• よくある実装
– 先行研究と同じモデルなのに再現できない、なぜ?
9/1/17
Model
17
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
• 重みの初期化を明示的に指定しているか?
– 使っているクラスの重みの初期化を正確に理解しているか
• normal, uniform, zeros, lecun, glorot (xavier), he
– デフォルトの初期化が適さないケー...
• 毎回書いていないか?
– epoch / batch のイテレーション
– trainフラグの管理
– backwardの呼び出し, 重みの更新
– loss, accuracyの計測/出力
9/1/17
Training
19
ディープラ...
• 設計方針:モデルと学習の分離
– Trainerクラスにはforward関数, loss関数, accuracy関数(必要
であれば)を渡す
• trainerは学習時にforward → loss (& accuracy) → backw...
•
9/1/17
Refactoring: Model
21
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
9/1/17
Refactoring: Loader
22
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
9/1/17
Refactoring: Training
23
ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
9/1/17
Example: BiaffineParser
24
• BiaffineParser (Dozat+, 2016)
– Chainer / PyTorch実装
https://github.com/chantera/biaffi...
• ソースコードを読む
– Chainer, Keras, DyNet
• きれいなコードを書く
– コーディング規約を読む
• Google C++ Style Guide
• PEP8
– linterを使ってコード解析/整形する : cp...
• 研究するなら結局はフレームワークのソースコードを読
んで理解しなければならない → 仕様が変わるし面倒
• オレオレフレームワークを作ると幸せになれる
• フレームワーク実装の難しさの8割はtensor計算
– tensor計算をライブラリ...
• フレームワーク実装の面倒くささの8割は微分の実装
• 自分の研究で使うときに必要な関数だけ書けば楽
– みんなに使ってもらうフレームワークは目指さない
• フレームワーク雑感
– Chainer: プロトタイピング
– DyNet: アルゴ...
• 発表資料 : https://github.com/chantera/svm2017
• ライブラリ : https://github.com/chantera/teras
– 自分の研究用なのでAPIはちょくちょく変わります, forkし...
Upcoming SlideShare
Loading in …5
×

ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見

833 views

Published on

奈良先端科学技術大学院大学 自然言語処理学研究室
第15回SVM勉強会

Published in: Engineering
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
833
On SlideShare
0
From Embeds
0
Number of Embeds
93
Actions
Shares
0
Downloads
3
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見

  1. 1. ディープラーニングのフレームワークを 使った自然言語処理研究の実装の知見 寺西 裕紀 奈良先端科学技術大学院大学 自然言語処理学研究室 2017年9月1日(金) 第15回SVM勉強会
  2. 2. • 自己紹介 • 機械学習は難しい • 実装の工夫 – Logging – Application – Preprocessing – Dataset – Loader – Model – Training • 実例 • おまけ 9/1/17 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見 目次 2 • 内容 – 個人的なノウハウ・提案・ チュートリアル的な内容 – DL+NLPをやり始めたときに 知っていたかったこと • 資料 : https://github.com/chantera/svm2017
  3. 3. • Background – 大学(商学部) → 社会人(Web/アプリエンジニア) → NAIST松本研 (M2) – 機械学習・深層学習 / NLP 歴 : ちょうど1年ぐらい • 研究内容 – 並列句解析: https://www.slideshare.net/HirokiTeranishi1/ss-78087806 • 会社 – TeraBytes inc. https://terabytes.jp/ • 事業内容: 受託開発, コンサルティング • 趣味 – ボクシング 9/1/17 自己紹介 3 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  4. 4. • 学習しない!→ 原因の切り分けが難しい – データが悪い • データの量が悪い・質が悪い • 前処理に問題がある – モデルが悪い • バグがある(ある程度動いてしまう) • モデルそのものが悪い(表現力 ↔ 汎化性能) – 学習方法が悪い • 最適化手法の選択が悪い, 学習率などの設定が悪い – 参考: https://www.slideshare.net/takahirokubo7792/ss-65413290 • 対応方法 : Goodfellow本 (Chapter 11) が詳しい – URL : http://www.deeplearningbook.org/contents/guidelines.html 9/1/17 機械学習は難しい 4 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  5. 5. • 前提・目的 : adhocな実装を避ける – adhocな実装はバグを生みやすい → モデル実装以外のバグで悩みたくない, バグを減らしたい – adhocな実装は学習がうまくいかない原因を探るのが大変 → 原因 : 設定(データ, モデル, 学習方法), 実装(前処理, モデル実装, その他) • 研究的には設定の部分に時間を注ぎ込みたい • 仕組み化・ライブラリ化 – ディープラーニング / NLPに使える汎用的な仕組みを作る – 再利用なコードにまとめる • デバッグ用の処理を入れる, テストを書く → バグの減少, 問題の特定が容易, 開発の効率化 • 設計の見直し ← 今日の話のメイン 9/1/17 実装で回避 5 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  6. 6. 9/1/17 Example: BiLSTM POS tagger 6 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  7. 7. • 原因特定のためには最も重要 • 機能の作り込み – ファイルと標準(エラー)出力への書き込み • 異なるログレベルを設定可能にする – ログファイルのユーティリティ • フォーマットの見直し – 日付+タイムゾーン, プロセスごとの識別子, メッセージ • ミリ秒まで出す : 正確な時間の把握, 簡易な時間計測 • 識別子 : 同一ファイルに同時に書き込んだ場合のメッセージの識別 • 実験設定を残す – OS・実行環境, コマンドライン引数, モデルアーキテクチャ, ハイパーパラメータ 9/1/17 Logging 7 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  8. 8. ※Pythonの場合 • 標準ライブラリのロガーを拡 張 • モデルのアーキテクチャは __repr__ を実装して表現 • コマンドライン引数やmain() への引数は薄いラッパーを 使って呼び出し側でロギング すると楽 • main()はtry-exceptでラップ して例外はログへ 9/1/17 Logging 8 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  9. 9. • ログから実験の再現ができそう 9/1/17 Logging 9 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  10. 10. • 統合的な役割 – コマンドライン引数の処理 – 設定ファイルの読み書き – ロガーの初期化 – 環境設定の切り替え – デバッグモードの切り替え – 命令の実行 – 例外ハンドリング – シグナルハンドリング 9/1/17 Application 10 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  11. 11. • 実行したい関数をラップするだけ 9/1/17 Application 11 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  12. 12. • 汎用的な前処理 – 表層形の処理 • lowercase化, 数字のトークン化 – 単語のID化, 未知語処理 – IDから単語のlookup – パディング – pretrained embeddingの読み込み • 2種類のファイル形式に対応 – 辞書・ベクトル同一ファイル – 辞書・ベクトル別ファイル • ヘッダー有無 :(単語数, 次元数) – データの正規化 9/1/17 Preprocessing 12 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  13. 13. • 汎用的なミニバッチの処理 – samplesのバッチイテレーション – samplesのシャッフル – sampleの属性ごとのバッチ化 • [(word, pos, label), ...] で初期化したデータを (words, chars, labels)に変換 – なるべく余計な処理はさせない 9/1/17 Dataset 13 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  14. 14. • Loader = FileReader + Preprocessing + Dataset • 実装・機能 – readerからitemsを イテレート – filterとmapを継承して itemを変換 (preprocessorを呼ぶ) 9/1/17 Loader 14 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  15. 15. • よくある実装 9/1/17 Model 15 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  16. 16. • モデルのforward計算でlossを計算させない – predict時にはlossの計算は必要ない – 本来predict時には正解データは必要ない → forwardメソッドの引数に正解データを入れたくない • モデルと学習の分離 – Modelの外でloss関数を設定 – loss関数は タスク依存 > モデル依存 • 例) 多クラス分類ならモデルはラベルのスコア(logit)を返せばよい → 呼び出し側でクロスエントロピーなりヒンジなりを選ぶ • モデルに学習/予測の処理をなるべく意識させない – せいぜいdropoutぐらい 9/1/17 Model 16 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  17. 17. • よくある実装 – 先行研究と同じモデルなのに再現できない、なぜ? 9/1/17 Model 17 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  18. 18. • 重みの初期化を明示的に指定しているか? – 使っているクラスの重みの初期化を正確に理解しているか • normal, uniform, zeros, lecun, glorot (xavier), he – デフォルトの初期化が適さないケースもある • activation関数によって適した初期化が違う, LSTMのforget gateのbiasを1にするかどうか • 関数の実装は把握しているか? – dropoutのpredict時のscalingは?, LSTMのpeepholeは? • フレームワークのソースコードは必ず読む – 先行研究を再現する場合は公開されているコードで使っている フレームワークと自分が使うフレームワークの両方 • 研究の場合はなるべく Wx + b レベルで自分で書く 9/1/17 Model 18 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  19. 19. • 毎回書いていないか? – epoch / batch のイテレーション – trainフラグの管理 – backwardの呼び出し, 重みの更新 – loss, accuracyの計測/出力 9/1/17 Training 19 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  20. 20. • 設計方針:モデルと学習の分離 – Trainerクラスにはforward関数, loss関数, accuracy関数(必要 であれば)を渡す • trainerは学習時にforward → loss (& accuracy) → backward & update, テスト時はforward → accuracy を呼び出す • タスク・実験設定に固有な処理をループに入れたい – 例) テスト時のdecoding + evaluation – Trainerクラスをオブザーバーパターンで書く (Keras参考) • ループ内でイベント処理:self.notify(BATCH_END, data) • forward, backward以外の処理が重いと話にならない – ループ部分はC, C++, Cythonで書く 9/1/17 Training 20 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  21. 21. • 9/1/17 Refactoring: Model 21 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  22. 22. 9/1/17 Refactoring: Loader 22 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  23. 23. 9/1/17 Refactoring: Training 23 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  24. 24. 9/1/17 Example: BiaffineParser 24 • BiaffineParser (Dozat+, 2016) – Chainer / PyTorch実装 https://github.com/chantera/biaffineparser – コマンドライン引数で backendを‘chainer’か ‘pytorch’を指定 • 提案した設計の利点 – フレームワークに依存 しない → Modelクラスだけフレーム ワークで実装してtrainerに modelとoptimizerとロス関数 を渡すだけ ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  25. 25. • ソースコードを読む – Chainer, Keras, DyNet • きれいなコードを書く – コーディング規約を読む • Google C++ Style Guide • PEP8 – linterを使ってコード解析/整形する : cpplint, flake8 • 勉強 – リーダブルコード – デザインパターン – PofEAA – Effective C++ / Effective Java 9/1/17 実装力を高めるために... 25 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  26. 26. • 研究するなら結局はフレームワークのソースコードを読 んで理解しなければならない → 仕様が変わるし面倒 • オレオレフレームワークを作ると幸せになれる • フレームワーク実装の難しさの8割はtensor計算 – tensor計算をライブラリに任せるならすぐ作れる – CPU/GPUの演算が同じインタフェースでできればもっと楽 • numpy/cupy, arrayfire, etc... 9/1/17 おまけ 26 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  27. 27. • フレームワーク実装の面倒くささの8割は微分の実装 • 自分の研究で使うときに必要な関数だけ書けば楽 – みんなに使ってもらうフレームワークは目指さない • フレームワーク雑感 – Chainer: プロトタイピング – DyNet: アルゴリズムをゴリゴリ書くときに使う – Tensorflow: プロダクション – PyTorch: 洗練されてないのでコードが汚くなる, 今後に期待 9/1/17 おまけ 27 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見
  28. 28. • 発表資料 : https://github.com/chantera/svm2017 • ライブラリ : https://github.com/chantera/teras – 自分の研究用なのでAPIはちょくちょく変わります, forkして使ってください – 開発計画 : Cython実装, Transition Systemの汎用的なクラス(Stateなど) 9/1/17 Appendix 28 ディープラーニングのフレームワークを使った自然言語処理研究の実装の知見

×
Save this presentationTap To Close