TransformerEncoder機構を実装する
画像とLoRAの関係に整合性があるか判定する分類モデル構築の際にTransformerEncoder機構を利用した。実装の仕方を解説する。https://scrapbox.io/files/6814b2df48b593fae16b20d9.png
Transformer以前の処理
LoRAIDと画像をベクトル表現し行列形式で入力
以降では入力された行列に対する処理をPythonスクリプトと共に解説する
⓪必要なライブラリのインストール
code:bash
import torch.nn as nn
torch.nnライブラリをnnと略して利用
①Transformer Encoderの定義
code:python
encoder_layer = nn.TransformerEncoderLayer(d_model=768, nhead=8)
#入力ベクトルが768次元のマルチヘッドattention機構(8層)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=2)
#設定したencoder_layerに2回通して処理する組織の定義
d_model=768: 入力ベクトルの次元をViTや埋め込みと揃える。
nhead=8: 8ヘッドの自己注意機構を使用。
num_layers=2: 同じエンコーダ層を2回適用。
つまり、**LoRAベクトル + 画像ベクトル(2つ)**をTransformer Encoderに渡して、selfattentionを通じた「関係性のモデリング」を行います。
TransformerEncoderLayer()の詳細
TransformerEncoderLayerは、Transformerエンコーダの基本構成要素であり、以下の主要なコンポーネントから構成されている
1. マルチヘッド自己注意機構(Multi-Head Self-Attention)
入力内の各位置が他の位置とどのように関連しているかを学習
複数の「注意ヘッド」を用いることで、異なる表現空間での関係性を同時に捉える
↳多様な観点をもって学習可能
2. 位置ごとの前向きフィードフォワードネットワーク(Feedforward Network)
各位置の出力に対して独立に適用される全結合層からなるネットワーク
非線形変換を通じて、モデルの表現力を高める(Relu,Geluなど)
3. 残差接続とレイヤー正規化(Residual Connection and Layer Normalization)
学習の安定
↑位置埋め込み(Positional Encoding)を自動では加算されない
(今回は不要なケース)
構成要素をコードで定義
code:python
import torch.nn as nn
encoder_layer = nn.TransformerEncoderLayer(
d_model=768, # 入力および出力の次元数
nhead=8, # 注意ヘッドの数
dim_feedforward=2048, # フィードフォワードネットワークの内部次元数
dropout=0.1, # ドロップアウト率
activation='relu' # 活性化関数
)
この設定により、入力は自己注意機構とフィードフォワードネットワークを通じて変換され、同じ次元数の出力が得られる
②定義したTransformer EncoderでLoRAと画像間の関係性をモデリング
code:python
x = self.transformer(x) #設定済みのTransformerEncoderによる処理を実行
x:入力となる行列(LoRAベクトル、画像ベクトルを連結させた行列)
このTransformer Encoderによる処理で出来ること
自己注意により、以下のようなベクトル間の相互作用を学習
LoRA IDが表す特徴と画像の特徴がどれだけ一致しているかを、ベクトル間の関係性として把握
単純なMLPではなく、双方向的な情報伝達を可能にするTransformerが、「整合性判定」という本タスクに適しているのではないか
https://scrapbox.io/files/6814b2c7063d02965e971a01.png
#Daichi_Sugita