May the Neural Networks be with you

ニューラルネットワークと共にあらんことを

【外部発表】Learning to Faithfully Rationalize by Construction

こんにちは。@shunk031です。論文読み会で登壇したので、そのときの発表資料と概要、及び頂いた質問への回答*1を載せます。

イベント: ACL 2020 オンライン読み会

exawizards.connpass.com

登壇概要

タイトル:Learning to Faithfully Rationalize by Construction

Learning to Faithfully Rationalize by Construction

  • Sarthak Jain1, Sarah Wiegreffe2, Yuval Pinter2, Byron C. Wallace1
    • 1Khoury College of Computer Sciences, Northeastern University
    • 2School of Interactive Computing, Georgia Institute of Technology

自己紹介

  • 北田 俊輔 法政大学大学院 理工学研究科 D1 彌冨研 所属
    • 深層学習を元にした基礎・応用研究
      • 自然言語処理: 文字形状に着目・解釈性のあるモデル
        • YANS2019にて 奨励賞 を受賞
        • ACL2020 SRWにて共著の論文採択
      • 医用画像処理: 悪性黒色腫自動診断システムの構築
        • IPSJ2019にて 学生奨励賞 受賞
      • 計算機広告: 広告クリエイティブの評価・作成支援
        • KDD2019(データマイニングの最難関国際会議)にて論文採択
          • Attention可視化によるクリエイティブ作成支援

本論文を選択した理由

“Attention is not Explanation” と “Attention is not not Explanation” の著者らによる夢のコラボレーション

Attentionに説明性があるかを解析した論文[Jain+Wallace NAACL19; Wiegreffe+Pinter EMNLP19] の著者による深層学習モデルの予測に対する根拠を学習する手法を提案

本文から根拠を抽出してその根拠を元にタスクを解く新たな枠組みの提案

  • 予測の根拠をどのように抽出するかが気になった
  • 根拠抽出により短くなったテキストでどれくらいの精度でタスクを解くことができるのか

本研究の貢献

入力文から根拠を抽出し、その根拠を元に予測可能なニューラルテキスト分類の枠組みを提案

  • 先行研究のモデルは強化学習ベースのため学習が難しい
    • 強化学習を使わない枠組みでモデルを学習

      これまでの学習方法固有の複雑さを回避するために新たな学習手法を提案

  • 新たな学習手法 Faithful Rationale Extractionale from Saliency tHresholding (FRESH) を提案
    • 根拠を抽出する部分と根拠から予測する部分を別々に訓練可能にする (後述)

提案手法 FRESH に対して人手による評価を実施

導入: 深層学習モデルの予測に対する説明性

予測の説明性における”Faithfulness”と”Rationle”

Faithfulness (忠実)

“予測モデルによって示される根拠は、そのモデルが最終的にその予測に至るために使った情報を反映していれば 忠実 である” [Lipton Queue18] 入力文から取り出した一部分を根拠とし、それだけで正しく予測できるのなら、faithful な根拠と言える

Rationale (根拠)

“アノテータがテキストを分類する際にその判断に影響を与えた文字列を強調して表示するように求められる。このような手がかりを 根拠 と呼ぶ” [Zaidan+ NAACL07] 入力文から一部分を抽出して予測根拠としその根拠のみでどれくらい予測できるかを評価すべき

関連研究 | モデル説明手法における現状の問題点

  • 近年ではheatmapによる可視化が頻繁に利用されている
    • しかしこれらの手法は一般的に頑健ではなく忠実な説明を与えているとは言えない場合がある[Feng+ EMNLP18; Zhong+ 18; Jain+ NAACL19; Wiegreffe+ ACL19; Serrano+ EMNLP19; Brunner+ ICLR20; Pruthi+ ACL20]
  • 解釈可能性の文脈で分類・根拠提示モデルに求められるもの[Wiegreffe+ ACL19; Lei+ EMNLP16]
    • 分類モデル: 忠実さ (faltuful) & 尤もらしさ (plausibility)
    • 根拠提示モデル: 簡潔さ (short) & 一貫性 (coherent)
      • 加えて 包括性 (comprehensiveness) [Yu+ EMNLP19]
  • 忠実な根拠を示すようなモデルの提案 [Lei+ EMNLP16; Yu+ EMNLP19; Bastings+ ACL19]
    • 根拠を生成するgeneratorと根拠から予測するencoderをEnd-to-endで学習されるモデル➜ REINFORCEやRepara. trickを使う複雑なものばかり

関連研究 | 解釈可能性と説明可能性

  • “解釈可能性” の定義と特性に関する概要[Lipton Queue18; Doshi-Velez+ 17; Rudin NatureMI19]
  • モデルの予測に対する根拠の提示は次の3つに分けられる:[Lertvittayakumjorn+ EMNLP19]
    • 挙動を明らかにすること
    • 予測を正当化すること
    • 人間が不確実な予測を調査する際に支援すること
  • 人間に受け入れてもらえるような説明や解釈を与える手法
    • 非常にチャレンジングだが有益 [Rudin NatureMI19]
      • 忠実な説明は予測モデルモデルの根底にある意思決定プロセスを明らかにする手段を提供する

関連研究 | 人間による説明性の評価

  • 人間による評価
    • “ユーザーがある手法の結果を正しく予測できる場合、その手法は 解釈可能である と言える” [Kim+ NIPS16]
      • 人手による評価を実施している
    • 人間が根拠提示による合理性を好むかを検証 [Ehsan+ AIES18; Ehsan+ IUI19]

本研究ではこうした先行研究に倣って、根拠の解釈性や合理性について人手による評価を実施

Faithfulness through Discrete Rationale Selection

End-to-Endで予測根拠を抽出 [Lei+ EMNLP16]

先行研究: Rationalizing Neural Predictions [Lei+ EMNLP16]

  • GeneratorとEncoderによる予測根拠の抽出
    • Generator gen(xi): 入力テキスト xi から根拠 zi を抽出
    • Encoder enc(xi , zi): 入力テキストと根拠から予測
  • モデルの学習: REINFORCE [Williams ML92] で最適化
    • 考慮できる根拠の状態空間が大きいため分散が 大➜ 効率的に探索することは困難

提案手法: Faithful Rationale Extraction from Saliency tHresholding (FRESH)

End-to-Endで予測根拠を抽出しない枠組み

本研究: FRESH (Faithful Rationale Extraction from Saliency tHresholding)

  • REINFORCEによる学習の難しさを克服
    • あえてEnd-to-Endな枠組みにしないことで、一般的に困難な強化学習を元にした学習を回避する
  • 3つの独立したモデルから構成される枠組み
    • Supportモデル・Extractorモデル・Classifierモデル

End-to-Endで予測根拠を抽出しない枠組み

  • Supportモデル: supp(xi , yi)入力 xi と正解 yi から学習する。得られる重要度 si を取得
    • 様々な重要度算出手法が利用可能e.g., Attention, 勾配ベースの手法, LIME [Ribeiro+ KDD16]
  • Extractorモデル: ext(xi, si)
    • suppから得られた重要度を2値化しsnippet を取得➜ このsnippetを予測の根拠として扱う
      • 2値化はルールベースや学習モデルベースなどが適用可能
  • Classifierモデル: pred( )extから得られたsnippet を元に正解 yi を予測する➜ 本来の入力よりも短いテキストで予測可能

FRESHの実装

  • Supportモデル supp
    • ベースモデル: BERT, RoBERTa, SciBERT
    • 重要度算出手法: Attention, Gradient
  • Extractorモデル ext
    • 重要度を元に2つの根拠の取り出し方を考慮 (連続/非連続):
      • Contiguous (連続な根拠)
        • 重要度が最大になるよう連続したスパンを抽出
      • Top-k (非連続な根拠)
        • 重要度上位 k 個の単語を連続性関係なく抽出
  • Classifierモデル pred
    • すべてのモデルに共通して、BERT表現を使って分類

実験設定

  • 評価用データセット (5種)
    • Stanford Sentiment Treebank (SST): NLPer好きなやつ
    • AgNews: ニュース記事 (Science, Sports, Bussiness, World)
    • Evidence Inference (人手根拠有): 生体医療の科学記事
    • Movies (人手根拠有): 映画のレビュー
    • MultiRC (人手根拠有): 複数の正解があるデータセット
  • 学習方法の詳細
    • 比較手法はすべてBERTベースのモデルに変更
    • 異なるシード値で5回実験
      • 強化学習ベースのモデル (e.g., Lei+ EMNLP16) は性能の分散が大きいため

定量的評価 | 評価方法

  • 予測性能の評価
    • 比較手法
      • テキスト全文: 性能上限の目安。根拠を示す機構なし。
      • 提案手法: [CLS] のattentionを元に根拠部分を抽出
      • 強化学習モデルベース: [Lei+ EMNLP16]
      • 微分可能モデルベース: [Bastings+ ACL19]
    • 抽出する根拠の長さ
      • テキストから抽出する根拠部分が長くなるほど性能 大➜ 根拠の長さを k に固定して評価実験を実施
  • 性能変化: 根拠の長さ・人手による根拠の使用
    • 根拠の長さを変化させたときの性能評価
    • 人手による根拠を学習に使用したときの性能評価
      • 根拠を考慮した学習法 [Zhang+ EMNLP16; Strout+ BlackboxNLP19]

予測性能の評価

  • FRESHは入力文の10-30%程度でFull textに迫る予測精度
  • 抽出された根拠には予測を説明できる情報が含まれている
  • FRESHは先行研究 [Lei+ EMNLP16; Bastings+ ACL19] を超える予測精度
    • 性能の分散が小さく安定したパフォーマンス
  • Attentionベースの重要度スコアを用いたほうが精度は高い
  • 重要度スコアのtop-kを抽出するほうが精度は高い

根拠の長さを変化させたときの性能変化

  • FRESH と [Lei+ EMNLP16] を比較
    • 抽出する根拠の長さに関わらずFRESHが良い性能
    • 強化学習ベースの [Lei+ EMNLP16] は性能にばらつき有
      • 根拠の長さを長くすると提案手法と同程度
      • Evidence. Inv. においては性能悪化

人手による根拠を使用したときの性能変化

  • 人手による根拠の使用
    • Evidence InferenceとMultiRCは人手の根拠データが存在
      • ➜ この根拠を0%-100%使ったときの予測精度を比較
  • FRESH と [Lei+ EMNLP16] を比較
    • 人手根拠を多く使えば予測性能向上に多少寄与する可能性
    • 先行研究のモデルにおいても人手根拠は良い影響を与える

