2022.07.08

要約AI「まずはお前が要約するんだよ」私「つらい」~ 太宰治の作品を抽出型要約しようとして折れた~

こんにちは…部署の名前変わりまして、グループ研究開発本部、AI研究開発室のY.Tです…よろしくお願いします…

前回のおさらい

PEGASUS:AI文書要約ってどこまで要約できるの? ~Swallow had been waiting for this moment for a long time.~
前回は抽出型と抽象型という二つの要約の形について説明し、簡単に最新の抽象型要約で遊びを試し、結果について色々と書きました。元の文として小説の一部を入力したら、学習に用いられたニュースデータセットの影響をしっかり受けた要約文が返ってきて、抽象型要約モデルの特性を実感した、という結末になりました。

そこで、Fine-Tuningをすれば、要約文がどの程度変わるのだろうというのが気になり、どうせなら日本語で試したいと考えました。そして、前回のブログの最後でこんなことを言いましたね。
「Pre-trainをそのまま使っているのでFine-tuningである程度改善するとは思いますが、物語の要約の場合はどういうデータを使いましょうかね。あらすじと本文とか?」

その結果、生まれたのが今回のブログになります。

はじめに

まず、目的は、小説のデータを使って学習したモデルと、Pre-Trainモデルとして公開されているWikipediaなどのデータを使って学習したモデルによる抽象型要約の質の違いを見ることです。

抽象型要約は、要約文を一からを生成するという特性上、学習データには、元となる文と、要約文のセットを大量に必要とします。そのため、使えるデータセットが限られてきます。要約文と本文の関係になっていて、大量にあるものの例を挙げると、ニュースのタイトルと本文、メールのタイトルと本文などが該当します。
世の中のPre-Trainモデルとして公開されているものの学習データは、これらのデータで学習されています。

しかし、今回学習したいデータは小説や随筆などの、メールやニュースとは変わった文体です。小説であれば、あらすじが要約文に該当します。小説のデータはあおぞら文庫のものが誰でもダウンロードができて利用可能なはずです。
そこで今回は、あおぞら文庫のデータを利用することに決めました。

あらすじが無い

人間失格
青空文庫では上記リンク先のようにhtmlでも見れて、txtもダウンロードできるんですが、あらすじが見当たりません。
あった気が…したんですけど…
あらすじと小説本文がセットで取れそうなものがあればどなたか教えてください!
有名な作品であれば、レビューを見るという手段もありますが、レビューはレビューなので、要約文とはまた違う気がしますね。

無いなら作るしかないでしょうか。
とりあえず小説全部読んであらすじを書いていくのは厳しいので、作家を絞って随筆のような短編集を一つ一つ要約して自分でデータセットを作ればFine-Tuningできるぐらいにはなるのでは無いでしょうか…!

ということで、とりあえず有名な作家ということで太宰治の作品から、ちょうど良い長さの作品を選んでいって、自分で要約文を追加。それを使ってFine-Tuningをすることで特化モデルを作ってみようかと思います。出力が太宰っぽくなるといいですね。
(太宰っぽいとは何かは知りませんが)

つらい

本当に…!つらい…!

要約という作業を完全に舐めていました。このブログは他の業務と並行で執筆作業をしていたりするのですが、こんな作業は間違いなく片手間にやる作業ではありません。今、人生で一番太宰を読んでいる。太宰の過剰摂取は精神的に良くない気もしています。

そして、要約していくにあたって、単純に物量がやばいとか、太宰の作品はゆっくり受け止めていくべきとかいう以外の問題もあります。
その一つが、旧字旧仮名使いがわからないという問題。読めはするのですが、自分で書くと何が自然なのかわからなくなってきます。
例を挙げると、校長三代
私は以下のように要約してみました。

「私がゐた高等學校の校長先生の話である。政治家肌のひとで、一國の宰相とでもいふやうであつた。校友會費を、ひそかに費消してしまつてゐ、追放された。いまは、どうして居られるか。」

一応流れに沿っていて、AIの要約でこれが出てきたら満点ですね。しかし、人間の要約としては問題点が二つあります。

