東大松尾研のLLM講座を受講して

# 初めに
先日まで、東京大学松尾・岩澤研究室がコンテンツを監修・開発している **「大規模言語モデルDeepLearning応用講座2024Fall」** を受講していました。
そこで学んだことをダイジェストでまとめたいと思います。

興味がある方は是非次回開催の際には参加してみてはいかがでしょうか。

# 「大規模言語モデルDeepLearning応用講座2024Fall」とは
公式より引用
>本講座はサマースクールの一環として大規模言語モデル（Large Language Models／LLM)に関して体系的に学べる講座を目的として開催されます。具体的には以下のスキルを身につける事を目的としています。
・LLMの原理について，事前学習からRLHFまでの一連の流れや意味合いを理解する
・LLMの学習や推論を支える技術について理解する
・すでに公開されているLLMやAPIなどの活用方法を理解する
本講座では、東京大学Deep Learning基礎講座・応用講座を公開してきた松尾・岩澤研究室が全面的に演習コンテンツを監修・作成しています。実践的な演習を通して、手を動かしながら技術を深く理解し、幅広いトピックを網羅します。

https://weblab.t.u-tokyo.ac.jp/lecture/course-list/large-language-model/


大学の授業を思い浮かべてもらえれば分かりやすいかと思いますが、全12回を3カ月かけて毎週平日に2時間ほどの講義形式で進めていくものになります。

講義内では様々なLLM関連の知識（詳しくは各回の概要を参照）に対する座学と、後半では実際のソースコードを使った実装を行います。
加えて、毎講義ごとにちょっとした宿題もあります。

# なぜ参加したか
直近2年を振り返ると、ChatGPTをはじめ怒涛の勢いで様々なモデル・AIツールがリリースされてきました。
今ではそれらをいかに上手く使うか、サービスに取り込むかの鬩ぎあいが起きているかと思います。

しかし個人的には**そもそものモデル開発やチューニングの手法を知りたい、できるようになりたい！**というのが始まりでした。

# 各回の振り返り
このLLM講座2024のカリキュラムで、各回で学習できる内容をまとめます。
### 第1回: Overview
:::note info
言語モデルの全体像を学びます。
**言語モデルとは何か、なぜ今言語モデルなのか、LLMの概況、スケール、汎用性、他領域への影響**などを理解します。
:::

### 第2回: PromptingとRAG
:::note info
学習済みLLMを効果的に活用するための**プロンプティング技術**と、外部知識を活用する**RAG (Retrieval Augmented Generation)** について学びます。
**Few-shot学習、プロンプトエンジニアリングの様々な手法(One-shot, Few-shot, Chain-of-Thought, Tree-of-Thoughtなど)** を理解し、LLMの活用法と、学習完了後のLLMの性能を引き出す技術を習得します。
:::

### 第3回: Pre-training
:::note info
LLMの主要なモデル構造である**Transformer**とその**事前学習の仕組み**を理解します。
**Embedding、Multi-Head Attention、Feed Forward、事前学習の目的、Transfer Learning、Adaptation**などを学びます。
LLM以前のモデルとの比較を通して、事前学習の重要性を理解します。
:::

### 第4回: Scaling Law
:::note info
言語モデルを大規模化する(スケーリング)ことの意義と、**計算資源、データセットサイズ、パラメータ数と誤差の関係を表すスケール則**について学びます。**スケール則の具体的な求め方、推論時のスケーリング、Emergent Ability、Inverse scaling prize**なども扱います。画像生成、マルチモーダル、動画、数理などへのスケール則の適用についても学びます。
:::

### 第5回: Supervised Fine-Tuning
:::note info
事前学習済みモデルの性能改善や特定タスクへの適応を行う**ファインチューニング**、特に**Instruction TuningとPEFT(Parameter-Efficient Fine-Tuning)** について学びます。
**Instruction Tuningのデータセット作成上の要点、PEFTの手法(LoRA, Adapterなど)、Full-FTとの比較**などを理解します。
様々なFine-Tuning事例（ChatGPT、Med-PaLM、FinGPTなど）を通して、それぞれの技術の適用方法と効果を学びます。
:::

### 第6回: LLMの発展を支える半導体エコシステム
:::note info
LLMの発展を支えるハードウェア、特にGPUの技術動向と、電力効率の改善について学びます。
**GPUの性能向上、消費電力問題、メモリ帯域、LLMと半導体に関する話題**などを扱います。
:::

### 第7回: RLHF & Alignment
:::note info
**強化学習からのヒューマンフィードバック(RLHF)**と、LLMの**アライメント**(人間の価値観に合わせた調整)について学びます。
**InstructGPT、ChatGPTで用いられている手法、PPO、Alignmentの基準、RLHFの課題と対策**などを理解します。RLHFを実装するためのライブラリについても学びます。
:::

### 第8回: Advanced Pre-training
:::note info
モデルをスケールして事前学習する上での課題と、その解決策となる様々な技術について学びます。
**パラメータ数、計算量、データセットのスケーリング、MoE、Efficient Attention、新しいアーキテクチャ**などを学びます。
:::

### 第9回: Safety
:::note info
LLMが抱えるリスク（**ハルシネーション、バイアス、攻撃への脆弱性**など）と、それらに対する対策について学びます。
**具体的なリスクと対策の技術、ハルシネーションの分類、原因、検出方法、軽減方法、LLMに対する攻撃と防御**について深い理解を深めます。
:::

### 第10回: LLMの分析と理論
:::note info
LLMの内部メカニズムを分析する手法について学びます。
**文脈内学習(In-Context Learning)の仕組み、その性能向上のための手法、なぜLLMは文脈内学習ができるのか、既存研究のアプローチ（分析手法・仮説）** などを学びます。
:::

