yoheikikuta/bert-japanese

テキスト要約タスクにファインチューニングする方法

plalomar opened this issue · 2 comments

こんにちは、
テキスト要約タスクについて質問があります。

googleのbertモデルと同様、bert-japaneseのコードも今テキスト分類タスクになっています。

しかし、テキスト分類タスクからテキスト要約タスクに変更したいと思い、run_classifier.pyを編集してみました。そして編集した途中でいくつかの不明点があります。

  1. create_modelに使用するnum_labelsは元々livedoorニューズのジャンルと同じ数になっています。でもテキスト要約の場合は、どう設定すればよいでしょうか。

  2. InputExampleに入力するtext_a、text_b、labelの指定方法がちょっと理解できませんでした。テキスト分類の場合、text_aにニューズ記事を入力し、labelにエンコーディングした記事のジャンルの数字だと分かります。しかし、テキスト要約の場合、text_aに要約したい本文を入力し、text_bに要約文を入力し、labelを使わないことでしょうか。

テキスト要約タスクに変更できるまで、他の部分も変更する必要があると思います。しかし今、思い浮かべるものは上記しかありません。

他のソースからいろいろ参考をしてBERTのことを理解できるようになりました。しかし、ソースコードの編集し方までは記述されたところを見つかりませんでした。

日本語不慣れな質問で申し訳ございません。日本語をもっとうまくなりたいので、日本語で質問させていただきます。
テキスト要約タスクについて心当たりがございましたら、どうかよろしくお願いいたします。

こんにちは。

BERT からテキスト要約タスクに変更する場合、少しモデル構造を変える必要があります。
bert-japanese ではこのようなテキスト要約はサポートされていません。

例えば、extractive summarization であれば、大まかには以下のように変更をする必要があります。

  • pre-trained BERT を準備する
    • これはテキスト要約関係なく学習したもので問題ありません(bert-japanese のモデルもそのまま使えるはずです)
  • fine-tuning 用に出力の layer を追加する
    • これは入力 token を要約に使う(1)か使わない(0)かを予測するための layer
  • fine-tuning を実施
    • 入力の文章は複数の文章でできていることが多い。BERT は [CLS] token に一つの文章の情報をまとめるので、[CLS] [token1 for sentence1] [token2 for sentence2] ... [CLS] [token1 for sentence2] [token2 for sentence2] ... のように入力を作る
    • 正解データは要約された文章で、各 token に対して 1/0 を付与したもの。この正解データを使って fune-tuning する

以上を踏まえてあなたの質問に答えます。

  1. に関してはテキスト要約では [CLS] token に対して classification 問題を解いたりしないので、num_labels のような情報は学習では使わないです。
  2. に関してはテキスト要約では BERT の使い方を少し変える必要があるので、上で書いたような入出力を作り、fine-tuning する必要があります。

詳しくは https://arxiv.org/abs/1908.08345v2 が参考になるかと思います。

yoheikikutaさん

ご丁寧な返答ありがとうございます。
こちらの返事遅れて申し訳ありません。
yoheikikutaさんの返答を読んで、不明なところまたは他の質問がないかを確認していました。
現時点では思い浮かべる質問がありません。

まずはyoheikikutaさんから頂いたヒントを参考にして、実装してみて実装方法がわかりましたら、
他の人が参考できるようにここに追記します。

追加質問のためにもうしばらくこのスレッドを開いたままでも構いませんでしょうか。

改めてありがとうございました。