Blog
背景
Preferred Networksでは国立研究開発法人情報通信研究機構(以下: NICT)と共同で大規模言語モデルの開発を現在行っています。この取り組みの中で、日本の文化や社会等に留意した高品質かつ大量の学習データを用いた安全で高性能な国産LLMを目指しています。
この開発において、最終的に開発する前の検証として小さいモデルから徐々にモデルサイズと学習トークン数を増やしながら事前学習をしていき、精度検証を行いました。今回はこの現在開発中のPLaMo 3についてと検証の中で学習したモデルのその結果を紹介します。
PLaMo 3 のアーキテクチャ
以前の記事でも紹介したとおり、PLaMo 3の一つ前のバージョンであるPLaMo 2 では Sambaをベースとしたアーキテクチャを採用していました。これは、長い系列長に対する性能を向上できると期待してのことだったのですが、実際には長い系列長での性能を向上させることは難しいということがわかりました(一方で、短い系列長では若干ながら推論効率の改善が見られました)。加えて、Samba を採用したモデルが少なく、Transformer に比べると広く利用されているライブラリやアプリケーションのサポートなど、モデルを利用する際のアクセシビリティが課題となりました。
これらの課題を踏まえて、PLaMo 3 ではモデルアーキテクチャを Attention および Sliding Window Attention を組み合わせたものに変更しています。これは Google の Gemma 3モデルのアーキテクチャに近いものになっています。このようなアーキテクチャにすることで、
- 計算コストの比較的小さい Sliding Window Attention を多くのレイヤで使用することで、推論コスト(時間およびメモリ)を削減する
- 系列上で遠く離れたトークン間の関係も、Attention レイヤにより把握することができる
ということが期待されます。加えて、広く使われているモデルと同様の構成要素 (Sliding Window Attention など) に基づいているため、各種ライブラリで迅速な対応が期待できます。
実際、PLaMo 3 31B モデルが必要とする KV キャッシュのサイズを他のパラメータ数が近いモデルと比較すると次のようになり、特に系列長が長い場合のメモリ消費を抑えられていることがわかります。
表1: KVキャッシュサイズ
| 系列長 | Qwen3-32B | Gemma3-27B | PLaMo 3 31B |
| L=1k | 128 MiB | 248 MiB | 128 MiB |
| L=128K | 16 GiB | 5.2 GiB | 2.2 GiB |
データセット
次にデータセットに関してです。事前学習において、英語と日本語、コード、多言語、の主に4種類について混ぜて学習しています。それぞれの比率としては以下の通りです。
表2: データ毎の比率
| データ | 比率 |
| 英語 | 43.75% |
| 日本語 | 31.25% |
| コード | 15% |
| 多言語 | 10% |
これらのデータのうち工夫をしている英語、日本語、コードについてそれぞれ簡単に説明します。
英語データ
Hugging Face にあるデータで使えそうなものについては検証を行い、小規模モデルの学習で性能が上がるなど、品質が良いと考えられるものについては学習データに取り入れました。
日本語データ
今回の日本語データは、
この問題に対して、英語の高品質なデータを PLaMo を使って日本語に翻訳させる手法は引き続き使っていますが、翻訳特化モデルでのPLaMo 翻訳の開発以降はこれを翻訳に使用しています。
加えて、今後、NICTの日本語学習データ等も用いて、
コードデータ
大規模なコードデータのコーパスとして The Stack v2を使用しました。使用の際には SwallowCode などを参考に、LLM でのフィルタリングや言い換えなどの加工を行いました。
以前の記事のように、PLaMo 2 の学習で使ったデータの生成時には、コードの生成時に多様性の確保のため「コードの抜粋」をプロンプトに付加していました。これには、プロンプト長の限界を超える長いコードでも生成に使用できるというメリットはあったのですが、生成されるコードの質や多様性を考慮した結果、今回は「コード全体」をプロンプトに含めての言い換えを中心にデータ生成を行いました。
その他の事前学習の詳細
ここでは上記に紹介した以外の部分で事前学習において重要な箇所について紹介します。
学習token数はChinchilla則などを参考に小さいモデルの場合は少ない学習token数に抑え、PLaMo 2 シリーズでも活用したweight reusingを利用してより大きいモデルの初期値として活用するということを実施しました。
それぞれのモデルの学習token数は以下の通りです。
表3: 学習トークン数
| モデルサイズ | 学習token数 |
| 2B | 200B |
| 8B | 1T |
| 31B | 3T |
この中でPLaMo 3の2B モデルに関しては、学習トークン数がかなり少ない状態なため、モデルサイズで期待される性能としては低めになっていることから、後ほど示す評価結果は8Bと31Bのみにしています。
評価結果
PLaMo 3の8B, 31Bの性能を既存の事前学習モデルと比較するために、いくつかのベンチマークで評価しました。比較に利用する既存モデルとしては、事前学習としてある程度日本語のデータが入っていると思われるモデルで、同レベルのサイズのものを選びました。具体的には以下の通りです。
8Bクラス
- Qwen3-8B-Base
- ABEJA-Qwen2.5-7b-Japanese-v0.1
- Llama-3.1-Swallow-8B-v0.5
- PLaMo 2 8B
- PLaMo 2.1 8B (PLaMo 2 31Bからpruningと知識蒸留によって学習したモデル)
- PLaMo 3 NICT 8B Base (今回のブログで紹介しているPLaMo 3 の8Bの事前学習モデル)
30Bクラス
- Qwen2.5-32B
- Qwen3-32B (参考)
- ABEJA-Qwen2.5-32b-Japanese-v0.1 (参考)
- PLaMo 2 31B (PLaMo 2シリーズの31Bモデル)
- PLaMo 3 NICT 31B Base (今回のブログで紹介しているPLaMo 3 の31Bの事前学習モデル)
この中で30Bクラスに関しては事前学習モデルが公開されてないことが多く、Qwen3-32B、ABEJA-Qwen2.5-32b-Japanese-v0.1に関しては事後学習済みのモデルではありますが、参考に結果を示します。
また、評価は質問と回答を日本語で行うベンチマークを中心に、知識やコーディング、翻訳など複数のジャンルで行いました。具体的に評価に利用したベンチマークは以下の通りです。
日本語生成
基本的な日本語の生成能力を測定するためのpfgen-benchを利用しました。pfgen-benchはPFNが開発している日本語の文章生成性能評価ベンチマークです。ベンチマークのスコアは0から1の値を取るようになっており、数値が高いほど適切な日本語の文章が生成できていることを示します。
知識
LLMがどの程度知識を有しているかを示すためにJMMLU , MMLU-ProXのja、JamC-QAの3つのベンチマークの結果を示します。
JMMLUに関しては、オリジナルのMMLUが良く5-shotで評価されるため、JMMLUの公開されているtestデータの各項目から5つのサンプルをランダムに選び、few shotの入力として利用しました。評価はLanguage Model Evaluation Harness (以降、lm-evaluation-harness) のMMLUのコードを改良して実施しました。
また、MMLUのような選択問題に関してはpromptで性能が大きく変化することが知られています。今回は選択肢をLLMに入力し、A,B,C,Dの選択肢を答えさせる方法(lm-evaluation-harnessのMMLUにおけるdefaultのprompt)を利用しました。
MMLU-ProXに関してはlm-evaluation-harnessのものを利用して測定しました。
最後にJamC-QAに関してはlm-evaluation-harnessで測定できるように設定ファイルを記述し、測定しました。
コーディング
コーディングに関してはJHumanEvalという、日本語でプログラミングの指示をするベンチマークによって評価しました。この評価の際に利用した実験条件はAppendixのほうに示しています。
翻訳
翻訳性能を測定するために、今回はWMT23とWMT24のうち、日本語が関係するものを測定しました。これらはStability AIのlm-evaluation-harnesを修正し、測定できるようにしたものを利用しています。
ここから各ベンチマークの結果をまとめて紹介したのち、結果の考察を述べます。
日本語生成
日本語生成の性能を評価するためにpfgen-benchの測定をしました。結果は以下の通りです。
表4: 日本語生成に関する評価結果
| モデル | pfgen-bench |
| Qwen3-8B-Base | 0.55 |
| ABEJA-Qwen2.5-7b-Japanese-v0.1 | 0.63 |
| Llama-3.1-Swallow-8B-v0.5 | 0.72 |
| PLaMo 2 8B | 0.75 |
| PLaMo 2.1 8B | 0.72 |
| PLaMo 3 8B | 0.68 |
| Qwen2.5-32B | 0.59 |
| Qwen3-32B (参考) | 0.63 |
| ABEJA-Qwen2.5-32b-Japanese-v0.1 (参考) | 0.79 |
| PLaMo 2 31B | 0.80 |
| PLaMo 3 31B | 0.79 |
知識
知識に関しての性能を測定するために、JMMLU, MMLU-ProXのja, JamC-QAを測定しました。結果は以下の通りです。
表5: 知識に関する評価結果
| モデル | JMMLU(5 shot, acc) | MMLU-ProX ja (5 shot, acc) | JamC-QA (4 shot, acc) |
| Qwen3-8B-Base | 0.715 | 0.470 | 0.387 |
| ABEJA-Qwen2.5-7b-Japanese-v0.1 | 0.690 | 0.438 | 0.459 |
| Llama-3.1-Swallow-8B-v0.5 | 0.631 | 0.333 | 0.555 |
| PLaMo 2 8B | 0.571 | 0.231 | 0.560 |
| PLaMo 2.1 8B | 0.624 | 0.251 | 0.557 |
| PLaMo 3 8B | 0.604 | 0.263 | 0.457 |
| Qwen2.5-32B | 0.786 | 0.508 | 0.472 |
| Qwen3-32B (参考) | 0.785 | 0.637 | 0.460 |
| ABEJA-Qwen2.5-32b-Japanese-v0.1 (参考) | 0.802 | 0.582 | 0.595 |
| PLaMo 2 31B | 0.672 | 0.341 | 0.680 |
| PLaMo 3 31B | 0.733 | 0.431 | 0.626 |
コーディング
コーディング能力を測定するためにJHumanEvalの評価を行いました。結果は以下の通りです。
表6: コーディングに関する評価結果
| モデル | JHumanEval (pass@1) |
| Qwen3-8B-Base | 0.616 |
| ABEJA-Qwen2.5-7b-Japanese-v0.1 | 0.372 |
| Llama-3.1-Swallow-8B-v0.5 | 0.287 (0.491*) |
| PLaMo 2 8B | 0.445 |
| PLaMo 2.1 8B | 0.409 |
| PLaMo 3 8B | 0.402 |
| Qwen2.5-32B | 0.652 |
| Qwen3-32B (参考) | 0.762 |
| ABEJA-Qwen2.5-32b-Japanese-v0.1 (参考) | 0.445 |
| PLaMo 2 31B | 0.488 |
| PLaMo 3 31B | 0.543 |
* https://huggingface.co/tokyotech-llm/Llama-3.1-Swallow-8B-v0.5 で示されているスコア。条件によって大きくスコアが変化するため、公式に公開されているスコアも参考に示しています。
翻訳
最後に翻訳性能を測定するためにWMT23,WMT24の日本語に関するものを測定しました。結果は以下の通りです。
表7: 翻訳に関する評価結果
| モデル | WMT23 (en->ja, 4-shot bleu) | WMT23 (ja->en, 4-shot bleu) | WMT24 (en->ja, 4-shot bleu) |
| Qwen3-8B-Base | 21.62 | 20.69 | 24.57 |
| ABEJA-Qwen2.5-7b-Japanese-v0.1 | 22.42 | 18.61 | 25.69 |
| Llama-3.1-Swallow-8B-v0.5 | 24.91 | 22.49 | 28.29 |
| PLaMo 2 8B | 23.87 | 19.71 | 27.11 |
| PLaMo 2.1 8B | 25.15 | 20.18 | 27.85 |
| PLaMo 3 8B | 25.24 | 19.67 | 28.59 |
| Qwen2.5-32B | 23.30 | 15.91 | 26.40 |
| Qwen3-32B (参考) | 23.02 | 22.49 | 25.71 |
| ABEJA-Qwen2.5-32b-Japanese-v0.1 (参考) | 25.53 | 23.08 | 29.92 |
| PLaMo 2 31B | 26.01 | 22.51 | 30.43 |
| PLaMo 3 31B | 26.28 | 22.30 | 30.45 |
結果の考察
これらの結果について、まずはJMMLU, MMLU-ProX, JHumanEvalについてです。これらのベンチマークは日本語に限らず英語などの別の言語のデータを多く学習することでも精度が上昇することが知られています。このため、JMMLUやJHumanEvalの翻訳元となったオリジナルのMMLUやHumanEvalで高いスコアを達成しているQwenシリーズや、これらのベンチマークで高いスコアを達成している海外のLLMに対して、追加学習して作られたLlama-3.1-Swallow-8B-v0.5、ABEJA-Qwen2.5シリーズなどが高いスコアを達成している傾向にあります。
これに対してPLaMo 3に関して、先ほど紹介したデータセットの工夫によって対策を行ってきました。この結果、PLaMo 2 8BやPLaMo 2 31Bと比べるとPLaMo 3の8B, 31Bのほうが高い精度を達成することができました。
次にpfgen-bench、JamC-QAについてです。この二つのベンチマークに関しては日本や日本語のデータを多く学習することでスコアが上がると考えられます。このため、日本語データが少ないと考えられるQwenシリーズのスコアが他のモデルよりも低くなっていると考えられます。
これらのベンチマークに関して、PLaMo 3はPLaMo 2と同等か低くなっている結果になっています。これはPLaMo 2で海外のLLMとの差が大きかったSTEM関係の知識を補うため、PLaMo 2と比べて英語の高品質なデータを翻訳して作ったデータの量を増やした結果であると考えています。この部分に関してはトレードオフの関係があると考えられるので引き続きどうすればよいかを検討する必要があると考えています。
最後に翻訳について、PLaMo 2とPLaMo 3を比べると、en–>jaはPLaMo 3が、ja->enはPLaMo 2が高いスコアを得ており、一貫した結果には見えないかもしれません。ただ、bleu で見た場合、性能はほぼ上限に近づいていると考えられ、誤差で順位が逆転している可能性もあり、結果の解釈には注意が必要であると考えています。
最後に
今回はNICTとの取り組みで行っているPLaMo 3シリーズの小規模な事前学習の検証について紹介しました。現在、より大きいモデルなどの学習を行っております。これらについても学習が完了次第、blog等で共有できればと考えています。
また、今回開発したモデルはHugging Faceの以下のURLで公開しています。
https://huggingface.co/pfnet/plamo-3-nict-2b-base
https://huggingface.co/pfnet/plamo-3-nict-8b-base
https://huggingface.co/pfnet/plamo-3-nict-31b-base
ただし、これらのモデルは事前学習済みのモデルです。このため、他の事前学習済みのLLMと同様、今回のPLaMo 3のモデルの出力内容を事前予測することはできず、場合によっては不正確・偏った内容、あるいはユーザーの指示に対して不適切と判断される応答を生成する可能性があります。したがって、PLaMo 3の今回のモデル利用したアプリケーションを展開される際には、開発者の方において本モデルの具体的な用途に合わせた安全性テストとチューニングを実施していただく必要があります。
仲間募集中
PFNでは今後もLLMの開発を継続して行っていきます。開発は今回紹介した以外にも多岐にわたります。我々はこれらの課題に情熱をもって挑戦していく仲間を募集しています。
これらの仕事に興味がある方はぜひご応募よろしくお願いします。
https://www.preferred.jp/ja/careers/
Appendix:
JMMLUの評価方法
JMMLUで利用したpromptは以下の通りです。
選択問題 問題: 48以上88以下=?以上11以下が成り立つ数を求めよ。 A. 6 B. 11 C. 8 D. 5 回答: A … 問題: ペレスさんは5日間で合計40マイルを運転した。毎日同じ距離を走った。ペレスさんは毎日何マイルを運転したか。 A. 5 B. 7 C. 8 D. 9 回答:
JHumanEvalの評価方法
promptは https://huggingface.co/datasets/kogi-jwu/jhumaneval のpromptをそのまま利用しました。
例:
from typing import List
def has_close_elements(numbers: List[float], threshold: float) -> bool:
"""リストnumbersの中に、与えられたthresholdより近い2つの数値が存在するか判定する
>>> has_close_elements([1.0, 2.0, 3.0], 0.5)
False
>>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)
True
"""
また、LLMのコードの生成は以下のものでも止まるようにしました。
[ "\nclass", "\ndef", "\n#", "\n@", "\nprint", "\nif", "\n```", "<|plamo:file_separator|>", "\nimport", "\nfrom"]
wmt23、24の評価方法
wmt23, 24の評価はhttps://github.com/Stability-AI/lm-evaluation-harness/tree/jp-stable のものと同じものを利用しました。具体的にはen → jaは以下のようなpromptになります。
English phrase: Ford Motor and Volkswagen have said they will spend billions of dollars to jointly develop electric and self-driving vehicles. Japanese phrase: フォード・モーターとフォルクスワーゲンは、電気自動車と自動運転車の共同開発に数十億ドルを投資する予定だと発表している。 … English phrase: Dozens of fundraising coffee mornings are taking place across Scotland on Friday. Japanese phrase:
pfgen-bench の評価方法
評価設定はhttps://github.com/pfnet-research/pfgen-bench をベースに試行回数は10回として実行し評価しました。