人手・Lei et al.・FRESHによる根拠抽出 in MultiRC

  • Query: What is the only difference between a reflection in a mirror and the actual image?
    • Answer: It is exactly the same.
    • Label: False
  • Human: You have seen your own reflection in a mirror. The person looking back at you looks just like you. Where does that reflected person appear to be standing ? Yes, they appear to be on the other side of the mirror. That is really strange to think about, but very cool. Have you ever waved at your reflection in a mirror? The reflected image will wave back at you. Here is something to try next time you stand in front of a mirror. Wave to your reflection with your right hand. What hand do you think the reflection will wave back with? The same hand? A different hand? You will notice something interesting. The reflection waves back with the hand on the same side as you, but it is their left hand. The image in a reflection is reversed. This is just like the image of the sign above. Light rays strike flat shiny surfaces and are reflected. The reflections are reversed.
  • Lei et al.: You have seen your own reflection in a mirror. The person looking back at you looks just like you. Where does that reflected person appear to be standing ? Yes, they appear to be on the other side of the mirror. That is really strange to think about, but very cool. Have you ever waved at your reflection in a mirror? The reflected image will wave back at you. Here is something to try next time you stand in front of a mirror. Wave to your reflection with your right hand. What hand do you think the reflection will wave back with? The same hand? A different hand? You will notice something interesting. The reflection waves back with the hand on the same side as you, but it is their left hand. The image in a reflection is reversed. This is just like the image of the sign above. Light rays strike flat shiny surfaces and are reflected. The reflections are reversed.
  • FRESH: You have seen your own reflection in a mirror. The person looking back at you looks just like you. Where does that reflected person appear to be standing ? Yes, they appear to be on the other side of the mirror. That is really strange to think about, but very cool. Have you ever waved at your reflection in a mirror? The reflected image will wave back at you. Here is something to try next time you stand in front of a mirror. Wave to your reflection with your right hand. What hand do you think the reflection will wave back with? The same hand? A different hand? You will notice something interesting. The reflection waves back with the hand on the same side as you, but it is their left hand. The image in a reflection is reversed. This is just like the image of the sign above. Light rays strike flat shiny surfaces and are reflected. The reflections are reversed.

人手評価

人手評価 | 評価視点と評価設定

人手評価の評価視点

  • Sufficiency
    • FRESHによる根拠を使って人間が予測できるか
  • Readability & Understandability
    • 仮定: 人間は単語レベルのばらばらな根拠よりも文レベルのまとまった根拠を好むのではないか
    • 一貫しているか・理解しやすいか

人手評価の設定

  • 評価データ
    • 人手根拠が予め付与されている Movies と MultiRC
    • 抽出した根拠に対して以下の質問をアノテータに示す:
      • 予測: Pos or Neg (Movie), True or False (MultiRC)
      • 確信度: 1 (not confident) ~ 4 (very confident)
      • 可読性: 1 (very difficult) ~ 5 (very easy)

人手評価 | 詳細

根拠の抽出方法

  • テストデータから100件ランダムに取得し根拠を抽出:
    • あらかじめ付与されている人手の根拠とする
    • 長さがkになるようランダムに選択して根拠とする
    • [Lei+ EMNLP16] で得られたものを根拠とする
    • FRESHで得られたものを根拠とする
  • アノテータによる人手評価の実施方法
    • Amazon Mechanical Turkを使用
    • アノテータ間のagreement
      • Movies: 84%, MultiRC: 89%
    • 1HITあたり0.24ドルでアノテータに依頼
      • 平均完了時間2分 (予備実験より) と時給7.20ドルに基づいて計算している
        • アノテータの英語力をテストして確認しているわけではない

人手評価 | Amazon Mechanical Turk上での評価

人手評価 | 評価結果

  • 人手根拠とモデルによる根拠が同等の精度を達成
  • 非連続な根拠 (non-contiguous) より、連続した根拠 (contiguous) を人間に見せたときに予測精度が高い➜ 人間は連続した根拠 (文) を強く好む傾向がある
  • FRESHのベストな結果は確信度や可読性が高い
  • FRESHは合理的な根拠 (faithful rationales) を示している

結論と所感

  • 予測モデルを説明可能にするFRESHを提案
    • さまざまな重要度算出手法が適用可能
    • シンプルな枠組みで先行研究の複雑なモデルを凌駕
    • FRESHによる根拠は人間にとっても良いものであった
  • 入力テキストのどの部分が重要かを示すことが可能
    • 根拠として抽出したテキストがタスクを解く上で重要であることを示せる
      • しかしなぜその部分が根拠として選ばれたかを解釈することはまだできていない

所感: Attentionに説明性はない (なくはない) の作者がattentionを重要度と見なして使っているのは筋が通っていない気がした タイトルでは “by Construction” だが 根拠を構築している感はなかった ➜ human in the loop 的なものを想像していた

参考文献

  • [Williams ML92] Williams, Ronald J. "Simple statistical gradient-following algorithms for connectionist reinforcement learning." Machine learning 8.3-4 (1992): 229-256.
  • [Zaidan+ NAACL07] Zaidan et al. "Using “Annotator Rationales” to Improve Machine Learning for Text Categorization." Proc. of NAACL-HLT 2007.
  • [Ribeiro+ KDD16] Ribeiro et al. "" Why should I trust you?" Explaining the predictions of any classifier." Proc. of KDD 2016.
  • [Zhang+ EMNLP16] Zhang et al. "Rationale-Augmented Convolutional Neural Networks for Text Classification." Proc. of EMNLP 2016.
  • [Lei+ EMNLP16] Lei et al. "Rationalizing Neural Predictions." Proc. of EMNLP 2016.
  • [Kim+ NIPS16] Kim, Been, Rajiv Khanna, and Oluwasanmi O. Koyejo. "Examples are not enough, learn to criticize! criticism for interpretability." Proc. of NIPS 2016.
  • [Doshi-Velez+ 17] Doshi-Velez et al. "Towards a rigorous science of interpretable machine learning." CoRR preprint arXiv:1702.08608 (2017).
  • [Lipton+ Queue18] Lipton, Zachary C. "The mythos of model interpretability." Queue 16.3 (2018): 31-57.
  • [Feng+ EMNLP18] Feng et al. "Pathologies of Neural Models Make Interpretations Difficult." Proc. of EMNLP 2018.
  • [Ehsan+ AIES18] Ehsan, Upol, et al. "Rationalization: A neural machine translation approach to generating natural language explanations." Proc. of AIES 2018.
  • [Strout+ BlackboxNLP19] Strout et al "Do Human Rationales Improve Machine Explanations?." Proc. of ACL Workshop BlackboxNLP2019.
  • [Ehsan+ IUI19] Ehsan et al. "Automated rationale generation: a technique for explainable AI and its effects on human perceptions." Proc. of IUI2019.
  • [Zhong+ 19] Zhong et al. "Fine-grained sentiment analysis with faithful attention." CoRR preprint arXiv:1908.06870 (2019).
  • [Rudin NatureMI19] Rudin, Cynthia. "Stop explaining black box machine learning models for high stakes decisions and use interpretable models instead." Nature Machine Intelligence 1.5 (2019): 206-215.
  • [Liu+ 19] Liu et al. "Roberta: A robustly optimized bert pretraining approach." arXiv preprint arXiv:1907.11692 (2019).
  • [Devlin+ NAACL19] Devlin, Jacob, et al. "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding." Proc. of NAACL-HLT2019.
  • [Jain+ NAACL19] Jain et al. "Attention is not Explanation." Proc. of NAACL-HLT 2019.
  • [Lertvittayakumjorn+ EMNLP19] Lertvittayakumjorn et al. "Human-grounded Evaluations of Explanation Methods for Text Classification." Proc. of EMNLP-IJCNLP2019.
  • [Yu+ EMNLP19] Yu, Mo, et al. "Rethinking Cooperative Rationalization: Introspective Extraction and Complement Control." Proc. of EMNLP-IJCNLP19.
  • [Serrano+ ACL19] Serrano et al. "Is Attention Interpretable?." Proc. of ACL 2019.
  • [Bastings+ ACL19] Bastings et al. "Interpretable Neural Predictions with Differentiable Binary Variables." Proc. of ACL 2019.
  • [Wiegreffe+ EMNLP19] Wiegreffe et al. "Attention is not not Explanation." Proc. of EMNLP 2019.
  • [Brunner+ ICLR20] Brunner, Gino, et al. "On identifiability in transformers." Proc. of ICLR 2020.
  • [Pruthi+ ACL20] Pruthi et al. "Learning to deceive with attention-based explanations." Proc. of ACL 2020.

*1:論文を読んで理解した範囲であり、個人的な経験や主観が含まれている可能性があります。

【外部発表】Human Attention Maps for Text Classification: Do Humans and Neural Networks Focus on the Same Words?

こんにちは。@shunk031です。論文読み会で登壇したので、そのときの発表資料と概要、及び頂いた質問への回答*1を載せます。

イベント: ACL 2020 オンラインLT会

nlpaper-challenge.connpass.com

登壇概要

タイトル:Human Attention Maps for Text Classification: Do Humans and Neural Networks Focus on the Same Words?

Human Attention Maps for Text Classification: Do Humans and Neural Networks Focus on the Same Words?

  • Cansu Sen1, Thomas Hartvigsen2, Biao Yin2, Xiangnan Kong1,2, and Elke Rundensteiner1,2
    • 1Computer Science Department , Worcester Polytechnic Institute
    • 2Data Science Program, Worcester Polytechnic Institute

自己紹介

  • 北田 俊輔 法政大学大学院 理工学研究科 D1 彌冨研 所属 @shunk031 shunk031
    • 深層学習を元にした基礎・応用研究
      • 自然言語処理: 文字形状に着目・解釈性のあるモデル
        • YANS2019にて 奨励賞 を受賞
        • ACL2020 SRWにて共著の論文採択
      • 医用画像処理: 悪性黒色腫自動診断システムの構築
        • IPSJ2019にて 学生奨励賞 受賞
      • 計算機広告: 広告クリエイティブの評価・作成支援
        • KDD2019(データマイニングの最難関国際会議)にて論文採択
          • Attention可視化によるクリエイティブ作成支援

本論文を選択した理由

人間とニューラルネットワークは予測の際に同様の単語に焦点を当てているのかが気になった

  • Attention機構はモデルの予測の解釈にも使われてきた
  • しかし解釈性を疑問視する論文が複数登場してきた

    クラウドソーシングによる人手attentionがアノテーションされたデータセットに興味を持った

  • 学習済みattentionに対する解釈性を直接評価可能
  • 人手attentionを教師にして、よりhuman-friendlyな新しいモデル・学習法を模索可能

本研究の貢献

