2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

図解×数式で学ぶVisionTransformer

Posted at

はじめに

2020年、Google Brainから発表されたVision Transformer(ViT)が、画像認識の分野において長年主流であったCNN(畳み込みニューラルネットワーク)とは根本的に異なるアプローチを提示し、大きな注目を集めました。

An Image is Worth 16x16 Words: Transformers for Image Recognition...

ViTが当時画期的であったのは、それまで画像認識の常識であった「畳み込み」処理を一切使わずに、自然言語処理で実績のあったAttentionメカニズムのみを用いる点です。この新しい手法で、当時の標準的なベンチマークにおいてCNNに匹敵する性能が示されたことは、多くのエンジニアや研究者にとって驚きでした。これは、局所的な特徴から全体を捉えるCNNとは対照的に、画像全体を直接的に捉えるという、革新的な出来事だったと感じています。

では、ViTのどのような点が、これほどまでに注目されたのでしょうか。その強みとして、特に挙げられるのが以下の2点です。

  • 優れたスケーラビリティ
    • ViTの大きな特徴は、そのスケーラビリティにあります。論文では、事前学習に使うデータセットを大規模化するほど、性能が向上し続ける傾向が報告されています。これは、豊富なデータを活用してモデルの限界性能を高めたい場合に、非常に魅力的な特性です。
  • 大局的な特徴抽出
    • CNNがカーネル内の局所的な情報を扱うのに対し、ViTのSelf-Attentionは、画像内のより広い範囲の関係性を一度に捉えることができます。このため、画像内の離れた要素間の文脈理解など、グローバルな視点が必要なタスクで力を発揮すると期待されています。

本記事では、このViTがどのように画像を処理しているのか、そのアーキテクチャの基本的な仕組みを、一つひとつ確認していきたいと思います。その構造を理解することで、なぜこれほどの性能とスケーラビリティに繋がるのか、その本質を探っていければ幸いです。

アーキテクチャの全体像

以下の図はViTのアーキテクチャ全体像を表した論文中に載っている図です。ViTのモデルは大きく分けて入力層(パッチ分割・埋め込み)、Transformerエンコーダ、そして分類用の出力層(MLPヘッド)の三つの部分から構成されています。

IMG_4721.jpeg

ViTではまず上図のように入力画像を一定サイズのパッチに区切り、それぞれをトークン(ベクトル表現)に変換します。得られたパッチ列にクラス分類用の特殊トークンを付加し、各トークンに位置情報のエンコードを加えます。この系列データをTransformerエンコーダ(多数のSelf-Attentionブロック)に入力します。そして最終的に[CLS]トークンの出力をMLPヘッドによって画像のクラスに分類します。以下では、この流れを順を追って詳細に見ていきます。

入力層

パッチ分割 (Patch Split)

ViTでは、入力画像をピクセル行列のまま直接処理するのではなく、まず小さなパッチ(画像の小片)に均等に分割します。以下のではその様子を示しています。これは、長い文章を処理する前に、まず単語ごとに区切る作業と似ています。例えば、224×224ピクセルの画像を16×16サイズのパッチに区切ると、縦横14枚ずつ、合計196個のパッチ(画像の小片)が出来上がります。

ViT_Patch_Extraction_Concept.png

パッチ埋め込み (Patch Embedding):

これらの各パッチを、計算できる形式であるトークン(固定長のベクトル)に変換します。各パッチは元々 $P\times P$(RGBなら $P^2\cdot3$次元)のデータを持っていますが、各パッチを一次元配列(ベクトル)にフラット化し数値列へと変換します。以下の図はその様子を示しています。

つまり、「パッチ」は画像を分割した断片そのものを指し、「トークン」はそのパッチをモデルが扱えるようにベクトル化した後のデータを指します。この変換により、ViTは画像を「トークンの列」として認識し、言語モデルのように処理することが可能になります。

Flattening_(Simple).png

