事前学習モデルT5とTransformersを使ってお手軽日本語文書要約をやってみた

こんにちは。 カスタマーサクセス部リサーチャーの勝又です。 私はレトリバで自然言語処理、とくに要約や文法誤り訂正に関する研究の最新動向の調査・キャッチアップなどを行っております。

今回の記事では、事前学習モデルであるT5を使って日本語文書要約を行った話を紹介します。

概要

近年、自然言語処理の分野では事前学習を利用した研究が盛んに行われています。 有名な事前学習モデルとしては、BERT(Bidirectional Encoder Representations from Transformers)1と呼ばれるモデルが盛んに研究されています。 事前学習モデルの良いところとして、アノテーションされていないテキストデータを用いて事前学習を行うことで、実際に解きたい課題の精度が向上することが挙げられます。

以前の記事では、BERTではなく、BART(Bidirectional and Auto-Regressive Transformers)2と呼ばれる事前学習モデルを用いて抽象型要約を行いました。 今回はT5(Text-to-Text Transfer Transformer)3と呼ばれる事前学習を用いて抽象型要約を行います。

T5の簡単な説明

T5はTransformer4 Encoder-Decoderを大量のテキストデータで事前学習したモデルです。 ここまでは前回ご紹介したBARTと同じなのですが、大きく異なる点として事前学習タスクの違いが存在します。 事前学習として、T5の論文ではさまざまな手法が検証されています。 その検証中で精度が良く、学習効率5が高かった方式を事前学習として実施しています。 具体的には、以下の図1のように入力文書の一部を特殊トークンに置き換え、置き換え元のトークンを出力するようにするように事前学習を行います。 この出力側として、置き換えた元の文書すべてではなく、置き換えたトークンのみとすることで、学習効率を向上させています。 この事前学習されたT5に対して、英語要約タスクでfine-tuningを行うことで、高い精度となることが報告されています。

f:id:ssskkk420:20211119163019p:plain
図1: T5とBARTのマスクの具体例。<X>や<Y>、<Z>、[MASK]は特殊トークン。

一方で、BARTは入力文書の一部をマスクし、さらに文の順番を入れ替えたものを入力として、元の文書すべてを出力するように事前学習を行っています。 T5と比べると文の順番を入れ替えるといった違いもありますが、個人的に大きな違いだと感じたのは、出力側として置き換え元のトークンを出すのか、元の文書すべてを出すのかという点です。 T5の論文中でも触れられているのですが、この辺りの事前学習の違いは確かに下流タスクへ幾らかの影響を与えると思うのですが、実際その影響がそこまで大きくないのなら、T5のように学習コストを意識した事前学習を行うのはうまい判断だと感じました。

本記事ではmC4(multilingual Colossal Clean Crawled Corpus)と日本語WikipediaWiki-40B)6で事前学習された、こちらの日本語向けT5を使ってみようと思います。

Transformersを用いた抽象型要約

今回は記事にある通りお手軽に要約を実験しようと思います。 具体的にはHuggingFace社の公開しているPythonライブラリであるTransformers7を使ってみようと思います。

今回は公式のsummarization exampleを使用して要約をfine-tuning、推論まで行いたいと思います。

データの準備

まずはデータを用意します。 たとえば日本語版wikiHowを使う場合、以下のようにjsonlデータが得られたとします8

{'src': 'これはサンプルテキストその1です。こちら側には文書側が入ってきます。', 'tgt': 'サンプルテキストの用意をする。', 'title': 'How_toサンプルテキストの用意_1'}
{'src': 'これはサンプルテキストその2です。こちら側には文書側が入ってきます。', 'tgt': 'サンプルテキストの用意をする。', 'title': 'How_toサンプルテキストの用意_2'}

そして、trainやdev、testのファイル名の末尾をjsonlからjsonへ変更してください。 なんと、これでデータの準備は完了です。 今回の実験では(他のデータでも同様ですが)テキストに対して、detokenizeだったりUnicode正規化などを施してはいるのですが、Transformersに使用するフォーマットに関しては本当にこれで完了です。

学習および推論を行う

公式が用意しているこちらのスクリプトを使用して要約を行います。 今回の実験では以下のような引数を指定して学習から推論までを行いました。

