制御可能な文章生成RAG - RAG学習

はじめに

前回 RAG1を学習する前段階としてDPR2の学習を行った。
今回は学習済みのDPRを利用してRAGの学習を行った。

RAGの構成要素

RAGは入力文に対して、関連する知識文章を検索してから、
それに対応する出力文を返すseq2seqモデルである。

RAGは以下の3つの構成要素からなる。

  1. Question Encoder
    • 入力文から特徴量を抽出する
  2. Retriever
    • 1で抽出した特徴量に対して関連する知識文(passage)を検索
    • 知識文から特徴量を抽出する (DPRのcontext encoderを利用)
  3. Generator
    • Retriverから得た特徴量を元に出力文を生成する

1, 2の部分をDPRが担い、3の部分はBART3やT54などのseq2seqモデルが担う。
transformers5ライブラリのRAG実装では、検索効率を向上するため、
Retriever部分は知識文をindex化して利用している。

知識文のindex化

知識文章群の数が増えると検索に必要な時間が膨大となる。
これを緩和するためRAGではfaiss6というライブラリを利用して、
検索の高速化を図っている。

  1. DPRのcontext encoderで知識文章群の各文章の特徴量を抽出
  2. 特徴量群をfaissライブラリを使ってindex化
  3. retrrieverはindexを利用して高速な検索を行う。

参考 : 学習済みDPRを用いた知識文章のindex化

RAGの学習

前々回 作成したデータに対してRAGの学習を行った。
DPRは前回学習したモデルを利用し、generatorはBARTを用いた。

評価文に対する出力結果

質問 正解回答 RAG返答
1925年から1935年で静岡県の人口は変わっていますか? 同じくらいです。 増 えています 。
京都府の人口は634万人くらいですか? 634万人よりも少ないです。 644 万 人 よりも 少 ないてす 。
2005年から2010年で徳島県の人口は変わっていますか? 同じくらいです。 同 しくらいてす 。

濁点が消えている、数字が微妙に間違っている点は気になるが、それらしい返答はできている。

次に質問文に対する関連文章を見てみる。

静岡県の人口は345万人くらいですか? 京都府の人口は280万人くらいですか? 島根県の人口は73万人くらいですか?
正解回答 345万人くらいです。 280万人くらいです。 73万人くらいです。
RAG返答 345 万 人 よりも 少 ないてす 。 202 万 人 よりも 少 ないてす 。 203 万 人 くらいてす 。
関連1 1955年の大阪府の人口は461万人です。 1955年の大阪府の人口は461万人です。 1955年の大阪府の人口は461万人です。
関連2 1965年の大阪府の人口は665万人です。 1965年の大阪府の人口は665万人です。 1965年の大阪府の人口は665万人です。
関連3 1975年の大阪府の人口は827万人です。 1975年の大阪府の人口は827万人です。 1975年の大阪府の人口は827万人です。
関連4 1955年の栃木県の人口は154万人です。 1955年の栃木県の人口は154万人です。 1955年の栃木県の人口は154万人です。
関連5 1960年の大阪府の人口は550万人です。 1960年の大阪府の人口は550万人です。 1960年の大阪府の人口は550万人です。

関連1~5はretrieverから得られた、入力文章に関連すると思われる知識文章上位5件である。

上表の3つの質問に対して関連する文章は変わっていない。
すなわちretrieverが入力文章に対して、意味的に関連する文章を返せていないことになる。
このためgeneratorはretrieverからの入力を無視して、 元の入力文章情報だけから
返答を行っていることとなり、RAGの意味がない(ほぼBARTと挙動が変わらない。)

前回DPR学習時点では評価データに対して正しい情報検索ができていた。
すなわち、学習時にquestion encoderもfine-tuningしてしまったために、
question encoder側が過学習してしまっていると思われる。

そこでquestion encoderの重みを固定して、generatorのみを学習することとする。

generatorのみの学習

評価データ回答例
静岡県の人口は345万人くらいですか? 京都府の人口は280万人くらいですか? 島根県の人口は73万人くらいですか?
回答 345万人くらいです。 280万人くらいです。 73万人くらいです。
返答 1055 万 人 よりも 少 ないてす 。 21280 万 人 くらいてす 。 273 万 人 よりも 少 ないてす 。
関連1 2015年の静岡県の人口は370万人です。 2015年の京都府の人口は261万人です。 2015年の島根県の人口は69万人です。
関連2 2010年の静岡県の人口は376万人です。 2015年の東京都の人口は1351万人です。 2015年の鹿児島県の人口は164万人です。
関連3 2005年の静岡県の人口は379万人です。 2010年の京都府の人口は263万人です。 2005年の島根県の人口は74万人です。
関連4 2015年の福岡県の人口は510万人です。 2005年の京都府の人口は264万人です。 2015年の徳島県の人口は75万人です。
関連5 2015年の佐賀県の人口は83万人です。 2000年の京都府の人口は264万人です。 2015年の広島県の人口は284万人です。

この場合関連文章は概ね正しいが、 返答文章中の数字が
入力文章からかけ離れているものが多い。 (73 → 273など部分的に一致はしている)
おそらくgeneratorが入力文章と知識文章の両方を見るようになったことで、
入力文章の数字部分の再現性能が低下しているものと思われる。

