見出し画像

今更聞けないLLM解説まとめ②LLMの活用法


始めに

どうも、それなニキです。
三日坊主ではいられないので今日も続けて書いていきます。
長すぎて1日では書けませんでした。ぐぬぬ。

今回は松尾研の第二回の講義の要約になります。
相も変わらず自分の脳内整理メモなので、読みづらかったらすみません。

今回は学習済みモデルの活用方法です。
多分この分野の研究をしない一般の方々にとっては一番重要なセクターになるんじゃないかなぁと思います。


1.学習済みモデルの分類

学習済みモデルと一概に言っても、そのアクセスによっていくつかに分類することができます。

Ⅰ非公開モデル

非公開で開発が進んでいるモデルになります。
最近はオープンソースでの開発や、APIの公開が進んでいるのでほとんど見ません。

参照できる試料中ではGoogleのPaLMなどが紹介されていましたが、現在確認したところ2023年の3月にAPIを公開していたらしく、何ならPaLM2という後継モデルも開発されているようです。

もう一つ紹介されていたGopherについては情報が見つかりませんでした。GPT-4に検索をかけさせてもダメだったので、多分まだ非公開モデルだと思います。

ⅡAPIのみ公開されているモデル

APIのみ公開されている、というのは、一言で言ってしまえば
自分でカスタマイズはほとんどできないけど、料金などを払う形で間接的に利用・サービスへの組み込みが可能
ということです。

まあAPIの話は本題ではないしいったん置いておきます。

ChatGPTや、Bardなどがここに該当します。

Ⅲ公開モデル

いわゆるオープンソースというやつです。
モデル全体が公開されていて、自分で追加で学習させたりなどカスタマイズ性が非常に高く(そりゃ全部公開されているんだからそう)、商用利用にも比較的寛容だったりします。

LLAMA-2や、Bloom、Falconなどがあります。

また、その派生として、カスタマイズ済みのモデルも出回っています。

Huggingfaceにリーダーボードが公開されているので、それなど参照いただければ、公開モデルが現在どんな感じかとかわかると思います。
(まあモデルが多すぎて何が何やらだとは思いますが)

大企業がチャットボット形式のカスタマーサポートを提供している場合がありますが、その場合は大体これを自社でいじくったものだと思います。知らんけど。

その他の分類法について

資料ではそのほかにも学習に使ったデータやモデルの構造による分類も一部紹介されています。

実はLLMの学習に使うデータは、必ずしも単なる文章である必要はありません(当たり前)。文章以外で使われる代表的な学習データにはプログラム(コード)などがあります。
それどころか、文章に関しても、Webからスクレイピングしたもの、会話データ、書籍、論文など多岐にわたります。

それをどのような配分で利用するかによって、モデルの性能や得意分野が変わるのは言うまでもありません。

普通の文章しか学習していないモデルが、sudoの後にapt upgradeという単語が続くと予想するはずがないのです。
(Linux系のOSをいじったことがない人はsudoって言われても分からないと思いますが、LLMも同じ風に思っているんだなぁととらえていただければいいと思います。)

2.LLM活用法①プロンプティング

ここからは具体的に我々が既存のLLMをどのように活用するかについて、技術的な視点から2つに分けて考えていきます。

まずはプロンプティングについて。
こっちはChatGPTが流行りだした初期から割と話題になって、様々な意識高い系メディア()が扱ってくださったので割と広まっていると思います。

分からない方向けに軽く説明すると、LLMは「与えられた文章の続きを推測する」という性質上、どんな文章を与えるかに回答がめっちゃ依存しているので、入力分を工夫することで回答をより自分の求めるものにできないか、というのが発端の技術になります。

現在挙げられている技術を、私の知る限り以下に列挙します。

Ⅰ Few-Shot

Few-shotとは、答えてほしい問題の類題とその回答を入力文に付け加えることで、より望んでいる方向性の回答を得るという方法です。

文脈内で追加で学習しているように見えるので、文脈内学習(In-Context Learning)とも呼ばれます。

また、これと対比して、例題を提示しない入力法をZero-Shotといいます。
多分Shotという部分が具体例を示しているんだと思います。知らんけど。

松尾研の資料に上がっている例を示します。

Zero-shotの例

Translate English to French:
cheese =>
Few-shotの例

Translate English to French:
sea otter => loutre de mer
peppermint => menthe poivree
plush girafe => girafe peluche
cheese =>

Zero-shotと比較して、Few-shotでは実際に仏語に訳している例がいくつか文中に示されています。

特にモデルが大規模な場合、こうしたFew-Shotで性能(回答の精度)が大幅に向上することが多いそうです(松尾研資料より)。

Ⅱ Chain of Thought(CoT)

これは前述のFew-shotの拡張版で、具体例の中に思考の過程を入れておくことでさらに性能を上げる方法です。

例えば、計算問題を解かせたいときに、その途中式や思考の過程をFew-shotの答えの方に入れておくことが考えられます。