トークンを学習可能な線形写像によって高次元ベクトル(埋め込みベクトル)に変換されます。これはすなわち、パッチnごとのトークン$\mathbf{x}_p^n$(要素の数$P^2 \cdot C$)に重み行列$E$(次元 $\mathbb{R}^{(P^2 \cdot C) \times D}$)を掛けて長さDの特徴ベクトルに写す操作です。ここで$C$はチャンネル数、$D$はTransformer内部で用いる隠れベクトルの次元です。数式で表すと、パッチ$n$に対し埋め込みベクトル $\mathbf{x}_p^n E$ が得られます。その様子は以下の図のようにあらわすことができます。

Linear_Projection_(Revised).png

これらを結合し、Dの要素を持つベクトルがN個並んだ系列 $[\mathbf{x}_p^1 E; \mathbf{x}_p^2 E; \dots; \mathbf{x}_p^N E] \in \mathbb{R}^{N \times D}$が生成されます。Nはパッチの総数を表す。こうして画像はトークン埋め込みの列へ変換され、Transformerが扱える形式(固定次元のベクトル系列)に整形されます。

Concatenation_(Revised).png

列方向の連結 (横) → , (カンマ)

カンマは、行列を左右に連結し、列の数を増やします。連結する行列同士の行数が同じである必要があります。

A = \begin{pmatrix} 1 & 2 \end{pmatrix}, B = \begin{pmatrix} 3 & 4 \end{pmatrix} ⟹ [A,B] = \begin{pmatrix} 1 & 2 & 3 & 4 \end{pmatrix}

行方向の連結 (縦) → ; (セミコロン)

セミコロンは、行列を上下に連結し、行の数を増やします。連結する行列同士の列数が同じである必要があります。

A = \begin{pmatrix} 1 & 2 \end{pmatrix}, B = \begin{pmatrix} 3 & 4 \end{pmatrix} ⟹ [A;B] = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix}

[CLS]トークンの付加

パッチから得たトークン列の先頭に、クラス分類用の特殊トークン(CLSトークン)を付け加えます。このCLSトークンはTransformer内部で他のパッチ情報とSelf-Attentionを行うことで、画像全体を要約した特徴表現を獲得する役割を持ちます。ベクトル長は他のトークンと同じ$D$で、初期値は学習可能なパラメータとしてモデルに組み込まれています(BERTのCLSトークンと同様の仕組み)。最終的にこのトークンが画像を代表するベクトル表現となり、後段の分類器に入力されます。CLSトークンが埋め込まれたトークン列は以下のようになります。

$$
\mathbf{x}_{\text{class}} \in \mathbb{R}^{1 \times D}
$$

$$
[\mathbf{x}_{\text{class}}; \mathbf{x}_p^1 E; \mathbf{x}_p^2 E; \dots; \mathbf{x}p^N E]
$$

Prepending_CLS_Token.png

位置埋め込み (Positional Encoding):

Transformerは本来トークン列内の位置関係を持たないため、画像トークン列にも位置の情報を付与する必要があります。ViTでは各トークンに対応する位置埋め込みベクトル$E_{\text{pos}} \in \mathbb{R}^{(N+1) \times D}$ を加算し、パッチが画像内のどの位置に対応するかの情報を付与します。位置埋め込みにより、「同じ内容のパッチであっても画像内の配置が異なれば意味合いが変わる」という空間的な意味の違いをモデルが認識できるようになります。入力層では「CLS + パッチ埋め込み列 + 位置埋め込み」が準備され、これがTransformerエンコーダに渡されます。

以上の操作をまとめた、Transformerエンコーダへの最終的な入力 $\mathbf{z}_0 \in \mathbb{R}^{(N+1) \times D}$ は、以下の式で構築されます。

\mathbf{z}_0 = [\mathbf{x}_{\text{class}}; \mathbf{x}_p^1 E; \mathbf{x}_p^2 E; \dots; \mathbf{x}_p^N E] + E_{\text{pos}}