### 第11回: Application of LLM(Domain Specific LLM)
:::note info
特定のドメイン・領域(医療、金融など)に特化したLLMの応用について学びます。
**ドメイン特化LLMの作成方法、評価指標、実用化に向けた課題、プロンプトエンジニアリング、RAG、継続事前学習、Supervised Fine-Tuning、Instruction Tuning、表層アライメント仮説**などを学びます。
医療ドメインと金融ドメインのそれぞれについて、具体的な事例や最新の研究動向を学びます。
:::

### 第12回: Application of LLM(LLM for Control)
:::note info
LLMを使った様々な制御を行うための応用について学びます。
**LLMをロボット制御やWebエージェントに活用する方法、基盤モデルの構築、シミュレータの活用、Open-Loop Planning、Closed-Loop Planning、Promptingによるエージェント、Multimodal LLM、Self-Improvement**などを学びます。
:::

### 特別回
:::note info
LLMの自己修正に関する研究の歴史と現状について学びます。
特に、**OpenAIのo1モデルに至るまでの研究の流れと、残された課題について**深く掘り下げて解説されます
:::

### まとめ
:::note info
この講座全体を通して、LLMの基礎から応用、そして最先端の研究動向までを網羅的に学ぶことができます。
特に後半の応用編では、**特定のドメインへのLLMの応用、そしてロボット制御やWebエージェントへの応用**について深く学ぶことで、LLMの社会実装への理解を深めることができます。
:::

# 最終課題（LLMコンペ）
全講義が終了してからの約1ヵ月間で、受講生同士で競い合うLLMに関するコンペティション型の最終課題が課されます。

コンペの要件としてはザックリ以下となります。

:::note info
事前学習済みモデルをファインチューニングし、特定のタスクに対する性能を向上させること
:::
ここでの特定のタスクとは[ELYZA-tasks-100: 日本語instructionモデル評価データセット](https://huggingface.co/datasets/elyza/ELYZA-tasks-100)のように、input（入力）に対してモデルがoutput（出力）する形式のことを指しており、この評価点数が高ければ性能が向上しているということになります。

最後に学んだ知識の集大成を作り上げるという何とも粋な課題ですね！！

## コンペでのアウトプット
この講座で学んだことをもとに、私がどのようにコンペ用にモデルをファインチューニングしたかを記載します。

まず、大枠としてモデルの開発から調整までの流れをまとめます。


### ①Pre-training（事前学習）
Pre-trainingとは、**大規模言語モデル（LLM）の基礎となる言語能力を獲得するための学習プロセス**で、モデルに語彙、文法、知識といった基本的な言語理解能力を身につけさせる自己教師学習（ラベルなしデータ）を行う手法です。
この自己教師学習に使われるラベルのないテキストデータを大規模（コーパス）にすることで、大規模言語モデル（LLM）が作られます。

特定の領域のドメイン知識を学習させたい場合は、ここからさらに**Continued Pretraining（継続的事前学習）** を行います。

:::note info
Pre-trainingで作成された代表的なモデル
BERT、GPT、PaLM、など。。。
:::

### ②Supervised Fine-Tuning（教師あり学習）
SFTとは、**事前学習済みの言語モデルに対し、性能の向上や特定のタスクやドメインに適応**させる教師あり学習（ラベルがあるデータ）を行う手法です。

### ③Reinforcement Learning from Human Feedback（人間のフィードバックを用いた強化学習）
RLHFとは、これまでにチューニングしたモデルが出力する内容に対して人間が評価を行い、その評価結果データセットを用いて強化学習を行う手法です。
ただ、最近ではRLHFよりも効率的な手法として提案されたDPO（Direct Preference Optimization）を使う傾向があります。（今回のコンペでもDPOを採用しています。）

---

大まか、この①~③を行うことによって大規模言語モデルが作られるかつ、そのモデルの出力結果が我々人間の価値観に沿ったものになります。

今回のコンペでは①で使用するオープンなモデルを決め、主に②と③のチューニングに注力する形となります。
私は以下のようにコンペを進めました。

- ①： 今回のタスクが日本語での対応が求められるため、事前学習にて日本語対応済みの[llm-jp/llm-jp-3-13b](https://huggingface.co/llm-jp/llm-jp-3-13b)を利用することに決定
- ②：教師あり学習ではモデルのパラメータを効率的に調整することができるLoRAという手法を活用し、コンペ要件のタスクに沿ったモデルのチューニングを行う
- ③：強化学習フェーズではDPOを用いて、精度のフィードバックを行いさらなる精度向上を検討する

ただ③に関しては時間が足りず、試した結果逆に精度が落ちてしまいました。
そのため、実際にコンペに提出したモデルは②までを行ったモデルとなってしまいました。

といってもモデルを作るうえでの必要なリソースの大部分を運営様側でサンプルを用意してくれていたので、私はそれを使わせていただきました。
なので正直まだ理解不足の部分も多く、これらの手法について具体的にコードを用いた解説もいつかはしたいと思います。

# 最後に
正直、本業の隙間を縫っての講義&コンペだったため、なかなかに忙しい日々でした。
内容もまだすべてを理解しきれておらず、コンペも課題こそ提出すれど、成績自体はあまりいいものではなかったと思います。

しかし、この講義を通じてLLMの基本原理や独自のモデルの開発手法や実績を積むことができました！

時間や理解不足のためできなかったことは山ほどあるので、今後も色々とモデル性能の向上について試行錯誤できるようになれればと思います。
まだまだ奥が深い分野かつ、発展の勢いがものすごい領域のためについていくだけで精一杯ですが諦めずに頑張ります。。。