で、その結果、回答にも思考過程が明示されるようになって、思考過程と結果の整合性が取れている方がより確からしいと判断されるのか、結果の精度が向上します。

これは、Few-shotと同様にモデルサイズの大きい場合に効果が大きいのは言うまでもありませんが、従来難しいとされてきた算数の文章題の回答の精度を大幅に向上させることができます。

LLMに算数の問題を解かせたらめっちゃ間違えるやんけ!と話題にされる方がいらっしゃいますが、こうした対処法をご存じない方が多い故の話だとは思います。
まあ算数については後述のAugumented LMによって大方解決されつつあったりしますが…

ちなみに弱点もあり、常識に従って回答する系統の問題では、むしろ考えすぎて回答を間違えることも多く、性能がむしろ低下する場合もあるようです。
万能ではないことは一応心にとどめた方がいいと思います。

Ⅱ' Zero-shot CoT

実は上記のCoT、何と具体例を使わずとも部分的に利用できることが明らかになっています。

どういうことかというと、質問の後に
ステップバイステップで考えてください
とか
"Let's think step by step"
などといった表現を入れてあげると、結果がより段階的になって、回答の正確性が向上するのです。

むしろこっちの方が、皆さん馴染みがあると思います。
実際私がLLMを本格的に学習していなかった2023年春に「プロンプトの極意」と銘打った某ネット番組ではZero-shotの方だけを紹介していました。

ちなみにFew-shotとの性能比較についてですが、確かそこまで大差はなかったはず…
普段使いには断然こっちですね。

それと、Zero-shot CoTに用いるプロンプト自体でもそれなりに性能が変わるようで、LLM自体を使って自動でプロンプト探索を行った研究によると(“Large Language Models Are Human-Level Prompt Engineers”, ICLR2023)、
"Let's work this out in a step by step way to be sure we have the right answer."
という表現の方が結果が良いそうです。
まあモデルによってまちまちだとは思いますが参考までに。

Ⅱ" Plan-and-Solve Prompting(PS+)

CoTの改善案が多すぎて辟易してきましたが、頑張って続けていきます。

名前からしてPSPと略したくなること間違いなしですね。
いや、でもPS Plusと考えればそれはそれでアリなのか…?

PS+はさっきのZero-shot CoTにおける「ステップバイステップで」という部分を
「計画を立ててから実行せよ」
という表現に変えるものです。

また、
「必要な変数を保持せよ」
という指示を加えると性能がさらに改善することが報告されています。
(“Plan-and-Solve Prompting”, ACL2023)

Zero-shot CoTよりもさらに精度が上がるようですが、普段使いしている人を見たことがありません。
自分もほとんど試したことがなく、何とも言えませんが、一応上位互換っていう認識でいいのかな…?

Ⅲ Self Consistency

これもCoTをさらに改善するための方法なので、正直3つ目として紹介するのに多少抵抗がありますが、一応分けて説明します。

Self-Consistencyとは、要するにLLMに複数回推論を行わせて、その中から多数決で回答を決定させるというものです。

まあ一発だとミスったら即アウトだから、何回かやってリスクを低減しようぜっていう話だと思います。知らんけど。

試料中では具体的なプロンプトが明示されていませんでしたが、まあ

submit 3 answers, and choose the most frequent one

とか書けばいいんだと思います。

Ⅲ' Tree of Thought(ToT)

なんだか略称が顔文字みたい()

これはSelf Consistencyの進化版といったところで、いわゆる戦略的な思考が必要なタスクで性能が大幅改善するそうです。

具体的には、問題を複数の段階に分けて、それぞれについて回答を作成・評価を行い、最終的に正解と判断されたものを選んで提示するというものだそうです。

…が、自分は一度も使ったことがないし、具体的な使い方についてはほとんど情報が出てきませんでした。
もう一回LLM講座受けて復習しようかな…

ChatGPTに調べさせた感じだと、各段階のノードを評価するモジュール・記憶するモジュールなどの外部ツールが必要とのことで、多分プロンプティングだけでどうこうなる話じゃないと思います。

補題 敵対的プロンプト(Adversarial Prompt)

あんまり拡散するものでもないとは思いますが、一応触れておきます。

後の投稿で詳しく扱いますが、LLMは基本的に制作者の意図に沿わない発言をしないように調整が加えられています(RLHF)。
例えば、非倫理的な発言を控えさせたり、企業秘密の漏洩を防止したりなど、その目的は多岐にわたります。

これを突破して、無理やり発言を引き出そうとするプロンプティング技術を敵対的プロンプトといいます。

例えば、ジェイルブレイクという、LLMに特定の人物になりきって発言させることを通じてRLHFを突破する手法などが知られています。(Do Anything Nowの頭文字をとってDANと言われたりします。)

他には、
プロンプトインジェクション(プロンプトに割り込んで指示を無視させる)

プロンプトリークなどが存在します。

私としては特にこうした技術を広める意図はないので、防衛的な意味で詳しく知りたい方はPrompt Engineering Guideを見てください、という程度にとどめておきます。

