概要

小さな画像拡大DNNを使い、FP16の重みをFP6へ変えたときの画質とファイル容量を比較した。量子化条件の探索では検証画像4枚のPSNRが上がったが、別画像4枚では下がった。その後、撮影系列を分けた174枚の5分割評価と、FP16の条件を固定するまで使わなかった12枚で評価した。同程度のパラメータ数でも、残差型と直接生成型では一律FP6への変換による劣化が大きく異なった。FP6の最終12枚比較はFP16結果を見た後に加えたため、新たな盲検評価ではない。

この記事は、探索で得た改善が別画像にも残るか、また一律のFP6量子化でモデル間の劣化がどう違うかを検証した記録である。小さな画像拡大DNNの結果であり、LLMの精度やFP6専用演算器の速度を直接示すものではない。

背景と問い

前の記事では、FP6のE3M2とE2M3を眺めながら、限られたbitを重みのどこへ配るかを考えた。JPEGのように表現を変えたり、Zopfliのように量子化を作る段階で候補をたくさん試したりできないか、という話も書いた。ただ、その時点では自分でモデルを量子化して測った結果はなかった。

そこで quant-search-exp を作った。LLMをいきなり扱うのではなく、重みが数百個の画像拡大DNNから始める。実験結果と手順は Issue #9の検証レポート にも残している。

調べたいのは二点ある。推論時のFP6形式を変えずに量子化条件だけを探索したとき、選択に使っていない画像でも画質は上がるのか。そして、パラメータ数をほぼ揃えた別のモデルでも、一律のFP6量子化による画質低下は同じ程度なのか。最初は探索的に測り、その結果を受けて画像の分け方とモデル比較を作り直した。

実験方法

小さな画像拡大モデル

最初に作ったのは、低解像度JPEGをbicubicで縦横2倍に拡大し、その結果を小さなDNNで補正するモデル。拡大後の3×3画素のRGB値、計27値を入力し、16ユニットのReLU隠れ層を経て、中央画素に加えるRGB補正3値を出す。全部で499パラメータしかない。一般的な超解像モデルと画質を競うためではなく、量子化条件を何度も変えて評価できる大きさにした。

学習用の画像から最大512×512画素のcropを取り、半分に縮小して品質70のJPEGを作り、元のcropを正解として2倍拡大を学習する。評価でも同じように人工的な低解像度JPEGを作る。指標は、復元画像と元画像のRGB画素から計算したPSNRで、高いほど元画像に近い。出力JPEGとして保存するときの再圧縮誤差は含めない。

モデルの重みをFP16で保存したファイルは1,006 byte。FP6版は接続重み480個を32個ずつのblockに分け、各blockにE8M0の共有scaleを付ける。bias 19個はFP16のままで、ファイル全体は431 byteになった。つまり「全499パラメータを6bitにした」という話ではない。どちらも計算時にはFP32を使うので、この実験からFP6専用演算の速度向上も主張できない。

探索的な量子化条件の比較

まず、FP6 E2M3という推論時の形式を固定し、量子化するときのscale、clipping、丸め方だけを変えてみた。15個のblockについて標準設定以外の26候補ずつ、合計390候補を検証画像4枚のPSNRで順に比較する。よい候補が見つかったblockだけ採用する方式で、全組み合わせの総当たりではない。モデルのファイルサイズと推論器は変わらない。

この時点では検証4枚と別画像4枚で比べた。ただし、別画像4枚は390候補の選択には使っていないものの、それ以前の学習条件の検討で参照済みだった。盲検の最終評価ではなく、探索的な比較として扱う。

学習画像数の予備比較

次に、元の学習画像18枚に131枚を追加し、学習を8、32、64 epochに延ばして比べた。モデルは同じ499パラメータで、seedを3通りにした。各epochで抽出する画素数は画像18枚でも149枚でも同じ20万画素にしている。

撮影系列を分けた追試

その後、追加画像を148枚に増やし、既存26枚と合わせた174枚を撮影月や近いカメラの連番で26組にまとめた。同じ組が学習側と評価側へまたがらないように5分割し、seed 42と43で比較する。以前使った評価4枚もこの174枚の中に含め、各分割では学習側か評価側のどちらかに置く。

モデルは二種類にした。一つは先ほどの残差型で、bicubicで拡大した画像をDNNが補正する。もう一つは直接生成型で、低解像度画像の3×3近傍から高解像度の2×2画素を直接出す。後者は推論時にbicubic画像を使わない。比較するパラメータ数を約500個と約650個の二組に揃え、どちらも隠れ層は1層。24 epoch、JPEG品質70、学習率0.0003とし、1 epochあたりの教師画素数80万と更新回数も揃えた。ただし入出力の仕事そのものは異なるので、完全に同一の学習問題ではない。追試にはモデルの種類と幅を記録する別のファイル形式を使ったため、同じ499パラメータの残差型でも、最初のモデルとはファイル容量が少し異なる。

別に確保した12枚は、条件を固定するまで学習にも交差検証にも使わず、174枚すべてで再学習したモデルを最後に評価した。画像の完全一致と近いdHashは検出されなかったが、同じような撮影場面まで否定できるわけではない。

FP16モデルの保存済み重みから、接続重みだけを一律MXFP6 E2M3またはE3M2へ変換した。32重みごとにE8M0 scaleを使い、biasはFP16のまま。ここではblockごとの形式選択や390候補の探索は行っていない。FP6モデルも読み込み時にFP32へ展開してから計算する。

結果

量子化条件の探索

