Vision Transformer (ViT): 画像セグメンテーション、画像ブロック埋め込み、カテゴリ マーキング、QKV マトリックス、セルフ アテンション メカニズムの分析

著者:CSDN@ _Yakult_

この記事では、ビジョントランスフォーマー(ViT)のポイントを紹介します。画像のパッチング (Image Patching)、画像ブロックの埋め込み (Patch Embedding)、カテゴリ マーキング、(class_token)、QKV 行列計算プロセス、コサイン類似度 (コサイン類似度)、ソフトマックス、セルフ アテンション メカニズムなどの概念が含まれます。主にQKV行列の計算過程を紹介します。



一、画像のパッチング

画像を小さなブロックに分割するプロセスは、「画像パッチング」または単に「パッチング」です。このプロセスでは、画像は同じサイズまたは異なるサイズの一連の小さなブロックに分割されます。これらの小さなブロックは、多くの場合「画像パッチ」(画像ブロック) または単に「パッチ」と呼ばれます。

画像のパッチ処理のプロセスを図に示します。

ここに画像の説明を挿入

「パッチ」とは、画像内の小さな領域またはセグメントを指します。この概念は、大きなサイズの画像を小さな部分に分解して、各小さなブロックを個別に処理、分析、または特徴抽出できるようにするためによく使用されます。

画像を小さなブロック(パッチ)に分割することの利点は次のとおりです。

  • 特徴抽出: タスクによっては、画像全体よりも特定の領域からの情報の方が有用です。各パッチの特徴を抽出することで、より詳細な情報が得られ、画像内容の理解が深まります。

  • 大きな画像の処理: 非常に大きな画像の場合、計算およびストレージの制約に遭遇する可能性があります。画像を小さなパッチに分割すると、計算の複雑さが軽減され、これらの小さなサイズのパッチの処理が容易になります。

  • 適応性: 一部の適応処理アルゴリズムでは、異なる画像領域に対して異なる戦略を採用するのが一般的です。画像をパッチに分割すると、アルゴリズムがより柔軟になり、局所領域での適応性が高まります。

二、パッチの埋め込み

「パッチ埋め込み」は、画像処理および深層学習における畳み込みニューラル ネットワーク (CNN) に関連するコンピューター ビジョンの分野の概念です。

従来の畳み込みニューラル ネットワークは、画像処理でピクセル レベルの演算を使用し、画像上で畳み込みカーネルをスライドさせることによって特徴を抽出します。「パッチの埋め込み」では、この概念により、より高度な特徴表現が導入されます。入力画像を小さなパッチ (「パッチ」とも呼ばれます) に分割し、各パッチを低次元のベクトル表現に変換します。このベクトル表現は、後続のタスクの入力として使用できます。

パッチ埋め込みの目的は、計算の複雑さを軽減し、特徴抽出の効率を向上させることです。従来の畳み込み演算では通常、隣接するピクセルに大量のオーバーラップがあるため、パッチ埋め込みは画像をブロックに分割するため、重要な特徴情報を保持しながら冗長な計算を削減できます。

ここに画像の説明を挿入

3. クラストークン

「クラストークン」は、画像全体のクラス情報を表すために使用される特別なトークンです。通常、モデルがこのカテゴリ情報を分類または生成タスクに使用できるように、パッチ埋め込み後に取得されたベクトル シーケンス内の特定の位置に追加されます。

3.1 クラストークンの追加

Transformer モデルでは、通常、「クラス トークン」が入力シーケンスの先頭に追加され、モデルがカテゴリ情報をエンコードして利用できるようにするために、トレーニング プロセスに特定のアテンション メカニズムが渡されます。

パッチ埋め込み操作の後、「クラス トークン」がパッチ埋め込みベクトル シーケンスの先頭に追加されます。これは、後続の画像分類または生成タスクを支援するために画像全体のカテゴリ情報を表すために使用されます。

ここに画像の説明を挿入

次の例は、アプリケーションが画像が石原さとみであるかどうかを分類することを想定したクラス トークンを示しています。カテゴリ情報を表すためにワンホット エンコーディングを使用します。次に、カテゴリ情報には、yes と no の 2 種類があり、[1, 0]yes と[0, 1]no をベクトルで表現するようになりました。この場合、 class_token は[1, 0]または になります[0, 1]

ここで、この「クラス トークン」を各パッチのパッチ埋め込みベクトルと連結して、最終的な入力シーケンスを取得します。取得した 196 個のパッチ埋め込みベクトルが次のとおりであると仮定します。

[v1, v2, v3, ..., v196]

次に、「クラス トークン」を追加した後の最終的な入力シーケンスは次のようになります。

[Class_token, v1, v2, v3, ..., v196]