この行列 $\mathbf{z}_0$の各行が、Transformerエンコーダに入力される1つのトークンに対応します。

  • 0番目のトークン(CLSトークン):
\mathbf{z}_0^{(0)} = \mathbf{x}_{\text{class}} + E_{\text{pos}}^{(0)}
  • n番目のトークン(画像パッチ):
\mathbf{z}_0^{(n)} = \mathbf{x}_p^n E + \mathbf{E}_{\text{pos}}^{(n)}, \quad n = 1, \dots, N

Positional Encodingの様子を図で表すと以下のようになります。

Adding_Positional_Embeddings_(Margin_Fixed).png

Transformer Encoder層

ViTは以下の図のようにTransformerエンコーダのみから成るモデルで、複数のエンコーダブロックを直列に積み重ねています。各ブロックMulti-Head Self-AttentionMulti-Head AttentionとMLP(多層パーセプトロン)からなり、各部分の前にLayer Normalization(層正規化)、後に残差接続を伴います。これはオリジナルのTransformerと同様の構造です。

image.png

数式でTransformerエンコーダを表すと、入力ベクトルを$\mathbf{z}_{0}\in N \times D$としたとき、エンコーダ各層$\ell(\ell=1\ldots L)$での処理は入力を ${z}_{\ell-1}$として次式で表されます。

  • Self-Attention層:
\displaystyle \mathbf{z}_{\ell}' = \mathrm{MSA}\!\Big(\mathrm{LN}\big(\mathbf{z}_{\ell-1}\big)\Big) + \mathbf{z}_{\ell-1},
  • フィードフォワード層 (MLP):
