📚

大規模言語モデル講座@松尾研をふりかえる

に公開

振り返る前に

今更ですが自分の記憶の整理と共に一月末に修了した松尾研主催の大規模言語モデル講座の振り返りを備忘録的に。。書いておきたいと思います。
改めて思い返すと、社会人で受けた講座の中で1番難しかった、の一言に尽きます。松尾研講座よく参加している人はよく知っていると思いますが、修了率がまさかの3割程度だったり脱落者もきっと多いのでしょう。参加者もこの業界では有名な"からあげさん"が参加していたり、コンペのレベルが異次元でした。そう脅してきたものの笑、受講したい方もいらっしゃるのではないでしょうか。学んだ内容について噛み砕いて説明していきます。

学んだこと

カリキュラム

●第1回:Overview of Language Models

●第2回:PromptingとRAG

●第3回:Pre-training

●第4回:Scaling Law

●第5回:Supervised Fine-Tuning

●第6回:LLMの発展を支える半導体エコシステム

●第7回:RLHF & Alignment

●第8回:Advanced Pre-training

●第9回:Safety

●第10回:LLMの分析と理論

●第11回:Application of LLM (Domain Specific LLM)
👉LLMについて幅広く学べる点が素晴らしいです。
逆に言うと、RAGやエージェント(※RAGも広義の意味でエージェントともいえそうですが)のようないわゆるアプリケーション寄りの話はあまり出てきませんので、
LLMとしての技術を追求したい方向けといえます。

興味深かった内容

LLMは学習ステップが多い

いろんな学習をして言葉を学んでいくような学習方法です。

まさに赤ちゃんが言葉を覚えていく様に近しいです。
①父母の言葉を真似して話して言葉の並びを覚える
②父母の真似をしているうちに質疑応答することを覚え、コミュニケーションができるようになる
③父母から下品なことを言わないように矯正される
といったようなプロセスを踏みます。興味深いですね。
また、RLHFは社会的なバイアスや倫理性にかかわる部分(※③に該当)で、近年重要視されています。

事後学習が面白い

Fine-tuningの学習は通常1-3回程度というのも驚きでしたね。
学習を多く進めると過学習が起きやすかったり、損失関数がいきなり発散する(loss spike)など、いろんな珍事件にLLMだと出会えます笑 またLossがいい感じで学習がうまく進行してもタスク性能が人間の感性にマッチしているとは限らない点も面白いです。

引用:https://arxiv.org/html/2312.16903v2

コンペの内容

開発したLLMの性能を競う

このコンペ聞いた時、マジで驚きました。
シンプルですがLLMの開発っていわゆる巷でいう生成AI作るのとほぼ同義ですからね。
ルールとしてはシンプルでライセンスに準拠して開発すること、評価用のデータセットは学習に使わない外部サービスのAPIは使用不可(もちろんOpenai APIとかはNG)、などなどです。ベースの基盤モデルは、複数(数B~20Bくらいだったかな)から選べます。
モデル開発後は、モデルを提出し自動採点でLLMを別のLLMに得点をつけてもらいます。
この時の評価に使っているのは日本語性能を計測するelyza tasks100に数が月分のニュースデータを入れ込んだ改造されたデータセットです。このデータセットもちゃんと使ったのは、今回が初だったのでとても勉強になりました。今も第三者的に性能を測る時にも使ってます笑
また、厳しいルールとして、elyza tasks-100の推論をするときは、時間制約があり1時間と決まっています。さらに使えるGPUはT4(=16GB)です。そのため、モデルのスケーリング則(※今後死後になる?!)を活かしたパワー攻めができなくなるので、大きいモデルやエージェントを活用したような仕組みは実質使えません

工夫した点

pre-trainingモデルをichikaraデータセットでFine-tuningを行い、Adaptive RAGの仕組みを採用し、スピードが高い推論を維持しつつ、新しい情報も回答できる仕組みにしました。
特に、Adaptive RAGの仕組みをとる場合にはLLMを分類器とすることもありますが、大体この分類器はまともに性能が出ないので、FAISSの類似度判定で一定の閾値以上なのかそれ以下なのかでLLMから知識を引き出すのか?RAGから引き出すのか?を変更するシステムとしました(SNGのhuggingfaceリポジトリ, ※雑魚コードなので見ないように苦笑)。いろいろ試したところ、なんとか平均スコア3.0/5.0になりました。ちなみに、GPT3.5とかだと3.6くらいです。モデルサイズが全く違うのでこの差はこんなもんなのかなという印象です。

気づいたこと

ファインチューニングは、データセットに依存してめっちゃ性能が変わり、ハイパーパラメータはやっぱり味付け要素が強い、ということ。忘れていましたが、結局データセット命なのは昔のディープラーニングから改めて変わってないと思いました。添いう意味では、コンペではあまりデータセットを弄れなかった。。です。

もっと頑張りたかったこと

外部知識を活用したRAGのデメリットについては、やはり質問の中に複数の要素を含んでいる場合や計算問題です。計算問題に対しては類似度判定の閾値をチューニングして乗り切りましたが、上記のAdaptive RAGの仕組みでは、LLM単体の性能よりも圧倒的に劣ってしまう場合もあり、類似度判定では根本的な解決にならず。今回はllm-jpの14Bを採用したのですが、やはりモデルサイズが小さいと最大コンテキスト長が短いこともあり、コンテキスト内学習の性能があまり出ません。つまり、小さいモデルではプロンプトエンジニアリングがほとんど通用しない、ということです。
そういうこともあり。。実際にコンペ上位者はCPT(continious pre-training)を行いLLMとしての知識を与える工夫をされている方や、データセットを作る人もいました。今回はそこまで手が回りませんでしたが、どこかでCPTを試したいと思います。そのほか、おすすめの手法あればコメントください笑

まとめ

講座を通して、
①LLMのざっくりとした仕組み
②LLMの学習方法への理解
③LLMの学習における課題や制御の難しさ
④データセットの重要性
を学ぶことができました。
おそらくチャットbotだけでなく、今後様々な産業用途で使われると思うので、
とても良い経験になりました。今後も頑張っていきます!では!

Discussion