「ROUGEメトリクス:大規模言語モデルにおける要約の評価」
ROUGEメトリクス:要約評価の大規模言語モデル
大規模言語モデルに基づくビジネスアプリケーションの増加により、これらのアプリケーションが提供する解決策の品質を測定する必要性が生じました。ここで、ROUGEのようなメトリクスが重要となります。
従来のモデルと比較して、Accuracy、F1スコア、または再現率などのメトリクスは、生成モデルの結果を評価するのに役立ちません。
これらのモデルでは、BLEU、ROUGE、METEORなどのメトリクスを使用し始めています。モデルの目的に適したメトリクスです。
この記事では、最新の大規模言語モデルが生成する要約の品質を測定するためにROUGEメトリクスを使用する方法について説明します。
ROUGEとは何ですか?
ROUGEは、生成されたテキストと参照テキストの品質を比較するために使用される一連のメトリクスです。
- プラグ可能な回折ニューラルネットワーク(P-DNN):内部プラグインを切り替えることによって、様々なタスクを認識するために適用できるカスケードメタサーフェスを利用する一般的なパラダイム
- 「RAVENに会ってください:ATLASの制限に対処する検索強化型エンコーダーデコーダーランゲージモデル」
- アーサーがベンチを発表:仕事に最適な言語モデルを見つけるためのAIツール
参照テキストが利用可能な場合に使用できます。最も一般的な応用例は、翻訳、テキスト要約、エンティティ抽出などです。
ROUGEの信頼性は、参照テキストの品質によってのみ保証されることに注意する必要があります。参照テキストの品質が低い場合、ROUGEによって提供される結果は生成されたテキストの品質を正しく反映しない可能性があります。
ROUGEの別の利用法は、2つの異なるモデルによって生成された出力の異なり具合を測定することです。おそらく、2つのモデルによって生成されたテキストの間に有意な違いがあるかどうかを確認したい場合です。
さらに、ROUGEは、剪定や量子化(モデルの重み削減)などのプロセスが特定のタスクに対してモデルの結果に大きな影響を与えたかどうかを推定するために使用することができます。
提供されるメトリクスは次のとおりです:
- ROUGE-1:1-gramまたは個々の単語を使用して生成されたテキストと参照テキストの一致を示します。
- ROUGE-2:ROUGE-1と同じですが、2-gramのセットを考慮します。
- ROUGE-L:このメトリクスは、2つのテキスト間の最長共通部分列の単語の一致を評価します。単語の順序は完全に一致する必要はありません。
ROUGEメトリクスの詳細については、次のサイトを参照してください:https://pypi.org/project/rouge-score/
ノートブックで何を測定する予定ですか?
ベースのT5モデルと要約生成用にファインチューニングされたT5モデルを比較します。
まず、2つのモデルの違いを分析して、ファインチューニングプロセスが異なる振る舞いをするモデルを生成したかどうかを判断します。
その後、CNN-DailyMailデータセットで提供される参照テキストを使用して、どちらがより優れた要約を生成するかを評価します。
この記事のソースコード、および大規模言語モデルに関するコース全体は、対応する英語の記事とともに、私のGitHubリポジトリで見つけることができます。この記事で使用されたノートブックは次の場所でアクセスできます:https://github.com/peremartra/Large-Language-Model-Notebooks-Course/blob/main/rouge-evaluation-untrained-vs-trained-llm.ipynb
GitHub – peremartra/Large-Language-Model-Notebooks-Course
GitHubでアカウントを作成することで、peremartra/Large-Language-Model-Notebooks-Courseの開発に貢献してください。
github.com
使用されるモデルはHugging Faceで見つけることができます。
- ファインチューニング済み:t5-Base: https://huggingface.co/flax-community/t5-base-cnn-dm
- ベース:t5-Base: https://huggingface.co/t5-base
データの読み込み。
この記事の最初の部分では、Kaggleで入手可能なMITのニュースを含むデータセットを使用します。このデータセットは、ロードされたモデルが十分に異なる要約を生成することを検証するために使用されます。
データセットリンク:https://www.kaggle.com/datasets/deepanshudalal09/mit-ai-news-published-till-2023
まず、一般的なPythonライブラリをインポートしましょう:
#一般的なライブラリをインポートimport numpy as np import pandas as pdimport torch
これらはすべてPythonの世界でよく知られたライブラリです。 torch をインポートする必要があるのは、ROUGEが必要だからです。
データセットを読み込みましょう。
news = pd.read_csv('/kaggle/input/mit-ai-news-published-till-2023/articles.csv')DOCUMENT="Article Body"#コースであるだけなので、Newsの一部を選択します。MAX_NEWS = 3subset_news = news.head(MAX_NEWS)subset_news.head()
完全な記事の内容は、Article Bodyという列に含まれています。これが必要なのはデータセットからの唯一のフィールドです。
処理時間を短縮するために、3つの記事のみを選択しています。
articles = subset_news[DOCUMENT].tolist()
3つのロードされた記事の完全なテキストを articles という変数に保存しました。もっと少ない記事やもっと多くの記事で作業したい場合は、変数 MAX_NEWS の値を変更するだけです。
モデルをロードして要約を作成する。
使用する2つのモデルは、T5ファミリーのものです。1つは基本的なT5-Baseモデルで、もう1つはCNN-DailyMailデータセットでファインチューニングされたモデルです。
両方のモデルがHugging Faceで利用可能なので、transformers ライブラリを使用します。
import transformersfrom transformers import AutoTokenizer, AutoModelForSeq2SeqLM#モデル名は model_name_small と model_name_reference に格納されています。model_name_small = "t5-base"model_name_reference = "flax-community/t5-base-cnn-dm"
トークナイザーとモデルを取得するために、次の関数を作成しました:
#この関数はトークナイザーとモデルを返します。 def get_model(model_id): tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForSeq2SeqLM.from_pretrained(model_id) return tokenizer, model
この関数は、model_id を入力として受け取り、トークナイザーと共にロードされたモデルを返します。
トークナイザーは、テキストをモデルが処理できるトークンのシーケンスに変換するために使用されます。
get_model 関数を使用すると、2つのトークナイザーとモデルを取得できます:
tokenizer_small, model_small = get_model(model_name_small)tokenizer_reference, model_reference = get_model(model_name_reference)
要約を生成するために、次の4つのパラメータを受け取る関数を作成します:
- 要約するテキストのリスト。
- トークナイザー。
- モデル。
- 取得する要約の最大長。
関数は、要約する記事のテキストを少しフォーマットする必要があります。これには、各記事の前に接頭辞を追加する必要があります。 この接頭辞は、モデルの指示です。 私たちの場合、モデルに記事の要約を作成してほしいので、追加する接頭辞は「このニュースを要約する:」です。
トークナイザーを使用して、各記事はエンコーディングに変換され、モデルに送信されます。モデルは要約を返し、それをデコードしてエンコーディングからテキストに変換する必要があります。
def create_summaries(texts_list, tokenizer, model, max_l=125): # 要約する各記事に接頭辞を追加します。 # モデルが何をすべきかを知る必要があります prefix = "このニュースを要約する:" summaries_list = [] #すべての要約を格納します texts_list = [prefix + text for text in texts_list] for text in texts_list: summary="" #エンコーディングを計算 input_encodings = tokenizer(text, max_length=1024, return_tensors='pt', padding=True, truncation=True) # 要約を生成 with torch.no_grad(): output = model.generate( input_ids=input_encodings.input_ids, attention_mask=input_encodings.attention_mask, max_length=max_l, # 生成された要約の最大長を設定 num_beams=2, # ビームサーチのビーム数を設定 early_stopping=True ) #デコードしてテキストを取得 summary = tokenizer.batch_decode(output, skip_special_tokens=True) #要約を要約リストに追加 summaries_list += summary return summaries_list
関数のコードの特定の部分を見てみましょう:要約を生成するためのモデルの呼び出しです:
# 要約を生成する with torch.no_grad(): output = model.generate( input_ids=input_encodings.input_ids, attention_mask=input_encodings.attention_mask, max_length=max_l, # 生成される要約の最大長を設定する num_beams=2, # ビームサーチのビームの数を設定する early_stopping=True )
ご覧の通り、ブロックを始める行は「with torch.no_grad()」で、このブロック内で勾配を計算したくないことを示しています。これにより、コードの速度が向上します。
次に、以下のパラメータを使用してmodel.generateを呼び出します:
- input_ids:トークン化された入力テキストを表すエンコーディング。
- attention_mask:トークナイザによって提供される注意マスク。
- max_length:モデルの応答の最大長。
- beams:ビームの数が大きいほど、モデルの生成される応答の多様性が増します。2に設定しています。
- early_stopping:このパラメータをTrueに設定することで、応答が最大長に達する前にテキストの生成を停止することができます。この値をTrueに設定することは一般的な方法です。
要約を取得するためにcreate_summaries関数を呼び出す方法を見てみましょう:
# 両モデルの要約を作成する。 summaries_small = create_summaries(articles, tokenizer_small, model_small)summaries_reference = create_summaries(articles, tokenizer_reference, model_reference)
ご覧の通り、シンプルです。要約するテキストをトークナイザとモデルと一緒に渡すだけです。
2つのモデルから生成された要約を見てみましょう:
summaries_small:[‘MITとMIT-Watson AI Labは統一フレームワークを開発しました。システムは同時に分子の特性を予測し、新しい分子を生成することができます。この文法を使用して有効な分子を構築し、その特性を予測します。’, ‘「BioAutoMATED」は、与えられたデータセットに適切なモデルを選択および構築することができる自動機械学習システムです。データの前処理という労働集約的なタスクすらも取り扱うことができ、数か月かかるプロセスを数時間に短縮することができます。「機械学習または生物学を使用したい多くの人々のために、これらの障壁を下げたい」と第一共著者のJacqueline Valeriは語っています。’, ‘MITとIBMの研究者は、コンピュータビジョンモデルをより頑健にするため、人間や他の霊長類が物体認識に頼る脳の一部のように機能するようにトレーニングしました。「我々は、人工ニューラルネットワークが、対応する生物学的ニューロン層とできるだけ似た機能を持つようにするように要求しました。」とMITの教授は述べています。’]
summaries_reference:[‘研究者は、小規模なドメイン固有のデータセットのみを使用して分子の「言語」を自動的に学習する機械学習システムを作成しました。システムは有効な分子を構築し、その特性を予測することを学習します。Computational design and Fabrication Groupは、Machine Learningの国際会議で発表されます。’, ‘自動機械学習システムは、与えられたデータセットに適切なモデルを選択および構築することができます。「BioAutoMATED」は、2値分類モデル、多クラス分類モデル、およびより複雑なニューラルネットワークを含んでいます。’, ‘MITとIBMの研究者は、人工ニューラルネットワークが人間や他の霊長類の視覚情報を処理する多層の脳回路に似ていることを発見しました。「我々は、標準的なコンピュータビジョンのアプローチと同様に、それらの機能を実行するように要求しました」とある専門家は述べています。脳の一部のように機能するようにトレーニングすることで、ネットワークはより頑健になりました。’]
最初に見る限り、生成された要約が異なることがわかります。ただし、要約を見るだけでは、どちらが私たちのニーズにとってより良いかを判断するのは難しいです。
要約が大きく異なるかどうかを判断するために、ROUGEを使用します。生成された要約を比較するとき、どちらも参照要約として機能しない場合、生成された要約の品質そのものを理解するわけではありません。代わりに、結果がどれだけ異なるかを示す指標を得ることができます。これにより、ファインチューニングプロセスが要約の結果にどのような影響を与えたかを特定することができます。
ROUGEの計算
ROUGEメトリクスを実行できるように、必要なライブラリをインストールしてロードしましょう。
ROUGEの計算を実装するためのいくつかのライブラリがありますが、私はevaluate
ライブラリを使用することにしました。時には、選択は習熟度に基づいて行われます。私はこのライブラリを使うことに慣れています。
!pip install evaluate import evaluatefrom nltk.tokenize import sent_tokenize#evaluateライブラリのload関数を使用してrouge_scoreオブジェクトを作成します。rouge_score = evaluate.load("rouge")
必要なライブラリがインポートされたら、ROUGEメトリクスを計算することは、作成したrouge_score
オブジェクトのcompute
関数を単一の呼び出しで行うだけです。
この関数には、テキストがパラメータとして渡され、比較に単語の語幹(レンマ)または全単語を使用するかを示す3番目のパラメータが含まれています。通常、語幹のみを比較して、”jump”と”jumped”のような単語を同等とみなします。
以下にいくつかのレンマの例を示します:
- Jumping → Jump.
- Running → Run.
- Cats → Cat.
steamer
パラメータにTrue
を使用すると、同じ語幹を持つ単語は同じとみなされます。一方、False
を使用すると、それらは異なる単語として扱われます。
ただし、テキストを少し整形しておく必要があります。各行の先頭に改行を追加し、空白文字を削除します。これを実現するために、compute_rouge_score
関数を作成しましょう:
def compute_rouge_score(generated, reference): #ROUGEに送る前に各行に'\n'を追加する必要があります generated_with_newlines = ["\n".join(sent_tokenize(s.strip())) for s in generated] reference_with_newlines = ["\n".join(sent_tokenize(s.strip())) for s in reference] return rouge_score.compute( predictions=generated_with_newlines, references=reference_with_newlines, use_stemmer=True, )
この関数は、パラメータとして受け取ったテキストを文ごとに改行を追加して変更します。その後、rouge_score.compute
関数を単一の呼び出しで行います。
compute_rouge_score(summaries_small, summaries_reference)
この呼び出しでは、T5ベースモデルとファインチューニングされたT5モデルの両方を使用して生成されたテキストが渡されます。返される結果は次のとおりです:
{‘rouge1’: 0.47018752391886715, ‘rouge2’: 0.3209013209013209, ‘rougeL’: 0.34330271718331423, ‘rougeLsum’: 0.44692881745120555}
ROUGE-1の類似度は47%、ROUGE-2の類似度は32%であり、これは両モデルによって生成された要約が異なることを明示しています。いくつかの類似点がありますが、ファインチューニングプロセスが要約の生成にどのように影響を与えたかを示唆しています。
ただし、どのモデルが優れているかはまだ判断できません。参照テキストとの比較を行っていないためです。
参照テキストとの比較
次に、第二のデータセットであるCNN_Dailymailを使用します。これはDatasetsライブラリの一部である、よく知られたデータセットです。
このデータセットには記事の他に、参照テキストとして使用する人間によって生成された要約が含まれています。
両モデルによって生成された要約とデータセット内の参照要約を比較します。これにより、どのモデルが参照テキストとより類似した要約を生成するかを判断することができます。
from datasets import load_datasetcnn_dataset = load_dataset( "cnn_dailymail", version="3.0.0")#テストのためにいくつかのニュースを選択しますsample_cnn = cnn_dataset["test"].select(range(MAX_NEWS))sample_cnn
記事の最初の部分と同様に、ニュースの数を制限して読み込みます。これにより、実行時間を制御できます。
データセットで選択した要約の最大長を取得し、モデルによって生成された応答の最大長を示します。
max_length = max(len(item['highlights']) for item in sample_cnn)
max_length = max_length + 10
これで要約を生成するために必要なものが全て揃いました。
summaries_t5_base = create_summaries(sample_cnn["article"],
tokenizer_small,
model_small,
max_l=max_length)
summaries_t5_finetuned = create_summaries(sample_cnn["article"],
tokenizer_reference,
model_reference,
max_l=max_length)
# cnn_datasetから実際の要約を取得します
real_summaries = sample_cnn['highlights']
それぞれの要約を変数に格納しました。内容を見てみましょう。
summaries = pd.DataFrame.from_dict(
{
"base": summaries_t5_base,
"finetuned": summaries_t5_finetuned,
"reference": real_summaries,
}
)
summaries.head()
一目でわかるように、どちらのモデルがより良い要約を作成するのかは非常に難しいです。
それでは、両モデルのROUGEメトリクスを計算してみましょう。
compute_rouge_score(summaries_t5_base, real_summaries)
summaries_t5_base: {‘rouge1’: 0.3050834824090638, ‘rouge2’: 0.07211128178870115, ‘rougeL’: 0.2095520274299344, ‘rougeLsum’: 0.2662418008348241}
compute_rouge_score(summaries_t5_finetuned, real_summaries)
summaries_t5_finetuned: {‘rouge1’: 0.31659149328289443, ‘rouge2’: 0.11065084340946411, ‘rougeL’: 0.22002036956205442, ‘rougeLsum’: 0.24877540132887144}
これらの結果から、微小な差はあるものの、ファインチューニングモデルの方がT5-Baseモデルよりも良い要約を作成していると言えます。これは、全てのメトリクスでより高いスコアを達成していることに基づいています。
また、ROUGEメトリクスは高い解釈性を持ち、絶対的な真実を提供するものではありません。言い換えれば、ROUGEスコアが高いからといって、必ずしもあるモデルが他のモデルよりも優れているわけではありません。これらのスコアは、他のモデルが生成したテキストと比べて、参照テキストとの類似性がより高いことを示しているだけです。
両モデルは非常に似た結果を示していますが、ファインチューニングモデルは全てのメトリクスでより高いスコアを達成しており、特にROUGE-2とROUGE-Lの点で優れています(ROUGE-LSUMを除く)。これは、ベースモデルがより類似したテキストを生成する一方、ファインチューニングモデルは参照テキストにより類似した語彙を使用していることを意味します。
いずれの場合も、わずかな要約の分析しか行っていないため、明確な結論を得ることはできません。最良のモデルを特定するには、異なる戦略を開発する必要があります。良いアプローチの一つは、ニュースをトピックごとにグループ化し、結果に有意な違いがあるかどうかを調査することです。
結論。
メトリクスだけでは十分ではありません。ROUGEも参照テキストの品質に大きく依存するためです。
人間の要素はまだ非常に重要です。これが人間の介在で訓練されたモデルが成功している理由です。
少なくとも一つ良いニュースがあります。ROUGEのようなメトリクスを簡単に取得できるため、意思決定プロセスを支援する上で役立ち、モデルの判断をより良くすることができます。
Large Language Modelsに関する完全なコースは Github で利用可能です。リポジトリをフォローやスターをつけることで、新しい記事が追加された際に通知を受け取ることができます。
GitHub – peremartra/Large-Language-Model-Notebooks-Course
GitHubでアカウントを作成して、peremartra/Large-Language-Model-Notebooks-Courseの開発に貢献してください。
github.com
私は定期的にDeep LearningとAIについて書いています。新しい記事の更新情報を入手するために、VoAGIで私をフォローすることを検討してください。そして、もちろん、LinkedInで私とつながることも歓迎です。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles