0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルLLMを使う 第1回:仕組みを知る――モデルファイル・学習・多言語とメモリ

0
Posted at

LLMを自分のパソコンで動かそうとすると、いくつもの疑問が出てきます。

「実行プログラムとモデルファイルは別なのか」「日本語で知識を教えたら英語でも使えるのか」「対応言語が多いほどメモリを使うのか」「後からタイ語を使いたくなったら何を足すのか」。

さらに、LLM自体がどのように作られるのかを考えると、「毎回ゼロから開発するのか」「学習データは秘伝のタレのように改良されるのか」という疑問につながります。

この記事では、これらを順番に整理します。対象は、主に文章を生成する一般的なLLMです。製品やモデルによって構成は異なるため、特定のソフトの導入手順ではなく、仕組みを理解するための説明とします。

1. LLMとは何か

LLMは、Large Language Model(大規模言語モデル) の略です。

「Large」は対応言語の多さではなく、モデルの規模を指します。多言語であることはLLMの定義ではありません。特定の言語を中心に学習したLLMもあります。

言語モデルとは、文章中の言葉の並びを学習し、その文脈でどのような言葉が続くかを扱うモデルです。文章生成に使うLLMでは、入力された文章に続くトークンを順に生成します。

トークン は、文章を処理するための小さな単位です。単語そのものとは限らず、単語の一部分、記号、文字などになることもあります。どのように区切るかはモデルの仕組みによります。

LLMは大量の文章から、言葉の使い方だけでなく、事実に関するパターンや概念の関係、説明や問題解決のパターンも学びます。ただし、学習したからといって、すべての事実を正確に保持したり、毎回正しく答えたりするわけではありません。

2. 実行プログラムとモデルファイルは別のもの

ローカルでLLMを使う場合、まず次の区別が必要です。

ローカル とは、ここでは自分のパソコン上で処理することです。

構成要素 役割 内容の例
実行プログラム モデルを読み込み、計算して回答を生成する Ollamaなどの実行ソフト
モデルファイル 学習済みの数値を保存する 重みデータ、設定、トークナイザー関連データなど
自分のアプリケーション 入力画面や業務処理を用意する チャット画面、資料検索、翻訳との接続など

パラメータは実行プログラムとは別のファイルに保存される、という理解でよい です。ただし、配布形式によって、一つのファイルにまとめられていたり、複数のファイルに分かれていたりします。

例えば、同じ実行ソフトでも、読み込むモデルを替えれば違うLLMを動かせます。一方で、モデルファイルだけを手に入れても、それを読み込める実行環境がなければ回答は生成できません。

プログラマー向けに言えば、「計算を行うコード」と「そのコードが利用する学習済みデータ」を分けて考えると理解しやすくなります。

3. パラメータは何を保存しているのか

パラメータ は、ニューラルネットワークの中で学習によって調整される数値です。特に重みと呼ばれる数値が大部分を占めるため、モデルの話では「パラメータ」と「重み」が近い意味で使われることがあります。

ニューラルネットワーク は、入力された数値を、重みを使った計算や変換に繰り返し通して、出力を求める仕組みです。

学習するときは、望ましい予測に近づくように、この数値を調整します。利用するときは、学習済みの数値を読み込み、入力に対する計算を行います。この利用時の処理を 推論 と呼びます。

3.1 モデルファイルは普通のデータベースとは違う

モデルファイルを「学習結果を保存したデータ」と考えるのは適切です。ただし、普通のデータベースのように、「質問Aに回答B」というレコードが並んでいるわけではありません。

知識や言語のパターンは、多数の数値の組み合わせに分散して反映されています。したがって、「タイ語のテーブルを削除する」「日本語のレコードだけ残す」という操作で言語を切り分けることは、一般的なモデルではできません。

また、学習用の文章をそのまま全部保存しているわけではありません。ただし、文章の一部を記憶し、似た形で出力してしまう場合はあります。