Yelpレビューデータセットを元にAttention mapを人手でアノテーション

  • Amazon Mechanical Turkを利用
  • データ収集方法を詳細に検討し、15,000件を収集・公開

人手のattentionと深層学習モデルのattentionを比較するための新たな評価指標を考案

  • 様々な指標で評価: 単語の重複度、語彙の分布 etc.

人手のattentionと深層学習モデルのsoft/hard attentionに対して比較・分析

  • 深層学習モデルのattentionは人間と似た説明を与える
  • 文の長さが長くなるほど異なった説明を与える

関連研究

Attention機構の解釈性

  • さまざまな先行研究で言及 [Choi+ NIPS16; Sha+ ACM-BCB17; Yang+ NAACL16]
  • その解釈性を疑問視する研究の出現 [Jain+ NAACL19; Serrano+ ACL19]
  • 一方attentionは入力単語とモデルの予測の間に意味のある関係性があることを指摘 [Wiegreffe+ EMNLP19]

Attentionの評価

  • VQAタスクにおけるattentionの評価 [Das+ EMNLP16]
  • ERASER [DeYong+ ACL20]

Preliminaries on Attention Maps

本研究で登場する Attention Map について

Human Attention Map (HAM)

  • 人間による2値のattention map (binary AM)

Machine Attention Map (MAM)

同一テキスト内の複数の異なるHAM

Consensus Attention Map (CAM)

  • bit-wise AND なHAMを計算したもの

Super Attention Map (SAM)

  • bit-wise OR なHAMを計算したもの

Human Attention Mapの収集と分析

概要: クラウドソーシングで収集

予備実験1: アノテーションの質の調査

  • 人間さまのアノテーションの質を調査
  • チートやズルをするアノテータがいないかどうか等

予備実験2: アノテーション方法の検討

read-firstデザイン

  • 文を先に読んでもらってから感情値を予測してもらうその後どの単語が重要かのアノテーションしてもらう

free-styleデザイン

Human Attention Mapの収集と分析

  • データ収集で用意したインターフェース

Human Attention Mapの収集と分析

  • レビュー文と感情値選択に寄与しそうな単語のアノテーション
  • レビューに対する感情値の選択
  • データ収集で用意したインターフェース

Human Attention Mapの収集と分析

予備実験1: アノテーションの質の調査

  • 2つの小規模データセット
    • Yelp datasetからランダムに50文取得
    • A: 50単語/文、B: 100単語/文
  • アノテーション時の数値感
    • 1文あたりのアノテーション時間
      • 44秒(50単語/文)、70秒(100単語/文)
    • 1文あたりの選択された単語数
      • 9単語(50単語/文)、13単語(100単語/文)
  • 1文あたりの単語数が増えるにつれてアノテーション時間・選択された単語数それぞれ増加する
    • アノテータがランダムにアノテーションしているわけではなさそうという結論

Human Attention Mapの収集と分析

予備実験2: アノテーション方法の検討

  • 2つのアノテーション方法
    • read-first と free-style
  • アノテーション時の数値感
    • アノテータ間のagreement
      • 73% (read-first)、69% (free-style)
    • ground truthとどれくらい似ているか
      • 3.30 (read-first)、3.10 (free-style)
    • cross-sentimentでノイジーなデータの量(選択した感情値と異なる場合のスコア)
      • 0.5 (read-first)、1.0 (free-style)

Human Attention Mapの収集と分析

最終的なhuman attention mapの収集方法と結果

Yelp Human Attention Dataset (YELP-HAT)

Attention Map Similarity Framework

人間と機械のattention mapに対する類似度評価

単語選択の重複度

  • 人間AMと機械AMの2つが似ている➜ 同様の箇所にattentionが当たっているかを評価

    語彙の分布

  • 感情の語彙的指標は品詞 (e.g., 名詞・動詞・形容詞) と一般的に関連していることが知られている [Marimuthu+’12]➜ 人間AMと機械AMの語彙的な類似度を評価

    感情値の文脈依存性

  • ネガティブなレビューの中にあるポジティブな言葉を考慮したり、逆もしかりな場合がある➜ 人間AMと機械AMに対して文脈を考慮して評価

人間と機械のattention mapに対する類似度評価

単語選択の重複度 (Behavioral similarity)

  • HAMとMAMで選択された単語重複度合いを計算

    語彙の分布 (Lexical similarity: LS)

  • HAMとMAMそれぞれで選択された品詞の分布間の相関ランダムなattention R を元に0-1となるように計算

人間と機械のattention mapに対する類似度評価

感情値の文脈依存性 (Cross-sentiment selection rate: CSSR)

  • 肯定的な文 (Y=1) のHAMが付与されている単語と否定的な文 (Y=0) のHAMが付与されている単語に着目
    • get_words() は条件に合う単語を取得
    • 肯定的な文に現れる否定的なな単語、否定的な文に現れる肯定的な単語の比率を比較

Is Machine Attention Similar to Human Attention?

機械の注意は人間の注意と似ているのか?

Machine attention mapの学習

  • Amazon Mechanical Turkを利用
  • データ収集方法を詳細に検討し、15,000件を収集・公開

文あたりの単語数で分けたときのモデルの精度

  • 単語数別に3つのデータセットを構築
    • Yelp-50、Yelp-100、Yelp-200

人間の注意と機械の注意の類似性分析

  • 単語選択の重複度
  • 語彙分布
  • 感情値の文脈依存性

機械の注意は人間の注意と似ているのか?

Machine attention mapの学習

  • 使用データセット
    • Yelp dataset
    • 0〜5の評価値が付与されている
  • データセットの前処理と分割
    • negative: 1〜2、positive: 4〜5 の2値分類設定
    • 2値が不均衡にならないように tng:val:tst = 8:1:1
  • モデル
    • RNN (soft attention)
      • uni-, bi-directional LSTM with additive attention
    • Rationale mechanisms (hard attention) [Lei+ EMNLP16; Bao+ EMNLP18]
      • ハイパーパラメータとして予測根拠となりうる箇所の個数やその特徴表現の近さを指定可能

機械の注意は人間の注意と似ているのか?

注意の可視化結果

  • 上から HAM, HAM, RNN, bi-RNN, Ratinales の順

機械の注意は人間の注意と似ているのか?

文あたりの単語数で分けたときのモデルの精度

  • 文長が長くなるほどhuman・machineともに精度減少
    • 文が長いと一回で文意を読み解くのは難しく、より集中して読み解かなくてはならないため
  • 双方向RNNはパフォーマンス的にhumanと近い傾向
    • テキスト読解の双方向性が人間に近い

単語選択の重複度の側面での分析

  • HAMと比べてConsensus Attention Mapの類似度が他と比べて高い
    • 複数のアノテータが重要だと判断した単語
    • 機械の注意でもそれらが重要だと予測
  • CAMと比べてSuper Attention Mapの類似度は低い
    • 人間の主観的な単語選択は常に機械から高い注目を受けているわけではない
  • もちろん人間同士の類似度は機械との類似度よりも高い
    • 完全に類似はしていない➜ それぞれ主観的な単語選択
    • 文が長くなればなるほど類似度は低くなっていく

機械の注意は人間の注意と似ているのか?

語彙分布の側面での分析

  • Bi-RNN Attentionが人間に近い注意を学習
    • 文が長くなればなるほどスコアは減少
  • どの語彙カテゴリが多く選ばれているか
    • 人間・機械ともに○: 形容詞、比較級形容詞、名詞
      • 人間 ○: 副詞
      • 機械 ○: 固有名詞(複数形)
    • 人間・機械ともに✘: 人称代名詞

機械の注意は人間の注意と似ているのか?

感情値の文脈依存性の側面での分析

  • 人間アノテータ
    • レビューが肯定的であれば、ほぼ肯定的な単語を選択
    • 否定的なレビューについては否定的な単語よりも肯定的な単語のほうが多く選択
  • RNN attention
    • 否定的な文脈での肯定的な単語の選択率が2倍以上
    • 肯定的なレビュー文において

結論と今後の展望

Yelpレビューデータセットを元にAttention mapを人手でアノテーション

  • Amazon Mechanical Turkを利用し、15,000件を収集

    人手のattentionと深層学習モデルのattentionを比較するための新たな評価指標を考案し、分析

  • 様々な指標で評価: 単語の重複度、語彙の分布 etc.

    深層学習モデルのattentionは人間と似た説明を与える

  • Attentionを教師ありで学習するモデルの検討
    • CV分野や一部のNLPタスクでは教師として注目領域を学習するモデルが提案 [Chen+ CVPRW17, Liu+ ACL17] ➜ NLP分野でも実現可能か?
  • 再現実験を準備中
    • shunk031/human-attention-map-for-text-classification 2分

33 Appendix

アノテータ間で選択された単語数の違い 34 多数アノテーションしているアノテータもいれば、ごく少数の単語にのみアノテーションしているアノテータもいる

参考文献

  • [Marimuthu+ ‘12] Marimuthu et al. "How Human Analyse Lexical Indicators of Sentiments-A Cognitive Analysis Using Reaction-Time." Proc. of the 2nd Workshop on Sentiment Analysis where AI meets Psychology. 2012.
  • [Lei+ EMNLP16] Lei et al. "Rationalizing Neural Predictions." Proc. of EMNLP 2016.
  • [Das+ EMNLP16] Das et al. "Human Attention in Visual Question Answering: Do Humans and Deep Networks look at the same regions?." Proc. of EMNLP 2016.
  • [Yang+ NAACL16] Yang et al. "Hierarchical attention networks for document classification." Proc. of NAACL-HLT 2016.
  • [Choi+ NIPS16] Choi et al. "Retain: An interpretable predictive model for healthcare using reverse time attention mechanism." Proc. of NIPS 2016.
  • [Sha+ ACM-BCB17] Sha et al. "Interpretable predictions of clinical outcomes with an attention-based recurrent neural network." Proc. of ACM-BCB 2017.
  • [Liu+ ACL17] Liu et al. "Exploiting argument information to improve event detection via supervised attention mechanisms." Proc. of ACL 2017.
  • [Chen+ CVPRW17] Chen et al. "Attending to distinctive moments: Weakly-supervised attention models for action localization in video." Proc. CVPR Workshops 2017.
  • [Bao+ EMNLP18] Bao et al. "Deriving Machine Attention from Human Rationales." Proc. of EMNLP 2018.
  • [Lipton Queue18] Lipton, Zachary C. "The mythos of model interpretability." Queue ACM 2018.
  • [Jain+ NAACL19] Jain et al. "Attention is not Explanation." Proc. of NAACL-HLT 2019.
  • [Serrano+ ACL19] Serrano et al. "Is Attention Interpretable?." Proc. of ACL 2019.
  • [Wiegreffe+ EMNLP19] Wiegreffe et al. "Attention is not not Explanation." Proc. of EMNLP 2019.
  • [DeYoung+ ACL20] DeYoung et al. "ERASER: A Benchmark to Evaluate Rationalized NLP Models." Proc. of ACL 2020.