このように、入力シーケンス全体の最初のベクトルは「クラストークン」であり、これには画像全体のカテゴリ情報、つまり画像が石原さとみのものであるかどうかが含まれます。モデルはトレーニング中にこのカテゴリ情報を使用して、画像分類タスクを支援できます。

より具体的に言うと、v1 が次のように表現される 2 次元ベクトルであるとします。

v1 = [0.2, 0.7]

このベクトルは、最初のパッチの特徴を表します。ここで、「クラス トークン」と v1 を連結して、最終的な入力シーケンスを取得します。

[Class_token, v1]

「クラス トークン」が画像が石原さとみのカテゴリに属する​​ことを示していると仮定すると、そのワンホット エンコーディングは次のようになります。

[1, 0]

最終的な入力シーケンスは次のようになります。

[[1, 0], [0.2, 0.7]]

この入力列には、画像全体のカテゴリ情報(石原さとみに属する確率が1、石原さとみでない確率が0)と、最初の小ブロックの特徴ベクトルが含まれる[0.2, 0.7]

3.2 位置エンコーディング

クラストークンを理解したら、vitのクラストークンを見てみましょう。

Vision Transformer (ViT) モデルでは、「PE」は位置エンコーディングの略で、画像内の各パッチ埋め込みベクトルをその位置情報と関連付けるために使用され、画像全体のグローバルな位置情報を Transformer に導入するために使用されます。モデル真ん中。

Transformer モデルは畳み込みニューラル ネットワークのように位置情報を明示的に保存しないため、位置エンコーディングは Transformer モデルに入力シーケンス内の位置情報を提供することです。自然言語処理タスクでは、入力は一連の単語ですが、単語の位置情報を保持するために、通常、位置エンコーディングが追加されます。同様に、ViT では、入力は画像の Patch Embedding シーケンスですが、Patch の位置情報を保存するために、位置コードを追加することも必要です。

ViT では、PE(pos, 2i) および PE(pos, 2i + 1) は、「クラス トークン」を計算するために使用される位置エンコード式です。位置コードは、sin 関数と cos 関数を使用して計算されます。「クラストークン」の位置コードの計算方法は次のとおりです。

PE ( pos , 2 i ) = sin ( pos / 1000 0 2 i / dmodel ) PE(pos, 2i) = sin(pos / 10000^{2i / dmodel})PE (位置_2i ) _=sin ( pos / 1000 0 _2 i / dモデル)PE ( pos , 2 i + 1 ) = cos ( pos / 1000 0 2 i / dmodel ) PE(pos, 2i + 1) = cos(pos / 10000^ { 2i / dmodel
})PE (位置_2i_ _+1 )=cos ( pos / 1000 02 i / dモデル) _ _ _ _

位置エンコーディングはサイン関数とコサイン関数の形式を採用します。PE(pos, 2i) は偶数の次元に対応する位置エンコーディングであり、PE(pos, 2i + 1) は奇数の次元に対応する位置エンコーディングです。寸法。計算する場合、pos はシーケンス内のパッチの位置を表し、i は 0 から始まる位置コードの次元インデックス、dmodel は Transformer モデルの隠れ層次元 (フィーチャー次元とも呼ばれます) です。

この位置エンコーディングの計算方法は、Transformer で一般的です。これにより、異なる位置にあるパッチ埋め込みベクトルが特徴空間内で異なる位置オフセットを持つようになり、シーケンス データを処理するときにモデルがそれらの相対位置を考慮できるようになります。


位置エンコーディングの計算プロセスをよりわかりやすく説明するために、単純化した例を見てみましょう。画像があるとします。それを 4x4 の小さなブロック (パッチ) に分割し、合計 16 個の小さなブロックに分割します。各小さなブロックは 2 次元ベクトルで表されます。隠れ層のサイズ (d_model) を 4 と仮定します。

ここで、「クラス トークン」と各小さなブロックの位置エンコーディングを計算してみましょう。

まず、「クラス トークン」の位置は画像全体です。「クラス トークン」の位置を表す仮想位置番号 pos = 0 を選択できます。次に、「クラス トークン」の位置エンコーディングを計算します。

d_model = 4
i = 0

PE(pos=0, 2i) = sin(0 / 10000^(2*0 / 4)) = sin(0) = 0
PE(pos=0, 2i + 1) = cos(0 / 10000^(2*0 / 4)) = cos(0) = 1

したがって、「クラストークン」の位置は[0, 1]としてエンコードされます。

次に、各パッチの位置エンコーディングを計算します。タイルには 1 から 16 までの番号が付けられていると仮定します。次の式を使用して、各タイルの位置エンコーディングを計算できます。

d_model = 4
i = 0, 1, 2, 3

pos = 1
PE(pos=1, 2*0) = sin(1 / 10000^(2*0 / 4)) = sin(1)0.8415
PE(pos=1, 2*0 + 1) = cos(1 / 10000^(2*0 / 4)) = cos(1)0.5403

