ViTのしくみ
Vision Transformer(ViT)は画像の内容を理解するモデル
昔はCNNっていうのが使われてたけど、こっちの方いろいろメリットがあって最近は主流みたい
仕組みざっくり調べてみた
学習時
画像をパッチにぶった切る(Patchify)
例えば 224×224 の画像があったら 16×16 の小さなブロックに切る
すると 14×14 = 196個のパッチになる
パッチをベクトルにして埋め込む(Patch Embedding)
一個のパッチの全てのピクセルのRGBを繋げてベクトルにする
16×16のパッチだったら 16×16×3で768次元になる
[ r,g,b, r,g,b, r,g,b, ... ] ← 768次元
これを線形変換(Wx + b)で 学習可能な埋め込みに変える。
このWを学習する
この時点で768次元のベクトルが縦に196個並んでるマトリックスができる
パッチ同士に位置情報を足す(Positional Embedding)
さきほどのマトリックスに位置情報を足し算する
足し算てどういうこと?って思ったら、位置情報自体もベクトルで、196個分それぞれもとのマトリクスに足し合わせるらしい
この位置情報のベクトル算出モデルみたいなのも多分学習する
画像のRGBと位置情報混ぜちゃって大丈夫なのぃ?って思ってるけどいったんスルーするぃ
Self-Attentionで画像の文脈を読む(Transformer Encoder)
ここからはお馴染みのアテンショ〜ン
- 目パッチ ↔ 耳パッチ
- しっぽパッチ ↔ 体パッチ
- 背景パッチ → 無視気味
- 輪郭パッチ → 複数に重要視
みたいな感じで仲良し同士が近くなるエモの魔法をかけます
重みを学習します はぃ
推論時(分類タスク)
画像ぶった斬り→ベクトル化→Transformer通す
Transformerが教えてくれるのは、
- 目の近くに耳がありますね
- しっぽのちかくに体がありますね
っていう「全体の意味」(猫とは言わない)
それを分類ヘッドで受け取って、
- 猫80%
- 犬10% ...
みたいに出力する