1. はじめに
明けましておめでとうございます。
冬休みに実家に帰省したら記録的な大雪で20cmの積雪を見れて少し嬉しかった、EdTech Labの水谷です。
昨年末の12月はNeurIPS2021がありましたが、その中でoutstanding paperの1つに選ばれたMAUVE: Measuring the Gap Between Neural Text and Human Text using Divergence Frontiersを解説したいと思います。
現在レアジョブでは言語生成モデルは運用していませんが、今後言語生成モデルを扱う際にはその評価の一つとして使える方法なのではと思っています。
2. 背景
GPTやMegatronに代表される巨大な言語モデル(Enormous Language Models: ELMs)が自然言語処理の様々なタスクにおいて人間と同等以上の精度を出せるようになっており、特にGPT-2がリリースされた際には人が書いた文章とあまりにも見分けが付かないことが話題になりました。
しかし、このようなopen-endな言語生成において、機械が生成した文章と人間が生成した文章がどの程度似ているかの指標に関してはあまり研究がされておらず、ヒューリスティックな評価や人間による評価が行われていました。
そこで、MAUVEでは機械が生成した文章と人間が生成した文章の分布を統計的に比較することで、客観的な言語生成モデルの性能評価の指標を提示しています。また人間による評価とも高い相関を示していることから、人間のアノテーターによる高価で主観的な評価からの脱却の道筋を示しています。
3. MAUVE
人間が生成した文章の分布を、機械によって生成された文章の分布をとするとき、以下の2種類のエラーがある。
- Type I error: (機械)ではよく現れるが、 (人間)には少ないテキスト
- Type II error: (人間)ではよく現れるが、 ( 機械)には現れにくいテキスト
Type I errorはから見たの乖離度と考えられるので、KL情報量を使って と表され、同様にType II errorはと書くことができる。
しかし、とでテキストの集合が異なる場合(多くの場合当てはまる)、とのどちらか、もしくは両方が無限大となるため、というを導入し、Type I errorを、Type II errorをと書き換えることでこの問題を回避している。
このλを(0,1)で変化させた時の、との描く曲線(divergence curve)の下の面積がMAUVEとして定義される。
具体的には、P(x)及びQ(x)を以下の手順で近似・量子化して計算する 。
GPT-2などの外部モデルを使って、人間が生成したテキスト 及び機械が生成したテキストのEmbeddingを得る。
各クラスタの出現頻度をカウントすることで、及びを近似。例えば、の場合、
こうして及びを個の要素からなる離散的な確率分布として近似+量子化することでdivergence curve = MAUVEが数値計算できる 。
4. 実験による評価
MAUVEの特性を評価するため、言語生成タスクにおいて1. 文章の長さ, 2. decodeのアルゴリズム, 3. モデルサイズを変化させて評価を行った。
4.1 文章の長さ・モデルサイズとの関係
機械により生成される文章の質は、文章が長いほど一貫性を失い低下することが知られており、また、モデルのパラメータ数が多くなるほど生成される文章の質が向上することもよく知られている。
文章の長さとモデルサイズ(GPT2 small~xl)を変化させ、従来のmetricsとの比較を行なったところ、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という理想的な挙動を示していた。
4.3 人間による評価及びdiscriminatorとの相関
クラウドソーシングで200人以上のアノテーターを使い、人間のアノテーターとMAUVEとの比較を行なった。
この実験では、あるコンテキストとそれに続く2つの文章を見て、より自然に見える(human-like)、興味深い(interesting)、合理的(sensible)な方を選択。2つの文章は8つの異なるモデル(モデルとdecoderの組み合わせ)と人間が生成した文章からなる通りの組み合わせがあり、Bradley-Terry(BT)モデルで各モデル(または人間が生成の文章)の優劣度合いを算出し、人間のアノテーターとの相関を算出した。
また、機械生成の文章を判別する(学習済みの)discriminatorによる判別精度との相関も計測(% Disc. Acc.)。
従来のmetricsと比べ、いずれの設定においても人間との相関は最も高く、discriminatorとの相関も高いことが確認された。
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])
このように、テキストのリストさえ与えれば簡単にMAUVEを計算することができました。