RareJob Tech Blog

レアジョブテクノロジーズのエンジニア・デザイナーによる技術ブログです

NeurIPS2021 outstanding paperのMAUVEを解説

1. はじめに

明けましておめでとうございます。 冬休みに実家に帰省したら記録的な大雪で20cmの積雪を見れて少し嬉しかった、EdTech Labの水谷です。
昨年末の12月はNeurIPS2021がありましたが、その中でoutstanding paperの1つに選ばれたMAUVE: Measuring the Gap Between Neural Text and Human Text using Divergence Frontiersを解説したいと思います。 現在レアジョブでは言語生成モデルは運用していませんが、今後言語生成モデルを扱う際にはその評価の一つとして使える方法なのではと思っています。

2. 背景

GPTMegatronに代表される巨大な言語モデル(Enormous Language Models: ELMs)が自然言語処理の様々なタスクにおいて人間と同等以上の精度を出せるようになっており、特にGPT-2がリリースされた際には人が書いた文章とあまりにも見分けが付かないことが話題になりました
しかし、このようなopen-endな言語生成において、機械が生成した文章と人間が生成した文章がどの程度似ているかの指標に関してはあまり研究がされておらず、ヒューリスティックな評価や人間による評価が行われていました。
そこで、MAUVEでは機械が生成した文章と人間が生成した文章の分布を統計的に比較することで、客観的な言語生成モデルの性能評価の指標を提示しています。また人間による評価とも高い相関を示していることから、人間のアノテーターによる高価で主観的な評価からの脱却の道筋を示しています。

3. MAUVE

人間が生成した文章の分布を P、機械によって生成された文章の分布を Qとするとき、以下の2種類のエラーがある。

  • Type I error:  Q (機械)ではよく現れるが、 P (人間)には少ないテキスト
  • Type II error:  P (人間)ではよく現れるが、 Q ( 機械)には現れにくいテキスト

f:id:emiz6413:20220105143535p:plain
type I errorとtype II errorの概念図 (原論文より引用)

Type I errorは Pから見た Qの乖離度と考えられるので、KL情報量を使って D_{KL}(Q || P) と表され、同様にType II errorは D_{KL}(P || Q)と書くことができる。 しかし、 Q Pでテキストの集合が異なる場合(多くの場合当てはまる)、 D_{KL}(Q || P) D_{KL}(P || Q)のどちらか、もしくは両方が無限大となるため、 R_{\lambda} = \lambda P + (1 - \lambda)Q , \lambda \in (0,1)という R_{\lambda}を導入し、Type I errorを D_{KL}(Q || R_{\lambda})、Type II errorを D_{KL}(P || R_{\lambda})と書き換えることでこの問題を回避している。
このλを(0,1)で変化させた時の、 \exp^{-D_{KL}(Q || R_{\lambda})} \exp^{-D_{KL}(P || R_{\lambda})}の描く曲線(divergence curve)の下の面積がMAUVEとして定義される。

f:id:emiz6413:20220105143731p:plain
divergence curve

