Blog
背景
Preferred Networks(以下PFN)とグループ会社のPreferred Elements(以下PFE)では2024年10月からGENIAC 第2期を開始し、その中で高性能かつ軽量なLLMの開発を行っています。その中で、310億 (31B) パラメータ規模のLLM (PLaMo 2 31B) の学習を行いました。今回の記事では、このモデルの開発について紹介します。
上記にあるように、この開発は経済産業省及び国立研究開発法人新エネルギー‧産業技術総合開発機構(NEDO)が実施する、国内の生成AIの開発力を強化するためのプロジェクト「GENIAC(Generative AI Accelerator Challenge)」の支援を受けて実施しました。
GENIAC 第2期におけるPFNとPFEの目標
今回PFNとPFEではモデルサイズを抑えたまま高い性能を実現するために高品質なデータを作成し、そのうえで小規模なモデルで高い精度を達成することを目標に活動しています。
特に、日本語や日本に関わる知識を十分に保持しつつ、幅広い知識を測定するJMMLUやコーディングタスクであるJHumanEvalにおいてモデルサイズを抑えたまま高い精度を達成することを目的の一つとしています。今回はこの目標を達成するために、以前作ったPLaMo 2 8Bより、モデルサイズを大きくした場合どの程度のスコアを達成できるかを確認するために31Bのモデルを2T トークン学習したので、その結果を紹介します。
評価結果
最初に開発したPLaMo 2 31Bの結果のまとめと各ベンチマークの結果を示します。そのあと各モデルとの結果の結果の比較を述べていきます。
結果のまとめ
まず結果を一言でまとめると、今回開発したPLaMo 2 31Bは日本語の生成文を評価するpfgen-benchでは同レベルのサイズのモデルと比べて高いスコアを達成しました。また、JMMLUやJHumanevalのようなベンチマークでは目標の一つであったPLaMo 100Bよりも高いスコアを達成することができました。
具体的な各ベンチマークの結果は以下に順番に説明していきます。
まず、評価に使ったベンチマークについてです。日本で利用される際、日本語による受け答えや日本の独自の知識が重要であると考えています。これらを測るベンチマークとして、PFNで開発しているpfgen-benchを利用しました。
さらに、LLMの応用例として重要な翻訳についても能力を測定するために、翻訳のベンチマークであるWMT20の結果も示します。
これに加えて、英語と日本語の両方で幅広い知識を測定するために、MMLUとその日本語訳であるJMMLUを使った評価、コーディング能力を測定するためにHumanEval+とJHumanEvalで評価しました。
比較対象には31B前後のモデルで、学習のデータに日本語が含まれていると考えられる事前学習済みモデルとしてQwen2.5-32B、Qwen2.5-32Bから派生してABEJAで作られたABEJA-Qwen2.5-32b-Japanese-v0.1を比較対象として選びました。最近Gemma 3で27Bという同レベルのサイズのモデルがでていますが、こちらは社内で試したところ、論文で示されているようなスコアが再現できなかったので、今回は除いてあります。また、PLaMo シリーズからPLaMo 100Bと最近開発して公開したPLaMo 2 8Bについても比較します。
結果についてここから順番に示していきます。
pfgen-bench
表1: pfgen-benchの結果
モデル | pfgen-bench |
Qwen/Qwen2.5-32B | 0.587 * |
abeja/ABEJA-Qwen2.5-32b-Japanese-v0.1 (**) | 0.774 * |
PLaMo 100B (pfnet/plamo-100b) | 0.747 * |
PLaMo 2 8B (pfnet/plamo-2-8b) | 0.753 * |
PLaMo 2 31B | 0.817 |
(*): https://github.com/pfnet-research/pfgen-bench から引用
(**) instruction tuned modelであるQwen/Qwen2.5-32B-Instruct をベースに継続事前学習を行ったモデルです。
WMT20
表2: wmt20の結果
モデル | WMT20 (4-shot, en → ja, wmt22-comet-da) | WMT20 (4-shot, ja → en, wmt22-comet-da) | wmt20-en-ja(bleu) | wmt20-ja-en(bleu) |
Qwen/Qwen2.5-32B | 0.895 | 0.824 | 26.917 | 22.176 |
abeja/ABEJA-Qwen2.5-32b-Japanese-v0.1 (*) | 0.903 | 0.826 | 27.664 | 22.952 |
PLaMo 100B (pfnet/plamo-100b) | 0.899 | 0.819 | 29.727 | 21.665 |
PLaMo 2 8B (pfnet/plamo-2-8b) | 0.901 | 0.814 | 28.972 | 20.636 |
PLaMo 2 31B | 0.907 | 0.826 | 31.18 | 24.17 |
(*) instruction tuned modelであるQwen/Qwen2.5-32B-Instruct をベースに継続事前学習を行ったモデルです。
JMMLUとMMLUの評価結果
表3: JMMLU, MMLUの結果
モデル | JMMLU (5 shot, acc) | MMLU (5 shot, acc) |
Qwen/Qwen2.5-32B | 0.786 | 0.832 |
abeja/ABEJA-Qwen2.5-32b-Japanese-v0.1 (*) | 0.802 | 0.826 |
PLaMo 100B (pfnet/plamo-100b) | 0.575 | 0.603 |
PLaMo 2 8B (pfnet/plamo-2-8b) | 0.572 | 0.573 |
PLaMo 2 31B | 0.672 | 0.681 |
(*) instruction tuned modelであるQwen/Qwen2.5-32B-Instruct をベースに継続事前学習を行ったモデルです。
JHumanEvalとHumanEval+
表4: JHumanEvalとHumanEval+の結果
モデル | JHumanEval(0-shot, pass@1) | HumanEval+(0-shot, pass@1) |
Qwen/Qwen2.5-32B | 0.628 | 0.463 |
abeja/ABEJA-Qwen2.5-32b-Japanese-v0.1 (*) | 0.463 | 0.213 |
PLaMo 100B (pfnet/plamo-100b) | 0.268 | 0.220 |
PLaMo 2 8B (pfnet/plamo-2-8b) | 0.463 | 0.463 |
PLaMo 2 31B | 0.488 | 0.555 |
(*) instruction tuned modelであるQwen/Qwen2.5-32B-Instruct をベースに継続事前学習を行ったモデルです。
他モデルとの結果比較
まず日本語能力という観点でpfgen-bench, WMT20の二つのベンチマークに注目して結果を比較します。その後、幅広い知識を問うJMMLU/MMLUとコーディング能力を見るJHumanEval/HumanEval+についてみていきます。
日本語能力 (pfgen-bench, WMT20)
pfgen-benchはPFNが開発し、メンテナンスをしている日本語の生成文を評価するベンチマークです。pfgen-benchは質問応答タスクであり、約100字の公用文に近い回答が期待されていることを、多数の例示のみで伝えます。指示文やテンプレートの差異による影響を小さくすることを目的としたベンチマークです。
PLaMo 2 31Bに関しては、比較したモデルの中で一番高いスコアを出し、高度な日本語生成能力を示しています。
31B前後の3つのモデルについて質問ごとの結果からPLaMo 2の特徴を見ていきます。
Qwen2.5-32B (以下Qwen) はスコアで見ると日本語を重視した他2モデルと比べて大きく低いスコアになっていますが、実際の出力を見ると質問によっては適切な回答を生成できています。
出力に英語・中国語が混ざる (“Q20. 地球の歴史について教えて。”など) ケースがある他、日本語データセット以外にあまり含まれていなさそうな知識 (“Q44. 走れメロスはどのような作品ですか?”、“Q46. 宝塚歌劇団の特徴は?” など) が苦手な傾向がありそうです。
Qwenから継続学習を行ったABEJA-Qwen2.5-32b-Japanese-v0.1 (以下ABEJA) は、日本語継続学習をしたことでQwenからスコアが上昇しています。例えば、”Q44. 走れメロスはどのような作品ですか?”などはQwenでは0.3716だったところABEJAでは0.8408まで上昇しており、継続事前学習で日本語特有の知識を獲得できたことがうかがえます。
一方で、改善幅の小さい質問もいくつかありました。例えば、”Q33. 日本の東西南北端点について教えて。”ではQwenが0.3856のところ0.551、“Q46. 宝塚歌劇団の特徴は?” ではQwenが0.5405のところ0.6246、となっています。100Bトークンと比較的短い継続事前学習で作られたモデルであるため、カバーしきれなかった知識もあるのではないかと考えています。
PLaMo 2は、どの質問もある程度高いスコアを達成しています。上であげた質問では、Q33が0.7702、Q44が0.8362、Q46が0.7303であり、ABEJAと同程度あるいは上回るスコアを獲得できています。
一方、日本語特有の知識を必要としない質問では、ABEJAに劣りQwenと同程度のスコアのものも見られました。例えば、”Q01. 時計の長針と短針が1日に重なる回数は?”では、Qwenが0.8355、ABEJAが0.9261に対し、PLaMo 2は0.8282でした。もともとQwenが得意としている分野の質問については、Qwenの能力をそのまま引き継いだABEJAの継続事前学習というアプローチが効果的であることが見て取れます。
PLaMo 2は日本語で問われるような事柄について幅広く知識を持ち、それを元に日本語で適切な回答を生成できるモデルということができます。
次に翻訳タスクであるWMT20に関してです。
WMT20ベンチマークの結果をCOMETスコアで比較すると、en-jaについてはQwen 2.5 32Bよりわずかに高い値になったものの、それ以外の比較ではほとんど差がない結果になりました。
参考として示したBLEUスコアはどの比較においても高い数字になりました。
しかし、COMETはBLEUに比べて人間による評価との高い相関が報告されており、近年はCOMETでの比較が推奨されています。
従って、日本語翻訳性能としてはABEJA 32Bと同等、Qwen 2.5 32Bよりもわずかに優れているといえます。
JMMLU/MMLUとJHumanEval/HumanEval+に関して
PLaMo 2 31B の学習では、PLaMo 2 8B の学習と同様の高品質なデータを使用しています。これにより、PLaMo 2 31B ではこれらベンチマークにおいて PLaMo 100B を大きく上回るスコアを達成することができています。加えて、モデルの規模を大きくしたことで、特に JMMLU/MMLU のスコアでは PLaMo 2 8B を大幅に上回ることができています。
コード生成のベンチマーク (JHumanEval / HumanEval+) のスコアを Qwen2.5-32B と比較した場合、HumanEval+ では PLaMo 2 31B のほうが高いスコアを示している一方、JHumanEval では大きく差をつけられてしまっています。PLaMo が日本語を重視したモデルであることを考慮するとこれは一見不合理ですが、事前学習モデルの性質上根本的に意図にそぐわない生成をしてしまう場合があることが一因として考えられます。すなわち、以下のようなプレースホルダー的なコードを生成してしまっているケースが無視できない個数存在しました(Qwen2.5-32B に HumanEval+ を解かせた際は、164 問のうち 25 問でこのような出力となっていました)。
def compute_sum(a, b): # your code here pass
これにより、Qwen2.5-32B の HumanEval+ のスコアが本来のモデルの実力よりも低くなってしまっていることが考えられます。このような側面もあるため、このスコアのみを見て一概に PLaMo 2 31B と Qwen2.5-32B を比較することは難しいものの、PLaMo 2 31B も Qwen2.5-32B に比較的近い性能を達成することができているとは言えるのではないかと考えています。
一方で、JMMLU / MMLU については Qwen2.5-32B、およびそこから派生した ABEJA-Qwen2.5-32b-Japanese-v0.1 に大きく差をつけられてしまっています。これについては学習トークン数の差による影響も考えられますが、データの改良を続けていくべき点であると思われます。
次にJMMLUの中にある日本固有の知識を問う問題の結果についてさらに深堀してみていきます。
JMMLU日本問題
JMMLUには日本問題という、MMLUからの翻訳ではない問題があります。熟語、公民、日本地理、日本史の4タスクからなるこれらの問題は、英語ではあまり問われることのない日本語固有の知識・問題が集まっています。
これらJMMLU 日本語問題の性能を通して、各モデルの日本語固有知識について見ていきます。
表5: JMMLUから日本問題を抜粋
モデル | 平均 | 熟語 | 公民 | 日本地理 | 日本史 |
Qwen/Qwen2.5-32B | 0.84 | 0.96 | 0.92 | 0.87 | 0.62 |
abeja/ABEJA-Qwen2.5-32b-Japanese-v0.1 (*) | 0.91 | 0.97 | 0.94 | 0.96 | 0.77 |
PLaMo 100B (pfnet/plamo-100b) | 0.85 | 0.94 | 0.87 | 0.86 | 0.74 |
PLaMo 2 8B (pfnet/plamo-2-8b) | 0.85 | 0.97 | 0.87 | 0.85 | 0.71 |
PLaMo 2 31B | 0.90 | 0.97 | 0.92 | 0.93 | 0.78 |
(*) instruction tuned modelであるQwen/Qwen2.5-32B-Instruct をベースに継続事前学習を行ったモデルです。
PLaMo 2 31Bは、JMMLUの日本問題においてもPLaMo-100B, PLaMo 2 8Bを超える性能を発揮しました。
PLaMo 2ではデータセットとして英語データの翻訳データを使っていますが、これらによって日本語固有の知識が忘れられる・失われるということがなかったことがわかります。また、モデルサイズがPLaMo-100Bの1/3以下でありながら知識を問うベンチマークでより高い性能を発揮しているということは、データセットの高品質化により無駄なテキストが少なくなったことを示していると考えられます。
Qwen2.5-32BとPLaMo 2 31Bの性能差は日本語の学習量の違いに起因すると考えられます。日本問題の中でも、日本特有の知識の重要性が特に高い日本地理と日本史で性能差が開いていることからも日本語学習量の違いが2つのモデルの性能差の要因であることが見て取れます。
一方、ABEJA-Qwen2.5-32b-Japanese-v0.1 はPLaMo 2 31Bより若干高い性能を発揮しています。
これがどういった要因かは正確なことは不明ですが、plamo2-8bとllama-3.1-swallow-8bの違いと同様 データセットの差に起因するのではないかと考えています。ABEJA-Qwen2.5-32b-Japanese-v0.1は継続学習に日本語約70Bトークンを学習に利用しています。これはPLaMo 2 31Bで利用した日本語トークン数より小さいため、より強くフィルタリング等をかけて知識に重点をおいたものとなっているのではないかと予想しています。
FP8を利用した学習中に起きた問題について
PLaMo 2 31Bの事前学習では、今までの事前学習で起きなかった問題が発生しました。この問題について簡単に紹介します。
PLaMo 2の事前学習では1Bから31BまですべてFP8 (8bit floating point) を利用しています。これは31Bなどモデルが大きい際に学習を高速化するためです。1Bの学習ではFP8を使うメリットがどれだけあるかは疑問符がつくところですが、動作確認の意味も含めてFP8を使ってきました。
なお、FP8の利用方法の詳細はこの論文 やTransformer Engineのdocumentなどをご覧ください。
PLaMo 2 8Bまでの学習では特に問題なく利用できてきたのですが、PLaMo 2 31Bでは、1.5Tトークンほど学習したところで一部downstream taskの性能が大きく劣化するという問題が発生しました。
表6: 学習中のdownstream taskの推移
モデル | pfgen-bench | HumanEval+(0-shot, pass@1) | MMLU (5 shot, acc) |
1.3T token時点 | 0.8015 | 0.5549 | 0.6726 |
1.5T token時点 | 0.7052 | 0.3841 | 0.6694 |
上の表では、downstream taskを3つ抜粋して性能劣化前後の結果を示しました。全てのタスクで性能劣化しているものの、MMLUについては試行ごとのブレの範疇の可能性もある程度です。
性能が大きく低下したpfgen-bench、HumanEval+とMMLUでは、比較方法が大きく違います。pfgen-bench、HumanEval+は文章を生成するタスクである一方、MMLUはA/B/C/Dの4択の選択肢から正解をあてるタスクです。MMLUはchain of thought (CoT) をもちいない設定で評価したため、質問文に続く次のtokenがA/B/C/Dのどれであるかを予測するタスクとなっています。
すなわち、次のtokenを予測する能力はほとんど影響がない一方、複数のtokenを生成して文やコードを生成する能力は大きく落ちたということがわかります。
実際にpfgen-benchで生成されたテキストの例を以下に上げます。
**1.3Ttoken時点**
Q44. 走れメロスはどのような作品ですか? 1. 走れメロスは、太宰治による短編小説で、友情をテーマにした物語です。暴君に捕らえられたメロスが、親友との約束を果たすために走り続ける姿を通して、友情の大切さや人間の真の強さを描いています。 2. 走れメロスは、太宰治の短編小説で、友情と信頼をテーマにした作品です。主人公メロスが、妹の結婚式のためにお金を工面しようと奔走する中で、友人のセリヌンティウスを裏切りかけた後、再び信頼を取り戻すために走るという物語です。 3. 走れメロスは、太宰治の短編小説で、友情や信頼、自己犠牲をテーマにした感動的な作品です。親友を裏切って敵の王の元に行ったメロスが、王の言葉に従って走り続け、無事に友人のもとへ戻るまでの話が描かれています。 4. 走れメロスは、太宰治の短編小説で、友情をテーマにした物語です。主人公のメロスと友人のセリヌンティウスの友情の絆を描き、友情のために命を懸けるメロスの姿が感動的な作品となっています。 5. 走れメロスは、太宰治の小説で、1940年に「新潮」に掲載されました。メロスという青年が、友人の王を救うために走ったエピソードを描いた作品です。友情や信頼、正義などのテーマが込められており、教科書にも掲載されています。
**1.5Ttoken時点**
Q44. 走れメロスはどのような作品ですか? 1. 走れメロスは、太宰治の短編小説で、親友セリヌンティウスを救うために走った主人公メロスの物語です。友情と信頼がテーマの古典的名作で、国語教材としても広く読まれています。 2. 走れメロスは、太宰治の短編小説で、ギリシャの歴史的故事を元に創作された作品です。友情と信頼をテーマにした物語で、主人公メロスが、親友を人質にして走ることで信頼を証明し、友情の強さを示します。 3. 走れメロスは、太宰治の短編小説で、メロスが友のために時間と戦いながら約束を果たす物語です。人間の信頼と友情の尊さをテーマとし、1948年に雑誌『新潮』に発表されました。教科書にも掲載される名作です。 4. 走れメロスは、太宰治による小説で、1940年に「新潮」に掲載されました。メロスという青年が、親友の人質となって邪智暴虐の王に立ち向かい、友情を貫く姿を描いた作品です。太宰治の代表的な作品の一つです。 5. 『走れメロS物語 TOクオ</i> m{expr_val}(わ屋 活)は、、\nはい is 応の\nい-機種 1するistant
1.3Ttoken時点の出力では、ハルシネーションは見られます (例えば、”友人の王を救うために” など) が、日本語の文章を生成することはできています。
一方、1.5Ttoken時点の出力を見ると、1〜4までは1.3Ttokenの時と大差がありませんが、5では途中で完全に文が壊れてしまっています。他のケースでも、このように問題なく生成できる時はあるが突然文字化けしたような出力を出すこともある、という挙動が多数見られました。
この問題の原因調査の取り組みとして、PLaMo 2 31Bの学習では途中から計算精度をbfloat16に戻すこととしました。推論の時の量子化は、数学タスクのようなテキスト生成を必要とするタスクで悪影響を及ぼすことは既存研究で報告されています (例えば http://arxiv.org/abs/2501.03035 など)。同様に学習時の量子化も問題を起こしている可能性があると考えたためです。
bfloat16に切り替えて数十Btoken学習したところ、pfgen-benchは0.820、HumanEval+は0.555と適切なテキストを生成できていると考えられるスコアに戻っていました。
そのため、そのタイミングからbfloat16に切り替えてPLaMo 2 31Bの学習を継続することとしました。
grad normの値をみると、以下の図のようにbfloat16に切り替えてから値が大きくなるケースが見られました。このことから、FP8で計算した結果勾配が一部消失するといった問題がおきていたのではないかと予想しています。
図1: 学習中のgrad normの推移
一方、計算速度という観点だとやはりbfloat16にすることでFP8のときより遅くなってしまいました。この問題を解決するためには、MX FP8 のような細かい粒度で量子化を行い、量子化誤差を小さくしつつFP8を利用する工夫が必要となりそうです。
PLaMo 2の学習ではこのような実装は用意できませんでしたが、今後の事前学習で取り組んでいきたいと考えています。
最後に
今回は、GENIAC 第2期における事前学習の取り組みについて紹介しました。現在はこのモデルに対して事後学習などを進めています。
今後もLLMをはじめ様々な知見についてblog等で共有できればと考えています。
仲間募集中
PFN/PFEでは今後もLLMの開発を継続して行っていきます。開発は今回紹介した以外にも多岐に渡ります。我々はこれらの課題に情熱をもって挑戦していく仲間を募集しています。
これらの仕事に興味がある方はぜひご応募よろしくお願いします。
https://www.preferred.jp/ja/careers/
Appendix
JMMLUのdefaultにおけるprompt
JMMLUのdefaultで利用したpromptは以下の通りです。
選択問題 問題: 48以上88以下=?以上11以下が成り立つ数を求めよ。 A. 6 B. 11 C. 8 D. 5 回答: A … 問題: ペレスさんは5日間で合計40マイルを運転した。毎日同じ距離を走った。ペレスさんは毎日何マイルを運転したか。 A. 5 B. 7 C. 8 D. 9 回答:
JMMLUのcontinuationにおけるprompt
JMMLUのcontinuationで利用したpromptは以下の通りです。
選択問題 問題: 48以上88以下=?以上11以下が成り立つ数を求めよ。 回答: 6 … 問題: ペレスさんは5日間で合計40マイルを運転した。毎日同じ距離を走った。ペレスさんは毎日何マイルを運転したか。 回答:
MMLUのdefaultにおけるprompt
MMLUのdefaultで利用したpromptは以下の通りです。
The following are multiple choice questions (with answers) about elementary mathematics. The population of the city where Michelle was born is 145,826. What is the value of the 5 in the number 145,826? A. 5 thousands B. 5 hundreds C. 5 tens D. 5 ones Answer: A … What is the value of p in 24 = 2p? A. p = 4 B. p = 8 C. p = 12 D. p = 24 Answer:
MMLUのcontinuationにおけるprompt
MMLUのcontinuationで利用したpromptは以下の通りです。
The following are multiple choice questions (with answers) about elementary mathematics. The population of the city where Michelle was born is 145,826. What is the value of the 5 in the number 145,826? Answer: 5 thousands … What is the value of p in 24 = 2p? Answer:
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```", "<file_sep>", "\nimport", "\nfrom"]
HumanEval+
promptはhttps://huggingface.co/datasets/evalplus/humanevalplus のpromptをそのまま利用しました。
例を以下に示します。
from typing import List def has_close_elements(numbers: List[float], threshold: float) -> bool: """ Check if in given list of numbers, are any two numbers closer to each other than given threshold. >>> 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```", "<file_sep>", "\nimport", "\nfrom"]
WMT20のprompt
wmt20の評価は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 のものをそのまま利用しています。
Area
Tag