[DL Hacks]Pretraining-Based Natural Language Generation for Text Summarization ~BERTから考える要約のこれまでとこれから

>100 Views

April 22, 19

スライド概要

2019/04/08
Deep Learning JP:
http://deeplearning.jp/hacks/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

Pretraining-Based Natural Language Generation for Text Summarization ~BERTから考える要約のこれまでとこれから~[DL Hacks] 東京大学 鶴岡研 B4 中村 朝陽 !1

2.

0. Abstract BERTを用いたAbstractiveな要約モデルの紹介と解説 • 2019年、BERTを要約タスクに応用したモデルが発表、SOTAを塗り替えた。 • 要約の前提となる背景や関連研究について時系列的に整理 • 加えて、BERTがテキスト生成モデルにどのような影響を与えたかを紹介 • 右側にお品書き

3.

1. Introduction

4.

1.1 タスク 要約 = 与えられた長い文をの要点をまとめ短い文として出力する • 入力:長い文章 • 出力:短い文章 • 目的:要点をまとめる • 入力形式 / 出力の内容 / 目的 のそれぞれにおいて以下の分類をすることがある • 入力: 単一の文書 / 複数の文書 • 出力: ネタバレあり(Informative) / ネタバレなし(Indicative) • 目的: 指示なしで要約させる / どういう観点の情報を抽出するかを指定する 1. Introduction

5.

1.2 手法の分類 Extractive / Abstractive の2種類のアプローチ • Extractive • 入力文の中から重要なn文をピックアップして並べる (n ≈ 3) • Abstractive • 新しく要約文を生成する 1. Introduction

6.

1.3 評価指標 N-gram ベースのヒューリスティックが存在するが、問題点も多い • ROUGE-N (Recall-Oriented Understudy of Gisting Evaluation) • N-gram単位でどれくらい一致しているか • Ex) Rouge-1, Rouge-2など • ROUGE-L • 最長で一致する単語列の長さの和を元に評価 • ROUGE-SU • Skip-bigram と Unigram の一致率を元に評価 • Skip-bigram:【wordA + 任意の間隔 + wordB】 • 他にも Pyramid や BLEU などの評価指標もある 1. Introduction

7.

1.4 データセット 1. Introduction 代表的なデータセットは CNN/Daily Mail と NYT50 CNN/Daily Mail NYT50 データ数 およそ 300,000 セット およそ 25,000 セット ソース文章の平均単語数 781 tokens 1152 tokens 要約に含まれる平均単語数 56 tokens 75 tokens • Anonymized / Non-anonymized の2種 • Anonymized:固有名詞を置換 • Ex) The United Nations → @entity5

8.

2. Related works

9.

2. Related works 要約手法の発展を時系列順に説明していく 2014 • 2.1 従来的なテキスト生成モデル • Seq2Seq + Attention 2017 • 2.2 要約モデル (BERT前) • Pointer-Generator Networks 2018 • 2.3 BERTショック • 要約などのテキスト生成タスクはしていないが、分類などのNLPタスクにおける革命児 2019 • 2.4 要約モデル (BERT後) • BERTが要約に応用され、Extractive / Abstractiveの両アプローチにてそれぞれSOTA 2. Related works

10.

2.1 一般的なテキスト生成モデル Seq2Seqの登場により、要約にディープラーニングが適用可能に • 入力:テキスト + 出力:テキスト • 条件付きのテキスト生成、という観点からは機械翻訳などとも同じようなモデルが構成可能 • ベースラインとして使われていた 2. Related works

11.

2.1.1 一般的なテキスト生成モデルの手法 RNN+Attentionによりencode, RNNによりdecode する 2. Related works

12.

2.1.2 一般的なテキスト生成モデルの結果と課題 不正確 / 未知語 / 冗長 の3つの課題 • 事実と異なる記述 → 致命的 • 未知語(OOV: Out Of Vocabulary)に対応不可能 • 要約したい文はニュースなどで、固有名詞も多い • 同じ内容を繰り返してしまう → “要約”できていない 入力 出力 2. Related works

13.