*1:論文を読んで理解した範囲であり、個人的な経験や主観が含まれている可能性があります。

深層学習モデルの実装を爆速にするVSCodeの設定メモ

こんにちは。@shunk031です。 新型コロナウイルスが猛威を奮っていますね。 不要不急の外出は控えるのが大切そうです。 こういう時は引きこもって論文を読むのが一番です。

今回はコードエディタであるVSCodeで、深層学習モデルの実装を爆速にするための設定についてメモします。 深層学習モデルの実装をする際にはリモート上にあるGPUを搭載したサーバで実装をしたりデバッグすることが非常に多いです。 VSCodeはこうしたリモートでのコード編集およびデバッグを簡単に行える仕組みを多数揃えています。

本記事では、深層学習モデルの実装に頻繁に利用されるPythonを対象に、以下の観点からモデルの実装を爆速にする設定や機能について紹介します:

  • Pythonの開発環境の構築
  • リモートのGPUサーバに接続するための設定
  • 深層学習モデルの実装・デバッグを簡単にする機能
  • おすすめのショートカットキー・拡張機能・カスタマイズ

私自身これまで魔改造したEmacsに引きこもってコードを書いてきましたが、以下の本でVSCodeに入門することができました。 体系的に整理されており、他のエディタから乗り換えを検討している方にオススメできる内容です。

Visual Studio Code実践ガイド —— 最新コードエディタを使い倒すテクニック

Visual Studio Code実践ガイド —— 最新コードエディタを使い倒すテクニック

  • 作者:森下 篤
  • 発売日: 2020/02/21
  • メディア: 単行本(ソフトカバー)

VSCodeのインストール

WindowsMacOSともに公式サイトからダウンロード可能です。

code.visualstudio.com

MacOSにおいて brew がインストールされている場合、以下のコマンドでインストールが可能です:

$ brew cask install visual-studio-code

コマンドパレットによるコマンドの実行

以降、簡単のためVSCodeコマンドパレットWindows: alt + shift + p , MacOS: cmd + shift + p)からコマンドを実行します。 コマンドパレットやショートカットキーに慣れるとキーボードから手を離すことなく編集が可能になります。 テキスト編集の効率化のために慣れることをおすすめします。

settings.json によるVSCodeの設定

VSCodeGUIによる設定のほか、 settings.json による設定の記述が可能です。 コマンドパレットから > Preferences: Open Settings (JSON) で設定ファイルを開くことができます。 以降では私がおすすめする設定をこの settings.json の形式で紹介します。 最終的な全体の設定は後半のセクションに示します。

Pythonの開発環境の構築

VSCodeによるPythonの開発環境はPython拡張機能をインストールすることで殆ど設定不要でリッチな補完やリファクタリング機能が使用できます。

拡張機能のインストール

Pythonの開発環境のための拡張機能をインストールします。 コマンドパレットから > View: Show Extensions を選択して検索窓から python と入力することで、以下の拡張機能を見つけることができますので、インストールしてください。

marketplace.visualstudio.com

settings.json の設定例

以下にPython拡張機能に対するsettings.jsonの設定例を示します:

{
    "python.formatting.provider": "black",
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--ignore=E501,W503"
    ],
    "python.sortImports.args": [
        "-m 3"
    ],
    "python.jediEnabled": false
}
  • black : Formatter
    • blackによるソースコードの自動フォーマットを利用します。カスタマイズ不要で規約に沿ったフォーマットに整えてくれます。
  • flake8 : Linter
    • flake8による文法チェックを利用します。
    • blackと併用する際に E501 (一行が長すぎるとエラー) *1W503 (二項演算子の前に改行すると警告) *2 を無視する設定を追加します。
    • pylintはflake8と同様に文法チェッカーとして広く用いられていますが、今回紹介する設定例ではflake8を用いるため、offにします。
  • isort : import文のソート
    • isortによるimport文の自動整理を利用します。
    • import文を改行する際のスタイルを -m 3 のように指定します。
  • jedi : コード補完
    • jediはこれまで広くPythonのコード補完に用いられてきましたが、Microsoft製のコード補完がよりリッチに動作するため、今回紹介する設定例ではoffにします。

これらのパッケージは対象のPython環境にインストールされていない場合はインストールを促すポップアップが表示されます。指示に従うことで簡単にインストールが可能です。

Python環境の指定

pyenv 等を用いた仮想のPython環境が存在する場合、コマンドパレットから> Python: Select Interpreter を選択し、Python環境の切り替えが可能です。 対象の仮想環境を選択して切り替えを行ってください。

リモートGPUサーバに接続するための設定方法

VSCodeではRemote developmentの拡張機能をインストールすることにより、ローカルでテキスト編集しているのとほとんど同様の編集が可能になります。

拡張機能のインストール

リモートのサーバ上のテキストを編集するために拡張機能をインストールします。 コマンドパレットから > View: Show Extensions を選択して検索窓から remote と入力することで、以下の拡張機能を見つけることができますので、インストールしてください。

marketplace.visualstudio.com

リモートのサーバにVSCodeで接続

コマンドパレットから > Remote-SSH: Open configuration File を選択すると、sshの設定ファイルが開きます。こちらに接続先となるサーバの情報を以下のように記入しておきます:

Host <任意の名前>
    Hostname <サーバのIPアドレス>
    User <ログインしたいサーバ上のユーザ名>
    IdentityFile <ssh鍵の場所>

サーバに接続するには、コマンドパレットから > Remote-SSH: Connect to Host を選択すると、<任意の名前> として設定したサーバ名が選択肢に現れるので選択します。 そうすると新しいウィンドウが立ち上がり、サーバに接続された状態のVSCode画面が現れます。

リモートのサーバに拡張機能をインストール

これまで複数の拡張機能をインストールしてきました。 VSCodeでは、リモートのサーバにも同様の拡張機能をインストールする必要があることに注意してください。

予めインストールすることが決まっているPython拡張機能などは、以下のようにsettings.jsonに記述することによって自動でインストールすることができます:

{
   "remote.containers.defaultExtensions": [
        "ms-python.python",
        "christian-kohler.path-intellisense"
    ]
}

深層学習モデルの実装・デバッグを簡単にする機能

深層学習モデルの実装を行う上で一番時間がかかるのは「モデルの入出力をする部分」と「モデル内のテンソル形状を合わせる部分」だと思います。もうここらへんもエーアイでなんとかしたいですが、そう簡単にはいきません。VSCodeデバッグ機能はこうした微妙の修正を必要とする部分で力を発揮します。

VSCodeの強力なデバッグ機能

深層学習モデルの実装で度々用いられるPyTorchによる実装をデバッグしている様子が以下のツイートで取り上げられています。

VSCodeではPython拡張機能をインストールしただけで次のようなことが可能です:

  • テンソルの値や形状が自動的に表示される(左画面)
  • マウスカーソルを変数に合わせるだけでテンソルの値や形状、重みやデバイスタイプまで確認できる

このように、深層学習モデルのデバッグに必要不可欠な情報が簡単に確認可能です。 一般的にデバッグをする際にはpdbといったデバッガを使用したり、printデバッグ を駆使していると思いますが、マウスホバーのみでテンソルの値や形状を確認することができ、こうした労力がほぼ0になります。

Pythonスクリプトデバッグ

VSCodeによるデバッグの流れとして、デバッグの設定を記述した launch.json を作成します。 launch.jsonの設定例として、以下のサイトに各プログラミング言語の例が掲載されています。 74th.github.io

今回は特にPythonを対象としているので、以下のページを見て設定します。

74th.github.io

具体的なデバッグの詳細については割愛します。公式サイトのページが特に詳しく紹介されているので参考にしてください。

code.visualstudio.com

AllenNLPモデルのデバッグ

深層学習による自然言語処理モデルを実装する際、AllenNLPを用いる方も多いのではないでしょうか? VSCodeデバッグ機能を用いてAllenNLPで実装したモデルをデバッグするには以下のサイトが参考になります。

docs.allennlp.org

デバッグ時に呼び出すスクリプトを記述します。 あとは launch.json に同様の手順でデバッグの設定を記述するだけのみです。

余談

ここからは私自身がおすすめするVSCodeの各種設定について述べます。

おすすめのショートカットキー・拡張機能・カスタマイズ

おすすめのショートカットキー

テキスト編集を効率よくできるショートカットキーとして私が多用しているものを列挙します。 以下はMacOSを想定したショートカットキー記述ですが、Windowsの場合は cmdalt に読み替えてください。

  • コマンドパレットを開く
    • 最重要ショートカットです。本記事でも何度も登場しました。
    • cmd + shift + p
  • サイドバーを開閉する
    • 左にあるサイドバーを表示したり隠したりします。エディタ領域が狭くなるので隠します。
    • cmd + b
  • ファイルエクスプローラを開く
    • ファイル一覧を見るのに使います。
    • cmd + shift + e
  • マルチカーソル系
    • 複数カーソルを表示して変数等を編集するときに使います
      • すべて変更する系
        • 選択中の語句をすべて選択する
          • cmd + shift + l
      • 特定の語句のみを対象として変更する系
        • cmd + d

おすすめの拡張機能

おすすめのカスタマイズ

このセクションでは、これまでに登場してきたおすすめ設定の全体を示します。 これらの設定の反映はコマンドパレットから > Preferences: Open Settings (JSON)settings.json を開いてコピペすることで反映されます。

{
    "editor.cursorStyle": "block",
    "editor.formatOnSave": true,
    "editor.minimap.enabled": false,
    "editor.formatOnType": true,
    "editor.codeActionsOnSave": {
        "source.organizeImports": true
    },
    "files.watcherExclude": {
        "**/.git/objects/**": true,
        "**/.git/subtree-cache/**": true,
        "**/node_modules/**": true,
        "**/dataset/**/*.{png,zip,jpg,npz}": true,
    },
    "remote.containers.defaultExtensions": [
        "christian-kohler.path-intellisense",
        "davidhouchin.whitespace-plus",
        "JoeBerria.statusbarerror",
        "ms-python.python",
        "streetsidesoftware.code-spell-checker"
    ],
    "python.formatting.provider": "black",
    "python.linting.flake8Enabled": true,
    "python.linting.pylintEnabled": false,
    "python.jediEnabled": false,
    "python.linting.flake8Args": [
        "--ignore=E501,W503"
    ],
    "python.sortImports.args": [
        "-m 3"
    ],
    "statusbarerror.wholeLine.show": true,
    "window.zoomLevel": 0,
    "window.title": "${folderPath}${separator}${activeEditorShort}${separator}${rootName}",
    "workbench.colorTheme": "Solarized Dark+",
    "workbench.startupEditor": "newUntitledFile",
    "workbench.colorCustomizations": {
        "editorCursor.foreground": "#FFFF00"
    },
    "cSpell.userWords": [
        "conv",
        "cuda",
        "cudnn",
        "lstm",
        "ndarray",
        "numpy",
        "relu",
        "sklearn",
        "tqdm",
    ],
}