python run_summarization.py \
    --model_name_or_path megagonlabs/t5-base-japanese-web \
    --do_train \
    --do_eval \
    --do_predict \
    --train_file /path/to/train.json \
    --validation_file /path/to/dev.json \
    --test_file /path/to/test.json \
    --output_dir /path/to/wikihow-summarization \
    --text_column src \
    --summary_column tgt \
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 4 \
    --overwrite_output_dir \
    --predict_with_generate \
    --max_source_length 512 \
    --max_target_length 64 \
    --num_beams 4 \
    --evaluation_strategy steps \
    --gradient_accumulation_steps 2 \
    --learning_rate 5e-5 \
    --max_steps 15000 \
    --save_steps 1000 \
    --load_best_model_at_end \
    --metric_for_best_model eval_loss

さまざまな引数をしていますが、ここで注目していただきたいのはtext_columnsummary_columnです。 これらはそれぞれデータ内の入力文書と出力要約のフィールド名を指定しています。 今回用意したデータでは入力文書をsrc、出力要約をtgtとしているので、それぞれを対応させて、--text_column src--summary_column tgtとしています。

これを実行することによりT5がfine-tuningされ、/path/to/wikihow-summarization/generated_predictions.txtにtestデータに対する推論結果が出力されます。 このように、Transformersを用いることでスクリプト側はまったく変更せず、お手軽に要約を行うことができます。

実験

今回は上記で紹介したTransformersを用いて、日本語T59に対して要約タスクでfine-tuningを行い、性能評価を行います。

実験設定

日本語要約タスクについて

前回の記事と同様に、要約タスクとして、次の3種類を実験しました。

  1. Livedoor News 1K
  2. Livedoor News 10K
  3. wikiHow

1番と2番のLivedoor Newsの1Kと10KはそれぞれLivedoor Newsから作成した3行要約データセット10に対して学習、評価を行っています。 1番と2番の違いは学習データの量で、1Kは学習データが1,000件、10Kは学習データが10,000件となっています。 1番と2番を比較することで学習データの量と要約精度の関係を調査します。 また、3番ではwikiHowデータセットに対して学習、評価を行っています。 wikiHowデータセットの学習データは3,040件なので、比較的少量サイズのデータセットであり、1番と3番の実験結果から少量データに対する要約モデルの振る舞いを確認します。

比較手法について

こちらも前回の記事と同様に、いくつかの抽出型、抽象型要約を実験しました。

  1. LEAD-3(記事の上から3文までを要約とみなす手法)
  2. Pointer-Generator
  3. UniLM
  4. JASS
  5. mT5
  6. BART
  7. T5

1番が教師なし抽出型要約で、2~7番が教師あり抽象型要約です。 また、2番のみ事前学習を利用しないモデルで、3~7番は事前学習モデルを利用したモデルとなっております。 3番のUniLMはBERTを元にした要約モデルです。 1~5番までの詳細についてはNLP2021の発表11をご確認ください。

実験結果

要約の自動評価尺度であるROUGE-1, 2, Lで評価を行いました(すべてF値)。 これらの指標は大きい方が要約精度が高いことを示します。

Livedoor News

以下の表はそれぞれ、Livedoor News 1Kと10Kでの要約結果です。

Livedoor News 1K

手法 ROUGE-1 ROUGE-2 ROUGE-L
LEAD-3 43.2 18.9 39.6
Pointer-Generator 25.5 5.0 24.2
UniLM 46.8 21.8 43.3
JASS 43.4 17.2 39.8
mT5 43.6 20.2 40.1
BART 47.0 21.5 43.3
T5 48.4 23.5 44.9

Livedoor News 10K

手法 ROUGE-1 ROUGE-2 ROUGE-L
LEAD-3 43.2 18.9 39.6
Pointer-Generator 41.1 18.0 38.2
UniLM 49.4 23.9 45.8
JASS 43.5 17.9 39.8
mT5 45.5 21.6 41.8
BART 50.3 24.6 46.8
T5 51.7 27.1 48.3

Livedoor News 1Kや10Kの結果から、T5がもっとも高いスコアであることがわかります。 この結果から、少量のデータセットでも数万のデータセットでもT5を元にfine-tuningをした方が精度が高いことがわかります。

wikiHow

以下の表はwikiHowでの要約結果です。

手法 ROUGE-1 ROUGE-2 ROUGE-L
LEAD-3 31.5 8.6 29.9
Pointer-Generator 24.0 7.8 23.7
UniLM 36.7 13.7 35.8
JASS 34.6 11.9 33.7
mT5 29.0 9.3 27.9
BART 36.6 12.3 35.3
T5 38.5 14.8 37.3

