fastTextの実装を見てみた

3,191 views

Published on

自然言語処理LT会・懇親会@新宿四谷 で発表した資料です。
https://massivelngg.connpass.com/event/47985/

Published in: Technology
1 Comment
16 Likes
Statistics
Notes
  • Hi, on slide 30, could you explain what happened there. 入力文書 : I love Gundam very much . ↓ I / love / gundam / very / much / lov / ove / ...
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
3,191
On SlideShare
0
From Embeds
0
Number of Embeds
401
Actions
Shares
0
Downloads
33
Comments
1
Likes
16
Embeds 0
No embeds

No notes for slide
  • 全てテキスト分類タスク。ニューラルネットワークモデルの中でRNN系モデルよりも速いとされるCNNベースの手法と比べてもケタ違いに学習が速いことがわかる。

    char-CNN: Lecunのやつ。一文字一文字を分解してCNNでテキスト分類する、というモデル
    VDCNN: これもLecun製のモデル。テキストを深い層のCNNで分類するモデル
  • fastTextの実装を見てみた

    1. 1. fastTextの実装を見てみた 2017/02/04 自然言語処理LT会・懇親会@新宿四谷 shirakiya831
    2. 2. Me 白木 義彦(shirakiya831) アディッシュ株式会社 技術開発部 大阪大学大学院で金属材料工学を学んだ後、 株式会社ガイアックスに入社。 プログラミングを始めて3年目、Webアプリに関わる技術は広く浅く…。 2016/5に機械学習エンジニアを目指して転籍。 最近は専らDjango で APIサーバ書いてたり、React.js書いてたり。
    3. 3. 注意 • 今回の発表にあたって、いくつかの論文や記事や実装を見て 自力で理解した内容となりますので、間違いが含まれている可 能性がありますので、予めご了承ください。 • Word2Vec(CBOW/skip-gram)は予め知っているとして話をし ます。(とはいえそんなにWord2Vecな話は出てきません) 質問等は懇親会でお気軽にどうぞ!
    4. 4. テキスト分類してますか?
    5. 5. https://research.fb.com/fasttext/ @2016/08/18
    6. 6. http://jp.techcrunch.com/2016/08/19/20160818facebooks-artificial-intelligence- research-lab-releases-open-source-fasttext-on-github/ @2016/08/19
    7. 7. fastText • https://github.com/facebookresearch/fastText • Facebook AI Research製ライブラリ • fastTextが行えること 1. Word Embedding の取得 2. テキスト分類(マルチラベル対応) • 以下の2つの論文のC++実装 • Enriching Word Vectors with Subword Information (P. Bojanowski, E. Grave, A. Joulin, T. Mikolov, 2016) • Bag of Tricks for Efficient Text Classification (A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, 2016)
    8. 8. fastTextの特徴 • 学習が速い • 精度が良い • 利用が簡単
    9. 9. 学習が速い https://research.fb.com/fasttext/ より引用
    10. 10. 精度が良い 『Bag of Tricks for Efficient Text Classification』 より引用
    11. 11. 利用が簡単 • リポジトリのREADME参考に。めっちゃ簡単。 • ざっくり言うと、 1. リポジトリをclone 2. makeで実行ファイルを得る 3. 自前のtrain用・test用のテキストデータを準備する 4. 学習コマンド叩く
    12. 12. 利用が簡単 • リポジトリのREADME参考に。めっちゃ簡単。 • ざっくり言うと、 1. リポジトリをclone 2. makeで実行ファイルを得る 3. 自前のtrain用・test用のテキストデータを準備する 4. 学習コマンド叩く
    13. 13. テキストデータを用意する 1つの入力文書を半角スペースで分割したtokenで構成する必要がある。 クラス「0」: I love apple very much. クラス「1」: I like orange. … __label__0 I love Gundam very much . n __label__1 I like Doraemon . n … data.txt
    14. 14. テキストデータを用意する 1つの入力文書を半角スペースで分割したtokenで構成する必要がある。 ※日本語の場合 クラス「0」: 私はリンゴがとても好きです。 クラス「1」: 私はオレンジが好きです。 … __label__0 私 は リンゴ が とても 好き ですn __label__1 私 は オレンジ が 好き ですn … data.txt わかち書きして、 token毎に半角スペースで区切る
    15. 15. 疑問
    16. 16. 疑問  前述の2つの論文から分類(supervised)でどのようなアルゴリ ズムで学習が行われているのか、わからなかった…orz  READMEに書かれているパラメータの役割は?  特に lrUpdateRate と t が…orz
    17. 17. 実装見ればええやん
    18. 18. ということで 実装を見てわかったことを 共有しようと思います。
    19. 19. 前提 • 分類(supervised)の方法に限って見ていきました • fastTextの論文や紹介記事では Hierarchical softmax(階層的ソフト マックス) が取りあげられてますが、今回は説明しません • なぜなら Livedoor の記事分類データセットで精度が低くなったため • なぜならデフォルトの損失関数が Negative Sampling のため
    20. 20. 参考: 損失関数の比較 ※ 9クラス分類、train:test = 9:1 でランダムに抽出・分割, 同一データセットを使用 Hierarchical Softmax loss=hs, 以外をデフォルト値で測定 Negative Sampling loss=ns, 以外をデフォルト値で測定
    21. 21. 学習の流れ
    22. 22. 学習の流れ(FastText::train) 1.データ準備 2.Vectorの初期化 3.学習
    23. 23. 学習の流れ(FastText::train) 1.データ準備 2.Vectorの初期化 3.学習
    24. 24. データの準備 (Dictionary::readFromFile) • <Dictionary> • テキストデータの入出力、tokenの保持などを行うクラス • Dictionary::readFromFile • 与えられたテキストデータから token を読み取り、単語に単語ID を突き合わせた 単語辞書 を作成する。 • また token を ngram に分解し、単語辞書 に格納. I love Gundam very much . <Gundam> word2int(単語辞書) Gu, Gun, Gund, Gunda, ... Gundam Gu Gun Gund Gunda
    25. 25. 学習の流れ(FastText::train) 1.データ準備 2.Vectorの初期化 3.学習
    26. 26. Vectorの初期化 (FastText::train) input(=Word Vector)と output(出力層)を初期化する 0~1の範囲での離散一様 分布の値で初期化 dim nwords + bucket 1 dim <input> <hidden> 学習実行毎に 0で初期化 nlabels <output> dim 単語辞書
    27. 27. 学習の流れ(FastText::train) 1.データ準備 2.Vectorの初期化 3.学習
    28. 28. 学習 (FastText::trainThread) • スレッド並列で学習は実行される(パラメータ: thread) • Negative Sampling(後述)でランダムなサンプリングが行える ように、予めラベルのキーをランダムで十分量生成・保持する • 以下ループ(入力テキストデータ1行ずつ) 1. テキストデータから<EOS>までの1行分を取り出す 2. FastText::supervised の実行 ← これが学習の本丸、NN計算 3. 今まで学習した token が lrUpdateRate を越えると学習率を更 新
    29. 29. 学習 (FastText::supervised) 「word vector を更新する処理」 当たり前だけど…
    30. 30. hiddenの計算処理 dim 1 dim <input> <hidden> 入力文書: I love Gundam very much . ↓ I / love / gundam / very / much / lov / ove / … 単語IDから列を特定 単語辞書
    31. 31. hiddenの計算処理 dim 1 dim <input> <hidden> 入力文書: I love Gundam very much . ↓ I / love / gundam / very / much / lov / ove / … 単語辞書 add
    32. 32. hiddenの計算処理 dim 1 dim <input> <hidden> 入力文書: I love Gundam very much . ↓ I / love / gundam / very / much / lov / ove / … 単語辞書 単語IDから列を特定
    33. 33. hiddenの計算処理 dim 1 dim <input> <hidden> 単語辞書 入力文書: I love Gundam very much . ↓ I / love / gundam / very / much / lov / ove / … 入力文書のvectorの総和を取 る add
    34. 34. 目標ラベルの score の計算 • 正解であるラベルにおける計算時点の確率 • 本来は1.00になって欲しい値 目標ラベルのscore
    35. 35. 目標ラベルの score の計算 1 dim <hiddenT> <output> dim 目標ラベル列
    36. 36. 目標ラベルの score の計算 1 dim <hiddenT> <output> dim 目標ラベル列 内積
    37. 37. 目標ラベルの score の計算 score = Sigmoid( ) 前スライドで求めた内積
    38. 38. 目標ラベルの score の計算 今までの計算は、 出力層の二値分類の計算式である、 と等価。 score = f(Σwx) Sigmoid
    39. 39. 勾配(重みの更新量)の計算 <output> dim 目標ラベル列 × α = <勾配ベクトル> α = lr × ( 1 – score )
    40. 40. 勾配(重みの更新量)の計算 <output> 目標ラベル列 <勾配ベクトル><hidden> copy
    41. 41. 勾配(重みの更新量)の計算 <勾配ベクトル> 目標ラベルにおける 更新量
    42. 42. Negative Sampling • いくつかの負例(目標ラベルでないラベル)を使って更新量を 求める手法。 • 本来はSoftmaxを使って全ラベルに対して score を計算し、 更新量を求めるが、Word Embeddingを求める場合では単語 の語彙数分だけべき乗計算を行わないといけないため、リソー スを大きく消費し、学習が遅くなる原因となる。
    43. 43. Negative Sampling <output> 目標ラベルでないラベル列 × α += <勾配ベクトル> α = lr × ( – score )
    44. 44. Negative Sampling <output> 目標ラベルでないラベル列 <勾配ベクトル> copy <hidden>
    45. 45. Negative Sampling <output> 目標ラベルでないラベル列 × α += <勾配ベクトル> α = lr × ( – score )
    46. 46. Negative Sampling <output> 目標ラベルでないラベル列 <勾配ベクトル> copy <hidden> Samplingの数だけ行う
    47. 47. word vector の更新 <勾配ベクトル> dim <input> 入力文書: I love Gundam very much . ↓ I / love / gundam / very / much / lov / ove / … add 単語辞書
    48. 48. word vector の更新 <勾配ベクトル> dim <input> 入力文書: I love Gundam very much . ↓ I / love / gundam / very / much / lov / ove / … add 単語辞書
    49. 49. 学習 以上の計算を、 ( 全文書数 × epoch ) 回だけ行う
    50. 50. 推論 (FastText::predict) 1. 学習済みの word vector をロード 2. 出力層まで学習と同じ計算を行う 3. Softmaxで各ラベルの確率を求める 4. 上位 k 番目のラベルを返して、コンソールに出力
    51. 51. fastTextのテキスト分類モデルは 1層のニューラルネットワークだった!
    52. 52. 参考: パラメータ https://github.com/facebookresearch/fastText、READMEより
    53. 53. 参考: パラメータ !? https://github.com/facebookresearch/fastText、READMEより
    54. 54. 参考: パラメータ パラメータ 説明 lr 学習率。この値で固定ではなく、学習したtokenが lrUpdateRate の個数を超える度に、減少する。 lrUpdateRate 学習率の更新を行う token の数。この値を超える度に更新 が行われる。(Rate とか言いながら、実際は割合ではなく tokenの数なので注意。) dim word vector の次元数。 ws window size 。supervised ではこの値は使われない。 epoch いわゆるepoch 。全 token 数に対して何倍の token を使っ て学習するか。 minCount 学習に用いない token の最低出現回数の閾値。 minCountLabel 学習に用いないラベルの最低出現回数の閾値。 neg Negative Sampling で用いる負例のサンプル数。 wordNgrams 学習に利用する Ngram の文字数。2であればbigramとなる。
    55. 55. 参考: パラメータ パラメータ 説明 loss 損失関数の種類の指定。 • ns: Negative Sampling • hs: Hierarchical Softmax • softmax: Softmax bucket 分解したNgramの格納可能数(メモリと相談して決めるらし い。 https://github.com/facebookresearch/fastText/issues/24 minn Ngramの最小文字数。 maxn Ngramの最大文字数。 thread 学習の並列処理数。(CPUと相談して決める) t 学習時にtokenをDropする確率に影響する値。 この数字が小さければ小さいほど、Dropされやすくなる。 verbose 0, 1, 2 から選択。値が大きいほど詳細な情報がコンソール に出力される。 pretrainedVector word vectorの初期値。具体的には input の初期値となる。
    56. 56. まとめ • Facebookが書いた実装の流れと少し詳しくみて いくと、意味が全くわからないというものでもな かった。 • 案外愚直に実装してる様子も見れて新鮮 • パラメータの意味まとめた

    ×