以下はこれまで紹介してこなかった設定についてコメントをいれます:

  • "editor.formatOnSave": true
    • ファイルを保存するときにフォーマッタを実行します。特にPythonのフォーマッタであるblackにより、常にコード規約に従った整ったコードを維持できます。
  • "editor.codeActionsOnSave"
    • "source.organizeImports": true
      • ファイルを保存するときにimport文を整理します。特にPythonのisortによって、import文が常に整理された形で維持できます。
  • "editor.minimap.enabled": false
    • ミニマップの表示をoffにします。これいります?
  • "files.watcherExclude"
    • 変更監視を除外するパターンを定義します。深層学習ではたくさんのファイルを扱うため、特に .jpg.png といった画像ファイルや .csv.csv といったテキストファイルを予め除外しておくことをおすすめします。
    • ディレクトリ構造に合わせて適宜変更することをおすすめします。
  • "cSpell.userWords"
    • スペルチェック時に除外する単語群を定義します。

Emacsから乗り換え

私はこれまでEmacsディストリビューションの1つであるSpacemacsを使っていました. 本記事を執筆するにあたり、これまで使ってきたEmacsの操作感にできるだけ近くなるようにいくつか設定しました。以下に詳細を紹介します。

代替となるVSCodeの機能や拡張機能

M-x から始まるコマンド実行

  • コマンドパレット
    • Emacsでは M-x から始まるコマンドが数え切れないほどあります。VSCodeのコマンドパレットはEmacsM-xと同様の立ち位置でして、本記事でもコマンド実行の際に様々な場面で登場してきました。

Emacsキーバインド

カラースキーマ

代替となるショートカットキー

これまで愛用してきたEmacsの操作感に近づけるためにキーバインドの追加や変更は必須です。 キーバインドの変更はコマンドパレットから > Preferences: Open Keyboard Shortcuts (JSON) を選択することで、keybindings.json が開きますので、こちらを追加していきます。 私は現在、以下のキーバインドを定義して使用しています:

[
    {
        "key": "ctrl+i",
        "command": "editor.action.indentLines",
        "when": "editorTextFocus && !editorReadonly"
    },
    {
        "key": "cmd+.",
        "command": "editor.action.revealDefinition",
        "when": "editorHasDefinitionProvider && editorTextFocus && !isInEmbeddedEditor"
    },
    {
        "key": "cmd+,",
        "command": "workbench.action.navigateBack"
    },
    {
        "key": "ctrl+x p",
        "command": "workbench.action.navigateBack"
    },
    {
        "key": "ctrl+x m",
        "command": "workbench.view.scm"
    },
    {
        "key": "ctrl+c ;",
        "command": "editor.action.commentLine",
        "when": "editorTextFocus && !editorReadonly"
    },
    {
        "key": "cmd+w",
        "command": "-workbench.action.closeWindow",
    },
    {
        "key": "cmd+w",
        "command": "-workbench.action.closeActiveEditor"
    },
    {
        "key": "cmd+w",
        "command": "-workbench.action.closeGroup",
    },
    {
        "key": "cmd+w",
        "command": "emacs-mcx.copyRegion",
        "when": "editorTextFocus"
    }
]

Emacsでは分割した画面を移動する際に C-x o (Ctrl + x o) を頻繁に利用しますが、この逆の操作 C-x p のようなもの*3VSCodeおよび追加したEmacsキーバインドの拡張にはありませんでした。 そこで次のような設定を定義することで操作を追加します:

{
    {
        "key": "ctrl+x p",
        "command": "workbench.action.navigateBack"
    }
}

代替できなかったEmacsの機能や拡張機能

VSCodeを使ってきて、EmacsにあってVSCodeに無くクリティカルに重要であった機能は今の所私のユースケースではなさそうです。しかしながらEmacs Lispには便利な拡張がたくさんあり、以下にいくつか紹介したいと思います。代替できそうな拡張機能をご存知ある方はぜひ @shunk031 までお知らせください。

dotfilesとして設定を管理する

これまでたくさんの拡張機能の導入や、それに伴った settings.jsonkeybindings.json の設定を行ってきました。 これらをGitHub等で管理することで、違うデバイスでも同じ環境でコードを書くことが可能です。

私はもともとGitHub上でdotfiles*4を管理しているため、VSCodeの設定ファイルもdotfilesに含めて管理しようと考えました。

github.com

具体的には、dotfilesディレクトリ内の settings.json および keybinding.json からもともとあった設定ファイルの場所にシンボリックリンクを張ります:

$ ln -sf ~/.dotfiles/.vscode.d/settings.json ~/Library/Application\ Support/Code/User/
$ ln -sf ~/.dotfiles/.vscode.d/keybindings.json ~/Library/Application\ Support/Code/User/

こうすることでGitHubで設定ファイルを管理する体制ができるわけですが、最新版ではVSCodeが設定ファイルの同期をサポートし始めました。

forest.watch.impress.co.jp

お好きな方法で設定ファイルを管理することをおすすめします。

おわりに

本記事では、深層学習モデルの実装に頻繁に利用されるPythonを対象に、深層学習モデルの実装を爆速にする設定や機能について紹介しました。 リモートにあるGPUサーバに簡単に接続が可能であり、またリモート上のコードの編集やデバッグが容易であることを確認しました。これらの機能をフル活用することにより、今まで以上に深層学習モデルの実装が高速に行える可能性があると考えています。

また、Emacsから乗り換えを検討している方たちに向けて、代替可能な拡張機能やショートカットキーを示し、代替ができていない拡張機能についても示しました。これらの拡張機能は自身で作ることが可能なので、少しずつ穴を埋められるような拡張機能を作れたらよいなと考えています。

参考記事

Windows向け

phst.hateblo.jp

*1:PEP 501 -- General purpose string interpolation | Python.org https://www.python.org/dev/peps/pep-0501/

*2:PEP 503 -- Simple Repository API | Python.org https://www.python.org/dev/peps/pep-0503/

*3:EmacsでC-x oの逆動作をC-x pに割り当てる - 拡張現実ライフ

*4:. (ドット) から始まる設定ファイルのことです。.bashrc や .zshrc 、tmux.conf 、.vimrc などを指します。

2019年の振り返り

こんにちは。@shunk031です。クリスマスにニューラルネットワーク"力"をお願いしましたが、何も貰えませんでした。サンタさんはHinton先生ではないみたいです。毎年同じお願いをしている気がします。

f:id:shunk031:20191231202921j:plain
メイドさんに書いてもらった「論文採択」です

驚くべきことに2019年も今日で終わりみたいです。 この1年何をやってきたか振り返りも兼ねて、思い出せるイベントについてその時のツイートと共に残しておこうと思います。

自己紹介

法政大学理工学研究科応用情報工学専攻2年です。深層学習を主とした自然言語処理を研究しています。Gunosyで研究にフォーカスしたリサーチインターンをやっています。

1月

1月は主に1月中に締め切りがある国内学会用の論文2本と、2月頭に締め切りがある国際学会用の論文1本を書くハードスケジュールをこなしていました。これらは自然言語処理医用画像処理、そして計算機広告というそれぞれ異分野の論文を並行で執筆していました。その途中に逆求人イベントや機械学習のコンペに参加していたりと、2019年始まった最初の月が今年で一番大変だった月だったと記憶しています。

情報処理学会 論文締め切り

1月11日締切の情報処理学会全国大会用の論文を書いていました。こちらは以前書いたSkin lesion classification with ensemble of squeeze-and-excitation networks and semi-supervised learningという論文の追加実験を行った結果をメインに執筆を行なっていました。

www.ipsj.or.jp

言語処理学会 論文締め切り

1月16日締切の言語処理学会全国大会用の論文を書いていました。こちらはGunosyでのリサーチインターンの成果をメインに執筆を行なっていました。

www.anlp.jp

アカリクITイベント in 東京

2020年卒だったので、一応就活を意識していました。まずは自分の現在持っている技術や経験がどれくらい企業の方に評価していただけるのかを知るために、以下の逆求人イベントに参加しました。

acaric.jp

参加されている方々は素晴らしい実績を持っている方々ばかりだったようで、Twitter等でもよくお見かけする方々とも交流できたのでとても良い経験になりました。

この逆求人イベントで声を掛けていただいた企業様を中心に就活を進めたので、とても有意義だったと考えています。

DeNAデータ解析コンペイベント

もともと交流があり、Kaggler軍団を有するDeNAさんが機械学習コンペをやるということで、怖いもの知らずでしたが参加してきました。

dena-ai.connpass.com

イベント開催中のPublic LBがあまり芳しくなく、ぜんぜんスコア上がらないと落ち込んでいたのですが、なぜかPrivate LBで1位でした。優勝者として名前が呼ばれたことにとても驚いたことを覚えています。

2月

2月はKDDの締め切りがあったあと少しゆっくりしていました。その間にChainerハンズオンのチューターに参加したり、機械学習のコンペを後輩たちと一緒にチームを組んでやっていたりしました。

KDD 論文締め切り

2月3日締切のKDD2019用の論文を書いていました。初めてのロングペーパーで、初めてのACMフォーマットで9ページ書ききるのがとても辛かったです。データマイニングのトップカンファレンスで採択率も低いこともあり、このときはKDDに採択されると思っておらず、リジェクトされたらCIKM2019に再度提出してみようという戦略でした。

www.kdd.org

Chainer Beginner's Hands-on Course チューター参加

突然ですが私はChainerが大好きです。研究でも使っていましたし、再現実装等もそれなりに多く公開してきました。しかしこれまでChainer本体に何もコントリビュートできていませんでした。 ちょうどChainerのハンズオンが開催されるタイミングがあり、そこでチューターとして参加させていただきました。

chainer.connpass.com

コードでコントリビュートしろと言われればそれまでですが、実際使っている方や使っている中で困っている方を助けることが出来たと考えており、コミュニティに対してコントリビュートできたのかな、と当時思っていました*1