2.2 要約モデル (BERT前) 先の3つの問題を解決できるような要約特化のSeq2Seqモデル Get To The Point: Summarization with Pointer-Generator Networks • 2017年、CNN/Daily Mail Dataset において SOTA • ソフトに「コピペ」することで 正確かつ未知語にも対応 (Pointer-Generator) • Coverage mechanism を導入し、まだ触れていない単語を出力しやすくし、冗長さを改善 • ExtractiveとAbstractiveの中間的なモデル 2. Related works

14.

2.2.1.1 要約モデル(BERT前)の手法, Pointer-Generator Encoderの出力であるAttentionをGatingして足し合わせて予測する • “2-0”などの未知語もそのまま コピーできる • 学習初期はコピペしやすく(p_gen≈0.3)、終盤はよりAbstractiveな出力に(p_gen≈0.53) • 追加のパラメータ数も少なく、高コスパ 2. Related works

15.

2.2.1.2 要約モデル(BERT前)の手法, Coverage vector Attentionの合計をとっておき、まだAttentionがかかってない箇所を参照 • 冗長性の削減に貢献 2. Related works

16.

2.2.2 要約モデル(BERT前)の結果と課題 不正確 / 未知語 / 冗長 の3つの課題を改善, しかしモデルが浅すぎる? • 定量的なスコアでSOTA • 下の例にあるように定性的な評価も大きく改善 (cf. Seq2Seq) • (個人的な感想) • EncoderもDecoderも1層のLSTM • 文の内容を理解しているのではなく、”受験英語的な要約”をしている可能性もあるのでは? • ex) But の後は重要! 引用は無視しとけ!など 2. Related works

17.

2. Related works 2.3 BERTショック 2018年に公開された汎用的で超高性能な事前学習済みモデル • BERT + FC層などの単純な変換 で様々なタスクで圧倒的なSOTA • 「入出力」「タスク」「要約」の3つの観点から整理 (参照: Ryobotさん)

18.

2.3.1 「入出力」から見たBERT 入力:1~2種類の文章, 出力:それぞれの単語の文脈を加味したベクトル • 入力と出力の系列長は同じ • WordPieceによるToken化, 質問文/選択肢などの文章の種類を表すSegment, 位置情報が埋め込まれる 2. Related works

19.

2.3.2 「タスク」から見たBERT BERTがencodeしたベクトルを簡単なモデルに接続してタスクを解く • 事前学習として「マスクされた単語の予想」「文A, Bが隣接しているか当てる」タスクを行った • BERTは高性能なEncoderであると言え、様々な分類問題などに応用される • 分類問題などは、[CLS]ラベルの出力ベクトルを簡単なモデルに接続 • NERや範囲を答えるタスクなら、該当する入力文に対応する特徴ベクトルを用いればよい 2. Related works

20.

2.3.3 「要約」から見たBERT BERTを要約に利用したい、だけど一工夫必要 • 従来は `受験英語的に` (?) 解いていたかもしれないが、きちんと言語や論理を理解した要約が出来そう • Extractiveな要約から見て • 入出力がNERや範囲指定と似ているので、簡単に応用できそう • 文同士の関係性を見たいので、Segmentラベルが2個じゃ足りない気もする • Abstractiveな要約から見て • BERTは高性能なEncoder • じゃあ、Decoderは? 2. Related works

21.

2.4 要約モデル (BERT後) 2019年, ExtractiveとAbstractive両者で応用モデルが発表、 共にSOTA • BERT × Extractive summarization • Fine-tune BERT for Extractive Summarization • 2019/03/25 (2週間前!) • 要約タスクにおいて、圧倒的にスコアを向上させた。 • シンプルなモデル • BERT × Abstractive summarization • Pretraining-Based Natural Language Generation for Text Summarization (2019/02/25) • Abstractiveな要約において若干スコアを塗り替えSOTA • 巨大なモデル • 今回実装した論文 2. Related works

22.

2.4.1 BERT × Extractive summarization “用法”を守ったBERTの利用 • BERTでencodeされたベクトルを fc層/ 2層のTransformer / 1層のLSTM などに入れるだけ • 工夫として、1文毎に異なるセグメントを用いることで、セグメント2種類しかない問題に対処 • コードも公開 2. Related works

23.

