本稿は、LLM(大規模言語モデル)に対するファインチューニングとは何か、ファインチューニングがモデルの中で何をする作業なのかを説明する記事です。読者が読み終えたときに、ファインチューニングに関する設定を読み取れるようになることを目指しています。
「ローカルLLMにISMSの適合状況評価を支援させる」の第5回「第5回 ローカルLLMに答え方を教え込むファインチューニング」で、次の設定を記載しました。Llama 3.1-8Bというモデルに、規格の要求ごとの判定の書き方を学習させたときの設定です。
| 項目 | 値 |
|---|---|
| ベースモデル | Llama 3.1-8B Instruct(4bit量子化版) |
| 学習環境 | Google Colab・GPU L4 |
| 手法 | QLoRA(LoRA r=16 / alpha=16) |
| 最大長 | 三工程とも2048トークン |
| エポック | 2 |
| 所要 | 三工程それぞれ31〜32分 |
| 変換後の大きさ | 1工程あたり4.58GB(GGUF q4_k_m) |
手法の欄にあるQLoRA(LoRA r=16 / alpha=16)のrとalphaが何を16にした値なのか、エポックの2が何を2回行った数なのか。読者がこの表を読み取れるかどうかは、ファインチューニングがモデルの中で何を動かす作業なのかを知っているかどうかで決まります。
とくに中心になるのが、「差分」という言葉です。上の表で示すQLoRAは、元のモデルには手を加えず、差分だけを学習する手法です。その差分が何と何の差なのかが分かれば、表の複数の行が一つの説明でつながります。
本稿の前半では、ファインチューニングの仕組みを説明します。後半では、その説明をもとに、この表の各項目が何を決めているかを示します。
1. モデルの中身は、膨大な数値の集まりです
ファインチューニングが何をする作業なのかを述べる前に、その対象であるLLMが何でできているかを説明します。
LLMは、2つの部分でできています。1つは、計算の手順です。入力された文章をどう数値に変換し、どの順序で掛け算と足し算を行い、最後に何を出力するか。この手順は、モデルを設計した時点で決まっており、使用しているあいだ変わりません。
もう1つは、その計算に用いる数値です。計算の各段階に、掛け合わせる数と足し合わせる数が用意されています。この数値を、パラメータと呼びます。
LLMが文章を書く手順は、次のとおりです。
- 入力された文章を、単語に近い細かさで区切り、それぞれを数値の列に置き換えます。
- その数値の列にパラメータを掛け合わせ、足し合わせる計算を、何段にも重ねて行います。
- 2.の計算で、入力された文章の次に来る区切り1つ分の候補それぞれについての点数を算定します。
- 点数の高い候補を1つ選び、入力の末尾に加えて、同じ計算をもう一度行います。
- この繰り返しによって、文章が1区切りずつ書かれていきます。
計算の手順は、どのモデルでも大きくは変わりません。候補の点数を決めているのは、掛け合わせ、足し合わせで使用するパラメータの値です。同じ手順で同じ文章を入力しても、パラメータの値が違えば、選ばれる候補が変わり、返ってくる答えが変わります。LLMがどう答えるかは、パラメータの値によって決まっています。
表のベースモデルの欄にある「8B」は、このパラメータの個数です。Bは英語のbillion(10億)の頭文字で、Llama 3.1-8Bには、およそ80億個のパラメータがあります。
80億個のパラメータの値は、人が1つずつ決めたものではありません。大量の文章を読み込ませ、次に来る区切りを当てられるように、値に小さな数値を足す(引く)ことを繰り返した結果です。当たらなかったときに、当たるほうへ近づく数値を足す(引く)。この繰り返しによって、80億個のパラメータの値が定まっています。
質問を入力しても、モデルが行うのは、点数の高い区切りを1つずつ選ぶことだけです。質問の次に答えが来る並びを多く学習していれば、答えにあたる区切りの点数が高くなり、学習した効果として現れます。
大量の文章を読み込ませる学習では、パラメータの値は、特定の使い方に向けた偏りを持たず、一般的な文章の続きを書くものに定まります。世の中の文章には、問いの後に答えが続くものもありますが、見出しの後に解説が続くもの、問いだけが並んでいるものもあります。読み込ませた文章にそうした並びが混じっている以上、質問を入力しても、答えにあたる区切りの点数が最も高くなるとは限りません。答えではなく、別の問いや見出しが選ばれることがあります。
そこで、入力された文章と、それに対する応答を組にした文章の組を学習データとして用意し、これを読み込ませることで、パラメータの値を調整します。加えて、同じ入力に対する複数の応答を人が比べ、どちらがよいかを記録したものを用意します。よいと評価された応答に現れる区切りの点数が高くなるように、パラメータの値を調整します。表のベースモデルの欄にある「Instruct」は、この2種類の調整まで終えたモデルであることを示します。
2種類の調整を終えても、計算の手順は変わりません。パラメータの個数も、80億個のままです。違うのは、80億個のパラメータの値だけです。
表に示したファインチューニングは、この2種類の調整まで終えたモデルを出発点にしています。
なお、同じ欄にある「4bit量子化版」は、パラメータの値をどう保存しているかについての記載です。後の節で説明します。
2. ファインチューニングは、追加の学習データをもとに、パラメータの値へ小さな数値を足す(引く)作業です
LLMを作る側が行う2種類の調整は、どちらもパラメータの値に小さな数値を足す(引く)作業でした。ファインチューニングも、同じ算術を行います。
2種類の調整は、モデルを作る側が、大量の文章と、広い用途を想定した学習データを用いて行います。ファインチューニングは、自分の用途に絞った少量の学習データを用いて行います。
学習データは、入力と、入力に対する正解を組にした文章です。表に示したファインチューニングでは、判定に必要な情報を入力とし、判定の結果と判定の理由を正解としました。入力と正解の組を、数多く用意します。
進め方は、モデルを作る側が行う調整と変わりません。
- 学習データの入力を読み込ませ、モデルに次の区切りの点数を算定させます。
- 正解にあたる区切りの点数が、他の候補より高いかどうかを比べます。
- 高くなければ、高くなるほうへ近づく数値を、パラメータの値に足します(引きます)。
- 学習データのすべてについて、繰り返します。
足す(引く)数値は、小さくします。大きな数値を足せば、学習データの正解には早く近づきます。しかし、パラメータの値は、2種類の調整によって、日本語で文章を書き、指示に従うように定まっています。大きな数値を足すと、定まりが崩れ、学習データ以外の入力に対して文章を書けなくなります。すでにできていることを保ったまま、学習データの書き方を加えるために、1回あたりに足す(引く)数値を小さくします。小さくするぶん、繰り返しの回数が必要になります。
モデルを使うだけであれば、行うのは、入力を数値に置き換え、パラメータを掛け合わせ、点数の高い区切りを選ぶ計算です。パラメータの値は読み出すだけで、書き換えません。
学習では、点数を出す計算に加えて、パラメータ1つずつについて、足す(引く)数値を算定する計算が必要です。算定には、点数を出すまでの途中で現れた数値を使います。使うだけであれば捨ててよい途中の数値を、算定が終わるまで保持しておかなければなりません。
算定が加わることで、学習には、使うときより多くの計算が必要になります。途中の数値を保持するため、多くのメモリも必要になります。
3. 「差分」とは、学習前の数値と学習後の数値の差です
学習では、パラメータの値に小さな数値を足す(引く)ことを、何度も繰り返します。学習を始める前の80億個の値と、学習を終えた後の80億個の値があります。1回あたりに足す(引く)数値は小さいものの、繰り返しのあいだに積み重なります。積み重なった量は、パラメータごとに違います。
差分とは、学習前の値と、学習後の値の差です。
パラメータ1つずつについて、学習後の値から学習前の値を引きます。残るのは、学習のあいだにそのパラメータへ足した(引いた)数値の合計です。一度も足されなかったパラメータには、ゼロが残ります。80億個ぶんの引き算の結果が、差分です。
差分は、80億個の数値の集まりです。元のモデルと同じ個数だけあり、パラメータ1つずつに対応しています。差分に入っているのは数値です。学習データの文章が、どこかにそのまま保存されているのではありません。
元のモデルのパラメータの値に差分を足せば、学習後の値になります。引けば、学習前の値に戻ります。足し算と引き算だけで、学習前と学習後を行き来できます。
差分に現れている数値は、学習データを読み込ませたことによって生じた増減です。元のモデルのパラメータの値そのものは、差分に入っていません。
4. LoRAは、元の数値に手を加えず、差分だけを別に持ちます
表の手法の欄にある「LoRA」は、元のモデルのパラメータに手を加えず、差分だけを別に持つ手法です。
差分は、80億個の数値の集まりです。元のモデルと同じ個数だけあります。差分をそのまま保存すると、元のモデルと同じ大きさになります。学習を1回行うたびに、モデルがもう1つ増えるのと変わりません。
差分は、2枚の小さな表の掛け算の形で持ちます。
80億個のパラメータは、1枚の表に並んでいるのではありません。計算の段階は何段も重なっており、1つの段の中でも、複数の表が使われます。80億個は、多数の表に分かれて並んでいます。
表は、数値の列を別の数値の列に作り変える単位です。入力した文章は、まず数値の列になります。段を1つ通るたびに、その列は作り変えられます。作り変えの前後で、数値の個数が変わることがあります。いったん個数を増やしてから、元の個数に戻す表が、同じ段の中にあります。表の縦の行数は入る数値の個数に、横の列数は出る数値の個数に対応するため、表の大きさは同じになりません。
以下では、縦4096行・横4096列の表を例として説明します。1枚に約1678万個のパラメータが並びます。差分も同じ形です。
約1678万マスの差分を、1マスずつ別々に決めることをあきらめます。
元のモデルは、大量の文章から、すでに広い範囲を学習し終えています。追加の学習で行うのは、新しい能力を作ることではなく、答え方を1つの用途に寄せることです。寄せるだけであれば、差分に必要な自由度は小さくて済む。LoRAを提案した論文は、そう考えました。論文は仮説として述べており、すべての用途で成り立つことが証明されているのではありません。
LoRAでは、2枚の表の掛け算で作れる差分だけを使うと決めています。
縦4096行・横16列の表と、縦16行・横4096列の表を用意します。2枚を掛け合わせると、縦4096行・横4096列の表になります。
掛け合わせるとは、次のことです。でき上がる表の1マスの値を出すには、1枚目の同じ行に並ぶ16個の数値と、2枚目の同じ列に並ぶ16個の数値を、順に掛けて足し合わせます。16回の掛け算と足し算で、1マスが決まります。これを4096行×4096列のすべてのマスについて行うと、約1678万マスが埋まります。
用意した数値は、4096×16と16×4096で、合わせて約13万個です。約13万個の数値で、約1678万マスの差分を代わりに表します。先に約1678万マスの差分を作っておいて、後から2枚に分けるのではありません。はじめから、2枚で表せる差分だけを使います。表せる差分の種類は、そのぶん限られます。
持つ数値は、差分をそのまま持つ場合の128分の1です。学習で足す(引く)対象も、同じだけ減ります。足す(引く)数値は、パラメータ1つずつについて算定する必要があり、算定には途中の数値を保持するメモリも必要です。対象が減れば、計算もメモリも減ります。
学習の手順は変わりません。正解にあたる区切りの点数が高くなるほうへ近づく数値を足します(引きます)。足す(引く)相手は、2枚の表に並ぶ数値だけです。元のモデルの80億個の値には、何も足しません。
点数を出す計算には、元のモデルの表と、2枚の表の掛け算の結果を、両方使います。入る数値を元の表で計算した結果に、1枚目と2枚目で計算した結果を足します。足した結果が、次の段へ進みます。段ごとの数値が変われば、最後に出る候補ごとの点数が変わり、選ばれる区切りが変わります。
「LoRA r=16」(以下、r=16と表記します)の16は、2枚の表が接する側の大きさです。図3の、1枚目の横の列数と、2枚目の縦の行数にあたります。大きさを決める値をrと呼び、学習を始める前に、実施する側が指定します。大きい値を指定すれば、用意する数値が増えます。小さい値を指定すれば減ります。
「LoRA alpha=16」(以下、alpha=16と表記します)も、学習を始める前に指定する値です。2枚の表を掛け合わせた結果に、さらに倍率を掛けます。倍率は、alphaをrで割った値です。rを変えると、掛け合わせた結果の大きさも変わります。rで割る形にしておけば、rを変えたときに、他の設定を調整し直す必要が減ります。論文は、この理由で倍率を掛けると記載しています。16を16で割って1倍になり、掛け合わせた結果を、そのまま差分として使います。
2枚の表は、学習の対象とした表それぞれに用意します。表に示したファインチューニングでは、2枚組に並ぶ数値は、合わせて約4194万個でした。モデル全体の約80億個に対して、およそ190分の1です。
学習が終わった時点で、元のモデルの表は、1つも変わっていません。保存する必要があるのは、値が変わった2枚組だけです。2枚組をすべて集めたものを、アダプタと呼びます。
表に示したファインチューニングでは、アダプタの大きさは1工程あたり168MBでした。約4194万個の数値を、1個あたり4バイトで保存した大きさです。
アダプタは、元のモデルとは別に保管できます。使うときは、元のモデルのパラメータの値に、2枚の表を掛け合わせた結果を足します。足した結果が、学習後のパラメータの値です。
足せば、学習した書き方で答えるようになります。引けば、元のモデルに戻ります。元のモデルのファイルは、学習の前後で変わりません。
5. 保存するときだけ数値を大まかにします ── 計算はもとの細かさに戻して行います
表のベースモデルの欄にある「4bit量子化版」は、パラメータの値をどう保存しているかを示す記載です。
パラメータの値は、小数です。小数を保存するには、何桁ぶんの細かさで持つかを決めなければなりません。細かく持てば、元の値に近い値を保存できます。そのかわり、1個あたりの容量が増えます。
細かさは、1個あたりのビット数で表します。ビットは、0か1のどちらかを記録する単位です。16ビットで持てば1個あたり2バイト、4ビットで持てば1個あたり0.5バイトです。
80億個のパラメータを16ビットで保存すると、約16GBになります。4ビットで保存すれば、必要な大きさは約4分の1です。
4ビットで表せる値は、16通りしかありません。元の値をそのまま記録することはできません。そこで、代表となる値を16通り決めておき、各パラメータの値を、最も近い代表値の番号に置き換えて保存します。番号は0から15までであり、4ビットで記録できます。元の値と代表値との差は、この時点で失われます。この置き換えを、量子化と呼びます。
パラメータの個数は、量子化しても80億個のまま変わりません。減るのは、1個あたりのビット数です。
ただし、計算まで4ビットで行うのではありません。計算を始める前に、番号から代表値に戻します。戻すのは、1個あたりのビット数です。代表値に置き換えた時点で差はすでに失われているため、戻した値が、量子化する前の値と同じになることはありません。
計算をもとの細かさで行う理由は、掛け算と足し算を何段も重ねるためです。段ごとに出てくる数値は、16通りには収まりません。途中の数値まで16通りに丸めれば、段を重ねるあいだに誤差が積み上がります。
学習でも同じです。元のモデルの値は4ビットで保存したまま、計算のときにもとの細かさに戻して使います。数値を足す(引く)相手であるアダプタは、量子化しません。アダプタは、もとの細かさのまま持ちます。
元のモデルを4ビットで保存し、その上でLoRAの学習を行うやり方を、QLoRAと呼びます。表の手法の欄にある「QLoRA」は、この組み合わせを示しています。
6. QLoRAは、元のモデルを4ビットで保存したまま、アダプタだけを学習させます
学習は、GPUで行います。GPUには使えるメモリの上限があり、そこに収まらなければ、学習を始められません。
まず、学習で何を行うかを整理します。学習は、次の1.から4.を繰り返す作業です。
- 学習データをいくつか読み込ませ、次の区切りの候補ごとの点数を出します。
- 正解にあたる区切りの点数が、他の候補より高いかを比べます。
- 高くなければ、対象のパラメータのすべてについて、足す(引く)数値を1つずつ求めます。
- 求めた数値を、パラメータの値に足します(引きます)。
学習データを最後まで読み込ませるまで、1.に戻って繰り返します。
3.で求める数値は、対象のパラメータと同じ個数だけ並びます。繰り返しに戻ると3.をやり直し、前の繰り返しで求めた数値は残しません。
3.で求める数値は、差分ではありません。差分は、繰り返しごとに足した(引いた)数値をパラメータごとに合計したものであり、学習を終えて決まります。
以上をふまえると、学習のあいだ、GPUのメモリを使う領域は2つあります。
1つ目は、元のモデルが占有する領域です。80億個のパラメータを16ビットで保存すると、約16GBです。4ビットで保存すれば、約4GBになります。
2つ目は、3.で求めた数値が占有する領域です。80億個のパラメータすべてを対象にするなら、3.で求める数値も80億個です。元のモデルを4GBに収めても、この80億個が、別に領域を占有します。
QLoRAでは、足す(引く)相手がアダプタの数値だけです。元のモデルのパラメータには、何も足しません。3.で求めるのは約4194万個であり、80億個のおよそ190分の1です。
2つの領域は、別々に小さくします。元のモデルを4ビットで保存しても、80億個すべてを対象にすれば、2つ目の領域は80億個ぶんのままです。アダプタだけを対象にしても、元のモデルを16ビットで保存していれば、1つ目の領域は約16GBのままです。片方だけでは、GPUのメモリに収まりません。元のモデルを4ビットで保存し、なおかつアダプタだけを対象として、はじめて1枚のGPUで学習できます。
1点だけ、取り違えやすいところがあります。4ビットにするのは、元のモデルだけです。アダプタは、もとの細かさのまま持ちます。元のモデルは値が変わらないため、大まかにしても学習に差し支えません。アダプタに足す(引く)数値は、代表値と代表値の間隔より小さい数値です。4ビットで持てば、足しても同じ代表値のままとなり、足したことが記録されません。
表の手法の欄にある「QLoRA(LoRA r=16 / alpha=16)」は、以上のやり方で学習したことを示す記載です。
7. 「最大長」「エポック」「所要」は、学習データをどう読み込ませたかを示しています
最大長・エポック・所要の3つの記載は、用意した学習データを、どういう単位で、何周読み込ませ、どれだけ時間がかかったかを示しています。
「ローカルLLMにISMSの適合状況評価を支援させる」の第5回「第5回 ローカルLLMに答え方を教え込むファインチューニング」では、ローカルLLMに任せる仕事を三つに分け、仕事ごとに別々の学習データを用意して、別々に学習させています。
- 規格の要求ごとに、判定に関係する組織の事実を選ぶ工程
- 要求に達しているかどうかを判定する工程
- 達していない要求について改善案を下書きする工程
の三つです。
以下では、紐づけ工程・判定工程・改善案工程と書きます。3つの記載にある「三工程」は、三つの工程を指します。
最大長の記載「三工程とも2048トークン」の2048は、学習データ1件あたりの長さの上限です。
トークンについて説明します。本稿の前半で、入力された文章を単語に近い細かさで区切ると述べました。区切りの1つを、トークンと呼びます。日本語では、1文字が1トークンになることも、数文字がまとめて1トークンになることもあり、文字数とは一致しません。
学習データは、入力と正解の組です。読み込ませるときは、1件を1本の文章につないで扱います。判定工程であれば、判定に必要な情報が入力、判定の結果と判定の理由が正解であり、両方をつないだ1本が1件です。1本をトークンに区切って数えた数が、1件の長さになります。
上限を超えた分は、切り捨てられます。切り捨てられた部分は、学習されません。正解の末尾が切り捨てられれば、答えの終わり方を学習できません。
「ローカルLLMにISMSの適合状況評価を支援させる」の第5回「第5回 ローカルLLMに答え方を教え込むファインチューニング」でファインチューニングを実施した際の学習データについて1件ずつ長さを数えた結果は、次のとおりです。
| 工程 | 件数 | 最も短い件 | 中央 | 最も長い件 | 2048を超えた件 |
|---|---|---|---|---|---|
| 紐づけ | 930件 | 377 | 720 | 1,692 | 0件 |
| 判定 | 975件 | 673 | 773 | 1,055 | 0件 |
| 改善案 | 583件 | 1,161 | 1,363 | 1,617 | 0件 |
長さの単位はトークンです。2048を超えた件はなく、切り捨ては発生していません。
エポックの記載「2」は、用意した学習データを何周読み込ませたかを示す数です。全件を1回ずつ読み込ませて一巡することを、1エポックと呼びます。「2」は、全件を2周したことを示します。
1周では足りません。1回に足す(引く)数値は、正解にあたる区切りの点数を、1度で他の候補より高くする大きさではないためです。本稿の前半で述べたとおり、大きな数値を足せば、すでにできていることが崩れます。崩さない大きさに抑えているため、1度足しただけでは、点数の並びはわずかしか変わりません。同じ学習データをもう一度読み込ませて足す(引く)ことを重ねると、足した量が積み重なります。
読み込ませ方は、1件ずつではありません。何件かをまとめて読み込ませ、まとめた分の結果から、足す(引く)数値を1回求めます。まとめる件数は、8件としています。判定工程の975件を8件ずつに分けると、122のまとまりになります(最後の1つは8件に足りません)。1周で122回、2周で244回、足す(引く)数値を求めて足した(引いた)ことになります。まとめた分を読み込ませて1回足す(引く)までを、ステップと呼びます。
エポックは、学習を始める前に、実施する側が指定する値です。
所要の記載「三工程それぞれ31〜32分」は、学習に要した時間です。
時間がかかるのは、ステップごとに行う計算です。1ステップでは、点数を出す計算に加えて、足す(引く)数値を約4194万個ぶん求める計算を行います。読み込ませたトークンの数が多いほど、点数を出す計算が増えます。所要は、ステップの回数と、1ステップで読み込ませるトークンの数によって決まります。
三工程は、件数もトークンの長さも違います。改善案工程は、件数が最も少なく、1件あたりが最も長い工程です。紐づけ工程と判定工程は、件数が多く、1件あたりは短くなっています。所要は、いずれも31〜32分でした。
以上は、1枚のGPUで学習した場合の値です。
8. 「学習環境」と「変換後の大きさ」は、どこで学習させ、成果をどう保存し直したかを示しています
学習環境と変換後の大きさの2つの記載は、学習をどこで行い、学習の成果をどのように保存し直したかを示しています。
学習環境の記載「Google Colab・GPU L4」は、学習を行った場所です。時間単位で借りるクラウドのGPUを1枚使っています。
GPUを借りた理由は、本稿の前半で述べたとおりです。学習のあいだは、元のモデルを保存する領域と、足す(引く)数値を求めるための領域が、同時に必要になります。
学習して得られるのは、アダプタです。大きさは1工程あたり168MBでした。
アダプタだけでは、答えを書けません。点数を出す計算には、元のモデルの表と、2枚組の掛け算の結果の両方が必要なためです。そこで、元のモデルのパラメータの値に、2枚組を掛け合わせた結果を足し、80億個の値を作り直します。作り直した80億個を、1つのファイルとして保存し直します。日々の判定には、保存し直したファイルを使います。
保存し直したファイルは、元のモデルと同じ規模になります。80億個の値を、まとめて持つためです。168MBだったものが4.58GBになるのは、保存する対象が2枚組から80億個に変わったからです。
変換後の大きさの記載「1工程あたり4.58GB(GGUF q4_k_m)」は、保存し直したファイルの大きさです。1工程ごとに1つずつ、三工程で三つのファイルがあります。
GGUFは、ファイルの形式の名前です。日々の判定に使うソフトウェアが読み込める形式であり、保存し直すときに、この形式へ変換します。
q4_k_mは、保存の細かさの指定です。名前は3つの部分に分かれています。
q4は、1個あたり4ビットで保存することを示します。本稿の前半で述べたとおり、4ビットで表せる値は16通りです。
kは、代表値の決め方を示します。16通りの代表値を80億個すべてに共通で使うのではなく、一定の個数ずつのまとまりに分け、まとまりごとに代表値を決めます。値の散らばりはまとまりごとに違うため、共通で使うより、元の値に近い代表値を選べます。まとまりごとの代表値を決める数値も保存するため、1個あたりに必要なビット数は、4ビットちょうどより少し多くなります。
mは、細かさを上げる範囲を示します。同じ決め方に3段階があり、mは中間です。中間では、一部の表だけを、4ビットではなく6ビット台で保存します。
ファイルの大きさは、保存する数値の個数と、1個あたりのビット数で決まります。作り直しても、個数は80億個のまま変わりません。変わるのは、1個あたりのビット数だけです。
作り直した80億個を16ビットで保存すると、約16GBになります。q4_k_mで保存し直した結果が、4.58GBです。
保存し直すときに行うのは、本稿の前半で述べた量子化です。値は、決めておいた代表値のどれかに置き換わり、元の値との差は失われます。
置き換わる値は、2枚組を足した後の値です。学習によって足した(引いた)分も、置き換えの対象に含まれます。
9. 学習前と学習後の数値の差に、学習データの何が入っているのでしょうか
本稿では、ファインチューニングを、パラメータの値に小さな数値を足す(引く)作業として説明しました。差分は、学習前の値と学習後の値の差です。アダプタは、差分を2枚組の形で持ったものです。
学習前の値は、公開されている元のモデルの中にあります。学習後の値は、元のモデルにアダプタを足せば得られます。両方が手元に揃えば、引き算で差分が出ます。アダプタは168MBであり、1つのファイルとして持ち運べます。
差分に並ぶのは数値です。学習データの文章が、どこかにそのまま保存されているのではありません。
ただし、差分の数値は、でたらめに足した(引いた)ものではありません。学習データの正解にあたる区切りの点数が高くなるように、1回ずつ足した(引いた)結果です。学習を終えたモデルは、学習データと同じ書き方で判定理由を書きます。書き方を再現できるのであれば、文章そのものは、どこまで再現できるのでしょうか。
学習前と学習後の数値の差に、学習データの何が入っているのでしょうか。アダプタを足したモデルから、学習に使った文章そのものを取り出せるのでしょうか。
学習データが、外に出せない情報を含んでいたとすれば、どうでしょうか。
答えは、本稿にはありません。実際にファインチューニングしたモデルを対象に測りました。結果は、別の記事に書きます。






