天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます(たまに関係ない雑記も)

最強DB講義 #32 大規模言語モデルを作り、拡張する -- LLM, RAG, Agentsに参加してきた

dblectures.connpass.com

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

会の概要

以下、イベントページから引用です。

大規模言語モデル (LLM) の普及が急速に進んでいる。本講義では、「LLMをどう作るか」「LLMをどう拡張するか」というトピックについてお話しする。前半部分では、講演者の研究グループで開発している独自の大規模言語モデル cotomi-core の研究開発プロセスを説明しながら「LLMが実際にどのように作られているのか」についてお話しする。後半部分では、LLM を実世界で活用する際に必須となる「LLMの知識・能力をどのように拡張するか」というトピックについてもカバーする。特に、「知識の最新化・補強」を実現する Retrieval-Augmented Generation (RAG) の技術や「LLMからの外部環境への作用」を実現する Tool LLM / Agentic LLM などの技術領域についてお話しする。

会の様子

小山田先生の講義の内容を以下に記載していきます。(一部話の順序を入れ替えて記載していきます)

発表の注意点

会のタイトルにあるRAG, Agentsはほんの少ししか触れられないという話がありました。

LLMの製造工程

空の箱に対してテキストデータを段階的に食わせていった結果LLMができるということで、フェーズとしては事前学習、事後学習、モデル選定・評価の3フェーズがあるというお話でした。

LLM≠トランスフォーマー

LLMはトランスフォーマーといいますが、本質的には学習可能なパラメータを持つテキスト変換器であれば何でもよいという話がありました。

TransformerのDecorder/Encorder以外にも、RNNや状態空間モデルなどといったものもあり、これらは計算量や学習の並列可能性などの特徴から選定できるということです。

モデルサイズ

モデルサイズは、学習できるパラメータ数(学習できる余地)であり、ネットワークの深さと幅で定まるという話がありました。

モデルサイズは大きければ大きいほどよいというのは表現力という観点では正しいものの、推論時のメモリ消費量や推論速度の低下には繋がるため、Scaling-Lawに従ってモデル規模を算出しておくことが重要だということでした。

そのため、近年(特にChinchilla以降)はモデルサイズを抑えてデータを過剰にいれるトレンドが出ているということでした。*1

フェーズ0(覚悟を決める)

ネタではなく、最初はどれくらいの計算をするか?(高品質なデータを何枚のGPUで何時間使えるのか?)の覚悟を決めることが必要だということでした。

LLMの精度を上げるためには、小山田先生の経験上、お金をいくら投下できたのか?というところにかかってくるので、どれくらいの期間どれくらいのお金をかけるのかを決める必要があるというお話がありました。

フェーズ1(事前学習)

最初のフェーズでは、予算を基にモデルやモデル規模とデータ量を決めて準備をし、モデルに学習をさせるという話がありました。
一般的には期間としては数ヶ月かかり、数億〜数十億のお金がかかるということです。
最初にデータを準備し、データを準備した後は事前学習タスクを準備したデータに対してひたすら繰り返すということが実際にする作業というお話でした。*2

事前学習は、モデルに知識と推論能力を持たせることが目的であり、事前学習の結果zero-shot推論やfew-shot推論ができるようになるということでした。

また、モデルの能力のほとんどは事前学習で決まるという論文も出ており、これが小手先のチューニングでChatGPTのようなツールを作れない理由にもなっているということです。(OpenAIなどは極めて高い品質を作るための魔法を持っていると噂されており、OSSとは圧倒的な精度差があるとされている)

フェーズ2(事後学習)

事前学習モデルさえ手に入れば、低レイヤNLP APIとして利用することも可能なため、人によっては満足するということですが、一般人向けに使えるようにするためには事後学習のフェーズに移るという話がありました。*3

このフェーズは、事前学習モデルに対して自分が思った反応をするように工夫するフェーズで、指示学習→アラインメントという順をたどりモデルの機能を定めていくということでした。
小山田さん的には、このフェーズはドメインDSLの設計をしてそのデータによる実装をしていくフェーズであり、以下に魅力的な機能を定義できるかが重要だと考えているそうです。

このフェーズでは機能を定義してデータを作った学習することが重要なため、どうやって高品質な入出力のペアを用意するのか?や複数のタスクを混在させるか?*4を考える必要があるということでした。

また、LLMにタスク処理する能力を持たせる指示学習と出力結果をよりフレンドリーにしてハルシネーションやノットエシカルな回答を防ぐアラインメントの2フェーズに分けることができるということでした。

フェーズ3(モデル選定)

最終的に納品するモデルを評価して選定するのがモデル選定フェーズだという話がありました。

このフェーズでは、ゴールとのギャップを認識して施策の効果を見極めることが重要であるため、Leaderboard1位のモデルを選定するような手段と目的が逆転するパターンに陥らないようにする必要があるということでした。
技術的には、インドメイン評価とアウトドメイン評価の分離であったり、データセットのcontaminationを裂けることが重要になってくるということです。

また、モデル評価に関しては、

  • Chatbot Arena
  • Redditのr/LocalLlamaのコメント
  • Rogue Scores

などがあるということでした。

LLMのServing

LLMは学習して終わりではなく、デプロイして動かす必要があり、如何にレイテンシを下げてスループットを上げるための高速化に対する研究が進んでいるということでした。

LLMの長文対応

Transformerは全部の単語関係を計算する必要があるため、文字数が多くなると対応のハードルは一気に上がるという話がありました。

理想モデルの定め方

顧客とコミュニケーションを取りながら業務効率化に繋がるためのタスクを丁寧に考えることになりますが、コールセンターなど典型的なパターンは幾つか見えているのでそういうのはメトリクスをノウハウとして抱えているということでした。

事前学習からやり直す場合とChatGPTのプロンプトエンジニアリングの違いは?

ChatGPTで適切なfew-shot-learningをしても、事前学習からやり直した場合と同じような精度は出るということでした。

そのため、計算の安定性や安心性、レイテンシなどの違いが今日話したような事前学習からやり直す場合のメリットとして上げられるということです。

会全体を通した感想

LLMの活用法などの話は割と聞く機会が多いですが、それをどのようにして作るのか?どういう障壁があるのか?という部分をこれだけ詳細に聞ける機会は少ない印象があるので、大変面白くあっという間の一時間でした。

*1:Chinchillaの想定であるデータが無限に存在しモデルは任意に大きくできる想定は現実的ではないため発展的な議論が必要

*2:このフェーズは損失スパイクからの発散や勾配爆発といった問題があるため、一発で安定した学習ができることはない

*3:ChatGPTなどといったプロダクトを作りたい人が移るフェーズ

*4:あるいはどのような割合で用意するか?