3.2 同じパラメータ数でも中身は違う

例えば、パラメータ数が同じ二つのモデルでも、学習データや学習方法が違えば能力は違います。

日本語が得意なモデル、プログラミングが得意なモデル、翻訳が得意なモデルが、同じくらいのファイル容量で存在することもあります。

ファイルの大きさだけでは、得意な言語や分野は分かりません。 モデルの説明、評価結果、自分の用途での試用を確認する必要があります。

4. ファイル容量とメモリ使用量の関係

ここでは三つを区別します。

種類 何を置くか いつ使うか
ディスク容量 ダウンロードしたモデルファイルなど 保存している間
RAM モデルや処理中のデータ CPUでの処理など
GPUメモリ(VRAM) GPUが計算するモデルや処理中のデータ GPUでの処理

機種によってはCPUとGPUがメモリを共有します。Apple SiliconのMacなどでは、その構成も考慮します。

4.1 パラメータ数と保存精度で容量が変わる

重みデータの容量は、概算では次の関係になります。

重みの容量 ≒ パラメータ数 × 1パラメータ当たりの保存ビット数 ÷ 8

説明用に、80億パラメータの重みをすべて同じ精度で保存すると仮定すると、次のようになります。

保存精度 重みだけの理論上の概算容量
16bit 約16GB
8bit 約8GB
4bit 約4GB

ここでは1GBを10億バイトとして計算しています。実際のファイルには管理情報や量子化用の追加データなどが含まれ、一部が別の精度で保存される場合もあるため、この表と一致するとは限りません。

量子化 は、重みなどをより少ないビット数で表す方法です。容量やメモリ使用量を減らせますが、方式やモデルによって精度への影響が異なります。参考:Hugging Faceの量子化解説

4.2 ファイル容量と必要メモリは同じではない

推論には、モデルの重みに加え、計算用の領域や会話の処理に使うデータも必要です。

例えば、生成中に過去のトークンに関する計算結果を保持する KVキャッシュ という領域があります。通常、扱う文脈が長くなるほど、このような処理用メモリも増えます。実際の増え方はモデルや実行方法によります。

そのため、「4GBのモデルだから、空きメモリも4GBあれば十分」とは限りません。参考:Hugging Faceのキャッシュ解説

5. LLMはどう作られるのか

文章生成LLMの代表的な学習の流れを見ていきます。

5.1 学習用の文章を集めて整理する

書籍、Web上の文章、コード、専門分野の資料など、目的に合ったデータを準備します。実際に利用するデータは開発者や利用条件によって異なります。

収集したデータは、重複や不要な部分の除去、形式の統一、品質の確認などを行います。単に量を増やすだけでなく、どの分野や言語をどれくらい含めるかも決めます。

5.2 文章をトークンの番号列に変える

文章を区切り、各トークンを番号に変換する仕組みを トークナイザー と呼びます。

モデルは文章をそのまま読んでいるのではなく、この番号列を数値表現に変えて計算します。

5.3 モデルの構造を決める

多くの文章生成LLMでは Transformer というニューラルネットワークの構造を使います。

Transformerの主要な仕組みである Attention は、文脈中のどの部分をどれくらい参照するかを計算します。文章中の離れた言葉の関係を扱うのにも使われます。

層の数、内部の数値表現の幅などを決めると、パラメータ数も決まってきます。

5.4 次のトークンを予測し、パラメータを調整する

例えば、学習文章に「猫が魚を食べた」とあれば、途中までの文章から次のトークンを予測する問題を作れます。

モデルの予測と実際の続きとの差を数値化したものを 損失(Loss) と呼びます。損失を減らす方向を計算し、パラメータを少しずつ更新します。

この流れを大量の文章で繰り返すのが、代表的な文章生成モデルの 事前学習(Pretraining) です。学習は大量の数値計算として実行されます。参考:Hugging Faceのゼロからの言語モデル学習

5.5 質問や指示に答えるよう調整する