2.4.2 BERT × Abstractive summarization この手法の紹介は次章にて • コードは公開されていない (大学の研究者 + Microsoftの研究チーム) このやり方の気持ちは下のよう(だと思われる) • BERTを要約に使いたいが、Decodeを上手く行う方法がない… • マスクされた単語の予測を応用してDecode出来ないか、と考える • 要約の草案を用意しそれにマスクして予測すれば、BERTを利用してDecodeできる!? • しかし、BERTは条件付きで予測することができない • このアイデアだと要約の草案としソース文章で条件付けしたいが、BERTの入力形式ではない • もちろん、草案も作らないといけない • → Transformer製のDecoderを用いて、「草案作り」と「条件の加味」をしてもらう 2. Related works

24.

2. Related works 要約手法の発展を時系列順に説明していった 2014 • 2.1 従来的なテキスト生成モデル → 不正確 / 未知語 / 冗長さの課題 • Seq2Seq + Attention 2017 • 2.2 要約モデル (BERT前) → 良くなったが、本当に内容を理解しているのか? • Pointer-Generator Networks 2018 • 2.3 BERTショック → BERTはすごい、だけどどうやってテキスト生成たる要約をするか? • 要約などのテキスト生成タスクはしていないが、分類などのNLPタスクにおける革命児 2019 • 2.4 要約モデル (BERT後) → BERTを工夫して要約に取り入れることでSOTA • BERTが要約に応用され、Extractive / Abstractiveの両アプローチにてそれぞれSOTA 2. Related works

25.

3. Architecture

26.

3. Architecture 3. Architecture Encoder(BERT) + Draft Decoder + Refine Decoder の3つからなる Encoder Draft Decoder Refine Decoder

27.

3.1 Encoder ソース文章を普通にBERTに入力し、特徴ベクトルを得る • 使ったBERTはbaseモデル(largeじゃない方) • 先に述べたように、BERTに入力できる系列長は最大で512 • 問題:CNN/Daily Mail Dataset の 平均的な単語数はいくつだったでしょう? • 入力に入りきらない、じゃあどうするか • 先頭の512tokenを切り取る • この方法は妥当? • (要約においてしばしば用いられる手法) • このデータセットはニュース、ニュースの大事な情報は前の方にあるから大きな支障はきたさない • むしろ先頭を切り取ってモデルに与える方がスコアが向上した、ということをいう論文もある • どちらにしろ、Data-specific な事柄 3. Architecture

28.

3.2 Draft Decoder 入力: Encoderの出力 + 時刻t-1まで出力した文, 出力: 時刻tでの単語の確率 3. Architecture

29.

3.2.1 Transformer Decoder TransformerのDecoderをそのまま利用 • Transformerは翻訳タスクでSOTAだった手法で要約タスクと入出力が似ている Decoderの次の出力 Encoderの出力 Decoderの途中までの出力 3. Architecture

30.

3.2.2 Copy Mechanism Pointer-Generatorの機構と同様、ソフトにコピペする手法 • 入力:Encoderの出力(Attention)とDecoderの出力(Attention) • 出力:単語の出現確率 • (未知語についての問題は、BERTのWordPiece embeddingsによるトークン化で解消してはいる) • 未知語への対策というよりコピペした方が要約の精度上がるから、という意味合いかも 3. Architecture

31.

3.3 Refine Decoder 1単語ずつ[MASK]して予測しなおすことで、BERTをテキスト出力に活用 3. Architecture

32.

3.4 学習の流れ 基本はDraft Decoder, Refine Decoder それぞれ尤度を最大に • 先ほどの図にあったようにラベルと単語の確率を比較するLoss関数 • Label smoothing を利用 • Label smoothing:エントロピーをとる際に、正解なら1, 不正解なら0で計算するのではなく 正解なら0.9, 不正解なら0.1 で計算することで正則化ができる • Draft Decoderの学習にはTeacher Forcingを利用 • 更に著者らはROUGEスコアを報酬にした強化学習的なアプローチも目的関数に入れている • Beam Search(幅4)を用いた推測をDraft Decoderで行う 3. Architecture

33.

3. Architecture 3. Architecture Encoder(BERT) + Draft Decoder + Refine Decoder の3つからなる Encoder Draft Decoder Refine Decoder