\displaystyle \mathbf{z}_{\ell} = \mathrm{MLP}\!\Big(\mathrm{LN}\big(\mathbf{z}_{\ell}'\big)\Big) + \mathbf{z}_{\ell}'.

ここで、LNはLayerNorm、MSAはMulti-Head Self-Attentionを表します。

Layer Normalizationは、パッチ一つ一つに対応するトークンベクトル(行)ごとに、そのベクトルが持つ全要素の平均が0、分散が1になるように正規化します。これにより、各トークンの特徴量のスケールが揃えられ、後段の計算がスムーズに進みます。元の行列と同じ形の出力$\mathrm{LN}(\mathbf{z}_{\ell-1})\in N \times D$が得られます。

Layer_Normalization_(Revised__Fixed).png

Self-Attention

まず、Self-Attention層への入力として、前の層から渡されたトークンごとの特徴ベクトル系列 ${z}_{\ell-1}$ があります。Self-Attentionは、この入力情報をもとに、各トークンに3つの異なる役割を与えます。

  1. Query (Q): 他の単語に「情報を問い合わせる」ためのベクトル。
  2. Key (K): 自身の持つ情報を「検索されるため」のインデックスとなるベクトル。
  3. Value (V): 実際に他の単語に「提供される」情報そのもののベクトル。

これら3つのベクトルは、入力${z}_{\ell-1}$ に対して、それぞれ異なる重み行列$\mathbf{W}^Q,$ $\mathbf{W}^K, \mathbf{W}^V \in D \times D$ を用いた線形変換によって生成されます。学習の安定化のために、変換前に入力はLayer Normalization(LN)で正規化されます。


\begin{aligned}
Q &= \mathrm{LN}(\mathbf{z}_{\ell-1}) \mathbf{W}^Q \\
K &= \mathrm{LN}(\mathbf{z}_{\ell-1}) \mathbf{W}^K \\
V &= \mathrm{LN}(\mathbf{z}_{\ell-1}) \mathbf{W}^V
\end{aligned}

Q_K_V_Generation_(Layout_Fixed).png

Q, K, Vベクトルが準備できたら、いよいよAttentionの計算に入ります。これは、あるトークンが他のすべてのトークンとどの程度関連しているかを算出し、その関連度に応じて情報を集約するプロセスです。計算式は以下の通りです。

$$
\quad \mathrm{Attention}(Q, K, V) = \mathrm{softmax}!\left(\frac{Q K^T}{\sqrt{d_k}}\right) V
$$

ここで$d_k$はキーベクトルの次元です。

この一見複雑な式を、3つのステップに分解して見ていきましょう。

Step 1: 関連度の計算 (Attentionスコア)

まず、あるトークンのQueryベクトル($Q$)と、Keyベクトルの転置($K^T$)との内積を計算します。これにより、トークン間の関連性を示す「Attentionスコア」が得られます。QueryとKeyが似ていれば(ベクトルの向きが近ければ)、スコアは高くなります。

Attention_Score_Calculation.png

Step 2: スコアの正規化 (スケーリング & Softmax)

次に、計算されたスコアをキーベクトルの次元 $d_k$ の平方根 $\sqrt{d_k}$ で割ります。これは、次元数が大きい場合に内積の値が大きくなりすぎ、後続のSoftmax関数で勾配が消失してしまうのを防ぐための重要な工夫です(スケールド・ドット積)。

スケーリングされたスコアをSoftmax関数に通すことで、すべてのトークンに対する関連度の合計が1になるような「重み(Attention Weight)」に変換します。これにより、「どのトークンにどれだけの割合で注目すべきか」が確率的に表現されます。

Scale__Softmax.png

Step 3: 情報の加重和 (Valueとの乗算)

最後に、このAttentionの重みと、各トークンのValueベクトルを掛け合わせます。これにより、関連性が高いと判断されたトークンの情報(Value)は大きく、逆に関連性が低いトークンの情報は小さく反映された、新しい特徴ベクトルが完成します。

Final_Output_Calculation.png

この一連のプロセスを通じて、各トークンは「自分自身が文脈の中でどのトークンと強く結びついているか」を考慮した表現へと更新されます。これが、Transformerが文の構造や複雑な意味関係を捉えることを可能にする、Self-Attentionの強力なメカニズムです。

Multi-Head Attention

これまで見てきたSelf-Attentionは非常に強力ですが、一つのAttention機構だけでは、文中の多様な関係性(例えば、文法的な係り受け、意味的な関連性など)をすべて捉えきれない可能性があります。人間が文章を読むとき、様々な角度から内容を解釈するように、モデルにも多角的な視点を持たせたい。この課題を解決するのがMulti-Head Attentionです。
Multi-Head Attentionは、単一のAttention計算を複数(h個)の「ヘッド」に分割し、並列して実行する仕組みです。各ヘッドは、入力情報の異なる「部分空間(subspace)」に注目することで、それぞれが独自の観点からトークン間の関係性を学習します。

1. 入力の分割(Projection)

まず、Q, K, Vをそれぞれ$h$個のヘッドに分割します。これは、各ヘッド専用の重み行列 $W_i^Q$, $W_i^K$, $W_i^V\in D\times D / h$ を用いて、元の$Q, K, V$をより低次元のベクトルに射影(変換)することで実現されます。

Splitting_into_Heads.png

2. 並列Attention計算

次に、各ヘッドで独立してAttention計算を実行します。これにより、$h$個の異なるAttentionの出力$\mathrm{head}_i \in N \times D / h$が得られます。

$$
\mathrm{head}_i = \mathrm{Attention}(Q W_i^Q, K W_i^K, V W_i^V)
$$

各ヘッドは、いわば「専門家」のようなものです。あるヘッドはすぐ近くの単語の関係(局所的な関係)に注目し、別のヘッドは文全体にわたる単語の関係(大域的な関係)に注目するなど、異なる役割を担うよう学習していきます。

Parallel_Attention_Calculation.png

3. 出力の統合(Concatenation & Projection)

最後に、$h$個のヘッドからの出力をすべて連結(Concatenate)し、一つの大きなベクトルに戻します。そして、このベクトルを新たな重み行列 $W^O \in (h \cdot D/h) \times D$で線形変換し、元の次元を持つ最終的な出力$\mathrm{MultiHead}(Q, K, V) \in N \times D$を生成します。

$$
\mathrm{MultiHead}(Q, K, V) = \mathrm{Concat}(\mathrm{head}_1, \dots, \mathrm{head}_h) W^O
$$

Concatenation_and_Final_Projection.png

この統合プロセスにより、各専門家(ヘッド)が得た多角的な知見が一つの洗練された表現にまとめ上げられます。

実際に画像認識モデルViTでは、層が浅い段階ではヘッドごとに注目する範囲が異なり、局所的な関係を見るヘッドと大域的な関係を見るヘッドが混在しています。しかし、層が深くなるにつれて、ほとんどのヘッドが画像全体、つまり文脈全体へと注意を払うようになります。これは、Multi-Head Attentionが、CNNにおける受容野の拡大に似た効果を、より柔軟に実現していることを示唆しています。

出力層

Transformerエンコーダのすべての層を通過した後、私たちは画像全体の文脈を豊富に含んだトークンベクトルの系列を手にします。この中から、系列の先頭に配置した特別なCLSトークンに対応する最終ベクトル $z_L^0$ を取り出します。このベクトルこそが、画像全体の情報を集約した表現として扱われます。

Extract_CLS_Token.png

CLSトークンのベクトルをLayer Normalizationで正規化します。

$$
\mathbf{y} = \mathrm{LN}(\mathbf{z}_L^0)
$$

Apply_LayerNorm.png

そして、この正規化されたベクトル $y$ を、単純な全結合層であるMLPヘッドに入力します。このヘッドは、入力されたベクトルを、あらかじめ定められたクラス数(例:「猫」「犬」「車」など)に対応するスコアに変換します。学習時には、このスコアをソフトマックス関数に通すことで、各クラスに属する確率を算出し、入力画像がどのクラスに分類されるかを予測します。

MLP_Head__Classification.png

ViTの強力な点は、このMLPヘッドの「付け替え」が可能な点にあります。非常に大規模なデータセット(例:ImageNet)で事前学習させたモデルの本体(Transformerエンコーダ部分)はそのままに、解きたい特定のタスクに合わせてMLPヘッドだけを新しいものに交換し、少量のデータで再学習(ファインチューニング)させることができます。これにより、多様な画像認識タスクに対して高い性能と汎用性を発揮するのです。

ViT vs CNN

長年、画像認識モデルの主役はCNNでした。小さなフィルターで画像の部分的な特徴(線や角など)を捉え、その情報を積み重ねていくことで、最終的に画像全体が何であるかを理解する。この「局所から全体へ」というアプローチは、非常に直感的でパワフルでした。

では、ViTはどのようにして画像を「見る」のでしょうか。

全体を一度にみるViT、局所的にみるCNN

ViTの最も革新的な点は、Self-Attentionという仕組みを使って、画像の全体を一度に見渡す能力にあります。

CNNが画像の小さな一部分(例えば3x3ピクセル)に注目する「虫の目」だとすれば、ViTは初期の段階から画像内の遠く離れたピクセル同士の関係性すら直接捉えることができる「鳥の目」を持っている、と例えられます。

例えば、猫の画像を認識するとき、CNNはまず耳の形、目の模様、ひげの線といった局所的なパーツを認識し、それらを組み合わせて「これは猫らしい」と結論づけます。一方ViTは、画像のパッチ(小さな領域)同士の関係性を直接計算します。「左上のパッチ(耳)と、中央下のパッチ(尻尾)は、この画像において強い関係がある」といったことを、データから自ら学習していくのです。

これにより、物体の全体的な形状や文脈(コンテキスト)を、より早い段階で、そして柔軟に捉えられる可能性が生まれます。

image 1.png

ゼロから学ぶViT、常識を持つCNN

この違いは、モデルが持つ「帰納バイアス」の違いに起因します。少し専門的な言葉ですが、これはモデルが生まれつき持っている「思い込み」や「常識」のようなものです。

  • CNNの常識: 画像認識に有利な"常識"を「畳み込み」という処理に組み込んでいます。

    • 「画像の中の物体は、少し位置がズレても同じものだ(平行移動不変性)」

      Translation_Invariance_(Simplified).png

    • 「近くにあるピクセル同士は関係が深い(局所性)」

      Locality_(Detailed_View).png

  • ViTの常識: 特定の"常識"を持ちません。画像固有の仮定を極力排除し、ただひたすらにデータの中から「どの部分とどの部分が重要か」を学んでいきます。

この性質の違いが、学習データの量によって面白い結果を生み出します。

Googleが行ったViTの元論文の実験では、ImageNet(約1400万枚)という中規模のデータセットで学習させた場合、ViTの精度はCNN(ResNet)に及びませんでした。これは、CNNが持つ"常識"が、限られたデータから効率よく学習する上で有利に働いたことを示唆しています。

しかし、JFT-300M(約3億枚)という巨大なデータセットで事前学習を行うと、状況は一変します。ViTはCNNを上回る性能を叩き出したのです。これは、ViTが特定の"常識"に縛られないがゆえに、膨大なデータの中からCNNでは捉えきれなかった複雑でグローバルな特徴を学び取り、その真価を発揮した結果といえます。

ViTが抱える弱点

ViTにも弱点はあります。その特性ゆえの弱点も、私たちは理解しておく必要があります。

1. データ量

ViTの最大の特性であり、同時に弱点ともなるのが、学習データの量への強い依存です。

  • 小規模データでの劣勢: CNNは、「画像中の近くにあるピクセルは関連性が高い(局所性)」といった、画像に特化した「帰納的バイアス」を構造に組み込んでいます。これにより、比較的小さなデータセットでも効率的に学習できます。一方、ViTはそのようなバイアスを持たないため、ゼロから画像の特徴を学ぶ必要があり、データが少ないと何が重要かを判断できず、ResNetのようなCNNに性能で劣る傾向があります。
  • 大規模データでの優位性: しかし、JFT-300Mのような超巨大データセットで事前学習を行うと、ViTはその柔軟性を最大限に発揮し、特定のバイアスに縛られない、より本質的な画像表現を獲得します。結果として、その性能はCNNを超えます。

image 2.png

論文で示されたこのグラフは、事前学習データセットが大きくなるにつれて、ViTの性能がResNetを上回っていく様子を示しています。

2. 計算量

ViTの心臓部であるSelf-Attentionは、計算量にも課題を抱えています。その計算量は、入力パッチ数の二乗に比例して増加します($O(N^2)$)。

これは、高解像度の画像を扱おうとすると、パッチ数Nが急増し、計算コストとメモリ使用量が爆発的に増加することを意味します。パッチサイズを大きくすれば計算量は削減できますが、その分、画像の細かな特徴が失われるというトレードオフが生じます。この問題は、特にリアルタイム処理が求められるアプリケーションにおいて深刻な制約となり得ます。

image 3.png

この図は、入力画像の解像度が上がるにつれて、ViTの推論速度が(特に大規模モデルで)ResNetよりも大きく低下する傾向を示しており、計算量の課題を裏付けています。

これらの課題から、データ量や計算リソースが限られている状況では、依然としてCNNが堅実で優れた選択肢となるケースも少なくありません。

ViTが直面した2つの課題と、それを克服した派生モデルたち

Vision Transformer(ViT)は画像認識に大きな進歩をもたらしましたが、実用化に向けては2つの主要な課題がありました。一つは、CNNに比べて空間的な特徴を捉えるための学習に膨大なデータを要する「データ効率の悪さ」。もう一つは、画像サイズに対して計算量が二乗で増加する「計算コストの高さ」です。

これらの課題を克服するため、ViTの基本構造に独創的な改良を加えた様々な派生モデルが登場しました。ここでは、代表的なモデルがどのようなアプローチでこれらの課題を解決したのかを見ていきます。

課題①:データ効率の改善

ViTの課題は、畳み込み層が暗黙的に持つ「隣接するピクセルは関連性が高い」という帰納的バイアス(inductive bias)を持たない点にありました。このため、画像の基本的な空間構造(局所性)をゼロから学ぶのに多くのデータを必要としました。

この解決策として、長年画像認識で実績のある畳み込み(Convolution)のメカニズムをTransformerに組み込むアプローチが主流となりました。

進化形①:CvT

CvT(Convolutional Vision Transformer, 2021)は、Transformerの心臓部であるトークン化とAttention機構に直接、畳み込みを導入しました。具体的には、パッチを生成するプロセスに畳み込みを用いることで、トークン自体が局所的な特徴を含むように設計されています。このアプローチにより、ViTが必要とした位置エンコーディングへの依存を低減しつつ、性能を向上させました。

CvT: Introducing Convolutions to Vision Transformers

進化形②:CoAtNet

CoAtNet(2021)は、畳み込みとSelf-Attentionを一つのブロック内で効率的に組み合わせるハイブリッドアプローチを提案しました。

  • 初期の層: 計算コストの低い畳み込み(Depthwise Convolution)で効率的に局所的な特徴を抽出します。
  • 後段の層: 大局的な文脈理解が得意なSelf-Attentionの役割を大きくし、広範囲の特徴を捉えます。

この構造により、CNNの学習効率とTransformerの高い表現力を両立させ、少ないデータ量でも高い性能を達成する道筋を示しました。

CoAtNet: Marrying Convolution and Attention for All Data Sizes

課題②:計算効率の向上

ViT最大の壁は、Attentionの計算量が画像のパッチ数の二乗($O(N^2)$)で増大する問題でした。これにより、高解像度画像を扱う物体検出やセグメンテーションへの応用が困難でした。

この計算量の問題を劇的に改善したのが、Swin Transformer(2021)です。

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

Window-based Self-Attention

Swin Transformerは、Attentionの計算範囲を画像全体ではなく、「窓(Window)」と呼ばれる小領域に限定しました。これにより、計算量はパッチ数に対して線形(O(N))に抑えられ、劇的な効率化を実現しました。

Shifted Window

しかし、Attentionの範囲を固定された窓に限定すると、窓の境界を越えた情報伝達ができません。そこでSwin Transformerは、層を重ねるごとに窓の位置をずらす(Shifted Window)という独創的な機構を導入しました。

この「窓ずらし」により、ある層では異なる窓に属していたパッチが、次の層では同じ窓に含まれるようになり、情報交換が可能になります。これを繰り返すことで、効率的な計算を維持しながら、CNNのように局所的な特徴から大局的な特徴へと至る階層的な特徴表現の獲得を可能にしました。

Swin Transformerの成功は、Transformerが画像分類だけでなく、物体検出やセマンティックセグメンテーションといった、より複雑なコンピュータビジョンタスクの主流モデルとなるための大きな転換点となりました。

まとめ

本稿で解説したVision Transformer (ViT)の興味深い点は、単なる精度向上に留まらず、コンピュータビジョンの設計思想に影響を与えた点にあります。

ViTは、CNNが暗黙的に持つ「局所性」や「平行移動不変性」といった強力な帰納バイアスを外し、画像のパッチ間の関連性をデータから直接学習しました。この柔軟性こそが、大規模データセットにおいてCNNを凌駕する性能を達成する要因であると考えられます。

一方で、このバイアスの欠如は、学習効率の低下と膨大な計算コストというトレードオフを生み出しました。この課題を解決する過程で、Attentionの計算範囲を限定するSwin Transformerや、再び畳み込みの構造を取り入れるCoAtNetのようなハイブリッドモデルが生まれました。

結果として、ViTは「いかにしてAttentionの柔軟性と、CNNの持つ効率的な画像処理の知見を融合させるか」という新たな流れを生み出しました。このようにViTの登場は、画像認識における転換点だったと考えられます。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?