文章の続きを生成する能力と、利用者の指示に沿って役立つ回答をする能力は、完全には同じではありません。

そこで、質問と望ましい回答の例で調整する 指示チューニング や、回答の好ましさに関する評価を利用する調整などを行います。こうした事前学習後の調整をまとめて 事後学習(Post-training) と呼ぶことがあります。

5.6 学習済みモデルを保存して配布する

学習済みの重みを、必要な設定やトークナイザー関連データとともに保存します。利用者がダウンロードするのは、主にこの成果物です。

利用するPCに合わせて量子化した版を配布することもあります。学習用の文章そのものが、モデルと一緒にすべて配布されるとは限りません。

6. 学習にはどこまで人間の手が必要か

人間の作業は必要ですが、一問ずつ正解を教えているわけではありません。

次のトークンを予測する学習では、文章の実際の続きが正解になります。データから学習問題を自動で作れるため、すべての問題に人間が正解ラベルを付ける必要はありません。これを 自己教師あり学習 と呼びます。

人間が主に担うこと コンピューターが主に担うこと
学習の目的や構造を決める トークン列から学習問題を作る
データを選び、品質を管理する 予測と損失を計算する
学習条件を決める パラメータを更新する
結果を評価し、改善方針を決める 大量の処理を繰り返す

質問への回答例を作ったり、回答同士を比較して評価したりする作業では、人間の判断も使われます。AIが生成したデータを利用する場合もありますが、生成させるだけで品質が保証されるわけではありません。

ここでいう アノテーション は、データに分類や評価などの情報を付ける作業です。LLM開発のすべてがアノテーションというわけではありません。参考:Hugging Faceの学習の解説

7. ゼロからの学習と、既存モデルの改良

「スクラッチから作る」という表現には、区別すべき二つの意味があります。

7.1 パラメータを初期化して学習する

学習済みの重みを引き継がず、初期値からモデルを学習させることです。これが、モデルをゼロから学習するという意味です。

ただし、既存のプログラム、計算設備、データ処理の仕組み、学習手順まで捨てるわけではありません。これらは再利用できます。

7.2 学習済みの重みを引き継いで改良する

すでに学習したモデルを出発点として、さらに学習する方法です。

方法 主な目的
継続事前学習 追加の文章から分野や言語などをさらに学ぶ
ファインチューニング 特定の用途や回答の仕方に合わせて調整する
LoRAなどの手法 少ない追加パラメータを学習して調整する

LoRA は、元の重みを固定して、比較的小さな追加パラメータを学習する代表的な手法です。追加部分はアダプターとして配布される場合があります。ただし、基本的に対応する元モデルが必要で、どのLLMにも使える汎用の追加パックではありません。参考:LoRAの研究論文

7.3 ノウハウを再利用しても、大規模学習は高コスト

「毎回、開発者がすべてをゼロから作業するわけではない」は正しい理解です。

一方、「だから大規模LLMの開発はそれほど大変ではない」とは言えません。手順が分かっていても、大量の計算、データ処理、実験、評価には時間と費用が必要です。

また、新しいモデルがすべて前のモデルの追加学習版というわけでもありません。構造を変更して初期値から学習することも、既存の重みを引き継ぐこともあります。各社の個別の開発方法は、公開資料で確認できる範囲で判断する必要があります。

8. 学習データは「秘伝のタレ」に似ている

学習データを「秘伝のタレ」に例えると、継続的な改良を理解しやすくなります。

例えば、次のような調整が考えられます。

  • 有用なデータを残す。
  • 重複や低品質なデータを除く。
  • 不足している分野や言語のデータを加える。
  • データの配分や学習させる順番を調整する。
  • 評価で見つかった弱点に対応する。

蓄積されるのはデータだけでなく、「何を選ぶか」「どの割合で混ぜるか」「どう評価するか」というノウハウです。

ただし、単純に古いデータへ新しいデータを足し続けるとは限りません。目的によっては、大幅に入れ替えたり、別のデータセットを作ったりします。

