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.

Word2vecの並列実行時の学習速度の改善

16,906 views

Published on

情報処理学会 第217回自然言語処理研究会
http://www.nl-ipsj.or.jp/NL217program.html

Published in: Technology
  • Be the first to comment

Word2vecの並列実行時の学習速度の改善

  1. 1. Word2vecの並列実行時の 学習速度の改善 岡崎 直観1,2 乾 健太郎1,3 1 東北大学大学院情報科学研究科 2 JST戦略的創造研究推進事業「さきがけ」 3 JST戦略的創造研究推進事業「CREST」 2014-07-04 Word2vecの並列実行時の学習速度の改善 1
  2. 2. word2vec祭り キタ━━゚+.ヽ(≧▽≦)ノ.+゚━━ ッ 2014-07-04 Word2vecの並列実行時の学習速度の改善 2 http://www.oreilly.co.jp/books/9784873116839/ http://naoyat.hatenablog.jp/entry/2013/09/11/002941
  3. 3. ACL2014でもword2vec祭り • J. Andreas and D. Klein: How much do word embeddings encode about syntax? • M. Bansal, K. Gimpel, and K. Livescu: Tailoring Continuous Word Representations for Dependency Parsing • M. Baroni, G Dinu, and G Kruszewski: Don’t count, predict! A systematic comparison of context-counting vs. context-predicting semantic vectors • O. Levy and Y. Goldberg: Dependency-Based Word Embeddings • R. Tian, Y. Miyao, and T. Matsuzaki: Logical Inference on Dependency-based Compositional Semantics • M. Yu and M. Dredze: Improving Lexical Embeddings with Semantic Knowledge • … 2014-07-04 Word2vecの並列実行時の学習速度の改善 3
  4. 4. なぜそんなに大人気? • オープンソースの実装が公開されている • ツールが使いやすい・試しやすい • 大規模なデータに対してもスケールする • 確立された理論に基づくオンライン学習 • 確率的勾配降下法,誤差逆伝搬法 • ベクトル和による単語の意味の構成性 • 𝑣𝑣 𝐾𝐾𝐾𝐾𝐾𝐾 𝐾𝐾 − 𝑣𝑣 𝑚𝑚𝑚𝑚𝑚𝑚 + 𝑣𝑣(𝑤𝑤𝑤𝑤𝑤𝑤𝑤𝑤𝑤𝑤) ≈ 𝑣𝑣(𝑄𝑄𝑄𝑄𝑄𝑄𝑄𝑄𝑄𝑄) • 複数のプロセッサによる並列処理 • 1週間かかる学習が1日以内になると助かる 2014-07-04 Word2vecの並列実行時の学習速度の改善 4
  5. 5. オンライン学習の並列処理とは? Iterative Parameter Mixture (McDonald+, 10) の場合 2014-07-04 Word2vecの並列実行時の学習速度の改善 5 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 3* 1* 2* 4* スレッド#1: モデル(ベクトル) スレッド#2: モデル(ベクトル) スレッド#3: モデル(ベクトル) スレッド#4: モデル(ベクトル) 学習データ + 学習事例を 4グループに分割 並列実行数を 4とする場合 勾配計算 モデル更新 全体のモデル(ベクトル)全体のモデル更新
  6. 6. word2vecは非同期パラメータ更新 (Bengio+, 03) 2014-07-04 Word2vecの並列実行時の学習速度の改善 6 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 スレッド#1 スレッド#2 スレッド#3 スレッド#4 学習データ 学習事例を 4グループに分割 並列実行数を 4とする場合 勾配計算 モデル更新 全体のモデル(ベクトル)全体のモデル更新 省メモリ スレッド毎に モデルを持たない 高速 スレッド間で 同期を取らない 容易 スレッド間の 同期処理が不要 不正確 複数のスレッドが モデルを同時に 更新すると, 更新内容が消失 する恐れがある 気にしない どうせ確率的勾配 元々ノイズだらけ
  7. 7. 実際に並列処理をさせてみると 2014-07-04 Word2vecの並列実行時の学習速度の改善 7 iイ彡 _=三三三f ヽ !イ 彡彡´_ -_=={ 二三三ニニニニヽ fイ 彡彡ィ 彡イ/ ィ_‐- 、  ̄ ̄ ヽ し ま f彡イ彡彡ィ/ f _ ̄ ヾユ fヱ‐ォ て る f/ミヽ======<|-'いシ lr=〈fラ/ !フ い で イイレ、´彡f ヽ 二 _rソ 弋_ { .リ な 成 fノ /) 彡! ィ ノ ̄l .い 長 トヾ__ら 'イf u /_ヽ,,テtt,仏 ! : |l|ヽ ー '/ rfイf〃イ川トリ / .: r!lト、{'ー‐ ヽ ´ ヾミ、 / : / \ゞ ヽ ヽ ヽ / ./ \ \ ヽ / /〈 \ ノ -‐ ´ ヽ ヽ \\ \ 人 並列実行数と速度向上の関係 試しに40スレッドで実行するとCPU利用率は約4000%になる(指示通り) CPUを使っているのに速くならない 謎
  8. 8. 本発表の概要 • word2vecの学習を並列化しても速くならない 原因を解明 • word2vecの理論を復習 • 並列処理が遅くなる原因を推測 • その原因を解消するアルゴリズムを提案する • 提案手法の効果を実験的に示す • 本研究の実装(パッチ)を以下のURLで公開 • http://www.chokkan.org/software/word2vec-multi 2014-07-04 Word2vecの並列実行時の学習速度の改善 8
  9. 9. word2vecの確率モデル (log-bilinearモデル,Skip-gramモデル) 2014-07-04 Word2vecの並列実行時の学習速度の改善 9 𝑤𝑤𝑡𝑡−2 𝑤𝑤𝑡𝑡 ・ ・ ・ ・ 𝑤𝑤𝑡𝑡−1 𝑤𝑤𝑡𝑡+1 𝑤𝑤𝑡𝑡+2 単語ベクトル(𝑚𝑚次元) (これを単語ベクトルとする) 単語予測ベクトル(𝑚𝑚次元) (学習後こちらは捨てる) 𝒗𝒗𝑤𝑤𝑡𝑡 コーパス中の全単語 � 𝑡𝑡=1 𝑇𝑇 � −𝑐𝑐≤𝑗𝑗≤𝑐𝑐,𝑗𝑗≠0 log 𝑃𝑃(𝑤𝑤𝑡𝑡+𝑗𝑗|𝑤𝑤𝑡𝑡) 𝒖𝒖 𝑤𝑤𝑡𝑡−2 𝒖𝒖 𝑤𝑤𝑡𝑡−1 𝒖𝒖 𝑤𝑤𝑡𝑡+1 𝒖𝒖 𝑤𝑤𝑡𝑡+2 各文に対し次式を最大化するモデルを求める Skip-gram(中央の単語𝑤𝑤𝑡𝑡から周辺語𝑤𝑤𝑡𝑡+𝑗𝑗を予測) 文中の単語数 文脈の範囲 𝑃𝑃(𝑤𝑤𝑡𝑡+𝑗𝑗|𝑤𝑤𝑡𝑡)はlog-bilinearモデルとする 𝑃𝑃(𝑤𝑤𝑡𝑡+𝑗𝑗|𝑤𝑤𝑡𝑡) = exp(𝒗𝒗 𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖 𝑤𝑤𝑡𝑡+𝑗𝑗 ) ∑𝑤𝑤′ exp(𝒗𝒗 𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖𝑤𝑤𝑤) すべての単語に関する 内積のexp和 in held Paris France on , … … log-bilinearモデルの分母の計算は重たい (数千万の単語に対して内積とexp和の計算)
  10. 10. 高速化のアイディア① 負例サンプリング • 分母: すべての単語 → サンプリングした𝑛𝑛単語 • モデル: log-bilinear → ロジスティック回帰の積 • 例えば,𝑤𝑤𝑡𝑡 = 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃, 𝑤𝑤𝑡𝑡+1 = 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹の時 • ParisからFranceを予測するモデルに更新したい • 𝑃𝑃 𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹𝐹 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃 → 1 • 𝑃𝑃 𝑡𝑡𝑡𝑡𝑡𝑡𝑡𝑡 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃 → 0, 𝑃𝑃 ℎ𝑜𝑜𝑜𝑜𝑜𝑜 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃 → 0, 𝑃𝑃 𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆𝑆 𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃𝑃 → 0 • つまり,コーパス中のすべての単語をラベルとして, one-vs-𝑛𝑛-restの学習をやっていることと等価 2014-07-04 Word2vecの並列実行時の学習速度の改善 10 𝑃𝑃 𝑤𝑤𝑡𝑡+𝑗𝑗 𝑤𝑤𝑡𝑡 = exp 𝒗𝒗𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖 𝑤𝑤𝑡𝑡+𝑗𝑗 ∑𝑤𝑤′ exp(𝒗𝒗𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖 𝑤𝑤′) ≈ 𝜎𝜎(𝒗𝒗𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖 𝑤𝑤𝑡𝑡+𝑗𝑗 ) � � 𝑥𝑥𝑖𝑖∈Sample(𝑤𝑤𝑡𝑡+𝑗𝑗) 𝜎𝜎(−𝒗𝒗 𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖𝑥𝑥𝑖𝑖 ) これらの単語をコーパス中のユニグラム分布に従ってサンプリング
  11. 11. 高速化のアイディア② 階層的ソフトマックス • 大元のアイディアは単語の意味クラ スを用いた最大エントロピー言語モデ ルの学習の高速化 (Goodman, 01) • 意味クラスを表す木に全単語を格納 • 階層構造としてWordNetを用いたり, 単語のクラスタリングで求める • ある単語wの予測確率を,階層構造 上の分枝の予測確率の積で表す • 分枝の予測確率はロジスティック回帰 • 葉の確率は正規化されている • 尤度の計算量は𝑂𝑂(log |𝑉𝑉|)に削減 2014-07-04 Word2vecの並列実行時の学習速度の改善 11 Root 具体物 抽象物 生物 無生物 動物 植物 猫犬 𝑃𝑃 𝑤𝑤𝑡𝑡+𝑗𝑗 𝑤𝑤𝑡𝑡 = exp 𝒗𝒗𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖 𝑤𝑤𝑡𝑡+𝑗𝑗 ∑ 𝑤𝑤′ exp(𝒗𝒗𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖 𝑤𝑤′) ≈ � (𝑥𝑥𝑖𝑖,𝑦𝑦𝑖𝑖)∈Path(𝑤𝑤𝑡𝑡+𝑗𝑗) 𝜎𝜎(𝑦𝑦𝑖𝑖 𝒗𝒗𝑤𝑤𝑡𝑡 ⋅ 𝒖𝒖𝑥𝑥𝑖𝑖 ) -1 +1 +1 +1 -1 -1 -1 +1 Path(猫) = { (Root, -1), (具体物, -1), (生物, -1), (動物, +1), }
  12. 12. 高速化のアイディア②’ 階層構造をハフマン木で近似 2014-07-04 Word2vecの並列実行時の学習速度の改善 12 単語 頻度 コード 東京 7111 大宮 4010 上野 4000 仙台 31101 宇都宮 21010 小山 21000 盛岡 20111 郡山 20010 福島 21011 新青森 20110 那須塩原 111001 古川 100110 一関 110011 八戸 111000 北上 100111 新白河 110010 東京大宮 7 仙台 3 古川 1 一関 1 八戸 1北上 1 小山 2郡山 2 福島 2盛岡 2 宇都 宮 2 那須 塩原 1 新 青森 2 新 白川 1 4上野 4 2 4 2 2 54 8 4 8 4 8 16 20 36 12 1 4 9 5 10 11 12 13 14 15 6 7 8 2 3 𝑃𝑃 八戸 = 𝑃𝑃 +1|@15 𝑃𝑃 +1|@14 𝑃𝑃 −1|@12 𝑃𝑃 −1|@8 𝑃𝑃(−1|@3) 階層構造をハフマン木で近似 単語の意味を反映し てないが,特殊なサン プリングと見なせる 単語の頻度分布から 容易に作成可能
  13. 13. 並列処理で何故速くならないのか? • インテルの資料を読んでみる • Intel Guide for Developing Multithreaded Applications • 注意点がいくつか挙げられている • 並列化しにくいループの書き方 • プロセッサの負荷バランスの崩れ • ロックやクリティカルセクションによる同期 • メモリ確保(malloc)によるロック • メモリ帯域の圧迫 • キャッシュの偽共有 2014-07-04 Word2vecの並列実行時の学習速度の改善 13 word2vecで は該当せず
  14. 14. キャッシュの偽共有(false sharing) • プロセッサのキャッシュの一貫性が保てず, キャッシュミスが発生してしまう状況 • Modified/Exclusive/Shared/Invalid (MESI) 2014-07-04 Word2vecの並列実行時の学習速度の改善 14 プロセッサの キャッシュ メインメモリ ストア ロードしたい
  15. 15. 階層的ソフトマックスにおける偽共有 2014-07-04 Word2vecの並列実行時の学習速度の改善 15
  16. 16. 偽共有への対処法 スレッド間のパラメータを共有しない 2014-07-04 Word2vecの並列実行時の学習速度の改善 16 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 スレッド#1: モデル(ベクトル) スレッド#2: モデル(ベクトル) スレッド#3: モデル(ベクトル) スレッド#4: モデル(ベクトル) 学習データ + 学習事例を 4グループに分割 並列実行数を 4とする場合 勾配計算 モデル更新 全体のモデル(ベクトル) 各 ス レ ッ ド が 学 習 し た ベ ク ト ル の 意 味 的 な 性 質 が 一 致 す る 保 証 が な い た め , 単 純 に 和 を 取 る こ と が で き な い
  17. 17. 偽共有への対処法: 提案手法 ヤバいベクトルの更新頻度を下げる 2014-07-04 Word2vecの並列実行時の学習速度の改善 17 たまに(k単語を学習 する毎に)同期を取る ヤバくないベクトルへの読み書きは従来通り 隠れベクトル ヤバイ(頻繁に更新される) ヤバくない • 隠れベクトル𝒖𝒖を分類 • ヤバい: 頻繁に更新される • 階層的ソフトマックス: 根に近い • 負例サンプリング: 頻出語 • ヤバくない: それ以外 • ヤバくないベクトルへの読み書きは通常通り • ヤバいベクトル • 共有メモリとローカルの両方で管理 • 読み込み: ローカルのベクトルを読み込む • 書き込み: ローカルのベクトルの値を更新する と共に,変化分を記録 • 各スレッドがk単語の学習を完了する度に,共 有メモリ上のベクトルの値と同期をとる • ベクトル𝒖𝒖の共有メモリ上での偽共有を軽減
  18. 18. 実験 • 学習データ • ukWaC (Baroni+, 09): 2,324,509,927トークン • 学習方法 • モデル: 300次元のSkip-gramモデル • 単語: 学習データ中の1,943,050種類の単語 • パラメータ: ウィンドウ幅=5, 10-5サブ・サンプリング • 学習環境 • 6 コアのAMD Opteron 2435 (2.6GHz) × 2 • 64GBのメインメモリ • 評価データ • アナロジータスク (Mikolov+, 13) 2014-07-04 Word2vecの並列実行時の学習速度の改善 18
  19. 19. 学習速度の評価 2014-07-04 Word2vecの並列実行時の学習速度の改善 19 階層的ソフトマックス では速度向上が顕著 負例サンプリングでは 速度向上が見られない 階層的ソフトマックスでは 偽共有が頻発していた
  20. 20. 得られた単語ベクトルの質の評価 手法 平均 分散 オリジナル (HS) 0.521 0.00418 提案手法 (HS; k=100) 0.520 0.00276 提案手法 (HS; k=1000) 0.521 0.00443 オリジナル (NEG-5) 0.549 0.00224 提案手法 (NEG-5; k=100) 0.551 0.00332 2014-07-04 Word2vecの並列実行時の学習速度の改善 20 アナロジータスクの正解率の平均と分散 (スレッド数を1, 2, 4, 6, 8, 12として学習した モデルを用いた時の正解率の平均と分散) • 提案手法で更新をサボっても単語ベクトルの質は落ちない • どれも分散が小さいことから,非同期更新でも支障はない
  21. 21. 結論と今後の展望 • 階層的ソフトマックスは偽共有を起こしやすく, 非同期の並列処理でも遅くなる • 提案手法は単語ベクトルの質を落とすことなく, 並列処理の実行効率を改善できた • 本研究の適用範囲 • word2vec を拡張するような研究 • 木構造上でソフトマックスを行うような研究 • 非同期パラメータ更新を行う他の学習アルゴリズム • 条件付き確率場 (Gimpel+, 10) など 2014-07-04 Word2vecの並列実行時の学習速度の改善 21

×