【Day 2】東大松尾研のLLM講座資料が公開されたから、詳しく読んでいくよ【備忘録】

# はじめに
先日、AI系で日本で一番有名と言っても過言ではない、東京大学の松尾研究室のLLM 大規模言語モデル講座の資料が、非商用利用での二次利用可能という条件で無料公開された。

:::note warn
詳しい利用規約は下の資料ダウンロードページよりご確認ください。
:::

:::note warn
講義資料はすべて、以下のライセンスがあります。
LLM 大規模言語モデル講座 講義資料  © 2023 by  東京大学松尾研究室 is licensed under CC BY-NC-ND 4.0
:::



この資料は、2023年秋に同研究室が開催したLLM講座と同様のもので、僕も含めて約2000人が受講した。

https://weblab.t.u-tokyo.ac.jp/llm_contents/

:::note alert
2024年8月14日現在、2023年版の資料公開は停止したらしいです。2024年秋に新LLM講座が開講されるらしく、そちらの受講をおすすめします。（申込は2024年8月26日までらしいです）
:::

さすが松尾研、何から何までとても質が良く、大変勉強になったので、今回はそれの復習＆備忘録がてら、資料を詳しく読みつつ、参考になるサイトや動画を貼り付けつつ、記事を書いていく。

:::note info
この資料において、「LLM資料」とは、松尾研究室から公開されたLLM講座の資料を指します。
手元に資料を用意し、同時にこの記事を参照していくことを想定しています。
:::

今回は第二回の講義資料について進める。それ以降は近々。講義資料は上のリンクから無料でダウンロードできます。

:::note warn
間違いがあるかもしれないので、コメントで教えていただけると大変嬉しいです。
:::
:::note warn
資料に書いていないことでこの記事に書いてあることは筆者が調べたことや考えです。
:::

:::note info
松尾研の深層学習基礎講座も受講させて頂きましたが、本当に質が良く、めちゃくちゃおすすめです。深層学習をこれから勉強する、基本まではわかる、という方にとてもおすすめです
:::

https://deeplearning.jp/lectures/dlb2023/

:::note info
筆者がさらに詳しく勉強したり、記事を読んだ方から「この情報参考になったよ」というものがあれば、随時更新していきます
:::



# 自己紹介
データサイエンティストを目指して日々勉強している、慶應大学理工学部4年生（202.01.09時点）
取得資格、コンペ優勝経験など、リアルタイムの情報は👇👇👇をみてね

X: <a href='https://twitter.com/A7_data'>@A7_data</a>←普段はXで活動しています。ありがたいことに、フォロワーは6500人を超えました😌
プロフィールページ👇👇👇

https://mohki7.notion.site/Mototsugu-Oki-c478f842c4de48f394e2e24b58e206bb

X👇👇👇

https://twitter.com/A7_data

# Day2の概要
Day2のテーマは「Prompting and Augmented Language Model」ということで、**LLMの活用法**に焦点が当てられている。（学習済みLLMを追加学習なしで活用する技術について）

項目としては大きく3つ。
1. プロンプティングや文脈内学習とは何か
1. プロンプティングによる性能改善方法
1. Augmented Language Modelの概要

LLMの使い方に焦点を絞っているので、今回の授業だけでも幅広い人に役立ちそう。

# 言語モデルとは
今回の講座のテーマである「LLM」は、Large Language Modelの略で、大規模言語モデルという意味である。そもそも言語モデルとは、人間の言語を、単語の出現確率によってモデル化したものを指す。

その中でも、ある単語の次に出てくる単語を、今まで出力した文章をもとに計算して予測するモデルを**自己回帰言語モデル**という。

LLM資料の6ページの条件付き確率の式を見れば、すぐに理解できた。

LLMはこの言語モデルにディープラーニングを用いて巨大なモデルを構築し、大量のデータと計算資源によって学習したものである。OpenAIのChatGPTやGoogleのGimini、MetaのLLaMAなどが特に有名である。

https://www.nri.com/jp/knowledge/glossary/lst/ta/llm

