はじめに
大規模言語モデル (LLM)の性能評価を行う際に、「モデルAとモデルBのどちらの出力の方が望ましいか?」というペアワイズな評価を収集してモデルの性能を比較することが増えています。
その代表例はChatbot Arena (https://huggingface.co/spaces/lmsys/chatbot-arena-leaderboard)ですが、今回は彼らの取り組みを紹介する以下の論文[Chiang+24]を読んで、どのようにユーザーによってアノテーションされたペアワイズな評価結果からモデルごとのスコアが計算されているのかを勉強してみました。
定式化
個のモデルを比較する状況を考えます。今回はペアワイズな評価を行うので、全てのユニークなモデルペアの集合
を定義します。
評価プロセスが始まると、各時刻 ごとにユーザーに対してモデルペア が何らかの確率分布 に従って選ばれ提示されます。
そして人間は提示されたペア のモデルが生成した出力を比較し、どちらが良かったかのアノテーション を付与します。の方が良かった場合はであり、の方が良かった場合はです。
モデルスコアの計算
Bradley-Terryモデル
モデルに対するスコア という概念を導入し、このスコアが高いモデルほどペアワイズな評価で勝利しやすいというモデル化を行います。
論文中で採用されているBradley-Terryモデル[Bradley+52]は、あるモデルペアが与えられたときに片方が勝利する確率、すなわちモデルペア に対して となる(が勝つ)確率を以下のように定義します。
このモデルを実際のの分布に対してフィッティングすることで、パラメータであるスコアを推定できます。最小化する損失関数は以下の通りです。(ここでは、モデルペア に対してはからの一様分布を仮定していることに注意してください。)
ここで、は以下のクロスエントロピー損失です。
実装
上の損失関数の最小化は、ロジスティック回帰の実装を利用することで簡単に実装することができます。
アノテーション結果が得られている時、の特徴量行列を作成し、および、それ以外のモデルに対してはとします。
この特徴量からを予測するロジスティック回帰モデルをバイアス無しの設定で学習すれば、パラメータとして所望のが得られます。
scikit-learnの実装を利用するなら、例えば以下のようになります。
from sklearn.linear_model import LogisticRegression model = LogisticRegression(fit_intercept=False) # fit_intercept=False: バイアス無し model.fit(X, H) xi = model.coef_[0]
実際のサンプル分布への補正
実際にはモデルペアは時刻 ごとに異なる分布 に従ってサンプルされます。この影響を補正するため、重点サンプリングと同様の考え方を使って(3行目)以下のように変形します。
以上の結果から、を用いてサンプルされたモデルペアに対するアノテーション集合を用いて、論文中の式(7)に相当する以下の式に従ってを推定すればよいことがわかります。
スコアの信頼区間の推定
論文にはpivot bootstrapと"sandwich" robust standard errorsをそれぞれ用いて信頼区間の計算を行っていると書かれていました。Appendix Aによると、これらの手法で得られた信頼区間はどちらも同程度の品質であったようです。
これらの手法が具体的にどういった方法を指すのかは論文では割愛されていたので現在調査中ですが、pivot bootstrapは検索してもあまりはっきりとした定義がヒットしないなどやや難航中です。
そこで、ここではChatbot Arenaのチームが公開している以下のノートブック[Chatbot Arena 24]で実装されている信頼区間の計算方法を追ってみたいと思います。
信頼区間の計算方法はいくつか実装されていますが、モデルペアを一様にサンプルした状況を仮定した場合のbootstrap信頼区間の計算は以下の通りです[Chatbot Arena 24]。
※ここで、彼らは重点サンプルの重みをかける代わりに、モデルペアごとに同じ数をサンプルすることで一様分布への補正を行っているようです。
def sample_battle_even(battles, n_per_battle): groups = battles.groupby(["model_a", "model_b"], as_index=False) resampled = (groups .apply(lambda grp: grp.sample(n_per_battle, replace=True)) .reset_index(drop=True)) return resampled # Sampling Battles Evenly def get_bootstrap_even_sample(battles, n_per_battle, func_compute_elo, num_round=BOOTSTRAP_ROUNDS): rows = [] for n in tqdm(range(num_round), desc="sampling battles evenly"): resampled = sample_battle_even(battles, n_per_battle) rows.append(func_compute_elo(resampled)) df = pd.DataFrame(rows) return df[df.median().sort_values(ascending=False).index]
シンプルにモデルペアごとに固定個(ノートブックでは50個)のアノテーションを復元サンプルし、得られたアノテーション集合を使ってモデルスコア(ここではEloスコア)を推定しています。この処理を指定回数(ノートブックでは100回)繰り返すと、モデルスコアの分布を得ることができます。ノートブックではこの分布の2.5%分位点から97.5%分位点までが信頼区間として図示されていました。
モデルペアの動的サンプリング
より効率的に人手評価のアノテーションを収集するため、モデルペアの分布 は情報が不足しているようなモデルペアが優先してサンプルされるように設計します。以下では、論文で紹介されていたwin rateの推定のばらつきが小さくなるようにモデルペアをサンプルする方法を紹介します。
まず、あるモデルペア に関するwin rate( が に勝つ確率)について考えます。
のように変換できるので、 のように定義すると、は の不偏推定量であることがわかります。
このの共分散行列を以下のように求めます。
この共分散行列を用いて、新しくアノテーションを増やすことでwin rateの推定のばらつきが小さくなるようなモデルペアを優先してサンプルする分布をとして利用します。
その他
論文にはこのほかにもrankingの計算方法や、アノテーションの品質が悪い外れ値的なユーザーを検知する方法についても述べられていました。今回の記事では省略してしまいましたが、興味がある方は論文の方をご参照ください。
参考文献
[Bradley+52] Bradley, Ralph Allan, and Milton E. Terry. "Rank analysis of incomplete block designs: I. The method of paired comparisons." Biometrika 39.3/4 (1952): 324-345.
[Chatbot Arena 24] "Chatbot Arena: MLE Elo Rating (Bradley-Terry model) Calculation (March 13, 2024)." Google Colab, Accessed 17 Mar. 2024, https://colab.research.google.com/drive/1KdwokPjirkTmpO_P1WByFNFiqxWQquwH#scrollTo=mSizG3Pzglte.
[Chiang+24] Chiang, Wei-Lin, et al. "Chatbot arena: An open platform for evaluating LLMs by human preference." arXiv preprint arXiv:2403.04132 (2024).