FDC締め切り

忙しかった1月の中旬頃から、こちらも機械学習コンペであるFintech Data Championship (FDC) に参加していました。こちらは株価を予測するコンペであり初手で闇コンペみを感じていましたが、コンペ運営も少しガバめであったこともあり闇x闇という素晴らしいコンペでした。

prtimes.jp

AIを専攻していないので分かりませんが、何かのバグを踏んでしまい3000億稼ぐエーアイを爆誕させて大喜びしていたのを覚えています。

3月

3月、それとなく就活ムーブをしてみたり、学会をはしごして発表したりしていました。移動距離が結構長くて移動している感を感じました。

就活

何の苦しみもなく就活をしていた気がします。応募するときも人事の方がいい感じにやってくれていたり、面接に行くとだいたいお知り合いだったのも気持ちが楽でした。ESは特に書いた記憶がなく、それっぽいCVを送るだけで良かったです。よく聞く就活辛い話は特になく、運の良い学生だったかなと今は思います。

言語処理学会2019 in 名古屋

名古屋大学で開催された言語処理学会2019全国大会にて、以下の発表を行いました。

  • 北田俊輔, 彌冨仁, 関喜史, "広告クリエイティブ自動生成にむけたマルチタスク学習と Conditional Attention による CVR 予測", 言語処理学会第 25 回年次大会, 2019.

言語処理学会での発表の様子は以下のブログに譲ります。

data.gunosy.io

情報処理学会2019 in 福岡

福岡大学で開催された情報処理学会2019全国大会にて、以下の発表を行いました。

  • 北田俊輔, 彌冨仁, "頑健な皮膚腫瘍診断支援のための body hair augmentation", 情報処理学第 81 回会全国大会, 2019.

言語処理学会での発表を終えて次の日には福岡に移動しました。新幹線の中で某社の採用課題をやって提出しました。その時はモデルのチューニングを考えたくなかったのでoptuna*2でハイパラ探索をさせていたのを記憶しています。

ありがたいことに学生奨励賞をいただくこともできました。

大学のホームページに乗ると、実家の家族も驚いてくれるので*3ありがたいです。

www.hosei.ac.jp

Gunosy DM 発表

私のインターン先であるGunosyでは毎週論文読み会を開催しています。私自身も発表に参加させていただいています。ちょうどWSDM2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

卒業式

お世話になった先輩方や、お世話をした後輩たちが卒業していきました。みなさん社会で活躍しているので弊研出身者凄いなという気持ちです。

FDC 結果発表

株価予測は運。

4月

3月に引き続き就活っぽいことをしつつ、推し事をやるために全国を飛び回っていました。 採用インターンでDe社さんにお世話になっており、とても楽しくインターンさせていただきました。

小倉唯ライブ

推し事をやりました。

www.ogurayui.jp

全通しました。大阪、滋賀、愛知、新潟、仙台、幕張2daysを1ヶ月でやりました。

KDD論文採択

4月28日にKDDの論文採択通知が来ました。ちょうどゴールデンウィークで実家に帰省していたのと、あまり期待していなかったため適当な生活をしていたのですが、共著者の関さんから連絡が来てメールを確認したら採択されてました。今でもあの嬉しさは忘れられないです。何も理解がない実家で一人ありえん喜んでいたので、とうとう息子は壊れてしまったのかと心配されました。

論文採択までのいろいろは以下のブログでまとめています。

shunk031.hatenablog.com

5月

5月はKDDに採択された論文のカメラレディを用意したり、プロモーションビデオを用意したりしていました。これが微妙に大変で忙しかったです。

KDD camera ready 締め切り

こちらがcamera ready版の論文です。いい感じに仕上がりました。

https://dl.acm.org/doi/10.1145/3292500.3330789dl.acm.org

研究室運動会

弊研恒例の研究室運動会でした。このときは3年間参加してきた運動会もラストか〜と個人的にエモい感じになっていました。

iyatomi-lab.info

6月

6月は比較的のんびりしていた気がします。ぽつぽつと就活案件も入っていたようです。

Cpaw LTで登壇

所属サークルであるCpawでLTをしました。

cpaw.connpass.com

私はPyTorchのC++フロントエンドであるlibtorchとgolangのwebアプリフレームワークであるginを組み合わせた高速な深層学習APIサーバの構築について話しました*4

実装は以下に公開しています。

github.com

ICML/KDD 2019 Pre-conference sessionで登壇

KDDの採択を受けて、同時期にICMLに採択されたLAPRASさんからお声がけいただき、以下の勉強会で発表してきました。

lapras.connpass.com

クローズドな勉強会で登壇

Gunosy社内で複数社合同のクローズドな勉強会が開催されたときにKDDに採択された内容を発表させていただきました。ちょうどこのときガウス過程と機械学習 の著者の大羽先生の講演も聞くことができ、とても刺激を受けました。

エムスリーインターン

ある勉強会でエムスリーの西場さんのお話を聞く機会があり、かねてより気になっていたのでインターンに応募させていただきました。エムスリー社内で私のことを知ってくださっている方も多く、次に連絡をもらったときにはもうインターンとして採用決定している旨を聞き、スピード感に驚きました。

エムスリーでは主に医療論文のレコメンドサービスをイチから立ち上げる経験をしました。アルゴリズム部分は私自身が選定し、実装しました。インターンが終わった後も私が実装したものをベースに改善されていっているようです*5

speakerdeck.com

ちなみに西場さんの エムスリーにおけるAI・機械学習チームの立ち上げと機械学習プロダクト開発 がとても良かったです。医療論文のレコメンドサービス Pauli についても言及されています。

speakerdeck.com

同時期にご一緒させていただいていたインターン生がありえないぐらい強かったです。

7月

8月頭のKDDへの発表に向けて準備していたり、8月終わりのYANSにむけたネタ集めをしていた時期でした。

Gunosy DM 発表

ちょうどWWW2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

フロリダ大学からの来客

指導教員の友人がフロリダ大学からいらっしゃいました。以下は彼が当時研究していたものです。 \beta-VAEにおける  \beta はチューニングするのが難しいですが、以下ではそうした問題を克服するための手法を提案しています。

arxiv.org

リサーチインターンに対するインタビュー

Gunosyでのリサーチインターンの成果について、メンターである関さんとインタビューを受けました。いつも面倒を見てくださっている関さんからとても嬉しい言葉をいただけたので、ここに引用しておきます。

頭で考えてから実装までのスピードがとても速いです。これはとても重要な能力だと思います。我々が取り組んでいるような機械学習の応用に関する研究ではどれだけ頭で考えていても、実装の結果を見ないと分からないことが多いです。北田君は考察しながら手を動かし、限られた時間で目覚ましい成果を出しているので、素晴らしいと感じています。 あとは、コミュニケーションを容易に取れる所も助かっています。僕が言った内容を理解し、それ以上の情報を返してくれる優秀さに驚いています。研究チームに北田君を誘ったのも、僕がメディアの研究や推薦システムの部分を行い、広告の研究を北田君に一任したいと考えていたからです。実際、広告技術部にいた彼だからこそ得意な分野を活かして良い研究に仕上げられたと感じています。

研究職インターンが活躍する環境とは~論文がトップカンファレンスに採択されるまでの軌跡 - Gunosiru(グノシル) | はたらくを知り、 Gunosyを知る。

gunosiru.gunosy.co.jp

特別賞受賞

リサーチインターンの成果が評価され、Gunosyでの締め会でCEO特別賞をいただくことができました。社員以外での受賞はこれが初めてのようです。たくさんの社員さんに協力して論文を書かせていただいたので、受賞できて嬉しかったです。

gunosiru.gunosy.co.jp

CEO特別賞(多大な業績に貢献した社員のみに贈られる賞) こちらの賞は従来の賞とは別に、多大な業績に貢献した社員が居る場合のみ贈られます。今回は、データマイニングに関する国際会議「KDD2019」に論文が採択された関さんと北田さんの2名が受賞しました。

飛躍に向けた全力助走~『Gunosy 第7期 下半期締会』の様子をレポート - Gunosiru(グノシル) | はたらくを知り、 Gunosyを知る。

8月

8月はKDDでアラスカ、お盆の帰省で長野、YANSで北海道と移動し、比較的涼しいところで過ごした夏でした。1年の中でも特に充実した1ヶ月でした。

KDD2019 in アラスカ

アラスカで開催されたKDD2019にて、以下の発表を行いました。

  • Shunsuke Kitada, Hitoshi Iyatomi, Yoshifumi Seki. "Conversion Prediction Using Multi-task Conditional Attention Networks to Support the Creation of Effective Ad Creatives." Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining, 2019.

初めての本会議で初めてのトップカンファレンスということもあり、学会の規模の大きさに驚きました。ポスター発表では名だたるテック企業の方々がポスター発表を聞きに来てくださり、とても刺激的なディスカッションをすることができました。

Gunosy DM 発表

SIGIR2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

オープンキャンパス

夏といえばオープンキャンパスです。今年は弊研究室が公開されました。私たちが普段研究している内容についての展示や説明を行いました。

iyatomi-lab.info

YANS2019

北海道札幌市で開催されたYANS2019にて、以下の発表を行いました。今回は初めて弊研から複数人参加であり、共著としての発表も増えました。

  • 北田俊輔,彌冨仁, "解釈性向上のための注意機構と損失勾配に対する関連損失の導入",NLP 若手の会 (YANS) 第 14 回シンポジウム, 2019.
  • 長澤駿太,北田俊輔,彌冨仁, "日本語の文字体系を考慮した文書分類モデルの提案",NLP 若手の会 (YANS) 第 14 回シンポジウム, 2019.
  • Daif Mahmoud, Shunsuke Kitada, Hitoshi Iyatomi, "Image Based Character Embeddings for Arabic Document Classification",NLP 若手の会 (YANS) 第 14 回シンポジウム, 2019.

以下はKDD2019でもらったTシャツを来てYANSで発表した様子です。

ありがたいことに奨励賞をいただくことができました。投票していただいたみなさんのおかげで受賞できたので、これを励みにまた頑張ろうという気持ちが強かったです。

繰り返しになりますが、大学のホームページに乗ると、実家の家族も驚いてくれるので*6ありがたいです。

www.hosei.ac.jp

9月

8月は出ずっぱりで発表しまくり月間でしたが、9月も引き続き発表する機会に恵まれました。研究室合宿でゆっくりしたかったですが、ありえん遊んでしまいました。

研究室合宿

毎年恒例弊研の合宿です。B4の子たちの中間発表に向けた発表練習が中心で、その後はいい感じに遊びました。