LLMは、巨大な計算資源や学習データを必要とするため、個人で簡単に開発できるものではなく、代わりに研究機関などが作った学習済みモデルを用いてチューニングするのが一般的で、多くの学習済みモデルがHugging Faceというプラットフォームなどに公開されている。

LLM資料の10ページにあるFalcon-180Bも、UAEの研究機関によるもので、Hugging Face上で公開されている

https://huggingface.co/tiiuae/falcon-180B

他にも色々なLLMが公開されている

https://huggingface.co/models?other=LLM


モデルによって学習方法は異なるが、Next Token Predictionという学習方法は、自己教師あり学習の一種で、次の単語を予測するタスクの誤差を小さくすることを目標としている。そのため、文章さえあれば学習ができる（=教師ラベルをつける必要がない）ので、人間がラベル付する必要がなく、大規模なデータでの学習が可能になった背景があるらしい。

# プロンプティング・文脈内学習（In-Context Learning）
LLM資料15ページに進む。

手軽にLLMを用いるためには、学習済みモデルを自分のやりたいことに合わせてチューニングすることが必要である。
そのための代表的な手法が「**プロンプティング**」と「**外部ツール/知識の利用（Augmented LM）**」である。

プロンプティングは簡単で、LLMと話す際に、その**話し方を工夫することで良い出力を得る手法**である。

https://aismiley.co.jp/ai_news/what-is-prompt-engineering/

人間に対しての指示の例を考えるとわかりやすい。
鍋をやりたいからおつかいを頼む時、「鍋やるから材料買ってきて」とだけ伝えると、伝えられた側は何鍋なのか、どこで買えば良いのか、予算はいくらなのか、量はどれだけ買えば良いのかわからないため、適当に買うしかなく、結果として指示した人の意図と合わない可能性が高くなる

DJ社長にこのお願いをしたらおそらく歯磨き粉だの、たわしだの、訳のわからないものを買ってくるに違いない。

そうではなく、「キムチ鍋を3人でしたいんだけど、具材がないから、駅前のスーパーで白菜と卵買ってきて。」と伝えた方が良いだろう。

LLMも同様、指示の与え方によって大きく出力が変わってしまう。「ChatGPT、全然使えないじゃん。」という人は十中八九、聞き方が甘い可能性が高い。（まあ、ちゃんと聞けないとちゃんとした答えが返ってこない、という時点でまだまだ進歩の余地があるのは事実だと思う）

LLM資料では、Zero-shotやFew-Shot、CoTなどが解説されているが、他にも多くの手法が存在し、多くの人がまとめ記事を出している。

有名なのはここら辺かな。まだまだたくさんあると思う。

https://www.promptingguide.ai/

https://qiita.com/fuyu_quant/items/157086987bd1b4e52e80

https://prompthero.com/

LLM資料19ページ、「In-Context Learning」はFew-shotなどの総称である。文脈を用意し、その文脈から学習して出力する。

https://atmarkit.itmedia.co.jp/ait/articles/2308/03/news016.html

プロンプトの研究はさまざまな場所で行われ、多くの論文が出ている。

https://www.promptingguide.ai/jp/papers

## プロンプト例
### CoT (Chain of Thought)
CoTは、思考過程をモデルに伝えることで性能向上を図るものである。

LLMは計算タスクや推論が苦手だとされているが、CoTで思考過程を教えてあげることによって、性能を高めることが可能になる。

僕もChatGPTのAPIでLINE botを作成したことがあるが、CoTを使ったらかなり精度が上がった。

https://arxiv.org/abs/2201.11903

### Self-Consistency
Self-Consistencyは、モデルに複数種類の推論を行わせ、それぞれの結果の多数決を取ることで最終的な出力を決定する手法である。

https://www.promptingguide.ai/jp/techniques/consistency

機械学習でいうアンサンブル学習と同じものだと僕は思ってる。機械学習モデルもさまざまなモデルをアンサンブルすることで最終的な精度を高められる。