pos = 2
PE(pos=2, 2*0) = sin(2 / 10000^(2*0 / 4)) = sin(2)0.9093
PE(pos=2, 2*0 + 1) = cos(2 / 10000^(2*0 / 4)) = cos(2)-0.4161

...
など、各タイルの位置エンコーディングを計算します。最後に、各小ブロックの位置エンコード結果が得られる。

これは単純化した例であり、隠れ層のサイズ (d_model) や小ブロックの位置数は実際の状況に応じて異なる場合があることに注意してください。実際には、ViT モデルは高次元の隠れ層を使用し、位置番号はより複雑になります。ここでの目的は、位置コードの計算プロセスを示すことです。

4.QKV

ここに画像の説明を挿入

上図に示すように、QKV マトリックスは、セルフ アテンション メカニズムにおける注意の重みを計算するために使用される 3 つのマトリックスです。これら 3 つの行列は、通常、入力シーケンスを線形変換することによって取得されます。それらはそれぞれ次のとおりです。

  • Q行列(クエリ行列):Q行列はクエリベクトルを生成するために使用され、各クエリベクトルはアテンションメカニズム内の小さなブロック(パッチ)クエリを表し、現在の小さなブロックに関連する情報を見つけるために使用されます。

  • K マトリックス (キー マトリックス): K マトリックスはキー ベクトルを生成するために使用され、各キー ベクトルはアテンション メカニズムの小ブロック (パッチ) のキーを表し、現在の小ブロック間の関係を表すために使用されます。その他の小さなブロック。

  • V マトリックス (値マトリックス): V マトリックスは値ベクトルを生成するために使用され、各値ベクトルはアテンション メカニズム内のパッチ (Patch) の値を表し、現在のパッチの特徴情報を表すために使用されます。

最初に知っておくべきことは、X 行列と Y 行列の次元が同じであり、入力次元も入力次元と同じであるということです。

具体的には、セルフ アテンション メカニズムでは、入力シーケンスはまず 3 つの異なる線形変換を経て、それぞれクエリ行列 Q、キー行列 K、および値行列 V を取得します。これら 3 つの行列はアテンションの重みを計算するために使用され、入力シーケンスが重み付けされ、合計されて最終的な表現が得られます。

このうち、Q と K の内積で得られる行列が注目重み行列 A です。Q と K のプロセスを経ずに V 行列だけがあると仮定すると、これはアテンション機構を追加しない通常のネットワークです。

どのような線形変換方法を使用しても、線形変換に使用する隠れ層の数だけであると仮定すると (この部分は Baidu です)、ここで QKV 行列を取得し、クラス トークンを追加します。以下に示すように、

ここに画像の説明を挿入

もちろん計算するとQKVは線状に引き伸ばされますが、ここでは表現の都合上、長方形のまま描いています。

4.1 コサイン類似度

Q および K 点の乗算を理解する前に、コサイン類似度の概念を理解する必要がありますQ と K の内積はコサイン類似度を比較するため、Q の最初のパッチと K のすべてのパッチを比較して内積を実行すると、コサイン類似度が計算されます

コサイン類似度が大き​​いほど、自己注意の重みも大きくなります。

コサイン類似度の概念と計算方法は以下の通りです。

コサイン類似度は、2 つのベクトル間の類似性を測定するために使用される測定方法であり、2 つのベクトルの方向が類似しているかどうかを計算するためによく使用されます。コサイン類似度では、ベクトルの長さは類似度の計算に影響しないため、ベクトルの方向に注目します。

2 つのベクトル A と B があるとします。これらは次のように表現できます。

A = [a 1 , a 2 , a 3 , . , an ] A = [a₁, a₂, a₃, ..., aₙ]=[ _1ある2ある3... ある]
B = [b 1 , b 2 , b 3 , . , bn ] B = [b₁, b₂, b₃, ..., bₙ]B=[ b1b2b3... b]

ここで、a₁、a₂、…、aₙ と b₁、b₂、…、bₙ はそれぞれ 2 つのベクトルの要素です。

コサイン類似度の計算式は以下のとおりです。

cosine_similarity = ( A ⋅ B ) / ( ∣ ∣ A ∣ ∣ ∗ ∣ ∣ B ∣ ∣ ) cosine\_similarity = (A·B) / (||A|| * ||B||)cos ine_similarity _ _ _ _ _ _ _ _ _ _=(B ) / ( ∣∣ A ∣∣∣∣ B ∣∣ )

の、

  • A・B はベクトル A とベクトル B の内積 (内積)、つまり a₁ * b₁ + a₂ * b₂ + … + aₙ * bₙ を意味します。
  • ||A|| はベクトル A のノルム (または長さ)、つまり √(a₁² + a₂² + … + aₙ²) を表します。
  • ||B|| はベクトル B のノルム、つまり √(b₁² + b₂² + … + bₙ²) を表します。