iyatomi-lab.info

法政大学 科学技術フォーラム

弊学の理系学部の研究・技術の内容・成果を展示などで披露するフォーラムに弊研が選ばれました。弊研究室が行っている研究をポスターにまとめ、来場者の方に説明を行ったり、デモを披露したりしました。

iyatomi-lab.info

PyConJP 2019

PyConJPは私がB3の頃から参加しています。当時はM2の先輩と一緒に参加し、とても楽しかった記憶があります。今年は私がM2で、B3, B4, M1の後輩たちと発表を聞きました。機械学習を中心とした発表が多く、Pythonのカンファレンスではなく機械学習のカンファレンスでは?という感想を抱きました。機械学習のカンファレンスでも私は聞いていて楽しいのでよいですが。

pyconjp.connpass.com

テキストアナリティクスシンポジウム 依頼講演

KDDの採択を受けて、テキストアナリティクスシンポジウムでリサーチインターンはどういうものなのか講演していただきたいというとてもありがたい依頼を受けまして、発表させていただきました。海外では一般的になりつつあるリサーチインターンですが、国内ではまだまだ発展途上であり、私がリサーチインターンをやっていく中でどのように論文採択までに至ったかについて発表しました。パネルディスカッションタイムでは、CyberAgentの方々や共著者でメンターの関さんと白熱したディスカッションができました。

speakerdeck.com

10月

10月はそれなりにゆっくりしていた1ヶ月だった気がします。あまり記憶がないです。

Gunosy DM 発表

KDD2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。この発表は私たちがKDDでポスター発表していたちょうど目の前で同じくポスター発表していたもので、論文の内容もそうですが、とても親近感が湧きました。

scrapbox.io

京都旅行

なぜか京都に行きたくなったので行ってきました。適当に京都に行くの普通に最高ですね。

11月

11月は論文執筆がメインの1ヶ月でした。

論文執筆

12月初旬に締め切りのある学会に向けて論文を書いていました。今回の今までキツキツだった執筆スケジュールと異なり、それなりに余裕のあるスケジュールで執筆をすすめることができました。

12月

12月は引き続き論文執筆をしていました。後半は温泉に行ったりアドベントカレンダーを書いたりしました。

論文締め切り

それなりに余裕があるなと思いながら執筆していましたが、直前はやっぱり色々ドタバタしますよね。なんとかサブミット出来ました。

Gunosy DM 発表

RecSys2019の論文を読む週だったので、以下の論文をチョイスして紹介しました。

scrapbox.io

草津旅行

後輩がcall for 草津温泉をやっていたので乗りました。

アドベントカレンダー執筆

実は密かに研究室アドベントカレンダーをやりたいと夢見ていました。

今年はアウトプットできる人材も増えてきたので、みんなを巻き込んでアドベントカレンダーをやりました。弊学の学部1年生から4年生、修士1,2年やOBOGを巻き込みました。隣の研究室の子も巻き込んだりして壮絶な感じになりましたが、無事完走したので良かったです。嬉しかったです。夢を叶えました。

adventar.org

ちなみに私が書いた記事は以下の4つです。なんだかんだアウトプットするのって大変なので強制的にアウトプットできるこの機会はありがたいです。

shunk031.hatenablog.com

shunk031.hatenablog.com

shunk031.hatenablog.com

shunk031.hatenablog.com

番外編

番外編として美味しいご飯や飲んだタピオカミルクティー、綺麗な景色のツイートを貼ります。

美味しいごはん

KDD執筆に向けてメンターさんが連れて行ってくださった馬刺しや寿司です。美味すぎて馬になりました。

タピオカミルクティー

タピオカミルクティーにどハマリした一年でした。飲んだタピオカミルクティーを順不同で適当に貼ります。

綺麗な景色

綺麗な景色は綺麗でした。初めて六本木ヒルズの頂上に行きました。

まとめ

トップカンファレンスに論文が採択されたことにより、半ば人生が変わってしまいました。楽しさが単調増加していた1年でした。素晴らしい人たちとコラボして研究をしたりインターンをしたりできたので、より幸せだったと思います。

ありがたいことに来年も色んな方々とコラボできる話が進んでおり、とても楽しみです。「こいつと組んでみたい」と思ってもらえるように研鑽を積んでいきます。そのほかコラボしていただける方や企業さま、@shunk031にご連絡いただければと思います。では良いお年を。

*1:Preferred Networks、深層学習の研究開発基盤をPyTorchに移行 | 株式会社Preferred Networks https://preferred.jp/ja/news/pr20191205/

*2:optuna/optuna: A hyperparameter optimization framework https://github.com/optuna/optuna

*3:実家に帰るとエーアイとかいうわけわからん研究してないで早く就職してくれとよく言われます。

*4:こちら資料は公開していません。もしもご興味がありましたらご連絡いただければ…

*5:Content-Based Citation Recommendation - ACL Anthology https://www.aclweb.org/anthology/N18-1022/

*6:勉学にあまり理解のない家族の人たちにも、流石に複数回受賞していると遊んでいるんじゃなくてちゃんと研究してる感が伝わるようです。

Allentuneを用いたAllenNLPモデルのハイパーパラメータのチューニング

こんにちは@shunk031です。

この記事は彌冨研 Advent Calendar 2019 20日目の記事です。

前回の記事は「期待検証性能(expected validation performance)」をもとにしたパラメータ探索の検証についてでした。

shunk031.hatenablog.com

今回の記事はallentuneを用いたAllenNLPモデルのハイパーパラメータチューニングについて紹介します。このallentuneには 期待検証性能 によるハイパーパラメータ探索の検証が行える手法が実装されています。

github.com

AllenNLPはPyTorchで構築されたリサーチにフォーカスしたオープンソースNLPライブラリです。

github.com

アルゴリズム

ハイパーパラメータのサンプリング手法

ハイパーパラメータ探索のアルゴリズムとして、random searchgrid search が実装されています。これらは Rayが提供しているものを使用しています。

期待検証性能によるパラメータ探索の検証

allentuneのアルゴリズムは以下の論文が元になっています。

arxiv.org

使い方

基本的にはallentuneのREADMEを参考に手順を踏むと実行可能ですが、依存しているパッケージのバージョンまわりで少しハマりポイントがあります。

インストール

レポジトリからクローンしてきてpipでインストールします。

$ git clone https://github.com/allenai/allentune.git
$ cd allentune
$ pip install --editable .

2019年12月現在の情報

このとき、普通にインストールすると依存でTensorflowの最新版(2019年12月現在v2.0.0が入ります)がインストールされますが、Rayが2系に対応していないため、Tensorflow 1.xxx系 を使ってください。

モデルの設定

学習を行うモデルの設定を記述します。例として classifier.jsonnet として定義しています (公式の設定例)

ハイパーパラメータとなる値は環境変数を通じて設定されるので std.extVar 等のjsonnetのメソッドを通じて流れるように設定ファイルを記述する必要があります。

通常のAllenNLPでのjsonnetでは相対パスが読み込めますが、allentuneの場合はjsonnetに相対パスを書いている場合は相対パスが解決できずエラーで読み込めなくなります。絶対パスを書く必要がありそうです。

探索範囲の指定

search_space.json (公式の設定例) を作成して、探索範囲を指定します。allentuneでは以下のサンプリング手法がサポートしています:

  • choice
    • 指定した要素群から選択する手法
  • integer
    • 指定した範囲内で整数をランダムにサンプルする手法
  • uniform
    • 指定した範囲内で一様分布に従った浮動小数点数をサンプルする手法
  • loguniform
    • 指定した範囲内で対数一様分布に従った浮動小数点数をサンプルする手法

ハイパーパラメータとして与えたい変数と、そのハイパーパラメータのサンプリング手法、そしてその範囲を与える形です。

実行方法

パラメータの探索範囲をと探索方法を指定する search_space.json とモデルの設定ファイル classifier.jsonnet が用意できたら、以下のように allentune コマンドを用いてハイパーパラメータ探索を開始できます。

$ allentune search \
    --experiment-name classifier_search \
    --num-cpus 56 \
    --num-gpus 4 \
    --cpus-per-trial 1 \
    --gpus-per-trial 1 \
    --search-space examples/search_space.json \
    --num-samples 30 \
    --base-config examples/classifier.jsonnet

--num-gpus に50を渡すと50GPUに対してハイパーパラメータ探索が実行されます。あとは実行して最強のハイパーパラメータを探してもらうだけです。論文でも読んで待ちましょう。

探索結果の確認

ハイパーパラメータの探索結果を確認する場合、以下のコマンドを実行することで performance-metric に指定したメトリックに対してベストなハイパーパラメータを確認することが可能です。

$ allentune report \
    --log-dir logs/classifier_search/ \
    --performance-metric best_validation_accuracy \
    --model cnn

期待検証性能の可視化

ハイパーパラメータの探索施行数と期待検証性能の関係図をプロットすることが可能です。 期待検証性能がサチってきていることがわかれば、それ以上探索しなくてもよくなります。

$ allentune plot \
    --data-name IMDB \
    --subplot 1 1 \
    --figsize 10 10 \
    --result-file logs/classifier_search/results.jsonl \
    --output-file classifier_performance.pdf \
    --performance-metric-field best_validation_accuracy \
    --performance-metric accuracy

所感

allentuneを用いたAllenNLPモデルのハイパーパラメータチューニングについて紹介しました。 ちょうどこのブログを書いていたときにallentuneでハイパーパラメータ探索を実行していました。

こんにちは@shunk031です。 Geforce RTX 2080Tiを50枚ほど使うとぽかぽかします。みなさんもぜひ試してみてください。

ハイパーパラメータ探索のライブラリでは hyperoptoptunaGPyOpt 等がありますが、AllenNLPで実装したモデルに対して簡単にチューニングを実行できるallentuneはNLPの研究者や技術者には必須のものであると考えています。ぜひみなさん使ってみてください。

「期待検証性能(expected validation performance)」をもとにしたパラメータ探索の検証

こんにちは@shunk031です。 温泉は素晴らしいですが、ホテルのインターネットが遅いと生きた心地がしないので人生難しいと感じています。

この記事は彌冨研 Advent Calendar 2019 19日目の記事です。

f:id:shunk031:20191219192507p:plain

今回はAllenAiから公開されているハイパーパラメータ探索allentuneに実装されているアルゴリズムであるShow Your Work: Improved Reporting of Experimental Resultsを紹介します。

arxiv.org

背景および導入