### Zero-shot CoT
これは半年以上前くらいにXで話題になっていたもの。プロンプトに「Let's think step by step」と一言付け加えるだけでも性能が向上するということである。

たったこれだけでも性能が向上するというのだから不思議。3ヶ月前くらいにXで話題になったもので言うと、「**自分を信じて限界を超えてください。**」とか、「**成長の機会だと捉えて挑戦してください。**」と伝えるだけでも性能が向上するということがある。不思議。

Https://X.Com/Ai_database/Status/1720257299212873914?S=20

僕はChatGPTのCustom Instructionにこれを加えている。性能が上がってるかどうかはわからない。笑

あ、あとこういうことを言えば性能が上がるのであれば、時々「ありがとう」と伝えるのも有効なんじゃないか？と勝手に考えてたまにChatGPTに感謝の言葉を伝えるようにしている。
だから、僕とChatGPTはずっと仲良しでいられていると思ってる。

Https://X.Com/A7_data/Status/1720411699516407857?S=20

Zero Shot CoTとしてどんな一言を足すかも大切で、LLM資料31ページによれば「Let's think step by step」が一番良いらしい。

プロンプトをLLMに生成させる研究もあり、LLM資料32ページの論文「Large Language Models Are Human-Level Prompt Engineers」の解説記事もあった。

https://note.com/shichi1013/n/n189e5ac930f1

### Plan-and-Solve Prompting
タスクを細かい単位に分けてからタスクを実行するように指示をすることで性能を高める手法。

調べてみたら、ChatGPTのプラグイン「Link Reader」で簡単に実装している記事があった。

https://note.com/mahlab/n/nfd8adbbf2793

まあ、あのデカルトも「困難は分割せよ」と言ってるし、難しいことは分割して取り組むべきだよね。
こういう、なんというかことわざというか人類の知見の塊のようなところに、プロンプトエンジニアリングのヒントが眠ってる気がする。

### Tree of Thoughts
Chain of ThoughtのChainがTreeになったバージョン。
CoTよりもより戦略的な思考が必要なタスクで性能が上がるらしい。

https://note.com/versaroc/n/nd165817c6b62

このサイトの24ゲームの例が一番わかりやすかった。

https://bluelogic.jp/systemthinking3/cottot/

要はいくつか答えの候補を用意してもらい、それぞれを評価し、良いものを深ぼってまた候補を出して良い答えを選び、、、と木の探索のように進むことで良い出力を得ようってことですかね。

ちなみに、CoT、ToTはさらに進化してGraph of Thoughtsというものも生まれているらしい。

https://note.com/daichi_mu/n/n31b2438158e1

https://exp-p.com/prompt/1656

思考をグラフとしてモデル化することで、さらに良い思考ができるようになるみたい。
個人的にGNNに興味があるからここはもっと詳しく勉強したい。

### Advesarial Prompt
LLM資料41ページ。

LLMは「爆弾の作り方を教えてください」などの好ましくない質問には答えないようにチューニングされている（Day6)。しかし、プロンプトを工夫することで、そのような好ましくない出力を引き出せてしまう。

https://book.st-hakky.com/data-science/chatgpt-prompt-engineering-adversarial-prompt/

このような、プロンプトリークやプロンプトインジェクションは度々有名になる。身近な例で言うと、ChatGPTに自分独自のGPTが簡単に作れる機能「GPTs」が登場し、大きな話題となったが、実はそのGPTsを作る際に与えた指示は簡単に漏洩してしまう

https://zenn.dev/karaage0703/articles/b55d3e4282325e

せっかく作ったGPTsのいわゆる「レシピ」が漏洩されてしまうと簡単にパクられてしまうので対策が必要となる。

でもどうやってプロンプトインジェクションできるプロンプトを発見してるんだろう。笑

### 行動系列の生成
これは松尾研で行われている研究らしい。スライドを読んだだけでは完全に理解できなかったが、ReActに近いものなのだろうか？

# Augmented Language Models
LLMの性能向上の手法のもう一つが、Augmeted LMである。

