Language Interpretability Tool (LIT) の紹介

概要

Google Researchが、言語解釈ツール Language Interpretability Tool (LIT) を紹介する論文を出しました。NLPモデルが期待どおりに動作しない場合に、何が問題かを解明するために役立つツールだと記載されていて、便利そうだと思い試しに動かしてみたので、LITの簡単な紹介を記載します。

[2008.05122] The Language Interpretability Tool: Extensible, Interactive Visualizations and Analysis for NLP Models

f:id:YukoIshizaki:20200823124657p:plain

LITとは

NLPモデルの理解と可視化のためのツールです。インタラクティブにデータを分析でき、特定のフレームワークに依存しません。OSSでPAIRが中心となって開発しています。

特徴

  1. Flexible
    classification, seq2seq, 言語モデリング、構造化予測など、NLPの幅広いタスクをカバー
  2. Extensible
    新しいワークフローに対応するため、再設計・拡張が可能
  3. Modular
    コンポーネントは、必要なものが揃っており、可搬性が高く、実装がシンプル
  4. Framework agnostic
    TensorFlowモデルもPyTorchモデルも使える
  5. Easy to use
    モデルとデータを追加するために必要なコードは非常に短く簡単

インストール

GitHubのreadmeの記載のとおり、condaで環境を作ります。
LITはフロントがTypeScript、バックエンドがPythonで作られています。

git clone https://github.com/PAIR-code/lit.git ~/lit

cd ~/lit
conda env create -f environment.yml
conda activate lit-nlp
conda install cudnn cupti  # optional, for GPU support
conda install -c pytorch pytorch  # optional, for PyTorch

cd ~/lit/lit_nlp/client
yarn && yarn build

github.com

LITの起動

インスタンスの起動

インスタンス起動用のスクリプトPythonで作り、ポート指定で起動します。
LITのGitHubリポジトリにいくつかサンプルが用意されているので、まず quickstart_sst_demo を起動してみました。このサンプルは、はじめにfine tuningが走るので、起動までにGPUで5分ほどかかります。

python -m lit_nlp.examples.quickstart_sst_demo --port=5432 [optional --args]

起動したら、http://localhost:5432 にアクセス。

quickstart_sst_demo

サンプル quickstart_sst_demo は感情分類タスクで、モデルにはhuggingfaceのTFAutoModelForSequenceClassificationが使われています。
データセットにはGLUE/SST-2(スタンフォード大学の映画レビュー)が使われています。

pretrained_lm_demo

2つめのサンプル pretrained_lm_demo はマスクされた単語予測タスクで、--modelsの引数でBERTかGPT2を選択。BERTの場合はhuggingfaceのTFBertForMaskedLM、GPT2の場合huggingfaceのTFGPT2LMHeadModelが使われています。
データセットには、GLUE/SST-2とIMDB(長い文章の映画レビュー)が使われています。

インスタンス起動用のスクリプト作成

インスタンス起動用のスクリプトを作成するには、LITのDatasetクラスのサブクラス、Modelクラスのサブクラスを作成し、そのインスタンスを設定したdictをdev_server.Serverの引数に設定してあげる必要があります。

from lit_nlp import dev_server

models = {'foo': FooModel(...)}
datasets = {'baz': BazDataset(...)}
server = lit_nlp.dev_server.Server(models, datasets, port=4321)
server.serve()

Design Overview
f:id:YukoIshizaki:20200822224857p:plain:w500

Datasetクラス
  1. lit_dataset.Datasetのサブクラスとして作成.
  2. spec 関数を定義します. データセットのカラムに対して、適切なType情報を設定して、dictで返す必要があります.
  3. self._examplesにデータセットをdictのリストとして設定する必要があります
class BazDataset(lit_dataset.Dataset):

  LABELS = ['0', '1']

  def __init__(self, path, split: str):
    self._examples = []
    for ex in load_tfds(path, split=split):
      self._examples.append({
          'sentence': ex['sentence'].decode('utf-8'),
          'label': self.LABELS[ex['label']],
      })

  def spec(self):
    return {
        'sentence': lit_types.TextSegment(),
        'label': lit_types.CategoryLabel(vocab=self.LABELS)
    }
