Llama1, 2, 3 の違いについて解説してみた

## あなたは Llama の違いを理解できていますか？

とうとう Llama3 が登場しましたね。
Llama3 はベンチマークを見ると、Llama2 に比べて大幅に性能が向上しているようです。

Meta が開発した Llama 系のモデルはオープンな LLM において重要な立ち位置にあるモデルです。
特に Llama2 は有名すぎて知らない人がいないであろうモデルで、いろんなところに登場します（Llama3 も今後似たような感じになっていくかと思います）。

これにはいくつか理由があります。
- 誰もが知っている大企業が開発している
- ChatGPT 一強みたいな時代にオープンソースで公開、しかも Llama2 は商用利用可能だった

そのため、Llama 系のモデルはモデル作成の際のベースモデルとしてだったり、論文の比較対象として引っ張りだこでした。

とはいえ、Llama がそこまで有名なモデルであるにも関わらず、実は「Llama1,2,3 がどういうものなのか」、「LLaMA と Llama2、 Llama3 がどう違うのか」を知らない人も多いんじゃないでしょうか？

現在 LLama は非公開ですが、Llama2 / Llama3 は知っておくとオープンモデルを利用するときや論文を読むときに理解が深まると思うので、解説していきます。

# LLaMA/Llama2/Llama3 の特徴と違い
## 目指すもの
### LLaMA
LLaMA は LLM の潜在能力を最大化することを目指しています。

というのも、LLaMA 以前のモデルは、「モデルサイズ至上主義。とりあえずモデルサイズを大きくすればよい」という考えのもと開発されていました。これに対して異議を唱えたのが LLaMA モデルで、大量のデータで学習をすることで小さなモデルであっても高い性能を出せることを証明しました。

これが LLaMA 論文に掲載されてあるスコアの比較ですが、比較対象が見事に大きなモデルばかりで当時の大艦巨砲主義的な側面がうかがえます。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  LLama のスコア\n(出典：LLaMA: Open and Efficient Foundation Language Models)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/f5eb905d-c361-3342-3938-68b69516d4c1.png>
@enduml
```

LLaMA も Llama2 や Llama3 のように公開されましたが、研究目的での利用という制限がありました。

### Llama2

Llama2 も同じように LLM の潜在能力を最大化することを目指しています。

が、それに加え、LLM コミュニティ促進を掲げ発表されたのが Llama2 です。

この頃は ChatGPT で大いに盛り上がっており、言語系 AI は（オープンなモデルはいくつか出ていたけど、とはいえ） ChatGPT 一択という現状でした。
Meta は「ChatGPT のようなクローズドモデルが情報公開を一切しないため、LLM コミュニティの進歩を妨げている」として、自身が開発する Llama2 を **商用可能ライセンス** で公開しました。
Llama2 登場後、Llama2 をベースとして様々なモデルが登場したので、目的通り LLM コミュニティの進歩させたと言えるでしょう。


### Llama 3

論文がまだ未発表なため、現時点では明確にはわかりませんが、LLaMA や Llama2 と同じようにデータの数や品質を増加させ、モデルの能力を最大限に引き出すことを目的にしていると考えられます。


## Pre-Training
### LLaMA
以下のオープンな大量のデータを用いて学習しています。オープンデータセットによっては取得後、追加でクレンジングしているようです。
- CommonCrawl
- C4
- GitHub
- Wikipedia
- Books
- ArXiv
- Stack Exchange

### Llama2 
LLaMA の時に使っていたデータセットから、40% データ数を増やし、更にデータの品質を強化しました。
（個人情報は抜いたり、事実に基づいているデータはアップサンプリングしてちゃんと学習するようにしているようです）

### Llama3
Llama3 では更に多くのデータが学習に利用されており、その規模は実に Llama2 の 7 倍のデータのようです。
そして、コード関連のデータが 4 倍になっているようです。

現状の情報だと Llama2 との違いは tokenizer の語彙の増加といった違いしか見られないので、データ数と品質が如何に影響するかがわかりますね。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer Llama2 と Llama3 のスコア比較\n(出典：https://github.com/meta-llama/llama3/blob/main/MODEL_CARD.md)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/2418327e-eca2-fc3b-7534-3d2b4f150e9c.png>
@enduml
```