具体的には、P(x)及びQ(x)を以下の手順で近似・量子化して計算する 。

  1. GPT-2などの外部モデル Mを使って、人間が生成したテキスト x_{i} 及び機械が生成したテキスト x'_{i}のEmbeddingを得る。

    f:id:emiz6413:20220105144402p:plain
    M(x)を2次元に次元削減した図 (原論文より引用)

  2. 得られた M(x_{I}) M(x'_{I})はそれぞれベクトルであるが、k-meansなどでクラスタリング \phi(x) \in \lbrace 1,...,k \rbraceし、属するクラスタを得る。

    f:id:emiz6413:20220105144605p:plain
    M(x)のクラスタリング決定境界 (原論文より引用)

  3. クラスタの出現頻度をカウントすることで、 P及び Qを近似。例えば、 Pの場合、

     \displaystyle{
\tilde{P}( j ) = \frac{1}{N} \sum^{N}_{i}{\mathbb{I}_{j} (\phi(x_{i}))} \quad where \quad {\mathbb{I}_{j}}(x):=
\begin{cases}
1  \quad \text{if} \quad x \in j \\
0 \quad \text{otherwise.}
\end{cases}
}

こうして P及び Q k個の要素からなる離散的な確率分布として近似+量子化することでdivergence curve = MAUVEが数値計算できる 。

4. 実験による評価

MAUVEの特性を評価するため、言語生成タスクにおいて1. 文章の長さ, 2. decodeのアルゴリズム, 3. モデルサイズを変化させて評価を行った。

4.1 文章の長さ・モデルサイズとの関係

機械により生成される文章の質は、文章が長いほど一貫性を失い低下することが知られており、また、モデルのパラメータ数が多くなるほど生成される文章の質が向上することもよく知られている。
文章の長さとモデルサイズ(GPT2 small~xl)を変化させ、従来のmetricsとの比較を行なったところ、MAUVEは文章長に関しては単調減少し、またモデルサイズに対しては単調増加するという理想的な挙動を示していた。

f:id:emiz6413:20220105150656p:plain
文章長・モデルサイズとMAUVEの関係 (原論文より引用)
※↑の指標は大きいほど2つの入力が近いことを示し、↓の指標は小さいほど2つの入力が近いことを表す。例えば、MAUVEは大きいほど2つの入力が近く、generation perplexity difference(Gen. PPL. diff.)は小さいほど2つの入力が近いことを表す。

4.2 decodeのアルゴリズムとの関係

3つのdecodeのアルゴリズム(greedy, ancestral, nucleus)の違いによる生成文章の質の比較を行なった。 これらのアルゴリズムの原理に関しては、本投稿では割愛しますが、以下の特性が知られています。

  • greedy decoding(貪欲法)は文章がある程度長くなると同じ文を繰り返しやすいという性質が知られており、3つの中では最も質が低いと思われる。
  • greedy decoding < ancestral sampling (beam sampling) < nucleus sampling (top-p sampling)の順に生成文章の質が良くなることが多い。

また、これらに加え、著者らが独自にadversarial samplingというダミーなdecoding方法を比較対象に加えており、これは先頭の15%はランダムにサンプル、残りのtokenはperplexityが人間が生成した文章と同じになるように選択するアルゴリズムで、perplexityは低く保ちつつ、意味の無い文章を生成する。

これら合わせて4つのdecodeアルゴリズムを比較した結果、MAUVEはgreedy < ancestral < nucleusという理想的な挙動を示していた。

f:id:emiz6413:20220105152443p:plain
decodeアルゴリズムの影響 (原論文より引用。一部改)

4.3 人間による評価及びdiscriminatorとの相関

クラウドソーシングで200人以上のアノテーターを使い、人間のアノテーターとMAUVEとの比較を行なった。
この実験では、あるコンテキストとそれに続く2つの文章を見て、より自然に見える(human-like)、興味深い(interesting)、合理的(sensible)な方を選択。2つの文章は8つの異なるモデル(モデルとdecoderの組み合わせ)と人間が生成した文章からなる {}_9C_2 = 36通りの組み合わせがあり、Bradley-Terry(BT)モデルで各モデル(または人間が生成の文章)の優劣度合い w_{i}を算出し、人間のアノテーターとの相関を算出した。 また、機械生成の文章を判別する(学習済みの)discriminatorによる判別精度との相関も計測(% Disc. Acc.)。

従来のmetricsと比べ、いずれの設定においても人間との相関は最も高く、discriminatorとの相関も高いことが確認された。

f:id:emiz6413:20220105162039p:plain
人間のアノテーターと各指標の相関

5. 試してみた

MAUVEのソースコードPyPI上にも公開されており、pipでインストールすることができます。
デフォルトではembeddingの計算にhuggingfaceのGPT2-largeを用いるため、Pytorchとhuggingfaceのインストールします。

pip install torch==1.10.1+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html 
pip install transformers 
pip install mauve-text

MAUVEの計算は簡単で、人間と機械が生成したテキストのリストを関数に入力するだけでMAUVEスコアを返してくれます。

from mauve import compute_mauve 
p_text = ["人間が生成したテキストのリスト'", ...] 
q_text = ["機械生成のテキストのリスト", ...]
result = compute_mauve(p_text=p_text, q_text=q_text) 

ここでは、READMEに従い、GPT-2が生成したamazonのレビューのデータセットを使ってMAUVEを計算してみます。

import json 
from mauve import compute_mauve 
import matplotlib.pyplot as plt 

with open('amazon.valid.jsonl') as f: 
    p_text = [json.loads(l)['text'] for l in f] 
with open('amazon-xl-1542M.valid.jsonl') as f: 
    q_text = [json.loads(l)['text'] for l in f] 

print(p_text[0]) 
"""
Category: Cell Phones and Accessories
Product: Blackberry Trackball / Joystick / Navigate / Pearl / Ring Repair Replacement Fix Fixing for Rim Blackberry Pearl
Rating: One Star
Summary: Paid for express shipping and got it almost two weeks later
Review: ask for more money for express shipping and it takes longer than regular mail. It took almost two weeks to receive item. I wrote to seller and seller never contacted me.
""" 

print(q_text[0]) 
""" 
Category: Baby
Product: Sassy Soft Teethers 2 Piece
Rating: Three Stars
Summary: Not so much a teether once my kids started teething
Review: These are somewhat hard, so my two toddlers (3 and 4) didn't get as much out of them as I expected them to. I wish I had gotten something different. Still, not awful.
""" 

out = mauve.compute_mauve(p_text=p_text[:1000], 
                          q_text=q_text[:1000], 
                          device_id=0,
                          verbose=False,
                          max_text_length=256)
print(out.mauve)  # 0.9405395299261428
plt.plot(out.divergence_curve[:, 1], out.divergence_curve[:, 0])

f:id:emiz6413:20220105153446p:plain
出力plot

このように、テキストのリストさえ与えれば簡単にMAUVEを計算することができました。

6. 所感

  • Type I及びType II errorをKL Divergenceとして定義し、うまく発散を回避しつつMAUVEを定義しているところは面白いと思いました。
  • 外部モデルによるembeddingでの入力の近似や、クラスタリングでの量子化など、かなり作り込んでいそうだが、実験結果を見るとよく知られた特性や人間による評価ともよく相関しており、上手く動いているという印象を受けました。
  • クラウドワーカーを使った実験や、パッケージを公開するところまで実装している点にも著者らの多大な努力を感じられました。