Anima-2.9Bと同じ層拡張をQwen3-0.6Bでやったら、新層だけで自分の記事は覚えたが、元の層を凍結しても忘れた
目次
前回、層拡張で40層になったAnima-2.9Bに既存のキャラLoRAはそのまま乗るのかで、Anima-2.9Bの層の足し方は LLaMA Pro のやり方だとサラッと書いて流した。
方法としては、隣のブロックをコピーして間に挟み、コピー側の出力の重みをゼロにして、元の層は凍結したまま挟んだ層だけ学習する、というやつ。
Muonと勘違いしてたけど、LLaMA Pro自体はこのブログで一度も動かしていない。
画像モデルだと「本人が出た」「出ない」を目視確認である意味適当な判定しかないが、LLMならperplexityの数字で比べられる。
なのでQwen3-0.6B-Baseで同じことをやって、挟んだ層だけで新しい内容を覚えるのか、元の層を凍結すると本当に忘れないのかを確認してみる。
とりあえず学習データとしてこのブログの技術記事を流用。
Qwen3-0.6Bが出たのは2025年4月なので、Anima、QIE、2026年のComfyUIのバージョン、かな・けい・こはる・くららのことは当然何も知らない、カットオフ以前の問題。
Anima-2.9Bが元の28層を凍結して、新しい12層だけに170万枚の絵を覚えさせたのと同じやり方で、0.6Bのテキストで実際に学習してみる。
検証環境
| 項目 | 内容 |
|---|---|
| 実行機 | M1 Max 64GB MacBook Pro(macOS 26.5) |
| フレームワーク | MLX 0.32.1、mlx-lm 0.31.3 |
| 基準モデル | Qwen3-0.6B-Base(28層、bf16) |
| 比較方式 | 層拡張(新層のみ学習)、LoRA、フルファインチューン |
| 学習データ | このブログの技術記事(日本語)の本文 |
| 評価 | 学習から外した記事のperplexity(覚えたか)、Wikipedia-jaとwikitext-2のperplexity(忘れたか) |
実験の流れ
graph TD
A[技術記事763本<br/>新しい40本を評価用に外す] --> B[学習データ722本]
Q[Qwen3-0.6B-Base 28層] --> R[7ブロックをコピーして挟み35層に<br/>コピー側の出力をゼロ]
B --> C[層拡張<br/>挟んだ7層だけ]
R --> C
B --> D[LoRA<br/>28層にアダプタ]
B --> E[フルFT<br/>全パラメータ]
C --> F[perplexityで比較<br/>覚えたか / 忘れたか]
D --> F
E --> F
D --> G[28層LoRAを35層に当てる<br/>番号そのまま / 付け替え]
F --> H[同じ書き出しで生成を比較]
データ側は、技術記事763本の本文をMarkdownのまま取り出し、新しい方から数十本を評価用に外して残りを学習用にする。
モデル側は、Qwen3-0.6B-Baseの28層を4層ごとに区切り、各区切りの最後のブロックをコピーして後ろに挟んで35層にする。
コピー側の o_proj と down_proj をゼロにして、学習前の出力が元と一致することをロジット(次のトークンを選ぶ直前の生のスコア)で確かめる。
学習は同じデータ、同じトークン数で、層拡張(挟んだ7層だけ)、LoRA(元の28層にアダプタ)、フルFT(全パラメータ)の3方式。
学習前後で、学習に使った記事、外した記事、外した記事の英語版、Wikipedia-ja、wikitext-2のperplexityを測る。
それとは別に、28層の素のモデルで焼いたLoRAを35層のモデルに番号そのままと付け替えの2通りで当てて、Anima-2.9Bでやったことをperplexityで測り直す。
最後に、学習前後で同じプロンプトから続きを生成して、出てくる文がどう変わったかを比べる。
データ
技術記事はfrontmatterだけ外して、タイトルを # 見出しに、本文は表やコードブロックも含めてMarkdownのまま学習データとしてつっこむ。
評価用に外したのは publishedAt の新しい方から40本で、2026年7月26日から8月22日までの記事。
Anima-2.9Bの記事もこっちに入っている。
この40本の英語版も、日本語だけ学習して英語側のperplexityが変わるかを確かめるために同じように外した。
忘れたかどうかは、Wikipedia日本語版と英語のwikitext-2のtest split(評価用の分割)を使う。
Wikipediaは wikimedia/wikipedia の20231101.jaで、1シャード(データセットの分割ファイル)の先頭から1500文字以上の記事を拾って、長い記事は6000文字で切った。
| 用途 | 中身 | 本数 | Qwen3トークン |
|---|---|---|---|
| 学習 | 技術記事(日本語、2025年11月〜2026年7月25日) | 722 | 2.62M |
| 覚えたか | 技術記事(日本語、2026年7月26日〜8月22日、学習に使わない) | 40 | 200k |
| 覚えたか(英語側) | 上の40本の英語版 | 40 | 167k |
| 忘れたか | Wikipedia日本語版 | 132 | 301k |
| 忘れたか(英語) | wikitext-2 test | 1 | 299k |
トークン数はQwen3のトークナイザで数えた。
層を挟んで恒等になるか
LLaMA Proの論文は32層のLLaMA2-7Bを4層ずつ8グループに切り、各グループの末尾のブロックをコピーして後ろに足して40層にしている。
Qwen3-0.6B-Baseは28層なので、4層ずつ7グループに切って7個足し、35層にした。
コピーしたブロックの self_attn.o_proj と mlp.down_proj をゼロにする。
Qwen3のブロックは x + attn(norm(x)) と h + mlp(norm(h)) の2段の残差になっている。
残差に足す側の最後の線形がこの2つなので、両方ゼロだとブロックは入力をそのまま通す。つまりなんもしない。
Anima-2.9Bでは self_attn.output_proj、cross_attn.output_proj、mlp.layer2、adaLNの出力をゼロにしていて、今回の2つはそれと同じ場所。
Qwen3のブロックにはcross attentionもadaLNもないので、ゼロにするのは2つだけ。
mlx-lmのQwen3実装で num_hidden_layers を35にしたモデルを作り、元の重みを番号を付け替えて流し込んだ。
元のブロック番号と新しい番号の対応はこんな感じ。
挟んだのは新しい番号の4、9、14、19、24、29、34で、それぞれ直前のブロックのコピー。
| 元の番号 | 新しい番号 | 元の番号 | 新しい番号 |
|---|---|---|---|
| 0〜3 | 0〜3 | 16〜19 | 20〜23 |
| 4〜7 | 5〜8 | 20〜23 | 25〜28 |
| 8〜11 | 10〜13 | 24〜27 | 30〜33 |
| 12〜15 | 15〜18 |
| 項目 | 値 |
|---|---|
| パラメータ | 596.0M → 706.2M |
| 挟んだ7ブロックの合計 | 110.1M |
| ゼロにしたテンソル | 14個(7ブロック × 2) |
学習前のチェックは、日本語と英語の4つの文で元モデルと35層モデルのロジットを比べて、最大差が0.0だった。
bf16でも0を足すだけなので完全一致になる。
貪欲生成(毎回いちばん確率の高いトークンだけを選ぶ生成。同じモデルなら必ず同じ文になる)の30トークンも同じ文が出た。
Anima-2.9Bの記事で「出力がゼロだと残差に何も足さないので、学習前の2.9BはAnima-Baseと同じ絵を出す」と書いた部分を、実測で確かめた。
学習条件
3方式とも同じデータを同じ順番で入れる。
722本の記事を文末トークン(EOS)で区切って1本につなぎ、1025トークンごとの2553チャンクにして、シード固定で並べ替えてバッチ8で回す。
1エポック319ステップ、2エポックで638ステップ、回すトークンは約5.2M。
学習率は50ステップのウォームアップのあとコサインで1/10まで下げる。
オプティマイザはAdamW(weight decay 0)、勾配ノルムは1.0でクリップ。
学習ループはmlx-lmの lora.py を使わず、nn.value_and_grad で自分で書いた。
凍結はmlx-lmの freeze() / unfreeze() で、勾配が出るのは凍結していないパラメータだけになる。
| 方式 | 学習するもの | 学習パラメータ | 学習率 |
|---|---|---|---|
| 層拡張 | 35層のうち挟んだ7ブロックだけ。元の28層と埋め込みは凍結 | 110.1M | 1e-4 |
| LoRA | 元の28層の q_proj、k_proj、v_proj、o_proj、gate_proj、up_proj、down_proj にrank 32、scale 2.0のアダプタ | 20.2M | 1e-4 |
| フルFT | 全パラメータ | 596.0M | 2e-5 |
学習率は方式ごとに普通に使う値にした。
LLaMA Proの論文は新ブロックを2e-4で回しているけど、あちらは1ステップ4Mトークンのバッチなので、8kトークンのこちらは半分にした。
フルFTは全パラメータを動かすので、よく使われる2e-5にした。
学習前のperplexityはこんな感じ。
学習用記事の分は、722本から日付が散るように7本に1本を拾って30万トークン分だけ測った。
| 評価セット | 学習前のPPL |
|---|---|
| 学習用記事(抜粋30万トークン) | 12.76 |
| 外した記事40本(日本語) | 14.69 |
| 外した記事40本の英語版 | 16.06 |
| Wikipedia日本語版 | 13.54 |
| wikitext-2 | 14.11 |
1024トークンの窓で区切って、窓ごとに独立に測った平均。
文脈が1024で切れるので、論文のPPLより高めに出る。
学習速度とメモリ
| 方式 | 638ステップの所要 | 速度 | ピークメモリ | 最終損失 |
|---|---|---|---|---|
| 層拡張(1e-4) | 51.7分 | 1685 tok/s | 32.1GB | 1.80 |
| LoRA(1e-4) | 51.3分 | 1698 tok/s | 38.7GB | 2.05 |
| フルFT(2e-5) | 59.9分 | 1453 tok/s | 34.5GB | 1.94 |
| 層拡張(2e-5、追加) | 51.6分 | 1688 tok/s | 32.1GB | 2.03 |
層拡張の損失は2.77から始まって1エポック目の終わりで2.2前後、2エポック目は1.6から1.9の間を行き来した。
本番の前に20ステップだけ回したときは504 tok/sしか出なかった。
2エポックで4時間超と見積もって3エポックを諦めたのに、本番は最初から1680 tok/sで走った。
ピークメモリは同じ32.1GBで、差の原因はわからないがあまり重要じゃないのでとりあえず置いとく。
フルFTは596M全部の勾配とAdamの状態を持つので1453 tok/sまで下がったけど、ピークは34.5GBで、LoRAの38.7GBより小さかった。
LoRAはアダプタを通す分の中間テンソルが増える。
覚えたか、忘れたか
| 評価セット | 学習前 | 層拡張(1e-4) | LoRA(1e-4) | フルFT(2e-5) | 層拡張(2e-5) |
|---|---|---|---|---|---|
| 学習用記事(抜粋) | 12.76 | 5.45 | 6.97 | 6.66 | 7.14 |
| 外した記事40本(日本語) | 14.69 | 10.47 | 10.40 | 10.24 | 10.57 |
| 外した記事40本の英語版 | 16.06 | 17.21 | 14.01 | 13.97 | 16.03 |
| Wikipedia日本語版 | 13.54 | 17.91 | 16.40 | 16.92 | 16.07 |
| wikitext-2 | 14.11 | 21.00 | 16.52 | 16.74 | 17.87 |
右端の列は後から足した追加実験(次のセクション)。
層拡張は、学習に使った記事で12.76から5.45、学習に使っていない直近40本でも14.69から10.47まで下がった。
Anima、ComfyUI、LoRAの語彙と、このブログの書き方を、元の28層を一切触らずに挟んだ7層だけで覚えた。
その代わり、Wikipedia日本語版は13.54から17.91、英語のwikitext-2は14.11から21.00まで上がった。
元の層を凍結しても、新しい層は入力が元から知ってた文でも残差ストリームに差分を足す。
元から知ってた文の予測が悪くなったのは、学習データが自分の記事だけだったせいだと思う。
論文で元の能力が保たれているのは一般ベンチマークの話で、しかもコードと数学を約80Bトークン入れた条件。自分の記事2.6Mトークンだけを2周したこちらでは、凍結だけで防げなかった。
外した記事の英語版も16.06から17.21へ少し上がっていて、日本語で覚えた内容が英語側に転写されることもなかった。
LoRAは学習パラメータが20.2Mで層拡張の5分の1以下なのに、外した記事では10.40で層拡張の10.47とほぼ同じだった。
学習に使った記事は6.97で、層拡張の5.45ほどは下がらなかった。
忘れる方はLoRAの方が小さくて、Wikipedia日本語版が16.40、wikitext-2が16.52。
層拡張の17.91と21.00より元に近い。
英語版の記事は14.01で学習前の16.06より下がっていて、こっちは日本語で覚えさせた内容が英語側にも転写されている。
学習の損失は最後まで層拡張より高かった(400ステップ時点で2.14対1.93、最終2.05対1.80)。
LoRAは元の重みに小さな差分を足すだけなので、同じデータを同じ回数入れても丸暗記まではしなかった。
フルFTは外した記事で10.24と3方式の中で一番下がり、英語版も13.97で一番低い。
忘れる方はWikipedia日本語版16.92、wikitext-2が16.74で、LoRAとほぼ同じ。
層拡張の17.91と21.00より小さい。
つまりこの条件だと、元の28層を凍結して7層だけ学習した層拡張の方が、全パラメータを動かしたフルFTより元から知ってた文を忘れている。
学習率が層拡張1e-4に対してフルFT2e-5と5倍違うので、方式の差なのか学習率の差なのかは、この表だけではわからない。
層拡張をフルFTと同じ学習率で回す
学習率を2e-5に落として、層拡張を同じ638ステップでもう一度回した。
他の条件は全部同じ。
| 評価セット | 学習前 | フルFT(2e-5) | 層拡張(1e-4) | 層拡張(2e-5) |
|---|---|---|---|---|
| 学習用記事(抜粋) | 12.76 | 6.66 | 5.45 | 7.14 |
| 外した記事40本(日本語) | 14.69 | 10.24 | 10.47 | 10.57 |
| 外した記事40本の英語版 | 16.06 | 13.97 | 17.21 | 16.03 |
| Wikipedia日本語版 | 13.54 | 16.92 | 17.91 | 16.07 |
| wikitext-2 | 14.11 | 16.74 | 21.00 | 17.87 |
フルFTと同じ2e-5にすると、Wikipedia日本語版は16.07で4方式の中で一番元に近い。
フルFTの16.92より小さい。
一方で英語のwikitext-2は17.87で、フルFTの16.74より上がっている。
覚える方は外した記事が10.57で、フルFTの10.24や1e-4の10.47ほどは下がらなかった。
英語版の記事は16.03で学習前とほぼ同じ。
同じ学習率で比べると、Wikipedia日本語版はフルFTより層拡張の方が上がり方が小さく、wikitext-2は逆に層拡張の方が大きく上がった。
どちらにしても「元の層を凍結したから忘れない」と言えるほどの差はこの規模では出なかった。
Wikipedia日本語版とwikitext-2で結果が逆になるのは、学習データが日本語だけだからだと思う。
挟んだ層は、日本語の残差には馴染んだ変化を、英語の残差には学習で一度も見ていない変化を足す。
フルFTは全層が少しずつ動くぶん、英語側の悪化が特定の層に集中しない。
28層で焼いたLoRAを35層に当てる
上で焼いたLoRA(28層のQwen3-0.6B-Baseで学習したもの)を、35層のモデルに2通りで当てた。
番号そのままは、アダプタの model.layers.N を35層側の同じ番号Nに読み込ませる。
4番以降は別のブロックに差分が足される。
付け替えは、元の番号から新しい番号への対応表でキー名を書き換えてから読み込ませる。
挟んだ7ブロックにはアダプタが付かない。
Anima-2.9Bの記事でやったのと同じ2通り。
まず学習前の35層(挟んだ層が恒等のまま)に当てた。
| 当て方 | 外した記事40本 | Wikipedia日本語版 |
|---|---|---|
| 28層 + LoRA(正解) | 10.40 | 16.40 |
| 35層(学習前)にそのまま | 14.32 | 14.26 |
| 35層(学習前)に付け替え | 10.40 | 16.40 |
番号そのままだと外した記事が14.32で、素の14.69からほとんど下がらない。
LoRAが効いていない。
付け替えると10.401と16.403で、28層+LoRAの値と小数3桁まで一致した。
挟んだ層が何も足さないので、付け替えさえ合っていれば完全に同じモデルになる。
Anima-2.9Bの記事でそのままだとキャラが出ず、付け替えると本人が出たのは、数字にするとこれ。
次に、自分の記事で学習した後の35層に当てた。
| 当て方 | 外した記事40本 | Wikipedia日本語版 |
|---|---|---|
| 35層(学習後)単体 | 10.47 | 17.91 |
| 35層(学習後)にそのまま | 11.00 | 19.78 |
| 35層(学習後)に付け替え | 16.07 | 31.69 |
こっちは付け替えた方が悪い。
外した記事は16.07で素のモデルより上がり、Wikipedia日本語版は31.69まで悪化した。
35層の挟んだ層とLoRAの両方が同じ722本の記事を覚えているので、付け替えて正しく合わせるほど同じ方向の差分が二重に足される。
番号そのままの方は差分が別の層にずれるぶん薄まって、悪化も小さい。
Anima-2.9Bの場合は新層が覚えたのは170万枚の一般のイラストで、LoRAが覚えているキャラは新層が知らない内容だった。
ここでやったのは新層とLoRAが同じものを覚えた状態なので、あの記事の構図とは逆。
scaleを半分にするとPPLの上がり幅も半分か
付け替えたLoRAのscaleを2.0から1.0に半分にして、学習後の35層にもう一度当てた。
| 当て方 | 外した記事40本 | Wikipedia日本語版 |
|---|---|---|
| 35層(学習後)単体 | 10.47 | 17.91 |
| 付け替え、scale 1.0 | 12.09 | 22.69 |
| 付け替え、scale 2.0 | 16.07 | 31.69 |
半分にすると悪化も半分くらいになったけど、単体より良くなる点はなかった。
同じ記事を覚えた差分は、足した量のぶんだけ悪くなる。
Wikipediaで焼いたLoRAを当てる
35層側が知らない内容として、Wikipedia日本語版で28層のQwen3-0.6B-Baseに焼いたLoRAを用意した。
同じシャードの末尾側から、評価に使った記事と重ならないように1484本、3.0Mトークンを取った。
学習は同じrank 32、scale 2.0、学習率1e-4で300ステップ(2.46Mトークン)。
これを、自分の記事で学習した後の35層に当てる。
| 当て方 | 外した記事40本 | Wikipedia日本語版 |
|---|---|---|
| 28層 + Wiki LoRA | 14.97 | 12.31 |
| 35層(学習後)単体 | 10.47 | 17.91 |
| 35層(学習後)にそのまま | 10.55 | 17.58 |
| 35層(学習後)に付け替え | 10.65 | 15.96 |
番号そのままだとWikipedia日本語版は17.58で、単体の17.91からほとんど変わらない。
LoRAが覚えたWikipediaの内容が反映されていない。
付け替えると15.96まで下がり、自分の記事の方は10.65で単体の10.47からほぼ変わらない。
新層が覚えた記事の内容はそのまま残って、そこにWikipediaの内容が加わった。
Anima-2.9Bの記事で、170万枚で学習した新層の上に、番号を付け替えたキャラLoRAを当てたら本人が出た、というのと同じ形になった。
ただし下がり幅は28層に当てたときより小さい。
28層では13.54から12.31まで下がるLoRAが、35層では17.91から15.96までしか下がらない。
LoRAの差分は28層向けに焼いたものなので、学習した新層を挟んだあとだとぴったりは合わないらしい。
忘れたのは小さいモデルだからか
0.6Bだから忘れたのか、それとも学習データにWikipediaみたいな文が1トークンも入っていないからか。
挟んだブロックは、入力が自分の記事でもWikipediaでも同じように残差へ足す。
学習データにWikipedia側の文がなければ、そっちで余計な差分を足しても損失は増えず、直る理由がない。
これはモデルの大きさと関係ない話なので、まずWikipediaを混ぜて確かめ、次にQwen3-1.7Bで同じことをやった。
Wikipediaを2割混ぜる
学習データに、Wikipedia日本語版と英語のwikitext-2のtrain split(評価はtest split)を33万トークンずつ足した。
Wikipediaの方は、評価と被らない別の記事にした。
合計3.28MトークンでWikipedia側が20.2%。
ステップ数は同じ638で、回すトークン数も5.2Mのまま。
学習率1e-4の層拡張で回した。
| 評価セット | 学習前 | 層拡張(1e-4) | 層拡張(1e-4、Wikipedia2割) |
|---|---|---|---|
| 学習用記事(抜粋) | 12.76 | 5.45 | 6.22 |
| 外した記事40本(日本語) | 14.69 | 10.47 | 10.50 |
| 外した記事40本の英語版 | 16.06 | 17.21 | 15.10 |
| Wikipedia日本語版 | 13.54 | 17.91 | 13.88 |
| wikitext-2 | 14.11 | 21.00 | 13.18 |
外した記事は10.50で、混ぜなかったときの10.47と変わらない。
覚える方は、学習データの2割をWikipediaに割いても悪くなっていない。
Wikipedia日本語版は13.88で学習前の13.54とほぼ同じ、wikitext-2は13.18で学習前より下がった。
凍結した元の層と挟んだ層という構造は同じまま、学習データにWikipediaを2割入れただけで、元から知ってた文の悪化はほぼ消えた。
ただし、混ぜた分は評価セットと同じところから取っている(同じWikipediaのダンプの別記事、同じwikitext-2の別split)。
その意味でリプレイには一番有利な条件ではある。
wikitext-2が学習前より下がったのはそのせい。
それでも、混ぜなかったときの17.91と21.00が、混ぜただけで13.88と13.18になる差は、サイズではなくデータの問題だったと言ってよさそう。
Qwen3-1.7Bで同じことをやる
Qwen3-1.7B-Base(28層、hidden 2048)に同じ4層ごとの挿入で7ブロック足して35層にした。
1720.6Mが2072.9Mになり、挟んだ7ブロックは352.4M。
学習前のロジット差はこちらも0.0。
学習データ、学習率1e-4、回すトークン5.2Mは0.6Bと同じ。
メモリがどこまで使われるか分からなかったので、バッチを4にして1276ステップにした。
0.6Bの3倍のパラメータに対して、速度は1690 tok/sから745 tok/sで2.3倍遅くなっただけ、ピークメモリはバッチが半分なので24.8GB。
学習時間は116.9分。
| 評価セット | 1.7B学習前 | 1.7B層拡張(1e-4) | 1.7BフルFT(2e-5) |
|---|---|---|---|
| 学習用記事(抜粋) | 9.30 | 3.87 | 5.27 |
| 外した記事40本(日本語) | 11.15 | 8.63 | 8.28 |
| 外した記事40本の英語版 | 12.76 | 13.16 | 11.16 |
| Wikipedia日本語版 | 9.47 | 12.52 | 11.33 |
| wikitext-2 | 10.33 | 14.27 | 11.87 |
フルFTは1720.6M全部にAdamの状態を持つので612 tok/sまで下がって142.4分、ピークは30.4GB。
学習前の値が0.6Bより全部低いので、学習前からの比率で比べる。
| 評価セット | 0.6B層拡張 | 1.7B層拡張 | 0.6BフルFT | 1.7BフルFT |
|---|---|---|---|---|
| 外した記事40本(日本語) | -29% | -23% | -30% | -26% |
| Wikipedia日本語版 | +32% | +32% | +25% | +20% |
| wikitext-2 | +49% | +38% | +19% | +15% |
層拡張のWikipedia日本語版の上がり方は0.6Bと1.7Bで同じ+32%。
wikitext-2は+49%が+38%になったけど、Wikipediaを2割混ぜたときの変わり方(+32%がほぼ0に)とは桁が違う。
モデルを3倍にしても、挟んだ層が元から知ってた文の予測を悪くする度合いはほとんど変わらなかった。
フルFTは1.7Bでも層拡張より忘れ方が小さく(+20%と+15%)、0.6Bと同じ並びのまま。
学習率が5倍違う点も同じで、方式の差か学習率の差かという問題は1.7Bでも残る。
学習に使った記事は層拡張で9.30から3.87まで下がっていて、下げ幅は0.6Bより大きい。
挟んだ層が352Mあれば2.6Mトークンはほぼ丸暗記できる。
「小さいモデルだから忘れた」わけではなかった。
サイズを3倍にしても比率は変わらず、Wikipediaを2割混ぜたらほぼ消えた。
生成の比較
学習前、1e-4の層拡張、LoRA、フルFTの4つに同じ書き出しを4本渡して、温度0の貪欲で60トークンずつ続けさせてみた。
0.6Bに5Mトークンしか学習させてないので、事実を答えるモデルにはなってない。
それでも語彙と書き方がどう変わったかくらいは分かる。
出力に出てくる行末スペース2個の改行(Markdownの改行記法。このブログの本文に大量にある)は ⏎ に置き換えてある。
書き出し「Anima-Baseのテキストエンコーダは」
| モデル | 続き |
|---|---|
| 学習前 | 、テキストエンコーダの定義を提供します。テキストエンコーダは、テキストデータをエンコードするためのアルゴリズムです。テキストエンコーダは、テキストデータをエンコードするためのアルゴリ |
| 層拡張 | Qwen3 0.6Bだった。Qwen3 0.6BはQwen3ベースだが、Qwen3 0.6BのテキストエンコーダはQwen3ベースなので、Qwen3ベースのLoRAはベースのQwen3 |
| LoRA | Qwen3-VL-4Bで、Anima-BaseのベースモデルはQwen3-VL-4BではなくQwen3-VL-27B。⏎Qwen3-VL-4Bは27Bモデルの一部で、27Bモデルの |
| フルFT | 、Anima-Baseのテキストエンコーダと同等の精度で、Anima-Baseの1.5倍の速度を実現している。⏎Anima-Baseのテキストエンコーダは1024トークンの長さで、An |
書き出し「ComfyUIでキャラLoRAを当てると」
| モデル | 続き |
|---|---|
| 学習前 | 、キャラの動きが悪くなることがある。これはなぜですか?また、キャラの動きが悪くなる原因は何ですか?さらに、キャラの動きが悪くなる原因の一つとして、キャラの動きが悪くなる原因の一つとして、キャラの動きが悪くなる原因の一つとして、 |
| 層拡張 | 、キャラの特徴がLoRAの学習素材に近づく。⏎キャラLoRAの学習素材は、キャラの特徴を強く保ったまま、LoRAの学習素材の崩れ方を抑える。⏎LoRAの崩れ方 |
| LoRA | 、キャラLoRAの効果が顔の特徴に集中する。⏎LoRAの効果は顔の特徴に集中するが、顔の特徴はLoRAの効果に集中するわけではない。⏎顔の |
| フルFT | 、キャラの特徴がそのまま出る。⏎LoRAの効き方は「キャラLoRAの特徴をそのまま学習データに混ぜる」だけなので、LoRAの効き方を変えると効きが変わる。⏎LoRA |
書き出し「M1 Max 64GBのMacBook Proで」
| モデル | 続き |
|---|---|
| 学習前 | 、Mac OS X 10.11.6のアップデートを試してみた。Mac OS X 10.11.6は、Mac OS X 10.11.5のアップデートを含む。Mac OS X 10.1 |
| 層拡張 | 動かすのが現実的。⏎ただし、MacBook Proは「Macで動く」だけでは足りない。⏎LLMの推論コスト、GPUのメモリリーク、バックエンドの選択肢が揃っていないと、現実的な |
| LoRA | 動くか、という話。⏎MacBook ProはM1 Maxの物理メモリを16GBに収めると、M1 Maxの64GBをそのまま使えない。⏎M1 Maxの物理メモリを16GBに収めると |
| フルFT | 、M1 Max 64GBのMacBook Proで、M1 Max 64GBのMacBook Proで、M1 Max 64GBのMacBook Proで、M1 Max 64GBのMacBook Proで、M1 Max 64GB |
書き出し「Qwen-Image-Editで」
| モデル | 続き |
|---|---|
| 学習前 | 画像を画像に変換する方法を教えてください。 はい、Qwen-Image-Editは、画像を画像に変換するためのAIモデルです。このモデルは、画像の内容や構造を変えることで、より良い画像を作成することができます。以下 |
| 層拡張 | LoRAを当てたときの差分を読むと、LoRAの効きが強すぎてプロンプトを変えると効果が落ちる、という話になる。⏎LoRAを当てたときの出力は、プロンプトを変 |
| LoRA | 画像を画像に変換する。⏎画像を入力すると、画像の内容を画像に変換する。⏎画像の内容を変えると、画像の内容も変える。⏎画像を変えると、画像の内容も変える。⏎画像を変える |
| フルFT | 画像を画像に変換する。⏎画像を画像に変換するには、画像を入力画像として渡す必要がある。⏎入力画像は画像生成モデルの入力として扱われる。⏎入力画像のサイズは、画像生成モデルの出力サイズ |
学習前は「です・ます」の解説文か質問文になって、M1 Maxの書き出しからはMac OS X 10.11が出てくる。
学習後の3つは「〜だった」「〜という話」の書き方になり、行末スペース2個の改行も出るようになった。
層拡張だけがAnima-Baseのテキストエンコーダを「Qwen3 0.6B」と続け、LoRAはQwen3-VL-4B、フルFTは精度と速度の話にそれた。
フルFTはM1 Maxの書き出しだと同じ句を繰り返すだけだった。
ただ1回の貪欲生成の話なので、これだけで層拡張が事実を覚えてるかは何とも言えない。
追加実験の分も同じ4本を試したけど、他の3つは上と同じで、学習後は文体が近づくだけ。
なので事実の確かめようがある1つ目の書き出しだけ載せておく。
書き出し「Anima-Baseのテキストエンコーダは」
| モデル | 続き |
|---|---|
| 0.6B層拡張(Wikipedia2割) | Qwen3-0.6Bだったが、Anima-BaseはQwen3-0.6BではなくQwen3-0.6B-Base(Qwen3-0.6Bのベースモデル)を使う。⏎Qwen3-0.6B- |
| 1.7B学習前 | 、どのような特徴を持っていますか?また、その特徴がどのように利用されるのでしょうか?さらに、Anima-Baseのテキストエンコーダは、どのようなデータセットで訓練されていますか?最後に、Anima-Baseのテキストエンコーダは、 |
| 1.7B層拡張 | Qwen3 0.6B(Qwen3-0.6B-base)で、Qwen3 0.6Bの1/10の計算量でAnima系の品質を出している。⏎Qwen3 0.6Bは202 |
| 1.7BフルFT | Qwen3-0.6Bで、LoRAはQwen3-0.6Bの学習データに収まっている。⏎Qwen3-1.7Bの学習データには入っていないので、LoRAの学習データがQwen3- |
1.7Bは層拡張もフルFTも「Qwen3-0.6B」と続けた。
Wikipediaを混ぜた0.6Bも同じ。
0.6Bで3方式中1つだけだった事実が、1.7Bでは両方で出た。
続きの「1/10の計算量で」「LoRAは学習データに収まっている」は記事のどこにも書いていない作文で、0.6Bと同じく事実を答えるモデルにはなっていない。