wikiHowでも同様にT5がもっとも高いスコアでした。 Livedoor Newsの結果と合わせると、T5は要約データの違いによらず精度が高いことがわかります。

出力例

wikiHowのHow to 勉強に対する姿勢を改善するエントリに対する出力例が次の通りです(入力文書は長いためここでは省略します)。

正解要約 落ち着いた精神状態になる。十分な睡眠をしっかり取る。予定を立てる。授業を受ける際に必ずノートをとる。勉強のグループを作る。適度に休憩を取る。
Pointer-Generator 宿題を持ちます。
UniLM 落ち着いた気持ちになる。気晴らしの時間を設ける。休憩時には特別点を与える。
JASS 睡眠不足を引き起こす要因を理解しましょう。学校とは関係のない活動をしましょう。
mT5 勉強や課題をこなす。勉強や課題をこなす。
BART 早起きする。勉強や課題をするために一定の時間を確保する。休憩を取る。
T5 眠気を紛らわす。勉強や課題をするために一定の時間を確保する。ノートをとる。

この例だけ見てみると、T5とBARTはかなり自然な文を出せているのではないでしょうか。 mT5は同一文を繰り返してしまい、JASSやUniLMは、最後の文がお題(勉強に対する姿勢を改善する)に対してちょっと変な印象を受けました。 また事前学習を利用していないPointer-Generatorはよくわからない文を出してしまっています。

まとめ

今回の記事では、事前学習モデルであるT5とTransformersを利用したお手軽要約実験を試しました。 結果としては、自動評価尺度上ではT5がもっとも精度が高い結果であることがわかりました。 これはT5の事前学習方法がとくに優れていたから、というよりは事前学習データの規模の差によるところが多いからだと考えられます。 とくにT5の事前学習データの1つであるmC4はさまざまなWebテキストを集めたものなので、もしかしたらその中にwikiHowの原文が入っている可能性も考えられます。 また他にも今回使用した日本語T5はTokenizerとしてSentencePiece12を用いているのですが、その際にByte-fallbackを有効にしているため、未知語トークン(語彙に含まれない単語; 以前のBARTの記事の<unk>トークンなど)が生じずらいモデルとなっています。 前回のBARTの要約の記事では未知語トークンが多く生成されたため、その辺りの処理に少し苦戦したのですが、今回出力を眺めてみると未知語トークンはとくに見当たらなかったので、後処理は今回実施していません。 こういった事前学習のデータやTokenizerでT5が一番うまくいったのかなと個人的には考えています。

今回の記事で既存の事前学習モデルでの要約結果は色々出揃ったと思うので、今後は、これらの要約結果に対してBERTScore13などの最近流行りの評価尺度や、他のタスクでの事前学習モデルの精度について検証したいと思います。


  1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova. [paper]

  2. BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension. Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman Mohamed, Omer Levy, Ves Stoyanov, Luke Zettlemoyer. [paper]

  3. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li, Peter J. Liu. [paper]

  4. Attention Is All You Need. Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin. [paper]

  5. ここでの学習効率は、学習の収束速度というよりは単純に一度に扱う必要のあるデータサイズによるものを指しています。具体的には出力の単語数を小さめになるように事前学習を設定することで、一度に扱うデータサイズを小さくすることができ、結果としてミニバッチサイズとして大きい値を設定できます。

  6. Wiki-40B: Multilingual Language Model Dataset. Mandy Guo Zihang Dai Denny Vrandecic Rami Al-Rfou. [paper]

  7. https://github.com/huggingface/transformers

  8. こちらで公開している日本語wikiHow要約データの場合は、記事のようなjsonlが最終的に取得できるので問題ないのですが、こちらのwikiHowデータを利用する場合はjsonlに加工する処理が必要になります。

  9. 今回は日本語T5として、megagonlabs/t5-base-japanese-webを使用します。

  10. TL;DR 3行要約に着目したニューラル文書要約. 小平知範, 小町守. [GitHub]

  11. 事前学習モデルを用いた少量データに対する日本語抽象型要約. 勝又智. [paper]

  12. SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing. Taku Kudo, John Richardson. [paper]

  13. BERTScore: Evaluating Text Generation with BERT. Tianyi Zhang, Varsha Kishore, Felix Wu, Kilian Q. Weinberger, Yoav Artzi. [paper]