自然言語処理の研究において、しばしば提案手法が先行研究よりも優れたテストスコアを出すことによって提案手法の良さを実証するというロジックで論文が書かれます。この論文では、こうしたテストデータに対するスコアだけで手法の良し悪しを判断するのは難しいことを述べています。また、validationデータを用いたモデルの訓練で得られるスコアに焦点を当てて検証を行っています。

本論文では computation budget (例えばハイパーパラメータの探索回数やモデル全体の訓練時間) を関数として、ベストなモデルを発見するに至るまでの expected validation performance (期待検証性能) を示しています。こうした指標に従って筆者らが先行研究の再検証を行った結果、より多くの時間を掛けてモデルを訓練することで、報告されているスコアとは異なるスコアになる場合があることを表しています。

期待検証性能

異なるハイパーパラメータ  h を割り当てられた複数のモデル  \mathcal{M} の集合  \mathcal{H}_{\mathcal{M}} を考えます。 あるハイパーパラメータ h_i で訓練されたモデルを  m_i \in \mathcal{M} とします。 ハイパーパラメータを探索するにはたくさんの計算リソースが必要です。今回はそのリソースを表すような関数を computation budget  \mathcal{B}として定義しておきます。

最適なハイパーパラメータ  h_{i*} が見つかったときに、そのパラメータを設定した  m_{i*} に対してテストデータにおけるスコアを論文に書きます。 ここで、 n 個のハイパーパラメータがある場合のベストなvalidationスコアは以下のように定義できます:

 v_{n}^{*} = {\rm max}_{h \in \{h\_{1}, \cdots, h\_{n} \}} \mathcal{A}(\mathcal{M}, h, \mathcal{D}_T, \mathcal{D}_V)

ここで、 \mathcal{A}はtrainデータ \mathcal{D}_Tで学習させたモデル群 \mathcal{M}とそのハイパーパラメータ群 hにおけるvalidデータ \mathcal{D}_Vに対するvalidationスコアを返す関数です。

上記の式をもとに、異なるハイパーパラメータで何度も繰り返しvalidationスコアを計算したときに、 V_{n}^{*}の分布が得られます。 従って、期待性能  \mathbb{E}[V_{n}^{*}\ | n ]として推定可能になります。

本論文では、実験結果を得るために必要な計算コストを概算する方法を導入します。  n 個のハイパーパラメータにおける期待性能は以下のように定義できます。

  \mathbb{E} [{\rm max}_{h \in \{h\_{1}, \cdots, h\_{n} \}} \mathcal{A}(\mathcal{M}, h, \mathcal{D}_T, \mathcal{D}_V) | n]

この指標を用いることで、あるスコアに到達するまでに必要な計算コストについて知ることができます。 特にvalidationスコアに対する期待性能を 期待検証性能 と呼んでいます。

ハイパーパラメータ探索を行う際の推奨事項

ハイパーパラメータの値を決める手法として、 grid searchuniform sampling が一般的に使われます。また適応的にハイパーパラメータをサンプリングするベイズ最適化も有名です。

こうしたハイパーパラメータ探索を検証するために、実験の再現性を担保するためのチェックリストが示されています。 特に本論文で導入されている 期待値検証性能 を基にしたパラメータ探索の検証を行うために必要な項目もあります。

再現性を担保するためのチェックリスト

研究者が報告する実験結果の再現性の向上のために、以下のようなチェックリストが論文内で提供されています。

  • 実験結果の報告について
    • 計算リソースについて
    • 各アプローチの平均実行時間
    • train/validationの分割の詳細情報
    • 報告された各test結果に対応するvalidationのパフォーマンス
    • 実装の公開リンク
  • ハイパーパラメータサーチについて
    • 各ハイパーパラメータの探索域
    • ベストモデルにおけるハイパーパラメータのセッティング
    • ハイパーパラメータ探索の試行回数
    • ハイパーパラメータのサンプリング手法
    • validationのパフォーマンスの期待値

EMNLP2018におけるチェックリストの集計結果

以下は上記のチェックリストに対する有無のパーセンテージを示しています。

  • 実験結果の報告について
    • 計算リソースについての有無: 18%
    • 各アプローチの平均実行時間の有無: 14%
    • train/validationの分割の詳細情報の有無: 92%
    • 報告された各test結果に対応するvalidationのパフォーマンスの有無: 24%
    • 実装の公開リンクの有無: 30%
  • ハイパーパラメータサーチについて
    • 各ハイパーパラメータの探索域の有無: 8%
    • ベストモデルにおけるハイパーパラメータのセッティングの有無: 74%
    • ハイパーパラメータ探索の試行回数の有無: 10%
    • ハイパーパラメータのサンプリング手法の有無: 14%
    • validationのパフォーマンスの期待値: 10%

特にハイパーパラメータの探索域や試行回数が論文中に記述されない場合が多いようです。最近は実装が公開されている論文も多く見られるように感じますが、それでも30%程度であることも驚きでした。

おわりに

今回、allentuneに実装されているShow Your Work: Improved Reporting of Experimental Resultsで提案されている 期待検証性能 について触れました。計算コストの観点から期待できる性能をもとに検証を行っていました。

ハイパーパラメータ探索の再現性を担保するために、計算リソースの規模やハイパーパラメータ探索関連の設定等のチェックリストが示されていました。 より大規模化するモデルとそのハイパーパラメータ探索をより再現しやすくするために、こうしたプロトコルで適切に評価し、再現できるような世界になるとよいですね。私自身もこうした点に注意したいと思います。

GitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushする

こんにちは@shunk031です。草津温泉からこの記事を書いています。温泉は良いぞ。

この記事は彌冨研 Advent Calendar 2019 17日目の記事です。

f:id:shunk031:20191217000530p:plain
クジラ(docker)の上に乗るタコ(Octcat)とめかぶ(MeCab

私のレポジトリshunk031/mecab-neologd-py3では、最新のmecab-ipadic-neologdを持つpython3用のdocker imageをTravisCIを使って定期的にビルドし、Docker Hubにpushしています。 今回はGitHub Actions公開に伴い、TravisCIからの乗り換えを行います。

github.com

以下、2019年12月現在の情報です。

GitHub Actionsを有効にする

まずはGitHub Actionsを有効にします。 こちらから指示に従ってGitHub Actionsにアクセスできるようにします。

Sign up for the beta をクリックして進みます。

f:id:shunk031:20191113082526p:plain
Features • GitHub Actions https://github.com/features/actions

自身のユーザーアカウントが選択されている状態で Register for GitHub Actions Beta をクリックします。

f:id:shunk031:20191122163716p:plain
GitHub Actionsに登録します

はい、完了です。早いですね。では対象のレポジトリで Actions タブが現れていることを確認します。

f:id:shunk031:20191122163558p:plain
これでGitHub Actionsにアクセスできるようになりました。

Actions タブが追加されています。今後はこのタブから設定を追加していきます。

f:id:shunk031:20191113082403p:plain
shunk031/mecab-neologd-py3: My dockernized mecab-ipadic-neologd with mecab-python3 https://github.com/shunk031/mecab-neologd-py3

GitHub Actionsでdocker imageをビルドする

GitHub Actionsでdocker imageをビルドするワークフローを定義します。 Actions タブを選択すると、レポジトリの内容から自動的にマッチするワークフローがサジェストされています。今回は以下の Docker image ワークフローをベースに、docker imageをビルドするワークフローを定義します。

f:id:shunk031:20191122163840p:plain
Actionsタブが追加されています。

以下が完成したワークフローです。GitHub Actionsのワークフローはyaml形式で記述します。

name: Docker Image CI

on:
  push:
  schedule:
    - cron: "0 0 * * 2,5"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@master
      
    - name: Sign in Docker Hub
      run: docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }}
      
    - name: Build and push Docker image
      run: |
        docker build -t shunk031/mecab-neologd-py3 .
        export TAG=`date +%Y.%m.%d`
        docker tag shunk031/mecab-neologd-py3 shunk031/mecab-neologd-py3:$TAG
        docker push shunk031/mecab-neologd-py3:$TAG
        docker tag shunk031/mecab-neologd-py3 shunk031/mecab-neologd-py3:latest
        docker push shunk031/mecab-neologd-py3:latest

steps にワークフローの各ステップを記述します。今回Docker Hubにdocker imageをpushするにあたり、Docker HubへのログインDocker imageのbuildとpush にステップを分けて実行させました。

Docker Hubへのログイン

Sign in Docker Hub と名前をつけたステップに、Docker Hubへのログイン処理を記述しました。ログインするにあたり、Docker Hubの usernamepassword が必要になるため、Secrets 画面にて DOCKER_HUB_USERNAMEDOEKCER_HUB_PASSWORD を設定しました。これらの変数は表からは直接見えないように暗号化されます。

f:id:shunk031:20191216231609p:plain
Secrets

このようにSecretsで設定した変数はyamlファイル内で ${{ secrets.DOCKER_HUB_USERNAME }} のように参照することが可能です。

Docker imageのbuildとpush

Build and push Docker image と名前をつけたステップに、docker imageのビルド等の処理を記述しました。

私の場合、最新の辞書を持ったimageがlatestになるよう、またビルドした日付をタグに付与しています。日々新語や道語に対応し変化する辞書の任意の時点でのimageを取得したいというモチベーションです。

cronを用いた定期的なbuildとpush

mecab-ipadic-neologdは月曜と木曜に更新されます*1。したがって、その翌日の火曜と金曜に新しい辞書を取り込んだdocker imageのビルドを schedulecron 機能で自動ビルドを実現します。

設定方法はlinuxのcronと同様のフォーマットで記述します。私はcronのフォーマットをいつもググって確認しているのですが、以下のようにポップアップで実行される時間が表示されるのでとても便利です。

f:id:shunk031:20191216234529p:plain
実行される時間が表示される。便利。

(おまけ) READMEにバッジを付ける

ここまででGitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushできるようにしました。おまけとしてワークフローが正しく実行されるかひと目で確認できるバッジをREADMEに追加します。

f:id:shunk031:20191122210401p:plain
完成

READMEにバッジを貼る際に必要なURLは https://github.com/(username)/(repository)/workflows/(workflow_name)/badge.svg で取得可能です。 workflow_name は ワークフローを記述するyaml の先頭にある name です。

READMEにバッジをつけるととてもそれっぽくなるので好きです。

おわりに

GitHub Actionsで最新のmecab-ipadic-neologd辞書を持つdocker imageをDocker Hubにpushするまでの工程を確認しました。GitHubがネイティブに提供するCI/CD環境はあたりまえですがGitHubと親和性が高く、これが無料*2で使えるというのは素晴らしいです。

Acknowledgement

mecab-ipadic-neologdにはいつもお世話になっております。作者の Toshinori Sato (@overlast)さま、ありがとうございます!