比喩を整理すると、次のようになります。

比喩 LLM開発で対応するもの
改訂される教科書 学習データ
改良される教育方法 学習手順や条件
学習後の脳の状態 学習済みパラメータ
新しい脳に最初から教える 初期値からの学習
育った脳にさらに教える 既存モデルの追加学習

「脳死して生き返る」という表現より、「教科書と教育方法を引き継いで、新しい脳を育てる」と表すほうが、初期値からの学習を説明しやすいでしょう。もちろん、LLMと人間の脳が同じ仕組みだという意味ではありません。

9. 多言語モデルは言語ごとに別の脳を持つのか

一般的な多言語LLMでは、複数の言語が同じニューラルネットワークの重みを使います。「日本語の脳」「英語の脳」「タイ語の脳」が独立したデータベースとして並んでいるわけではありません。

言語をまたいで共有される概念もあります。Anthropicの研究では、Claudeに異なる言語で質問した際、共通の概念に対応する内部の特徴が働く例が示されています。

ただし、この結果から「すべてのモデルが、すべての知識を、完全に言語非依存で扱う」とまでは言えません。言語に固有の処理もあり、言語ごとの能力差もあります。参考:Anthropicの多言語に関する分析

日本語で学んだ内容を英語で使えることはあるが、必ず同じ精度で使えるとは限らない、というのが実用上の理解です。

10. 日本語のQAや資料を、ほかの言語でも使えるか

ここで「知識を教える」という言葉を三つに分けます。この違いは、自分のQAシートを用意するときにも大切です。

QAシート は、質問(Question)と回答(Answer)を組にした資料です。同じ形式でも、学習用と評価用では役割が違います。

10.1 回答時に資料を渡す

質問と一緒に資料を入力して、モデルに参照させる方法です。通常、この操作だけでは学習済みパラメータは更新されません。

大量の資料から関連部分を検索し、質問と一緒にモデルへ渡す方法を RAG(Retrieval-Augmented Generation、検索拡張生成) と呼びます。

知識は外部の資料として保存されるため、資料を更新したり、利用するLLMを替えたりしやすくなります。ただし、検索方法や接続部分の調整は必要です。

外国語の質問から日本語の資料を検索する場合は、言語をまたいだ検索に対応した方法も必要です。生成するLLMが多言語対応でも、資料検索が自動的に多言語対応になるとは限りません。参考:RAGの研究論文

10.2 QAなどで追加学習する

QAを使ってモデルを追加学習する方法です。こちらは重み、またはLoRAなどの追加パラメータを調整します。

ただし、少量のQAを学習させればすべての事実を正確に覚える、という保証はありません。ファインチューニングは、回答形式や業務上の振る舞いの調整にも使われます。

10.3 QAで性能を評価する

QAを正解集として用意し、モデルの回答と比較する方法です。評価用のQAを用意すること自体は、追加学習ではありません。

学習用データと評価用データは分けます。学習に使った質問だけで評価すると、初めての質問にも答えられるかが分かりにくくなるためです。

10.4 日本語で用意してよいか

日本語の資料やQAを中心に用意して、英語などでも回答できるか確認する進め方は可能です。最初からすべての資料を各言語に複製する必要があるとは限りません。

一方で、実際に英語やタイ語で利用するなら、その言語の質問で確認します。知識を正しく使えるか、専門用語が通じるか、意図や回答内容が変わらないかを見ます。

外国語の評価問題を作ることと、学習資料を全部翻訳することは別です。 評価で弱点が見つかってから、追加データや検索方法の改善などを検討できます。

11. 後から言語を増やす方法と翻訳モデル

11.1 今のLLMが対応していれば追加不要

今のモデルが中国語、韓国語、タイ語を十分扱えるなら、その言語で質問し、直接回答させられます。使う言語を増やすだけで、新しいモデルをダウンロードする必要はありません。

