generated at
モデル
そもそもモデルデータってなんやねん?
概念的にはAIモデルの学習や機能の基盤となるデータに落とし込んだもの…
ってそんな話じゃわからんので若干プログラム的に構造を書くmorisoba65536
基本的にTransformersafetensors形式のフォーマットをベースに書く
目的としては自分の理解のためとマージとかChatVectorとかがなんで機能するの?というのを少し感覚的にわかりやすくなるので。
基本すごいニワカな人が書いてるのでおかしなところがあれば勝手に消して書き直してやってください…(多分ハルシネーション多数)morisoba65536

プログラム的に見ると?
基本的にはDictionary型とかHashMap型とかいわれているデータ構造に非常に近い
こんな感じのデータで格納されてるやつ(ここに抜き出したのはsafetensorsのヘッダ部分、中の実際のデータ定義(構造について)が書いてる)
>{
> "model.layer1.weight": {
> "dtype": "F32",
> "shape": 256, 512,
> "data_offsets": 0, 1048576
> },
> }
layer/層/テンソル名
なんか用途や概念によっていろいろな名前で呼ばれるやつ、上記でいう"model.layer1.weight"
LLMをマージしたり推論したりLoraを適用したり、なんかするときの基本的な1単位として扱われることが多い
階層マージとかMoEの専門家の出力の重ね合わせとか、場合によっては精度(ビット数)が変わったりも大体この層単位で見て計算する。
このdictionaryのキーにあたる部分がいわゆるlayer(層)となっている構造が一般的なようだ。
HuggingFaceとかのモデルカードを見ると良く置いてある"model.safetensors.index.json"ってやつにこのキーに当たる部分(layer/層)が書かれている、あのファイルは(モデルファイルがでかすぎるので)バラバラにsafetensorsを切り分けておいているので後で読みだす際に「この層はこのファイルから読み込んでくれー」って書いてるわけだ。
SD(U-Net)とかの階層マージとかも基本的にこの層単位でマージしたりする(のでTransformer固有の概念ではないようだ)
shape/次元
上記でいう"shape": 256, 512にあたるやつ。
層の形、(プログラマーに)簡単に言えば多次元配列の要素数
上記でいうと[256][512]といった256x512の多次元配列がある
中身は基本的には浮動小数点数(プログラムわかんねぇって人に書くと一種の小数)
ちょっとゲームプログラミングとかかじったことがある人なら同じ形(256x512とかの数が一致)の多次元の配列、というのを見て「(各値を)足し引きして差分とったりできるんじゃないか?」的なことを考えるかもしれない。
もしかして:ChatVector
また、同じ形(256x512とかの数が一致)ということは単純に足し算もできるわけで、単純に各値を足して割ったのがマージとなる。
要するに中身は「単純に小数が縦横の方眼状にぶわーってたくさんおいてある」ものに過ぎない。
イメージしにくい人は「層名のファイルに行と列が(全行全列隙間なく埋まった)小数だけ書かれたCSV」的なものをイメージすれば近いかも…近いかな…?
なので同じ位置にある小数(必ずしも正の数ではない)どうしは足し引き出来る、という話。
この数字が変わることで何か能力を得ているのなら「ベースモデル→何か能力を得たモデル」であるなら「何か能力を得たモデル-ベースモデル=何かの能力」なのでは?というのがChatVector
能力Aのモデルの数字と能力Bのモデルの数字を単純に足して2で割れば「能力A+B/2のモデルになりそう」ってのがマージ…と考えると実はこの辺の処理は(小数自体の数が膨大で計算が面倒なこと以外は)単純な四則演算の話になってくる。

(以下工事中、構造説明できる人は勝手に続きを書いても良いです)