Modelクラス
  1. lit_model.Modelのサブクラスとして作成
  2. input_spec 関数を定義します. インプットのカラムに対して、適切なType情報を設定して、dictで返す必要があります
  3. output_spec 関数を定義します. モデルの予測と追加情報に対して、適切なType情報を設定して、dictで返す必要があります. 追加情報にはAttention HeadsやEmbeddingsなどが設定でき、LITでのComponentsのインプットになります.
  4. predict / predict_minibatch 関数を定義します. input_specの記載と同一のTypeの入力データに対し、前処理を施してからモデルで予測した値を返す必要があります.
class FooModel(Model):

  LABELS = ['0', '1']

  def __init__(self, model_path, **kw):
    self._model = _load_model(model_path, **kw)

  def predict(self, inputs: List[Input]) -> Iterable[Preds]:
    examples = [self._model.convert_dict_input(d) for d in inputs]
    return self._model.predict(examples)

  def input_spec(self):
    return {
        'sentence': lit_types.TextSegment(),
        'label': lit_types.CategoryLabel(vocab=self.LABELS, required=False)
    }

  def output_spec(self):
    return {
      'probas': lit_types.MulticlassPreds(vocab=self.LABELS, parent='label'),
    }
公式ドキュメント

起動用スクリプトについては、GitHub上で公開されている Developer Guide の Python APIのドキュメントに詳しく記載されています。サンプル用のLIT起動スクリプトのコードも参考になりそうです。
lit/python_api.md at main · PAIR-code/lit · GitHub

LITの機能

Data Table

データセットが表形式で表示されるエリアです。検索・ソートができます。

f:id:YukoIshizaki:20200822233446g:plain

Embeddings

EmbeddingsをPCA・UMAPで次元削減した結果を3Dで描画されるエリアです。

インタラクティブに探索できるので、あるクラスだけで絞り込みして他のサンプルと距離が離れているデータを見つけたりするのに使えそう。予測が正しいものを青・間違っているものを赤にした label 1のデータを可視化してみました。

f:id:YukoIshizaki:20200823015143g:plain

Prediction Score

モデルの予測が表示されるエリアです。
2値分類タスクにおいて、閾値を変動させると Metricsの値やConfusion Matrixの値も連動して変化します。データを選択して詳細をData Tableで見ることもできます。

f:id:YukoIshizaki:20200823011103g:plain

マスクされた単語予測のタスクにおいて、どの単語をマスクするとモデルは何を予測するのかが確率と共に表示されます。

f:id:YukoIshizaki:20200823012417g:plain

Span Labelingなどの構造化予測のタスクにおいて、ラベルと予測されたタグが表示されます。
f:id:YukoIshizaki:20200823122706p:plain

Explanations

モデルの判断根拠の説明に用いられる手法であるLIMEや勾配を用いたヒートマップや、Attention Headの可視化が表示されたエリアです。Data Tableで選択されたデータが表示されます。

f:id:YukoIshizaki:20200823004035g:plain

Datapoint Generator

以下のアルゴリズムでデータを新しく生成することができます。

  • Scrambler: 単語をランダムに並び替える
  • Backtranslation: 逆翻訳
  • Word replacer: 文字の置き換え
  • Hotflip : 分類タスクにいおいて、予測に最も影響をあたえるトークンを、反対の影響をあたえるトークンに変更

f:id:YukoIshizaki:20200823005743g:plain

Performance

評価指標、混同行列が表示されるエリアです。
予測値のTypeによって自動で表示される指標は決まりますが、カスタマイズすることも可能です. 複数モデルを起動スクリプトで設定しておくとモデルごとに評価指標が表示されます。

データをlabelで切り分けて評価指標を表示させたり、Data Tableで選択したデータだけの評価指標を表示させることができます。

f:id:YukoIshizaki:20200823124023g:plain

その他

  • Slices : データを特定の条件でスライスして保存しておくことができます
  • Setting : どのデータセット・モデルを使うか、生成したデータの保存などがGUIから操作できます
  • Datapoint Editor : 直接入力でデータのテキストとラベルを編集できます
  • Datapoint color : データを特定の条件で色分けすることができます
  • Compare Datapoint : データを 2 つ選択して、比較することができます

動画

公式から 3 分間のDemo動画が公開されています.


おわり

全ての機能を検証・記載はできてないのですが、LITの主要な機能と仕組みを知ることができました。
起動スクリプトのモデルクラス部分はそれなりにコードを書かないと動かないので、やや手間ではあると思いますが、NLPのモデル解釈のツールとしては色々な機能がついていて、良いなと思いました!