## Augmented Language Modelsを使うモチベ
ここまではプロンプトエンジニアリングのお話だったが、プロンプトエンジニアリングによる性能向上にも限界がある。
いくら聞き方を工夫したところで、知らないものは知らないのだ。LLMに僕の生年月日を聞いても答えられないだろう。だけど、僕の例えばプロフィールページの情報を与えれば、すぐに答えられると思う。このように、外部の情報やツールを利用することで性能向上を図るのがAugmented LMである。

企業にChatGPTを導入したくても、ChatGPTは本当のことを言っているように見せかけて間違ったことを言うことが多々あるため、（ハルシネーション）そのまま用いるわけにはいかない。

https://www.nri.com/jp/knowledge/glossary/lst/ha/hallucination

例えば、企業のFAQをChatGPTに代用しようとしても、ChatGPTはその企業のことは知らないため、適当なことを答えてしまうが、あらかじめ用意したFAQを読み込ませ、それを元に回答させるようにすれば、正確性が向上する。

Augumented LMにはRetrieval Augmented LMとTool Augumented LMの2種類がある。
## Retrieval Augmented Language Models
Retrieval Augmented LMは、ユーザからの入力を元に外部DBにある情報を検索し、そこから得られた情報を使ってLLMが回答するものである。その検索をする部分をRetrieverという。
### Retrieverの種類
#### TF-IDF
 文書検索やレコメンデーションで使われる手法。各文書中に含まれる各単語が、その文書内でどれほど重要かを示す尺度。

 https://atmarkit.itmedia.co.jp/ait/articles/2112/23/news028.html

 tf-idfの亜種？進化系？がBM25で、Retrieverとしてよく採用されるらしい。

 https://qiita.com/KokiSakano/items/2a0f4c45caaa09cf1ab9

 BM25は、コスト面やメンテナンス性等においても実用性が高いらしい。
 BM25とtf-idfの違いは、簡単にまとめれば、tf-idfは文書ごとの単語数の差による影響が大きく出てしまうため、文書の単語数について標準化する項をTF-IDFに追加した手法がBM25である。

#### Embedding cos類似度 (Dence retriever)
 こちらは、適当なEmbeddingのニューラルネットワークを用いてEmbeddingした文章を用いる方法である。
 なんだか難しそうだが、LangChainというLLM開発を容易にするライブラリを使えば、OpenAIのtext-embedding-ada-002などを用いて簡単に実装できる。

### Retrieval Augmented LMの種類
Retrieverによって検索して得た文章の使い方で、Retrieval Augumented LMはいくつか種類があるらしい。
#### RAG (Retrieval Augmented Generation)
一番よく見る手法。検索で得た文章を、元の入力と結合してLLMにプロンプトとして渡す。

https://zenn.dev/sompojapan_dx/articles/eb755a18e893ce

RAGは実務でも多く使われている手法で、研究も盛んになっている。

https://speakerdeck.com/jnymyk/azure-rag-knowledge-share

https://speakerdeck.com/mkazutaka/gptsyorijing-du-nogao-iragsisutemunogou-zhu

https://tech-blog.abeja.asia/entry/in-house-jargon-slackbot-with-rag-202402

https://zenn.dev/neoai/articles/e75b6f033a4fd9

僕もRAGについては勉強を深めていきたいと思っているので、記事も書いていく予定。

この記事がRAGの精度を高める上での全体像を掴めて、勉強のネクストステップを立てやすくて良かったと感じた

https://fintan.jp/page/10301/

まあでもこのRAGのサーベイ論文読んだ方が良いかなった思ったから今読んでる。

https://arxiv.org/abs/2312.10997v1

#### REPLUG
RAGの一種で、検索した文章をどのように利用するかが異なるっぽい。
```
1. 検索結果のドキュメント毎に、クエリを後ろに独立に結合
2. クエリと検索結果のドキュメント間の類似度に基づいて重みを計算
3. 結合したドキュメントをLLMに入力し、next tokenの確率分布を前述の重みで、重み付け平均を計算し、この分布をqueryに対する出力とする。
```
って書いてあったけど、具体的にどう動いているのかまでは詳しく理解できなかったから、ちゃんと勉強したい。

