こんにちは、CCCMKホールディングスTECH LABの三浦です。
この前初めて訪れた街を朝早起きしてジョギングしたのですが、普段見られない景色や雰囲気を感じられてとても楽しかったです。いつか色々なところを旅して朝走ることを趣味に出来たらいいな、と思いました。
Large Language Model(LLM)を使っていると、"どうしてこういう回答が返ってくるんだろう?"と時々不思議に感じることがあります。現在のLLMのモデル構造として主に採用されているTransformerでは何層にも積み重ねられた層を通過しながら、入力テキストが変換されていき、LLMの事前知識が反映されたテキストが生成され出力されます。層を通過するたびに入力テキストがLLMの内部でどんな処理を施されていくのかを知ることで、"どうしてこの回答が出てきたのか"の疑問に答えられるようになるのかもしれません。
最近読んだ論文がまさにそのような内容に触れていて、とても面白かったので今回の記事でまとめてみたいと思います。具体的には入力プロンプトがLLMを通過する途中で各層で生成される表現ベクトルを抜き出して別のプロンプトに組み込み、その結果どのような出力が得られるのかを観察することで各層で組み込まれるLLMの事前知識を明らかにする、というアプローチです。結果も面白かったのですが、こういったアプローチもあるんだな、と勉強になりました。
今回はこちらの論文を参照して書いています。
- Title
Unveiling LLMs: The Evolution of Latent Representations in a Dynamic Knowledge Graph - Author
Marco Bronzini, Carlo Nicolini, Bruno Lepri, Jacopo Staiano, Andrea Passerini - Submit
4 Apr 2024 (v1), last revised 6 Aug 2024 - arXiv
https://arxiv.org/abs/2404.03623
LLMの知識をどうやって可視化するのか
論文では与えられた文章(claim)が事実かどうかを判断するタスクをLLMに与えて実験を行っています。事実か否かを表す(true or false)の他に、その判断に必要となる事実関係を知識グラフ(Knowledge Graph)で出力させる、という方法を取ることでLLMが持っている事前知識を可視化しています。
たとえば"Edgar Allan Poe wrote Hamlet"(Edgar Allan PoeがHamletを書いた)という主張は、Hamletの作者は"William Shakespeare"であることからfalseであり、判断に必要な事実としては"Edgar Allan Poe is a writer", "Hamlet is a play(演劇)", "William Shakespear is author of Hamlet"かつ"Edgar Allan Poe is not author of Hamlet"を挙げることが出来ます。この時LLMに求める回答形式は次のようになり、特に事実関係の記述は知識グラフで表現可能な形式で生成させています。
{"label": "false","facts": ["isWriter(Edgar Allan Poe)", "isPlay(Hamlet)","AuthorOf(Hamlet, William Shakespeare) ∧ ¬AuthorOf(Hamlet, Edgar Allan Poe)"]}
上の表現の"∧"は"and"を表し、"¬"は否定を表しています。対象の属性を表す場合は"is属性"を使い、2つの対象間の関係性を表す場合は"関係性(対象1, 対象2)"のような記述を用いています。
LLM各層における潜在表現の抽出について
論文で行われている実験で与えられるプロンプトは次のようになっており、(1)タスクを指示するパート(オレンジの箇所)、(2)出力形式を例示するパート(ピンクの箇所)、(3)判定対象のテキストが入力されるパート(グリーンの箇所)の3つで構成されています。
実験では特に(3)の入力パートに注目しており、この部分に該当するトークンに対する表現がLLMのself-attentionによってどのように変化するのか観察することでLLMが物事を判断する時に使う知識情報を可視化することを試みています。
この入力パートからどのように表現(ベクトル)を得るのかについてですが、具体的には一部のトークンの表現ベクトルだけを取り出して合計することで表現ベクトルを計算しています。論文の説明によると、入力テキストの単語に対して品詞判定を行い、名詞・動詞に対するトークンはテキストの最後に位置するものだけを取り込み、それ以外の名詞・動詞に対するトークンは使用しないようにしているようです。また文章内に出現するエンティティについては、LLMがエンティティの末尾のトークンに表現を生成する傾向があることから、エンティティ末尾のトークンを取り込むようにしているようです。具体的には以下の図のようになります。
これら抽出対象となるトークンに対する表現を合計したものをLLMの各層から抜き出して、次に説明する"Patching"という手法を用いて可視化を行っています。
Patchingによる潜在表現の取り込みと知識グラフの生成
各層から可視化したい対象の表現を抽出したのち、その表現を用いて先に説明した知識グラフを生成させることでその表現に含まれる事実情報を可視化します。そのために論文ではPatchingという手法が用いられています。
まず次のような入力プロンプトを用意します。
このプロンプトは先ほどの潜在表現を抽出するためのプロンプトと同じ構成をしており、先のプロンプトと同じ出力を指示していますが、入力パートには具体的なテキストは与えられません(x
の部分)。このプロンプトをLLMに入力すると各トークンに埋め込みベクトルが付与されますが、x
に該当する埋め込み表現として先の手順で取得したLLM各層の入力テキストに対する表現を上の図の右のように付与します。このようにすることでLLM各層から抽出した表現に基づいて知識グラフを生成することが出来、各表現に含まれている事実関係を可視化することを実現します。
この流れを最初読んだ時、常に正しい出力が得られる意味のある表現がLLMの層から本当に抽出出来るのかな、と少し疑問を持ちました。実際出力された結果が掲載されていたのですが、LLMの中間くらいの層から抽出した表現を用いた場合はちゃんと知識グラフが生成されている一方、最終層あたりから抽出した表現では知識グラフが生成出来ていない様子がうかがえました。
実験の結果とうかがえること
論文では各入力テキストに対するLLMの各層における知識グラフ生成の様子について考察がなされています。入力テキストに対して各層でどのような知識が使用されているのかを見るローカルな観点と、LLMの全体で見た時にどの層でどのような知識が使用されるのかを見るグローバルな観点で考察がされていました。
ローカルな観点での考察
3つの入力テキストをLLMに与えた場合の各層の表現による知識グラフの生成の様子が以下の図で表現されています。
入力テキストAはFALSEが正解で、LLMもFALSEと正しく判定出来たもの、B, CはTRUEが正解ですが、LLMはFALSEと判断してしまったものです。一番右の列が各入力テキストに対してLLMが生成した判定結果と知識グラフ、それ以外が対応する層から抽出した表現をPatchingして生成した判定結果と知識グラフです。
Aに対する知識グラフの様子を見てみると、入力テキストは再生可能エネルギーに関する内容なのにLAYER3で何故か"The BEATLES"についての知識グラフが生成されています。この理由はプロンプトの例示部分でThe Beatlesに関するテキストが扱われており、それによってLLMがThe Beatlesに関する事実を紐づけていることが要因として考えられます。Aについては正しい判断が出来ている一方で、LAYER17, 19でCOAL(石炭), NUCLEAR ENERGY(原子力), FOSSIL FUELS(化石燃料)をJOB KILLERと認識している点に知識の偏りがある可能性が伺えます。
BはLLMが間違って判断してしまった入力テキストですが、その要因がLAYER9とLAYER14付近で伺えます。もともと"Charlemagne"という歴史上の人物についてのテキストで、LAYER9ではちゃんと"Charlemagne"に関する事実が含まれた知識グラフを生成出来ているのにLAYER14では"CHARLES V"という別の歴史上の人物についての事実に注目してしまい、このことが最終的に誤った判断につながったのでは、と考えられます。
Cも判断を間違ったテキストです。これはLAYER19でその要因を伺うことが出来ます。"INDUSTRIAL LIGHT & MAGIC"という"GEORGE LUCAS"が設立した会社について、その頭文字を取った"ILM"は本来同じものとして扱うべきですが、別のエンティティとして認識してしまっていて、そのことが最終的な誤判断につながっていることが要因として考えられます。
このようにLLMが各層で処理をする際に自身の持つ事前知識をどのように使っているのかを可視化することで、様々な考察を行うことが出来、とても面白いと思いました。
グローバルな観点での考察
FEVERデータセットから500件のデータをサンプリングし、それぞれに対して各層から表現を抽出、それらを用いて知識グラフの生成を行っています。生成された知識グラフの間に、グラフノードに対応する埋め込みベクトル同士のコサイン類似度をベースにした類似度を定義し、K=5のクラスタリングを実施しています。同じ入力テキストに対し、ある層とその前の層で生成される知識グラフの間でも類似度を計算することが出来、層ごとのクラスタの分布状況と前の層との類似度の分布をグラフ化したものが以下の図です。
それぞれの色分けされた(属するクラスタごと)層で異なる知識グラフの生成傾向が見られるようです。
L1:L3(クラスタB)
浅い層に位置する部分では構文やエンティティの解釈が行われます。たとえば入力テキスト内のトークンとして"Mexico"といった欠損のない単語が使われていた場合、Mexicoについての情報として"IsCountry(Mexico)"が生成されるなどです。一方で"jack"のような単語の一部分のようなトークンが使われている場合は、そこから"Jackman"などのエンティティの推論が行われているようです。
この層の中では40%程度しか入力テキストを考慮した知識グラフが生成されない傾向があるとのことです。
L5:L21(クラスタD)
広範囲に及ぶ中間に位置するこれらの層では入力テキストに登場するエンティティを考慮した事実に基づいた知識グラフが生成される傾向があります。またあるエンティティについての知識グラフを構築出来るようになると、次の別のエンティティに対する知識グラフの生成に移るといった面白い傾向があるようです。たとえば"Robin was murdered by the Joker in a 1989 book"という入力テキストに対し、"Robin"についての知識グラフが構築された次の層以降は"Joker"についての知識グラフが生成され、それが終わるとまた"Robin"についての知識グラフが生成される、といった傾向です。
L27:L32(クラスタA)
最終層に位置する部分から抽出された入力テキストに対する表現からは、ほとんど知識グラフが生成されなくなる傾向が見られるようです。また、何故か入力テキストに関する情報ではなく例示として与えられたテキストに関する情報が生成される、といった現象も見られるようです。最終層付近では例示部分に位置するトークンへのAttentionの重みが大きくなる傾向があるのかもしれません。
まとめ
今回はLLMが事実に基づいて入力テキストの正誤を判断する時に、どのように自身の持つ事前知識を用いて判断しているのかを可視化する方法について提案された論文を読み、内容をまとめてみました。「LLMがなんでこういう結果を返したんだろう?」に対し、答えを探る1つのアプローチとしてとても面白いと感じました。またこの提案手法で使われていたPatchingという方法も、他の用途で活用出来そうなテクニックです。LLMの内部でどんな処理が行われているのかについては、これからも色々な方法で明らかにされていくのではないかと思います。とても興味深い領域なので、今後も引き続き追い続けてみたいと思いました。