多言語データも含まれるようですが、英語データの量と比較するとかなり少なく、同程度の性能は期待できないとのこと。（あくまで Llama3 も英語特化）

なお、Llama3 の 8B と 70B で学習データの断面が異なり、8B モデルの場合は 2023 年 3 月、70B モデルの場合は 2023 年 12 月の断面のようです。

## 各モデルの特徴的なポイント
### LLaMA
#### Pre-normalization の採用
Transformer は元々サブレイヤー（self-attention 層や Feed-forward 層）の後に正規化層が適用されますが、Pre-normalization ではこの順番を逆にして、先に正規化しています

これによって、各レイヤーが受け取る値の範囲が一定に保たれるため、勾配消失や勾配爆発が抑制され、ネットワークのトレーニングが安定します。

#### SwiGLU 活性化関数の採用

従来の ReLU 関数の代わりに、SwiGLU（Switched Gated Linear Unit）活性化関数を採用しています。

SwiGLU は非線形性を持つアクティベーション関数で、ReLU に比べてより複雑なデータ特徴を捉えることができます。また、GLU のゲート機能によってどの情報を通過させるかを選択的に制御できることで、特定の特徴を強調または抑制することができるようになり、モデル性能が向上します。

#### Rotary Positional Embeddings (RoPE):

従来の Absolute Position Embeddings (APE) という絶対位置エンベディングの代わりに、RoPE を採用しています。

従来の APE では絶対的な位置情報を入れ込んでいるので、学習に用いたデータのシーケンス長よりも入力シーケンス長が長くなると、モデル性能が著しく落ちるという欠点がありました。
RoPE では回転ベクトルを用いて相対位置情報をモデルに組み込むことで、この欠点を克服しました。RoPE は以下のページでも紹介しています。

https://qiita.com/kernelian/items/adc647204e0922d71c83

### Llama2
#### Grouped Query-Attention (GQA)
RoPE や SwiGLU など LLaMA で使っていたアーキテクチャはそのままに、Llama2 では追加で GQA を採用しています。（↓ 画像の真ん中のやつです）

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  各 Attention の概要図\n(出典：GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/18f91711-e96b-76fe-5503-164219fc2c85.png>
@enduml
```

従来の Transformer は左の Multi-head Attention ですが、この Multi-head Attention は「性能いいけど遅い」という問題点がありました。
そして、右の Multi-query Attention が開発されると「速いけど性能悪い」という問題点が見つかりました。

なので、折衷案として、真ん中の「性能も速度もいい」 Grouped-Query Attention が開発されました。

GQA は最近のモデルである Mistral-7B なんかでも使われているメジャーな手法ですね。以下でも簡単に解説しています。

https://qiita.com/kernelian/items/9a61f3957ccd9155ee4e


### Llama3
#### Tokenizer の強化
Llama3 はモデル構造に大きな違いはないようですが（2023/04/23 時点の情報からは違いはわからない）、Tokenizer の語彙数は大きく増え 128,000 トークンの語彙を持っています。

日本語の語彙をどれくらい持っているのかは気になるところですね！

## まとめ
以上、LLaMA、Llama2、Llama3 のまとめでした。

こうして比較してみると、LLaMA -> Llama2 -> Llama3 と性能が順当に進化しているにも関わらず、モデル構造には大きく性能がなく、最も変化が大きいのはデータ部分だというのはおもしろいですね。
LLM のパラメータは無駄が多いなんて言われますが、このデータからもそれが窺えますね。

機会があれば Llama3 も是非使ってみたいですね。

おわり