11.2 対応が弱い場合の選択肢

方法 今のモデルはどうなるか 注意点
別の多言語モデルへ替える モデルを入れ替える 元モデルへの追加学習やアダプターをそのまま移せるとは限らない
今のモデルに追加学習する 重みや追加パラメータを調整する データと計算が必要。既存能力への影響を評価する
外側に翻訳処理を足す 元モデルの重みはそのまま使う 翻訳モデルなどの追加構成と接続処理が必要

一般的なLLMに共通して使える「タイ語の言語パック」がある、という仕組みではありません。対応する元モデル向けのアダプターが提供される場合はありますが、互換性と性能の確認が必要です。

11.3 翻訳処理を足す場合

外国語の質問を日本語に翻訳し、今のLLMに回答させ、その回答を外国語に翻訳します。

  1. 利用者がタイ語で質問する。
  2. 翻訳モデルが質問を日本語にする。
  3. 今のLLMが日本語で回答する。
  4. 翻訳モデルが回答をタイ語にする。
  5. 利用者へタイ語で表示する。

この方式なら、翻訳の追加によって元モデルの重みが変更されることはありません。ただし、意味が翻訳でずれる可能性があり、翻訳処理の時間も増えます。

11.4 翻訳AI本体と呼び出しプログラムは別

構成要素 役割
翻訳モデル 実際に翻訳を行う学習済みデータ
実行ソフト 翻訳モデルを読み込んで動かす
接続プログラム 翻訳結果を今のLLMへ渡し、回答を再び翻訳へ回す

Ollamaは実行ソフトの例で、モデルを呼び出すAPIも提供します。API は、プログラムから機能を呼び出すための窓口です。翻訳モデルの例としてTranslateGemmaがあります。参考:Ollama API、TranslateGemmaの公式紹介

ただし、Ollamaと翻訳モデルを入れただけで、既存LLMとの往復の翻訳処理が自動で完成するわけではありません。その流れを接続するプログラムや、対応するアプリケーションが必要です。

新しく用意する構成例では、「実行ソフトをダウンロード」「翻訳モデルをダウンロード」「接続コードを追加」となります。すでにある実行環境を共用できる場合や、接続機能がアプリにある場合もあります。配布ファイルの分割もあるため、ダウンロードするファイル数を一律に断定することはできません。

中国語・韓国語・タイ語を一つの翻訳モデルで扱えるなら、言語ごとにモデルを三つ用意する必要はありません。ただし、必要な翻訳方向と品質は、そのモデルの説明と実際の試用で確認します。

11.5 PC内の翻訳と外部APIの違い

翻訳する場所 PC側に必要なもの メモリとの関係
自分のPC 翻訳モデル、実行環境、接続処理 翻訳モデルを読み込む分のメモリが必要
外部サービス APIを呼び出す接続処理 翻訳モデル本体をPCへ読み込む必要はない

外部APIでは通信が必要で、利用条件や費用、送信するデータの扱いも選択に関係します。

安定して動かすには、接続処理で失敗への対応や待ち時間の管理を行い、使うPCで動作を確認します。「処理が止まらないこと」と「翻訳が正しいこと」は別々に評価します。

12. 言語数によってメモリ使用量は増えるのか

ここは、二つの話を分けると明確になります。

12.1 同じ多言語モデルで使う言語を増やす

同じモデルがすでに扱える言語を使うだけなら、日本語だけの利用から、日本語・中国語・韓国語・タイ語の利用へ変えても、重みを保存するためのメモリが言語数に比例して増えるわけではありません。

多言語の能力は、そのモデルの重みにすでに反映されています。「一言語追加するたびに、その言語用の重みを別途読み込む」という構成ではありません。

対応言語を減らせば自動的に軽くなるわけでもありません。 同じパラメータ数と保存精度であれば、多言語モデルと特定言語を中心にしたモデルで、重みの容量が近くなることもあります。

12.2 翻訳モデルを別に追加する