(このガイドは私がLLMの勉強を始めた初期から存在するもので、説明も詳しいので合わせて読むことを推奨します。多分プロンプトを習得するだけならこっちだけでいいと思います。)

3.LLM活用法②Augmented Language Model

さて、ようやくプロンプトに区切りがついたので、次はAugmented Language Modelについて扱っていこうと思います。

これは一言でいうと、LLMに外部ツール・知識をくっつけてしまおう、というものです。

外部ツールをくっつけることのメリットはいくつかあり

  • 知識を外部に頼ることでLLM内部に保持する情報を減らし、学習効率を改善できる。

  • 知識を外部化しているため、知識の更新が容易になる。

  • LLM内に情報を保持していると、誤った知識をもっともらしく話してしまう(幻覚, Hallucination)可能性があるが、外部化することで情報の信頼性が向上する。

などが挙げられます。

Augmented LM には大きく分けて2種類のタイプが存在します。

Ⅰ Retrieval Augmented LM

こっちはRetrieval(検索)とある通り、入力された文章に強く関係している(類似した)文書を検索して、それを入力文と一緒にLLMに入力するというタイプです。
前述した3つのメリットをフルで享受できます。

一方で

  1. どのように文書をとってくるのか

  2. とってきた文書をどのようにLLMに渡すか

の2点が問題となります。

1番については、「類似度」という数値を定義して探していくのですが、松尾研の資料では

  • TF-IDF」…重要なキーワードを含んでいるかを重視

  • Embeddingのcos類似度」…文章の意味的な類似度(文脈?)を重視

の2種類が紹介されています。
急に難しくなったなオィ

2番についても、いくつか手法があります。

  • In-Context Augmented LM」…入力文に直接くっつけてしまう。

    • REPLUG」「REPLUG-LSR」…LLMをブラックボックスとして扱い、そこに検索機能をくっつけて性能改善を図る枠組み。LSRはその修正版(資料ではここに分類されているようですが、定義的にちょっと怪しいので要調査)

  • KNN-Prompt」…出力文と比較してLLMの予測を修正する。

  • その他「RETRO」「REALM」等

また、どのようなデータベースを使うといいのか、大量のデータベースから効率的に検索する方法などについても議論があります。

Ⅱ Tool Augmented LM

次は知識ではなく外部ツール、例えばコードやAPIなどで拡張されたLLMです。
ChatGPT-4でプログラムを書いたりイラストを生成する機能があると思いますが、要はソレです。

できることが単純に増えるというのも特徴ですが、既存のタスクも大幅改善されるものがあり、その代表例が計算問題です。
LLMに計算は難しいという話を以前扱いましたが、計算部分をプログラミング、例えばPythonに丸投げすることで、きちんと正解を得ることができるようになります。

Toolと一概に言っても山ほどあるので、以下に羅列します。

  • PAL(Program Aided LM)」…プログラミングツールをくっつける

  • ReAct(Reasoning and Acting)」…推論→行動→結果→推論→行動→結果…というサイクルを回すシステム。

  • Toolformer」…APIを呼び出すように訓練されたLLM

  • ToolkenGPT」…ツール呼び出し用のトークン(文字)のみを学習させたもの。Tool as a Token。

  • Chameleon」…どのツールをどの順序で使うかをプランニングして順に実行する。

うーん。何度見ても、全部Chameleonで良くねって感じがするのは私だけでしょうか…

終わりに

さて、ここまで読んでくださった方々、本当にお疲れ様です。
自分としてもこんなに長くなるとは思わなかったので、今後が心配なところです()

これ以降の記事は、ガッツリLLMの仕組み的な話をしていくことになるので、一般のユーザーにはほとんど縁のない話になるかとは思います。
というか、今後の記事についてはマジで長文になること間違いなしなので、私の記事を読むよりも松尾研の講座に直接出ることを強く推奨します。


余談

ここからはマジでただの雑談です。

私はそこそこの音楽中毒で、何かを聞いていないと体が動かないので、この記事を書いている間もソシャゲのBGMを垂れ流していました。

それが、幻獣契約クリプトラクトっていうゲームのBGMだったんですが、聞いているうちに久々にやりたいなーと思って、インストールしようと探したところサ終していることに気が付きました。
それも1年ほど前に。

めっちゃ戦闘システムを気に入っていた作品だったんですが、いつの間に…

和製ソシャゲ冬の時代とは言いますが、それを身をもって感じます。
テイルズオブクレストリアは速攻でコケて終わるし、乖離性ミリオンアーサーもそこそこ前に終わっちゃったし、パズドラとかモンストとかもう話題にもならないし…
周りを見渡せば大体mihoyoかYosterのゲームばっかりやってますしお寿司。(まあ私も崩壊3rdを長いことやってるので人のこと言えないんですけど)

頼む、ヘブバンだけはどうか生き残ってくれ…(切実)

この記事が気に入ったらサポートをしてみませんか?