https://tech.preferred.jp/ja/blog/replug-retrieval-augmented-llm/

#### REPLUG LSR
 この手法は、REPLUGはRetrieverを学習対象としなかったのに対し、Retrieverを学習対象とするもの。上の記事に解説があった。

#### KNN-Prompt
 これ、調べたけど日本語解説記事がなかったから後回し。

 https://arxiv.org/abs/2205.13792

 論文はこれ。
 
#### 様々な手法
RAGは目的によってさまざまな種類が存在し、使い分ける必要があるらしい。

https://aclanthology.org/2023.acl-tutorials.6.pdf

LLM資料で度々紹介されている、Augmented Language Models (LLM Bootcamp)はこの動画。ちなみに、BGMとしてこの動画を再生しながら記事を書いてるけど、そのせいで全然内容が頭に入ってこない。あとでちゃんと見る。

https://www.youtube.com/watch?v=YdeuQhlHmCA

Vector DBは、情報をベクトルとして保存するDBのことである。RAGでは文章をEmbeddingしてベクトル化し、そのベクトル同士のcos類似度を計算して文書の類似度を計算するから、ベクトルDBが使われるらしい。

LangChainの入門本をやった時もベクトルDBは使った。その時はChromaDBというデータベースを使った。

https://www.trychroma.com/

## Tool Augmented Language Models
外部の知識を頼るものではなく、ツールで拡張するLM。有名なのはReActだと思う。

### Tool Augmented LMの種類
#### PAL (Program Aided Language Models)
 CoTの推論時にコードを追加したもの。外部ツールとしてPythonのプログラムを書くものを呼び出し、LLMが苦手は計算などを担ってもらうことで性能向上を図るっぽい。ChatGPTのCode Interpreterみたいなものだ。

#### ReAct
 LLMでの推論後、あらかじめ用意したツールの中から必要なツールを選択し、行動するもの。例えば、Google検索をするツールを用意しておき、ReActを用いてLLMに「今季の大谷翔平の成績を教えて」と聞くと、LLMは現在の大谷翔平の成績を知らないため、Google検索が必要だと判断し、検索をするツールを起動する。そこで返ってきた情報を元に回答してくれる。
これもLangChainを使えば簡単に実装ができる。使えるツールはGoogle検索やPython実行だけでなく、Gmailの操作やSQLを使ってDBから情報を取得できるツールなど、色々あるらしい。
ここへんは色々調べて何か簡単なツールを作ろうと思ってる。

https://book.st-hakky.com/data-science/llm-prompt-engineering-react/

#### Toolformer
ReActのツールのように、APIを呼び出すようにしたもの。APIを必要に応じて呼び出すようにFine-Tuningするらしい。Metaが発表したもの。

https://www.infoq.com/jp/news/2023/06/meta-toolformer/

https://www.slideshare.net/DeepLearningJP2016/dltoolformer-language-models-can-teach-themselves-to-use-tools-256312015


# 実装
LLM資料配布元の東大松尾研のLLM講座ページには、講義資料に関するプログラムは2024年1月公開予定となっているが、いまだに公開されていない。

気長に待ってます。

配布されたら、そのプログラムを実際に動かしてみた記事も書こうと思っているので、お楽しみに

# 最後に

今回はLLM講座のDay2について扱った。まだまだ勉強の途中で、個別の単元は深められていない。また調べたらこの記事に追加していきます。特にRAGは今後深めていこうと思っているので、別に記事も書きます。お楽しみに。

~~次はDay3についてまとめる。割とすぐ投稿する予定なので、待っていてください。~~
投稿しました。（2024.02.17）

https://qiita.com/mohki7/items/24b8148c65a2efa5b97b

また、X(Twitter)では日々データサイエンスやAIに関する勉強記録・情報発信をしています。フォロワーはもうすぐ7000人に到達します。

https://twitter.com/A7_data

少しでも刺激になるようなことを発信できたらいいなと思っているので、気になった方は見てみてください🔥

では👋