34.

4. Experiment

35.

4.1 コーディング ~ Copy Mechanism ~ CopyMechanismの実装、未知語対応が無しならtorch.scatter 4. Experiment

36.

4.1 コーディング ~ torch.scatter, torch.scatter_ ~ Pytorch間違い探し 4. Experiment

37.

4.1 コーディング ~ Multi GPU とモジュール ~ 一行で複数GPUに対応できるが、モデルの自作メソッドは使えなくなる Summarizerクラスは • BertModel, DraftDecoder, RefineDecoder の3つのモジュールからなり、独自メソッド summarize()をもつ この時、summarizer = DataParallel(summarizer)をすると summarizer.summarize()は使えなくなる ↓ self.bert = DataPrallel(self.bert) self.draft_decoder = DataPrallel(self.draft_decoder)などとすればOK 4. Experiment

38.

4.2 動かしてみる ~Draft Decoder~ 初期パラのDraft Decoder, CopyMechanismが働いていることが分かる 4. Experiment

39.

4.2 動かしてみる ~Refine Decoder~ 初期パラのRefine Decoder, 1単語ずつRefineしていっている 4. Experiment

40.

4.3 学習させてみた 4. Experiment メモリとの戦い • もともとのモデルは超巨大(BERT 12層, Transformer Decoder 12層) • 1バッチの要約生成につき1単語ずつauto-regressiveに学習するので、100×2回 ほど回す • →通過するレイヤー数:3000以上。完全にミルフィーユ • 頑張ってbatch_sizeを4から24にした • retain_graph をオフにして、適宜 再計算+グラフをフリー (最終的にはこの手法は使わなかった。) • BERTの重みを固定する • モデルを小さくする(12 layer → 6 layer) • 演算の境目でメモリ使用が重なってメモリオーバーになっていた • → 基本的にretain_graph=True, for文の最後だけretain_graph=Falseとしてグラフをフリー • 部分的にグラフをフリーする (https://stackoverflow.com/questions/50741344/pytorch-when-using-backward-how-can-i-retain-only-part-of-the-graph)

41.

4.3 学習させてみた 1回目、とりあえず[PAD]と予測するようになってしまった 4. Experiment

42.

4.3 学習させてみた 正解が[PAD]の時のミスをロスに加算しないようにした • これである程度きちんと学習できるはず…! 4. Experiment

43.

4.3 学習させてみた コードを変えた。なんか下がっている。これは…!! 4. Experiment

44.

4.3 学習させてみた 「とりあえずピリオドって予測しとこw」 4. Experiment

45.

4.3 学習させてみた そもそも学習は始まったばかり(というか進まなすぎる) 今のペースだと25日/epoch (僕のコードが悪いかも) 4. Experiment

46.

5. Conclusion

47.

Conclusion / Comments 今後は「タスク設定」や「どのような入出力が汎用的か」が重要そう • 汎用的で高性能な“Decoder”が望まれる • 大量の教師無しデータでPre-training • 少量の教師ありデータでFinetuning • BERTが上手くいった理由 • 問題設定を見直し[MASK]の予測とすることで、双方向からEncodeすることが出来るようになった • Teacher-Forcingとは異なり、Pre-train時の入力データとFinetuning時の入力データの分布が近い • データの分布 = ソフトな意味での「型」 • 「言語を話せる」を「タスクXXが出来る」に言い換える • Pre-training時とFinetuning時の入出力の分布を揃えることで事前学習が効果的に効いてくる • 加えて、Auto-regressiveではないテキスト出力にも期待される 5. Conclusion

48.

6. References

49.

6. References 6. References 参考文献 • https://qiita.com/icoxfog417/items/d06651db10e27220c819#31-rouge-nカバー率の評価 • https://qiita.com/icoxfog417/items/65faecbbe27d3c53d212 • “A Survey on Neural Network-Based Summarization Methods”, 2018 • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding , 2018 • Pretraining-Based Natural Language Generation for Text Summarization , 2019 • Attention Is All You Need , 2017 • Get To The Point: Summarization with Pointer-Generator Networks, 2017 • Fine-tune BERT for Extractive Summarization, 2019