
第6部 どうやって軽くするのか第11章
BitNet / ternary / 1-bit系
重みが「−1・0・+1」の3つだけ。それでも会話できるLLMが作れます。BitNet b1.58を中心に、1.58bitの意味、bitnet.cpp、llama.cppのTQ形式までを見渡します。
このページの内容(10項目)
重みに使える数字が「−1、0、+1」の3つしかないとしたら?
ふつうのLLMの重みは、0.0137 や −0.2481 のような細かい小数です。ところが Microsoft Research のBitNetは、重みをたった3種類の値に制限したまま、まともに会話できるモデルを作ってみせました。
3つしかなければ、掛け算はほぼ「足す・引く・何もしない」で済みます。この章では、この大胆な発想がどこまで実用になっているのかを、2026年10月時点の公開情報で確かめていきます。
「1.58bit」ってどういう意味?
ひとことで言うと
3種類の値を区別するのに必要な情報量は log₂3 ≒ 1.58bit。重みが −1・0・+1 の三値(ternary)のモデルを「1.58bit LLM」と呼びます。
1bitで表せるのは2通り(0と1)、2bitなら4通りです。3通りはその間なので、理論上は1個あたり約1.58bitで済みます。実際のファイルでは5個の三値をまとめて1バイト(3⁵ = 243 通り ≦ 256)に詰めるなどの工夫で、この理論値に近づけています。
通常のモデルの重みが「0〜100点の細かい評価」だとすると、三値の重みは「賛成・反対・保留」の3択アンケートです。1つ1つは粗くても、何十億人分を集めれば全体としてはちゃんとした判断ができる——BitNetはそんな賭けに勝った研究だと言えます。
なお「1-bit LLM」という呼び方は、最初のBitNet(重みが +1 と −1 の2値)から来ています。今話題になるのはほとんどが三値版の b1.58 ですが、慣習としてまとめて「1-bit系」と呼ばれています。
BitNetからBitNet b1.58へ
流れを年表で押さえておきましょう。どれも Microsoft Research(論文の多くは同社の研究チーム)による発表です。
| 時期 | 名前 | ポイント |
|---|---|---|
| 2023年10月 | BitNet | 重みを2値にする BitLinear 層を提案。最初から1bitで学習 |
| 2024年2月 | BitNet b1.58 | 0を加えた三値に。同じ大きさ・同じ学習量のFP16/BF16モデルに匹敵すると報告 |
| 2024年10月 | bitnet.cpp | CPUで三値モデルを高速に動かす公式推論フレームワーク |
| 2024年11月 | BitNet a4.8 | 活性化(計算途中の値)も4bitに |
| 2025年4月 | BitNet b1.58 2B4T | 初の公式オープンモデル(約2B・4兆トークン学習) |
| 2025年4月 | BitNet v2 | アダマール変換で外れ値をならし、4bit活性化をネイティブに |
b1.58 で 0 が加わった意味は大きく、「この入力は無視する」という選択ができるようになりました。論文では、これが特徴の取捨選択(フィルタリング)を可能にし、性能向上につながったと説明しています。
重みを三値にする方法は「absmean」と呼ばれます。重み行列の絶対値の平均でスケールを決め、割り算したあと −1・0・+1 のいちばん近い値に丸めます。活性化は8bitの整数に量子化されるので、構成は W1.58A8(重み1.58bit・活性化8bit)と表記されます。
3つの値しかないのに、どうやって学習する?
ここで素朴な疑問がわきます。重みが −1・0・+1 しか取れないなら、学習で「ほんの少しだけ動かす」ことができないのでは?
答えは、学習中だけ高精度の「隠れた重み」を別に持っておくことです。BitNet の論文では、この隠れた重み(latent weight)に更新を少しずつ積み上げ、計算(順伝播)のたびにその場で丸めて使います。丸めは微分できない操作なので、逆伝播では「丸めがなかったことにして」勾配をそのまま通す STE(straight-through estimator)という定番の近似を使います。勾配やオプティマイザの状態も高精度のままです。
体重計が「やせた・変わらない・太った」の3段階しか表示しなくても、手帳にはグラム単位で記録をつけておく。表示(推論で使う三値)は粗くても、手帳(隠れた重み)の上では少しずつ変化が積み重なり、ある日ついに表示が切り替わる——そんなイメージです。
学習が終われば隠れた重みは不要になり、三値の重みとスケールだけを配布します。逆に言えば、学習の段階では通常のモデルと同じくらいの計算資源が必要で、「安く作れる」わけではなく「安く動かせる」技術だという点に注意してください。
なぜ速く、省エネになるのか
LLMの計算の大半は「重み × 入力」の行列積です。重みが −1・0・+1 しかなければ、掛け算は不要になります。
- 重みが +1 → 入力をそのまま足す
- 重みが −1 → 入力を引く
- 重みが 0 → 何もしない
flowchart TD A["入力 x
8bit整数"] --> B{"重みは?"} B -->|"+1"| C["足す"] B -->|"−1"| D["引く"] B -->|"0"| E["飛ばす"] C --> F["合計 × スケール"] D --> F E --> F
最後にスケールを1回掛ければ元の大きさに戻ります。さらに重みのサイズが16bitの約10分の1になるので、メモリから読み出す量も激減します。生成速度のボトルネックは多くの場合メモリの読み出しなので(第10章)、ここが効いてきます。
BitNet b1.58 2B4T:実際に触れる公式モデル
2025年4月、MicrosoftはBitNet b1.58 2B4Tを Hugging Face で公開しました。名前の「2B4T」は約20億パラメータ(README上は2.4B)・4兆(4 trillion)トークンで学習したことを表します。技術報告では「2B規模で初のオープンソースのネイティブ1-bit LLM」と位置づけています。
モデルカードに載っている、同規模の通常モデル(いずれも指示調整版)との比較の一部が次の表です。
| モデル | メモリ(埋め込み除く) | CPUでの1トークン生成 |
|---|---|---|
| LLaMA 3.2 1B | 2GB | 48ms |
| Gemma-3 1B | 1.4GB | 41ms |
| Qwen2.5 1.5B | 2.6GB | 65ms |
| BitNet b1.58 2B | 0.4GB | 29ms |
ベンチマークの点数でも、ARC-Challenge や WinoGrande などで同規模モデルと同等かそれ以上の値が並んでいます(これらは開発元自身の評価です)。そのほかの仕様は、文脈長4096トークン、トークナイザはLLaMA 3と同じ、FFNの活性化関数に二乗ReLU、学習は事前学習→SFT→DPOの3段階です。
注意
モデルカードには「標準の transformers ライブラリで動かしても、速度や省エネの効果は期待しないでください」と大きく書かれています。三値専用の計算カーネルがないと、メモリが減るだけで速くはなりません。速さを体験するなら、次の bitnet.cpp を使います。
なお同じシリーズには、学習・微調整用にBF16の「マスター重み」を収めた版と、bitnet.cpp 用のGGUF版も用意されています。
bitnet.cpp:三値モデル専用のエンジン
bitnet.cpp は、BitNet b1.58 のような三値モデルのための公式推論フレームワークです。llama.cpp をベースに、三値用の行列計算カーネル(I2_S や、表引きを使う TL1/TL2 など)を加えたものです。
READMEと技術報告によると、通常精度のモデルと比べた速度向上は x86 CPU で2.37〜6.17倍、ARM CPU で1.37〜5.07倍、消費エネルギーは x86 で71.9〜82.2%、ARM で55.4〜70.0%減ったとされます。READMEでは、100B規模のBitNet b1.58モデルを1台のCPUで毎秒5〜7トークン(人が読む速さ程度)で動かせたとも述べています。ただし、100B規模の三値モデル自体は2026年10月時点で Microsoft からは公開されていません。
その後も更新は続き、2025年5月に公式GPUカーネル、2026年1月にはCPUカーネルの並列化などでさらに1.15〜2.1倍の高速化が発表されました。2026年7月には1-bitの埋め込みモデル(BitNet-embedding-0.6B / 270M、第19章で扱う検索用のモデル)と、BitNet量子化を使ったCPU向け音声認識エンジン VibeASR.cpp が公開されています。
ためしてみよう
bitnet.cpp の README の手順では、リポジトリを git clone --recursive したあと、GGUF版の2B4Tをダウンロードして python setup_env.py -md models/BitNet-b1.58-2B-4T -q i2_s でビルドし、python run_inference.py -m models/BitNet-b1.58-2B-4T/ggml-model-i2_s.gguf -p "You are a helpful assistant" -cnv で対話を始めます。GPUがないノートPCでも試せる大きさです(手順は2026年10月時点のREADMEによる)。
bitnet.cpp は公式モデルのほか、コミュニティによる再現モデル(bitnet_b1_58-large / 3B)、Llama-3-8B-Instruct から1.58bitに微調整した Llama3-8B-1.58、TII の Falcon3 1.58bit版(1B〜10B)や Falcon-E シリーズにも対応しています。
もう一歩深く: 次の標的は「活性化」
重みを三値にしても、活性化(計算途中の値)は8bitのままです。大勢のリクエストをまとめて処理するときは、ここがボトルネックになります。ところが活性化には、ときどき桁違いに大きな値(外れ値)が混じるので、単純に4bitにすると壊れてしまいます。BitNet a4.8 は、注意やFFNの入力は4bitにしつつ、外れ値の多い中間の値は疎(ゼロが多い状態)にしてから8bitで扱う折衷案で、パラメータの55%だけを使い、3bitのKVキャッシュにも対応すると報告しました。BitNet v2 は、量子化の直前にアダマール変換という「値をまんべんなく混ぜる」変換をかけて外れ値をならし、最初から4bitの活性化で学習できるようにしています。
llama.cppのTQ1_0 / TQ2_0、そして「後から1bit」との違い
ふつうの llama.cpp にも、三値モデル専用の量子化形式 TQ1_0(約1.69bit/重み)と TQ2_0(約2.06bit/重み)があります。2024年に「TriLMs と BitNet b1.58 のための三値パッキング」として追加されたもので、TQ1_0 は5個の三値を1バイトに詰めてサイズ重視、TQ2_0 は1個2bitで扱いやすさと速度重視、という違いです。
ここで大事なのが、三値で学習したモデルと普通のモデルを後から低ビットにしたものはまったく別物だという点です。llama.cpp には IQ1_S(名目約1.56bit)のような極端な量子化もありますが、これは通常のモデルを無理やり縮めるもので、劣化がはっきり出ます。また埋め込み層などは高めのビットで残るため、Llama-3.1-8B での実測ではファイル全体で約2.0bit/重みになります。
flowchart TD A["低ビットのモデル"] --> B["最初から三値で学習
BitNet b1.58"] A --> C["学習後に丸める
IQ1_S・Q2_K など"] B --> D["TQ1_0・TQ2_0・I2_S
ほぼ劣化なしで格納"] C --> E["サイズは小さいが
精度が落ちやすい"]
三値モデルをTQ形式で保存するのは、もともと −1・0・+1 しかない値をそのまま詰めるだけなので、情報はほぼ失われません。一方、通常のモデルを1〜2bitに丸めるのは、細かい小数を無理に3択に押し込むので誤差が大きくなります。
限界と、これから
三値LLMの最大の壁は、最初から(あるいは大規模な追加学習で)三値として学習しなければならないことです。既存の強力なモデルをボタン一つで1.58bitにはできず、先ほど見たとおり学習の手間も通常のモデルを一から作るのと大きくは変わりません。Llama3-8B-1.58 のように既存モデルから追加学習で三値化する試みもありますが、それでも1000億トークン規模の学習が使われています。
そのため2026年10月時点で、Microsoft が公開している三値のLLMは2B規模の 2B4T にとどまり、数十B〜数百Bの最先端モデルが三値で出ている状況ではありません。それでも、メモリ・電力・速度のどれもが厳しいスマートフォンや組み込み機器にとっては有力な選択肢であり、埋め込みモデルや音声認識へ応用先が広がり始めています。
よくある誤解
好きなモデルを1.58bitに量子化すれば、BitNetと同じものになる
BitNet b1.58 は三値で学習したモデル。通常のモデルを後から丸めると大きく劣化します
BitNetはすべての計算が1bitで行われる
三値なのは主に線形層の重み。活性化は8bit(W1.58A8)で、埋め込みなども別の精度で持ちます
transformers で動かせば速く、省エネになる
専用カーネルが必要。速さを得るには bitnet.cpp などの対応ランタイムを使います
確認クイズ
Q2. 三値の重みだと、行列積で何が楽になる?
掛け算が要らなくなります。重みが +1 なら足す、−1 なら引く、0 なら飛ばすだけで、最後にスケールを1回掛ければ済みます。
Q3. TQ1_0 と IQ1_S はどちらも1bit台。何が違う?
TQ1_0 は三値で学習したモデルをそのまま詰めるための形式で、ほぼ劣化しません。IQ1_S は通常のモデルを後から極端に丸める量子化で、精度の低下が大きくなります。
この章のまとめ
- BitNet b1.58 は重みが −1・0・+1 の三値。情報量 log₂3 ≒ 1.58bit からこう呼ばれる
- 三値で学習するのがポイント。後から丸めた低ビット量子化とは別物
- 公式オープンモデル BitNet b1.58 2B4T は、同規模モデルよりずっと少ないメモリで動く
- 速さと省エネには bitnet.cpp などの専用カーネルが必要。llama.cpp には TQ1_0/TQ2_0 がある
さらに深く学ぶ
この章の内容をもう一歩掘り下げるための原典です。
- The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits重みを-1・0・+1の三値にしたBitNet b1.58を提案し、同規模のFP16モデルに迫る性能を示して大きな話題になった論文。
- BitNet: Scaling 1-bit Transformers for Large Language Models重みを1bitにしたTransformerを最初から学習するBitNetを提案。後の1.58bit版の出発点です。
- BitNet b1.58 2B4T Technical Report4兆トークンで学習した2Bの三値モデルを公開した技術報告。研究段階から「実際に試せる」段階に進んだ一歩です。
- Bitnet.cpp: Efficient Edge Inference for Ternary LLMs三値モデルをCPUで速く動かすための専用カーネルの論文。三値の利点を引き出すにはソフトウェア側の工夫が要ることが分かります。
出典・参考
- Wang ほか「BitNet: Scaling 1-bit Transformers for Large Language Models」(arXiv:2310.11453)
- Ma ほか「The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits」(arXiv:2402.17764)
- 「BitNet b1.58 2B4T Technical Report」(arXiv:2504.12285)
- microsoft/BitNet-b1.58-2B-4T(Hugging Face モデルカード) — 仕様、比較表、transformers利用時の注意(2026年10月確認)
- microsoft/BitNet(bitnet.cpp, GitHub) — 速度・省エネの数値、ニュース履歴、対応モデル(2026年10月時点)
- 「1-bit AI Infra: Part 1.1, Fast and Lossless BitNet b1.58 Inference on CPUs」(arXiv:2410.16144)、「Bitnet.cpp: Efficient Edge Inference for Ternary LLMs」(arXiv:2502.11880)
- 「BitNet a4.8」(arXiv:2411.04965)、「BitNet v2」(arXiv:2504.18415)
- llama.cpp PR #8151「ternary packing for TriLMs and BitNet b1.58」、llama.cpp quantize README(IQ1_S の実測bits/weight)
- HF1BitLLM/Llama3-8B-1.58-100B-tokens(モデルカード)