ModernBERT - Shinichi0713/LLM-fundamental-study GitHub Wiki
概要
ModernBERTは2018年に発表されたBERTの後継であり、Answer.AIとLightOnによって開発されました。
今回発表されたModernBERTはbaseとlargeの2種類です。
ModernBERT-base:22層、149億パラメータ
ModernBERT-large:28層、395億パラメータ
ModernBERTは従来のBERTに比べて高速・高性能で長文処理が可能です。
また、扱うことの出来るシーケンス長が8192トークンとなり、文章長さによる制約を受けづらくなった。
ModernBERTはGLUEスコアが高く処理時間も短いため、効率の良いモデルと言えます。実用性が高く、特にリソースに限りのある環境や高速処理が求められるタスクにおいてModernBERTは実力を発揮するでしょう。
GLUEスコア:英語圏における自然言語のベンチマーク。同義語の言い換えや質疑応答といった言語に関するテストデータが含まれていて、総合的な言語能力のスコアを算出する。10種類のタスクから構成されています。
ModernBERTの処理速度
ModernBERTの処理速度が高速になった理由として3つの技術。
- UnpaddingとSequence Packing
- Alternating Attention
- Flash Attention 各技術についての説明は以下通り。
UnpaddingとSequence Packing
モデルが処理するデータには、通常、ミニバッチ間でシーケンスの長さを揃えるためにパディングトークンと呼ばれる不要なトークンが挿入されます。
Unpaddingは、これらのパディングトークンを除去し、実際に意味のあるトークンのみを処理する手法です。
Sequence PackingはUnpaddingと併用される技術であり、モデルの計算リソースを効率化するためにシーケンスを埋め込む手法です。
ミニバッチ内のシーケンスを再配置し、可能な限りスペースを無駄にしないよう詰め込み、各バッチのシーケンス長を均一化することで、モデルの処理効率を最大化します。
その結果、Unpaddingでは、計算負荷を削減し、最大で20%のパフォーマンス向上を実現し、長文タスクや変動するシーケンス長のデータセットで力を発揮することが可能です。
また、Sequence Packingを用いることでトレーニング中のメモリ消費を抑えつつ、計算の無駄を削減し、GPUの効率を最大化しています。
Alternating Attention
Alternating Attentionは注意機構(Attention)を「グローバル」と「ローカル」の2種類に分け、交互に切り替えて計算コストを削減する技術です。
グローバルアテンションでは、各トークンが全ての他のトークンを参照。そのため、計算コストは高くなりますが、全体の関係を把握できます。
一方でローカルアテンションはトークンが近隣のトークンのみに注目をしており、計算コストは低いですが局所的な関係のみに集中します。
ModernBERTでは、グローバルアテンションを3層ごとに適用し、それ以外の層ではローカルアテンションを使用しており、その結果、全体の計算負荷を抑えつつ、必要な情報の抽出能力を維持しています。
Flash Attention
Flash Attentionは注意機構を計算する際のメモリと計算効率を向上させるための最新技術です。
通常のアテンション計算では膨大なメモリを消費しますが、Flash Attentionはメモリアクセスを最適化し、GPU上で効率的に処理することができます。
ModernBERTではグローバルアテンション用とローカルアテンション用を採用しており、メモリ使用量を大幅に削減し、計算速度を向上させています。
その他プラスに寄与した改良点
回転位置埋め込みを採用RoPE
Transformerでは、入力トークンの順序を考慮せずに学習を行うため、Positional Encodingによりトークンごとに一意の位置ベクトルを割り当て、単語埋め込みと合算する工夫を行っています。
一方で、Rotary Positional Encodingは、「RoFormer: Enhanced Transformer with Rotary Position Embedding」という論文で2021年に提案されており、トークンごとに位置ベクトルを追加するのではなく、単語埋め込みに回転を適用するアプローチをとります。
これにより、モデルは単語同士の関係をより正確に理解出来るようになり、より長いシーケンス長に拡張できるようになる。
(論文引用) Positional Embeddings We use rotary positional embeddings (RoPE) (Su et al., 2024) instead of absolute positional embeddings. This choice is motivated by the proven performance of RoPE in short- and long-context language models (Black et al., 2022; Dubey et al., 2024; Gemma et al., 2024), efficient implementations in most frameworks, and ease of context extension.
メモ
UnpaddingとSequence Packing
背景は、padding tokenには意味ないけど、代替文章の半分程度がpadding tokenだった。
改善の方針:
- Unpaddingを明示的に行うBlock: Embedding, Linear, LayerNorm, Addなどはbatchの次元とtokenの次元を混ぜても影響を受けない → unpadding(後述)の適用
ディープラーニングモデルに入力するシーケンスデータは、通常、同じ長さに揃える必要があります。これを実現するために、短いシーケンスにはパディング(通常はゼロや特定のトークン)を追加して、長さを揃えます。モデルの出力や中間層の出力に対しても同様にパディングが施されることがあります。
Unpaddingは、モデルの出力からこれらのパディングを取り除き、元のシーケンスの長さに戻すプロセスです。これにより、後続の処理や評価が正確に行えるようになります。
import numpy as np
# パディングされたシーケンス
padded_sequence = [
[1, 2, 3, 0, 0],
[4, 5, 0, 0, 0],
[6, 7, 8, 9, 0]
]
# パディングを取り除く
unpadded_sequence = [list(filter(lambda x: x != 0, seq)) for seq in padded_sequence]
print(unpadded_sequence)
# 出力: [1, 2, 3], [4, 5], [6, 7, 8, 9](/Shinichi0713/LLM-fundamental-study/wiki/1,-2,-3],-[4,-5],-[6,-7,-8,-9)
Sequence Packingは、可変長のシーケンスを一つのバッチにまとめるためのプロセスです。
特にRecurrent Neural Networks(RNNs)やLong Short-Term Memory(LSTM)ネットワークのようなシーケンスモデルでは、可変長のシーケンスを扱うことが一般的です。
- FlashAttentionの利用: FlashAttention内でpad tokenが最小限のみ付加されるようにデータの渡し方を最適化