多くの企業がRAG(検索拡張生成)を導入し、一定の成果を上げています。しかし、運用が進むにつれて、「検索精度が頭打ちだ」「専門用語のニュアンスをモデルが理解していない」「推論速度が遅い」といった課題に直面する現場が増えています。皆さんのプロジェクトでも、似たような壁にぶつかっていませんか?
そこで次のステップとして検討されるのが、Llamaなどのオープンモデルに対する継続事前学習(Continual Pre-training / CPT)です。
CPTは、RAGやプロンプトエンジニアリングとは比較にならないほど難易度が高い取り組みです。単に社内のPDFやWikiを読み込ませれば賢いAIができるというのは大きな間違いです。
不適切なデータセットと学習設定でCPTを行うと、モデルは新しい知識を覚えるどころか、元々持っていた日本語能力や論理的思考力を失う「破滅的忘却(Catastrophic Forgetting)」を起こします。結果として残るのは、社内用語をなんとなく知っているだけの、文法も怪しい「壊れたモデル」です。これではビジネスの現場で使い物になりません。
本記事では、長年の開発現場で培った知見をベースに、失敗しないための継続事前学習の鉄則をお伝えします。特に、多くのプロジェクトでおろそかにされがちな「データエンジニアリング」と「データミキシング戦略」に焦点を当て、実用的なノウハウを共有します。
これは、単なるツールの使い方ではありません。会社の「知能」を設計し、ビジネスへの最短距離を描くためのエンジニアリングの神髄です。
なぜRAGやSFTではなく「継続事前学習」なのか:技術的必然性の証明
まず、プロジェクトの方向性が正しいかを確認しましょう。「とりあえず自社モデルを作りたい」という動機だけでは、コストに見合う成果は得られません。なぜSFT(Supervised Fine-tuning)やRAGではなく、計算リソースを大量に消費するCPTを選択するのか、その技術的な境界線を明確にします。経営者視点でも、このROI(投資対効果)の見極めは非常に重要です。
知識注入における3つのアプローチ(Prompt/RAG/Fine-tuning)の限界
AIモデルに知識を与えるアプローチは、大きく分けて3つあります。それぞれの技術的特性と限界を正しく理解することが重要です。
- インコンテキスト学習(Prompt Engineering / RAG): コンテキストウィンドウに関連情報を詰め込む方法。
- SFT(Instruction Tuning): 質問と回答のペアを学習させ、モデルの振る舞いを調整する方法。
- 継続事前学習(CPT): 大量のテキストデータを読み込ませ、モデルの内部パラメータ(重み)そのものに知識を焼き付ける方法。
「SFTを行えば知識が増える」というのはよくある誤解です。SFTは「話し方」や「タスクの解き方」を教えるプロセスであり、新しい「知識」を定着させる能力は極めて限定的です。最新のトレンドでは、強化学習を組み合わせた手法(RFTなど)も登場していますが、これらも主に指示追従性や推論プロセスを強化するものであり、知識ベースそのものを拡張するものではありません。SFTで無理やり知識を覚えさせようとすると、モデルは事実と異なる内容を自信満々に語る「ハルシネーション(幻覚)」を引き起こすリスクが高まります。
一方、RAGは外部知識を参照するため正確性は高いですが、検索システムの性能(Recall/Precision)に依存します。GraphRAGのような進化型RAGが登場したものの、毎回膨大なドキュメントを入力・処理すれば、推論コストとレイテンシ(遅延)は比例して増大し、リアルタイム性が求められる現場では致命的なボトルネックとなり得ます。
継続事前学習(CPT)がROIに見合う具体的シナリオ
では、どのような場合にCPTが必要になるのでしょうか。技術的な判断基準として、以下の要件が挙げられます。
- ドメイン固有の言語体系がある: 金融、法律、医療、あるいは社内独自の技術用語など、一般的なLLMの学習データに含まれていない言葉や概念が頻出する場合。
- 「暗黙知」の理解が必要: 文書化されたマニュアルだけでなく、社内チャットや日報に含まれる文脈、行間、組織文化といった非構造化データをモデルの「常識」として持たせたい場合。
- 推論速度とコストの最適化: 毎回RAGで大量のドキュメントを検索・入力するのではなく、モデル自体が知識を持っていることで、プロンプトを短縮し、高速なレスポンスを実現したい場合。
例えば、製造業の現場を想像してください。独自の製品仕様書や過去のトラブルシューティング事例が蓄積されているとします。RAGでは「キーワードが一致する事例」を検索することはできても、それらを統合して「この異音と振動のパターンなら、過去の傾向から見てベアリングの摩耗が疑わしい」という高度な推論を行うことは困難です。CPTを実施することで、モデルは製品構造や故障の因果関係を深く理解し、熟練エンジニアのようなアシスタントとして機能する可能性が開かれます。
独自ドメイン知識が「モデルの常識」になるメカニズム
CPTの本質は、モデルの確率分布を特定のドメインに適応させることです。
Llamaをはじめとする最新のオープンモデルは、インターネット上の膨大なテキストで学習しており、一般的な単語の共起確率を知っていますが、特定の業界特有の文脈における共起確率は学習していません。
CPTによりモデル内のニューロンの重みが微調整され、専門用語同士の結びつきが強化されます。これにより、RAGで外部情報を与えられなくても、「Aというエラーコードが出たらBのモジュールを確認する」といったドメイン固有の論理展開を自然に行えるようになります。
これが、RAGにはないCPT独自の価値です。外部参照(カンニング)ではなく、「直感」としての知識を獲得するのです。まるで、長年その現場で働いてきたベテラン社員のように振る舞うわけです。
成功の9割を決める「独自コーパス」構築のベストプラクティス
CPT(継続事前学習)プロジェクトが失敗する最大の要因は、アルゴリズムの選択ミスではありません。データの品質です。「Garbage In, Garbage Out(ゴミを入れればゴミが出てくる)」は、AI開発における絶対的な真理と言えます。
社内のファイルサーバーにあるドキュメントをそのまま結合して学習させることは避けるべきです。それはモデルに毒を盛るようなものであり、予期せぬ挙動を引き起こす原因となります。
「Garbage In, Garbage Out」を防ぐ前処理パイプライン
高品質な独自コーパスを作成するためには、厳格なデータ前処理パイプラインが不可欠です。一般的に推奨される基本的なステップは以下の通りです。
- テキスト抽出とレイアウト解析: PDF、PowerPoint、Excelなどからテキストを抽出します。ヘッダー、フッター、ページ番号、スライドの装飾文字などが混入すると、モデルはそれらを「重要な文脈」として誤って学習してしまう恐れがあるため、レイアウト解析が重要です。
- クリーニング: 不要な記号、文字化け、URL、HTMLタグなどを削除します。特に社内文書に頻出する「機密」「社外秘」といった定型句や、メールの署名、免責事項を正規表現などで徹底的に除去しなければ、生成されるテキストにこれらが頻出することになります。
- 重複排除(De-duplication): 同じ内容のドキュメントが複数回学習されると、特定のフレーズに過剰適合(Overfitting)し、汎用性を失う傾向があります。MinHash LSH(Locality Sensitive Hashing)などのアルゴリズムを用いて、完全一致だけでなく「ほぼ重複」している文書も検出し、削除することが推奨されます。
- PII(個人情報)削除: 社内データに含まれる社員の名前、電話番号、メールアドレスなどを学習させると、生成時に個人情報を出力するセキュリティリスクが生じます。PII抽出ツールを用いて、これらをエンティティタグ(例:
<NAME>,<EMAIL>)に置換するか、マスキング処理を行う必要があります。
ドキュメントの品質スコアリングとフィルタリング手法
クリーニングしたデータすべてが学習に値するわけではありません。中身のない日報や、システムが自動生成したログファイルなどはノイズとなり、モデルの学習効率を下げます。
そこで、「教科書品質フィルター」の実装が効果的です。これは、Wikipediaや高品質な技術書のような「整った文章」に近いかどうかを判定するアプローチです。
- 言語モデルの予測確率(Perplexity)による評価: 自然言語処理における「文章の複雑さ・予測困難度」を示す指標です。KenLMなどの軽量な言語モデルを用いてテキストのPerplexityスコアを計算し、異常に高い(ランダムな文字列に近い)または低い(単調な繰り返し)テキストを除外します。
- ヒューリスティック・ルールベース: 文の長さ、平均単語長、記号と文字の比率などを指標にします。「コードスニペットばかりで説明文がない」「箇条書きしかない」といったデータは、文脈理解を目的とする事前学習には不向きなケースがあります。
トークナイザーへの語彙追加(Vocabulary Expansion)の判断基準
LlamaやMistralなど、英語圏発の基盤モデルは多言語対応が進んでいますが、依然として日本語のトークン効率に課題を残す場合があります。日本語の1文字が複数のトークンに分割されてしまうと、学習効率が悪化し、貴重なコンテキスト長を浪費します。
特定のドメイン(医療、法律、製造業の専門用語など)に特化する場合、トークナイザーに専門用語や頻出する日本語単語を追加することを検討してください。
- メリット: トークン数が削減され、学習・推論速度が向上します。また、単語単位での意味表現が獲得されやすくなり、ドメイン固有の概念理解が進むことが期待できます。
- デメリット: 埋め込み層(Embedding Layer)と出力層のサイズが大きくなり、パラメータ数が増加します。また、追加した語彙の埋め込み表現をゼロから学習させる必要があるため、十分なデータ量が求められます。
データ量が数GB程度しかない場合は無理に語彙追加をする必要はありませんが、数十GB以上の日本語テキストがあり、専門用語が多用される環境であれば、語彙拡張はモデル性能を底上げする有効な手段となります。まずはプロトタイプとして小規模に動かして検証し、トークナイザーの仕様に合わせて慎重に判断することが重要です。
「破滅的忘却」を回避するデータミキシング戦略
独自データを学習させると、モデルは新しい知識を得る代わりに古い知識を忘れる「破滅的忘却(Catastrophic Forgetting)」が発生します。特に深刻なのが、日本語の流暢さや論理的推論能力の喪失です。
これを防ぐために実務の現場で標準的に採用されているのが「データミキシング(Replay戦略)」であり、最新のモデル調整においてもこのアプローチの重要性は変わりません。
一般データとドメインデータの黄金比率(Replay戦略)
独自データ(ドメインデータ)だけで学習させず、必ずモデルが元々学習していたような「一般データ」を混ぜて学習させます。
推奨する黄金比率はプロジェクトの規模やモデルの特性にもよりますが、一般的に「ドメインデータ:一般データ = 8:2」から「9:1」程度が目安とされています。少なくとも10%程度は一般データを含めるべきです。
- 一般データの内容: Wikipedia(日本語・英語)、CC-100、mC4などの高品質なオープンデータセットを使用します。数学やプログラミングコードのデータセットを含めることで、論理的思考能力の低下を防ぐ効果があることが知られています。
- 英語データの維持: Llamaを含む多くのLLMは英語がベースです。日本語能力を高めたい場合でも、英語データを一定量混ぜることで、モデルの基礎的な推論能力を維持できます。
カリキュラム学習的なデータ投入順序
データの混ぜ方にも工夫が必要であり、段階的に学習させる「カリキュラム学習」の考え方が有効です。
- フェーズ1: 一般データ多め、ドメインデータ少なめで開始し、モデルを「学習モード」に慣らす。
- フェーズ2: 徐々にドメインデータの比率を高めていく。
- フェーズ3(アニーリング): 最後は高品質なドメインデータ(Q&A形式や教科書的な記述)に絞って仕上げる。
ただし、複雑なスケジュールを組むと管理が難しくなるため、実務的には「全データをシャッフルして、エポックごとに同じ比率で学習させる」方法でも十分な結果が得られることが多いです。アジャイルに開発を進めるなら、まずはシンプルな手法で素早く検証を回すことをお勧めします。重要なのは、常に一般データが混ざっている状態を維持することです。
正則化項による重み変動の抑制
データレベルの対策に加え、学習前のモデルの出力分布と学習中のモデルの出力分布が大きく乖離しないように制約をかける(KLダイバージェンス正則化)手法もあります。
しかし、これは実装難易度が高く計算コストも増えるため、まずはデータミキシング戦略を徹底することが最もコストパフォーマンスの良いアプローチです。依然としてデータセットの質と構成比率がモデル性能を左右する最大の要因であるとされています。
学習効率を最大化するハイパーパラメータ設定とインフラ
データセットの構築が完了したら、次は学習フェーズです。継続事前学習(CPT)は一般的な微調整(SFT)とは全く異なるアプローチが必要であり、SFTの設定をそのまま流用するとプロジェクトは失敗に終わります。
フルパラメータチューニング vs LoRA/GaLoreの選択基準
モデルの全パラメータを更新する「フルパラメータチューニング」は理論上最も高い性能を引き出せますが、Llamaの70Bクラス以上をフルで学習させるには最新のハイエンドGPUが複数台、場合によっては数十台規模で必要となり、インフラコストが甚大です。
そこで、リソース制約下での現実的な解として、以下のパラメータ効率化手法(PEFT)の採用を検討してください。
LoRA(Low-Rank Adaptation)の最新アプローチ:
かつてのLoRA設定(Attention層のみ、低ランク)はCPTのような「新しい知識の注入」には不向きであることが判明しており、現在のベストプラクティスでは以下の設定が推奨されます。- 対象モジュール: Attention層だけでなく、全ての線形層(All Linear Layers / MLP層含む)を対象にしてください。知識は主にMLP層に蓄積される傾向があるため、ここを更新しないと学習効果が限定的になります。
- ランク設定(r値): 新しい知識を受け入れる容量(キャパシティ)を確保するため、SFT時よりも高い値(例:r=64, 128, 場合によっては256)を設定します。
- 発展形の手法(DoRA等): 重みの大きさと方向を分解して学習するDoRA(Weight-Decomposed Low-Rank Adaptation)などが登場しており、従来のLoRAよりもフルパラメータ学習に近い性能を示すケースが報告されています。精度を重視する場合の有力な選択肢です。
GaLore(Gradient Low-Rank Projection):
LoRAよりもさらにメモリ効率が良く、フルパラメータ学習に近い性能が出るとされる手法です。勾配を低ランクに射影することでオプティマイザの状態(Optimizer States)が消費するメモリを大幅に削減し、VRAMリソースが厳しい環境でのCPTにおいてLoRAの強力な代替手段となります。
専門家の視点: 予算と計算リソースが許すならフルパラメータがベストですが、コスト対効果を考えると、「全モジュール対象の高ランクLoRA(またはDoRA)」あるいは「GaLore」が現代のCPTにおける現実的な最適解です。
学習率(Learning Rate)のウォームアップとスケジューリング
学習率の設定はモデルの寿命を左右します。ゼロからの事前学習(Pre-training)とは異なり、CPTではモデルは既に言語能力を持っているため、過度な更新は既存の知識を破壊する「破滅的忘却」を招きます。
- 最大学習率の設定: 一般的に、元の事前学習時の1/10から1/100程度(例:1e-5 〜 5e-5)に抑えるのが鉄則です。
- スケジューリング: コサイン減衰(Cosine Decay)が標準的です。学習の終盤に向けて学習率を滑らかに下げていくことで、収束を安定させます。
- ウォームアップ: 学習初期の勾配爆発や不安定さを避けるため、最初の数%のステップ(例:全ステップの1〜3%)を使って徐々に学習率を上げてください。
分散学習(FSDP/Deepspeed)の実装構成例
数十億〜数千億パラメータのモデルを扱う場合、単一GPUでの学習は困難であり、分散学習技術の導入は避けて通れません。
- FSDP(Fully Sharded Data Parallel): PyTorch標準の分散学習機能です。モデルのパラメータ、勾配、オプティマイザの状態を複数のGPUに分割(シャーディング)して配置し、巨大なモデルでもメモリオーバーフローを起こさずに学習可能です。
- DeepSpeed: Microsoftが開発した深層学習最適化ライブラリです。ZeRO(Zero Redundancy Optimizer)ステージ設定により、メモリ効率と通信速度のバランスを細かく調整できます。
バッチサイズと勾配蓄積:
学習の安定性と速度には十分なバッチサイズ(Global Batch Size)が必要です。GPUメモリの限界で物理的なバッチサイズを大きくできない場合は、Gradient Accumulation(勾配蓄積)を活用してください。複数ステップ分の勾配を溜めてからパラメータ更新を行うことで、仮想的に数百万トークン規模の大きなバッチサイズを実現できます。
定量評価:Lossの減少だけでは見えない「真の性能」を測る
学習が進むにつれてTraining Loss(学習損失)は下がっていきますが、Lossが下がったからといって良いモデルになったとは限りません。モデルが単にデータを丸暗記しているだけかもしれないし、日本語能力が崩壊しているかもしれません。
学習データと評価データのリーク厳禁
評価用データ(Validation Set)は学習データから完全に除外しておかなければなりません。さらに、評価データは「学習データと似すぎているもの」も避け、未知のデータに対してどれだけ汎化できているかを見る必要があります。
多肢選択式問題(MCQA)による知識定着度測定
ドメイン知識が定着したかを測るには、Perplexity(次単語予測の正確さ)だけでは不十分であり、独自に作成した多肢選択式問題(MCQA)やQ&Aタスクでの評価が有効です。
例えば、社内マニュアルから「この装置のLEDが赤点滅している原因は?」という問題と正解を作成し、モデルに解かせます。この正答率(Accuracy)こそがビジネス的な価値指標になります。
汎用ベンチマーク(JGLUE等)での劣化確認
同時に、「破滅的忘却」が起きていないかをチェックします。JGLUE(日本語の言語理解ベンチマーク)などの公開ベンチマークを用いて、学習前と学習後のスコアを比較します。
- もしドメイン知識のスコアが上がっても、JGLUEのスコアが大幅に下がっていたら、そのモデルは「専門バカ」になっており、会話が成立しない恐れがあります。
- 許容できる劣化の範囲(例えば5%以内など)を事前に定めておき、それを超えた場合はデータミキシング比率や学習率を見直すサイクルを回します。ここでも「まず動かして検証する」というアジャイルな姿勢が、最終的なモデルの品質を高めます。
まとめ:自社専用モデル構築は「総合格闘技」である
継続事前学習(CPT)は、単にGPUを回せば終わるタスクではありません。データの収集・選別・加工、インフラの構築、学習パラメータの調整、そして厳密な評価がすべて高いレベルで噛み合って初めて、実用的な「自社専用モデル」が誕生します。
特に強調したいのは、「データエンジニアリングへの投資を惜しまないこと」です。アルゴリズムは日進月歩で変わりますが、磨き上げられた独自データセットは会社の永続的な資産になる可能性があります。
RAGの限界を超え、モデル自体に知能を宿らせるこのアプローチは、AI活用のステージを一段引き上げる一手です。リスクはありますが、正しい手順を踏み、スピーディーに仮説検証を繰り返せば、そのリターンは計り知れません。皆さんのプロジェクトでも、ぜひこの「総合格闘技」に挑戦してみてください。
コメント