元のLLMに加えて翻訳モデルも同時に読み込むなら、追加モデルの分だけメモリを使います。

ただし、一つの翻訳モデルが三言語に対応していれば、その中で使う言語を一つから三つに増やすだけで、モデルのメモリが三倍になるわけではありません。

変更 メモリへの影響
同じモデルでタイ語も使い始める 言語追加だけで重み用メモリは増えない
別の翻訳モデルを追加して同時に読み込む 追加モデルと処理用領域の分が増える
言語ごとのモデルを複数同時に読み込む 読み込むモデルの分が増える
モデルを交互に読み込み、前のモデルを解放する 同時使用量を抑えられるが、読み込みの待ち時間が生じる

12.3 メモリも速度も完全に一定、ではない

同じ内容でも、言語やトークナイザーによってトークン数が変わります。そのため、文章を処理する時間や、会話に使うキャッシュの容量は変わることがあります。

また、同時に多数の質問を処理すれば、処理用メモリも増えます。

正確には、「言語の種類が増えたから、その数だけモデル用メモリが増えるわけではない。ただし、実際の文章量や実行方法によって負荷は変わる」 ということです。

13. 自分の用途で考える順番

ローカルLLMを使う計画では、次の順番で整理すると選びやすくなります。

  1. 目的を決める。 会話、専門資料への回答、翻訳、コード生成など、何をさせたいかを決めます。
  2. 使う言語を決める。 将来使いたい言語も候補に含め、言語数の少なさより実際の性能を見ます。
  3. PCの条件を確認する。 RAM、GPUメモリ、モデルの規模、量子化方式を照らし合わせます。
  4. 独自の知識をどう使わせるか決める。 資料を渡す、RAGで検索する、追加学習する方法を区別します。
  5. 実際の質問で評価する。 日本語だけでなく、利用する外国語でも確認します。
  6. 弱い部分に対応する。 モデルの変更、資料検索の改善、追加学習、翻訳の追加などを検討します。

独自の資料やQAを整理して使うことと、LLMをゼロから作ることは別の作業です。多くの用途では、まず学習済みモデルを使い、自分の目的に必要な構成を足すところから始められます。

14. 用語一覧

用語 意味
LLM Large Language Model。大規模言語モデル
ローカル 自分のPCなど、手元の環境で処理すること
モデル 入力から出力を計算する構造と、その計算に使う学習済みの数値など
パラメータ 学習によって調整される数値
重み ニューラルネットワークの計算に使う主要なパラメータ
トークン 文章を処理するための小さな単位
トークナイザー 文章とトークンの番号列を対応させる仕組み
Transformer 多くのLLMで使うニューラルネットワークの構造
Attention 文脈中の各部分をどれくらい参照するか計算する仕組み
推論 学習済みモデルを使って出力を求める処理
事前学習 大量のデータで基礎的な能力を学ぶ段階
自己教師あり学習 入力データから学習の正解を作る学習方法
損失 予測の誤差や学習目標とのずれを数値化したもの
ファインチューニング 学習済みモデルを用途に合わせて追加学習すること
指示チューニング 指示と回答の例などで、指示に沿うよう調整すること
事後学習 事前学習後に行う、用途や振る舞いなどの調整
LoRA 元の重みを固定して、少ない追加パラメータを学習する手法
量子化 数値を少ないビット数で表し、容量などを減らす方法
RAM CPU側などで利用する主記憶メモリ
VRAM GPUが利用するメモリ
KVキャッシュ 生成中に過去のトークンの計算結果を保持する領域
QA Question and Answer。質問と回答の組
RAG Retrieval-Augmented Generation。検索した資料を使って回答を生成する方法
API プログラムから機能を呼び出すための窓口
アノテーション データに分類や評価などの情報を付ける作業

15. 参考資料

各節の説明をさらに確認するための資料です。モデルごとの具体的な仕様は、そのモデルの公式説明も確認してください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?