一つ目は、この要約文がほぼ抽出型要約になってしまっているということ。旧仮名遣いを意識すると、自分で書けず、文章単位にならないようにはしましたが、単語単位ではほぼ本文の単語で書いてしまっています。抽象型であれば適切な言い換えなどが入ってほしいところです。

二つ目は、この要約文が全体とは違う話になっていないかわからないということ。これは私の読解力の問題でもあるのですが、この作品は随筆の短編で、正直どこが要約としてまとめていい部分かわからないですね。一言で言えば、「私がゐた高等學校の校長先生の話である。」のですが…
途中で気づいたのですが、数文という曖昧な長さで要約してたのも痛いですね。文章の長さはデータセットを作る時に決めたほうが良かったかもしれません。

結局、30作品でリタイアしました。

とりあえず何でもいいから学習しよう

もう、ここまで来ると、この30作品の要約を供養何とかして使ってやろうという気持ちです。一応、技術ブログなのに、まだ国語の話しかしていません!このままではまずい。
当初は下記の記事で解説してくださっているような、解きたいTaskと直接関係のあるSumarizationというTaskを与え、ROUGEスコアを損失関数として、要約の精度を考慮し、networkのweightを更新するということをやりたかったのですが、流石にデータがなさすぎる。
【日本語モデル付き】2021年に自然言語処理をする人にお勧めしたい事前学習済みモデル

そこで、新しいcorpusとして、本文を結合したもの与え、TaskはMLM(Masked Langauge Model)という穴埋め問題を解かせるBERTのデフォルトの学習法でweightを更新したモデルを作り、それをSummarizationに使うという方針にします。”小説の”Summarizationに特化したモデルは得られませんが、Summarization自体は他の日本語(ともすれば別言語)のSummarizationと同じロジックである程度いけそうですし、単語のweightは小説に偏ったデータで更新されるのでいけるはずです。
穴埋め問題のFine-Tuningであれば必要な量はありますし、文体も特徴的なので、何がしかの結果が期待できるのでは無いでしょうか?

あおぞら文庫のデータを使ったMLM TaskのFine Tuningに関しても先駆者がいたので、実装はかなり参考にさせていただきました。
(というかほぼそのままです。)
huggingface / transformersを使って日本語BERTの事前学習を実施してオリジナルな言語モデルを作ってみる

またまたHuggingFaceのPre-Trainモデルを使うので、ModelとTorkenizerが用意できれば、summarizationのpipelineでいけるはずです。SummarizationPipeline


こんな感じでいけるはず。(前回の教訓:textの入力長には注意)
summarizer = pipeline("summarization", model=model, tokenizer=tokenizer)
summarizer("太宰の作品", min_length=5, max_length=20)
と、思っていたのですが…
終わらない学習


終わんね…

学習のエポック減らしたりしたんですけど、ネットワークサイズがデカすぎるのでしょうか…
単純にリソースたりてないとかかもしれませんが、おそらくどこかに異常があります。色々見直す点はあるかもしれませんが、データの用意に時間を使いすぎて、時間がなくなってしまいました。
涙の敗北です。次回作にご期待ください。

おまけ

このままだと誰の役にも立たない気がするので、誰かの役に立つ情報を置いておこうと思います。
この実験はWSL(Ubuntsu)+Cuda+を入れてGPUを使えるようにして、VSCodeからJupyter notebookを開いてやっているのですが、学習を走らせた時に、最初、”CUDA error: no kernel image is available”と、怒られてしまいました。
原因はtorchとcudaのバージョン違いでした。気をつけましょう。以下のリンクでバージョンを選ぶと出てくるコマンドをそのまま実行し、ライブラリを入れ直すと解決します。やったね。
Pytorch GetStart
cudaのバージョンは以下の場所でわかります。/usr/local/cudaを見ましょう。
cat /usr/local/cuda-11.6/version.json 
>>>{
   "cuda" : {
      "name" : "CUDA SDK",
      "version" : "11.6.1"
   },
   "cuda_cccl" : {
      "name" : "CUDA C++ Core Compute Libraries",
      "version" : "11.6.55"
   },
(以下略)
 

最後に

グループ研究開発本部 AI研究開発室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務などAI研究開発室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。皆さんのご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事