このケースについて他の質問についての結果も見ていく。

Q2 都道府県面積
静岡県の面積は8310km2くらいですか? 京都府の面積は4837km2くらいですか? 島根県の面積は6563km2くらいですか?
回答 8310km2くらいです。 4837km2くらいです。 6563km2くらいです。
返答 8501km2よりも 小 さいてす 。 8837km2よりも 小 さいてす 。 6933km2よりも 小 さいてす 。
関連1 静岡県の面積は7700km2である。 京都府の面積は4600km2である。 島根県の面積は6700km2である。
関連2 福岡県の面積は4900km2である。 東京都の面積は2100km2である。 広島県の面積は8400km2である。
関連3 長野県の面積は13500km2である。 大阪府の面積は1900km2である。 徳島県の面積は4100km2である。
関連4 長崎県の面積は4100km2である。 2015年の京都府の人口は261万人です。 福島県の面積は13700km2である。
関連5 滋賀県の面積は4000km2である。 1995年の京都府の人口は262万人です。 長崎県の面積は4100km2である。

面積に関する質問は人口に関する質問と同様に数字部分の再現がうまくできていない。

Q3 面積比較
島根県と長野県ではどちらが大きいですか? 徳島県岩手県ではどちらが大きいですか? 長崎県大阪府ではどちらが大きいですか?
回答 長野県のほうが大きいです。 岩手県のほうが大きいです。 長崎県のほうが大きいです。
返答 長 野 県 のほうか 大 きいてす 。 岩 手 県 のほうか 大 きいてす 。 長 野 県 のほうか 大 きいてす 。
関連1 島根県の面積は6700km2である。 徳島県の面積は4100km2である。 大阪府の面積は1900km2である。
関連2 長野県の面積は13500km2である。 広島県の面積は8400km2である。 長崎県の面積は4100km2である。
関連3 長崎県の面積は4100km2である。 島根県の面積は6700km2である。 京都府の面積は4600km2である。
関連4 秋田県の面積は11600km2である。 岩手県の面積は15200km2である。 宮崎県の面積は7700km2である。
関連5 徳島県の面積は4100km2である。 福島県の面積は13700km2である。 2015年の長崎県の人口は137万人です。

面積の比較では関連文章も概ね正しく、出力結果も一見正しいが、
generatorは学習に使った都道府県しか再現できないようである。
(右の返答で"長崎"ではなく"長野"と回答している)。

今回学習・評価で都道府県を分けているため、
評価に利用した5県(静岡、京都、島根、徳島、長崎)を含む出力文章は生成できないようである。

Q4 人口比較
1955年から1990年で静岡県の人口は変わっていますか? 1955年から1980年で京都府の人口は変わっていますか? 1950年から1980年で島根県の人口は変わっていますか?
回答 増えています。 増えています。 同じくらいです。
返答 増 えています 。 同 しくらいてす 。 増 えています 。
関連1 1955年の静岡県の人口は265万人です。 1955年の京都府の人口は193万人です。 1950年の島根県の人口は91万人です。
関連2 1995年の静岡県の人口は373万人です。 1955年の東京都の人口は803万人です。 1950年の広島県の人口は208万人です。
関連3 1985年の静岡県の人口は357万人です。 1980年の京都府の人口は252万人です。 1950年の徳島県の人口は87万人です。
関連4 1990年の静岡県の人口は367万人です。 1970年の京都府の人口は225万人です。 1950年の鹿児島県の人口は180万人です。
関連5 1955年の岡山県の人口は168万人です。 1960年の京都府の人口は199万人です。 1980年の島根県の人口は78万人です。

年代間の人口比較では、関連文章の精度がやや低く、出力文章も間違っているものが多い。
やはり細かい数字を考慮して出力文を生成することは難しいものと思われる。

考察

今回都道府県の統計量から作成した文章データセットを使ってRAGを学習したが、
あまりいいモデルができなかった。 RAGの挙動を考えるとそもそもデータセット自体に
いくつか問題がある可能性がある。 (難易度が高すぎる)

  1. 数字の出力
  2. 学習-評価の分割

このデータセットでは回答文に数字を含むデータがたくさんあるが、数字が4桁くらいの幅を
もっており、 データの数(学習データ3000程度)的に数字生成をうまく学習すること
は難しいと思われる。 また、数字情報が入力文章と知識文章に分散していることも
難易度を上げている。

学習・評価データの分割についても都道府県ごとに学習・評価データを分けたのは難易度が
高すぎたと思う。tokenzierの関係上 "京都府"という文字列は "京", "都", "府"という
3トークンに分割されるため、 generatorが都道府県名を出力する場合はこれらの
パターンを覚える必要がある。 学習せずに知識文章だけからこういったパターンを
出力することは難しいと思われるため、 学習・評価データの分割を都道府県で行うのは
難易度が高すぎる気がする。

もう少し単純なデータセットのほうがRAGの挙動が分かりやすいと思う。

まとめ

今回はRAGについて一通り学習を行い、簡単に結果を見てみた。
現時点ではすごいと言えるような結果は出ておらず、
もう少し単純なデータセットでRAGの性能を確かめたいと思った。

参考文献