モデル検証4枚別画像4枚
FP1634.447 dB31.382 dB
一律FP6 E2M334.437 dB31.379 dB
E2M3の量子化条件を探索34.468 dB31.361 dB

検証側では一律E2M3から +0.031 dB。しかし別画像では -0.018 dB だった。作成時に計算を増やせば選択に使った画像へは合わせられるが、それだけで別画像にもよくなるわけではない。数値と試行記録は 探索結果JSON にある。

学習画像数の予備比較

3 seed平均の旧評価4枚では、18枚で8 epochのFP16が31.308 dB、64 epochでは31.438 dB。一方、149枚で64 epochは31.401 dBだった。追加画像を使った32 epochでは検証4枚の値がよくなったが、旧評価4枚では18枚のみの同条件を下回った。少なくともこの条件では「画像を増やせば改善する」とは言えない。

総抽出画素数を固定したので、画像を増やすと1枚あたりが選ばれる機会は減る。データ追加の効果と、各画像を何回見たかの効果は完全には切り分けられていない。加えて旧評価4枚はすでに見ている。この予備比較を決着とせず、評価の分け方を作り直した。seed別の値も含めた記録は 学習量と追加画像の予備比較 に置いた。

撮影系列を分けた評価と最終12枚

最終12枚のbicubicだけのPSNRは 33.405 dB。次は2 seedの全RGB画素の誤差を合算して計算した値で、画像ごとのdBを平均した数字ではない。

モデルパラメータファイル容量 FP16→FP6FP16FP6 E2M3FP6 E3M2
残差型・幅164991,010→429 byte33.44633.16633.369
直接生成型・幅12492996→430 byte33.35031.23927.874
残差型・幅216541,320→557 byte33.43533.40833.285
直接生成型・幅166521,316→560 byte33.35831.66027.037

FP16モデルの差

FP16の段階で、残差型がbicubicを上回った幅は小さい。幅16で +0.042 dB、幅21で +0.031 dB。直接生成型はどちらもbicubicより低かった。FP16同士を同じ画像・seedで対にすると、撮影系列を分けた5分割でも直接生成型は残差型より平均で約500パラメータ組が -0.329 dB、約650パラメータ組が -0.321 dB。26撮影組を単位にしたbootstrapの95%区間も、それぞれ[-0.395, -0.272] dBと[-0.394, -0.256] dBだった。ただし撮影組の定義は近接した画像からの推定であり、完全に独立した標本とは限らない。最終12枚でも、各サイズの12枚×2 seedの24件中、直接生成型が上だったのは1件だけ。表の全画素を合算したPSNR差と、画像ごとに対で取った差の平均は計算方法が違うため一致しない。

FP6へ変換したときの差

量子化の影響はさらに違った。5分割でのE2M3によるFP16からの低下は、残差型では 0.015〜0.024 dB。直接生成型では 1.953〜2.103 dB だった。最終12枚でも、残差型・幅21の低下は 0.028 dB なのに対し、直接生成型は 1.699〜2.111 dB 下がる。つまり、パラメータ数や隠れ層数が近くても、一律のFP6レシピに対する感度は大きく違う。

一方、残差型・幅16は最終12枚でE2M3にすると 0.281 dB 落ち、E3M2の方が高い値になった。E2M3が常に勝つわけでもない。何が効いたのかは、重みや層を分けて調べる必要がある。直接生成型のE3M2がさらに大きく落ちたことも、形式だけの一般的な優劣とはせず、このモデルとscale選択を含む結果として読むべきだろう。

集計値と画像別の値は 5分割の分析 最終12枚の分析 FP6比較結果 で確認できる。画像本体はリポジトリに入れていない。

考察

前の記事では、形式やscaleを選び、作成時に探索すれば限られたbitをうまく使えるのでは、と考えた。実際に試すと、選択に使った4枚だけで上がったPSNRは、別画像での改善を保証しなかった。Zopfliになぞらえて探索回数を増やすとしても、モデルの量子化では「よい結果」を何で判定するかが難しい。探索候補を増やすなら、候補を選ぶ画像と、最後まで触らない評価画像を分ける必要がある。

もう一つ分かったのは、量子化後の数字だけ見ても原因を取り違えることだ。直接生成型はFP16の時点で残差型より低く、さらに一律FP6にも敏感だった。先にFP16モデル自体の品質を見て、その同じ重みを量子化したときの差を別に見る方がよい。「隠れ層が1層だからFP6に弱い」とも言えない。残差型も1層だが、条件によっては劣化がほとんどなかった。

限界

未使用12枚についても注意がある。FP16の条件を固定してから評価した一方、FP6の比較はそのFP16結果を見た後に加えた。したがってFP6の12枚を新たな盲検評価とは呼ばない。12枚という数も少なく、撮影系列が近い画像を含みうる。撮影月と連番に基づく5分割も、場面が完全に独立していることを保証しない。

今回の対象は数百パラメータの画像拡大DNNで、LLMの量子化精度を直接示すものではない。評価画像も人工的な低解像度JPEGから作っている。また、FP6専用演算器で推論していないので速度比較にもならない。残差型と直接生成型はパラメータ数を揃えたが、出力の作り方まで同じではない。ここで観測した差の原因を、モデル構造のどの要素に帰すべきかはまだ特定できていない。

結論

次に進めるなら、直接生成型のどの層・blockが量子化に敏感なのかを切り分け、幅や深さを変えた場合も同じ画像分割でFP16の画質とFP6との差を別々に測りたい。そのうえで形式選択やscale探索を再開する。今のところ「どのbitをどこへ配るか」の前に、何を基準として改善と呼ぶのかをきちんと固定する必要がある。