コサイン類似度を計算するときは、まずベクトル A とベクトル B の内積を計算し、次にそれぞれのノルムを計算します。最後に、ドット積を 2 つのベクトルのノルムの積で割って、コサイン類似度の値を取得します。コサイン類似度の値の範囲は -1 ~ 1 です。

  • コサイン類似度が 1 の場合、2 つのベクトルの方向がまったく同じ、つまり空間内の同じ方向を指していることを意味します。
  • コサイン類似度が -1 の場合、2 つのベクトルの方向は完全に逆、つまり空間内で逆の方向を向いていることを意味します。
  • コサイン類似度が 0 の場合、2 つのベクトルの方向が垂直、つまり空間内で互いに直交していることを意味します。

4.2 Q @ KTK^{T}KT

図の赤枠に示すように、Q と K によって重み行列 A を計算するプロセスを見てみましょう。

ここに画像の説明を挿入

ここに画像の説明を挿入

上の図に示すように、黄色の長方形が Q 行列の要素を表し、青色の長方形がKTK^{T}を表すと仮定します。KT行列の要素このうち、q0は行、k0 は列を表し、q0k0 は黄色の行と青色の列をドット乗算した数を表す。

ここで、q 0は 1 次元ベクトルに取り出された class_token、q 1は Q 行列 (石原さとみの画像) の最初のパッチ ベクトル、k 0は K 行列の転置行列の列であり、一次元ベクトルに取り込まれた class_token を表します。 1 次元ベクトル、k 1は K 行列の最初のパッチ ベクトルです (石原さとみ画像)。

4.3 ソフトマックス( (Q @ KTK^{T}KT ) /dk \sqrt{dk}デク_

まずはソフトマックス関数について理解しましょう。Softmax は、ベクトルの要素を確率分布に変換するために使用される関数です。入力ベクトル z = [z₁, z₂, …, zₙ] を指定すると、Softmax 関数は、すべての確率値の合計が 1 に等しくなるように、各要素 zᵢ を確率値 pᵢ に変換します。

ここに画像の説明を挿入

たとえば、ここでは q 0 k 0、 q 0 k 1 ... q 0 k nの値が確率値に変換され、それらの合計が 1 に変更されます。

自己注意メカニズムでは、dk \sqrt{d_k}で割ります。d これは、深い Transformer モデルでの過剰な注意の重みによって引き起こされる勾配爆発の問題を回避するために、注意の重みをスケーリングするためです。

ここで、 d kはモデル内の注目ヘッドの次元であり、内積結果のサイズは d kであり、異なる位置間の内積結果の値の範囲は大きく異なる可能性があります。スケーリングを行わないと、一部の大きな内積値はソフトマックス後に非常に大きくなる可能性がありますが、小さな内積値はソフトマックス後に 0 に近くなる可能性があります。これにより、注意の重みに大きな差が生じ、一部の場所が他の場所に過剰または過少の影響を与える可能性があり、その結果、モデルの学習および一般化の能力に影響を与える可能性があります。

dk \sqrt{d_k}で割るとd 、すべての内積結果の範囲が比較的安定し、大きすぎたり小さすぎたりしないように、内積結果をスケーリングできます。このようにして、ソフトマックスの後に得られる注意の重みは比較的バランスが取れており、モデルが効果的なグローバルな関係と表現を学習するのにさらに役立ちます。

4.4A@V

ここに画像の説明を挿入

図に示すように、前の計算の後、重み A 行列が得られました。A と値行列を乗算することで、注目重み行列を V 行列に適用します。図の黄色の四角形は、アテンション メカニズムによって計算された Y 行列です。Y 行列の次元は、X 入力行列の次元とまったく同じです。つまり、Transform はプラグアンドプレイのモジュールです。

ここで、qk 0は A 重み行列の行、v 0は値行列の列、qk 0 v 0はそれらの点乗算後に得られる数値 (つまり、q 0 k 0 v 00 +q 0 k 1)です。 v 10 +q 0 k 2 v 20 +...)。

免責事項:
著者として、私は自分の作品と知的財産権を非常に重視しています。私はここに、私のオリジナルの記事はすべて著作権法によって保護されており、私の許可なく誰もそれらを公に公開することはできないことを宣言します。
私の記事はいくつかの有名なプラットフォームでの掲載料を支払われていますので、読者の皆様には知的財産権を尊重し、侵害を控えていただきますようお願いいたします。私の許可なくインターネット上で有料記事を無料または有料(商用を含む)で公開することは、私の著作権の侵害とみなされ、私は法的責任を追及する権利を留保します。
私の記事に注目してサポートしてくださった読者の皆様に感謝します。

おすすめ

転載: blog.csdn.net/qq_35591253/article/details/131994377