見出し画像

Vit(VisionTransformer)について理解を深める第一部        [Input layerについて理解する]

1.VisionTransfomerってなに?

Visiontransfomerというものは、Attension(注意機構)を活用した画像分類モデルです。
VisionTransfomerが登場する前は、ResNetやEfficientNetなどのCNN(畳み込みニューラルネットワーク)が主流かつ高精度なモデルでした。
しかし、
2020年にVit(VisionTransfomer)が登場したのです。
Vitは簡潔に説明すると、高精度かつ学習コストがCNNよりも少ないモデルです。
CNNなどの畳み込み層を使わずに、MultiHeadAttensionを活用して高精度(SoTA)を叩き出しました。
「MultiHeadAttensionってなんぞや」と思われている方もいらっしゃると思いますが、第二部で説明します。とりあえずこの章ではVitはやばいんだということだけを説明しました。

今回は、この下の図であるTransfomer Encoderの前までの処理Input layer
を説明します!


https://openreview.net/forum?id=YicbFdNTTyから引用

2.Inputlayerについて概念的な理解


https://qiita.com/omiita/items/0049ade809c4817670d7より引用

元々は、Transfomerは自然言語処理から扱われていたものになります。自然言語処理では、このように、文字をベクトル化にしてEncoderに入力させております。VisionTransfomerでは、このような処理を画像にも適用させたのが、下の図になります。

https://qiita.com/omiita/items/0049ade809c4817670d7より引用

このように画像をパッチというものに分割していきます。

https://qiita.com/omiita/items/0049ade809c4817670d7より引用


画像を平坦化(Flatten)させている理由は自然言語処理に合わせて実装されている為です。
なんか文章みたいに見えてきませんか?…

次に、この平坦化させたベクトルに対して特殊な処理(線形埋め込み)をおこなっていきます。
後半の背景を先にフライングで説明すると、このベクトル達の内積を取ります。(Multihead-Attensionでやります)
内積を取るということはどのような意味を指しているのでしょうか?
内積=類似度 なのです
内積が大きければ大きいほど、そのベクトル同士は類似性が高く
内積が小さければ小さいほど、そのベクトル同士は類似性が低いことを指しております。

2.1 Embeding層は何をしているのか?

それと特殊な処理(線形埋め込み)との関係ってなんなの?
それについて説明します。

元々の画像は0~255の輝度値(8bit)などで表された画像なので、学習ができないですよね。それに対して、ベクトル同士の類似度が大きくなるように学習可能にさせているのです。

これが第一のInputLayerの仕組みです

2.2 クラストークン(CLS)について

次に、クラストークン(CLS)について説明していきましょう。

Class Tokenとは、簡潔に説明すると画像全体の情報を凝縮させたベクトルになります。

最終的に正解ラベルとの差を見るためにある層(MLP Head)にベクトルを入力させるのですが、その入力にはクラストークンしか入れないのです。別の言い方だと、このTransfomer Encoderの出力はクラストークンのみとなっています。

このクラストークンは、パッチの埋め込みと同じ長さのベクトルで、それ自体が学習可能なパラメーターとなっています。
このベクトルの初期値は、標準正規分布に従った乱数をクラストークンの初期値としています。
CLSは下の図でいうと0の場所になります。

https://openreview.net/forum?id=YicbFdNTTyから引用

2.3 位置埋め込みについて

最後のInputlayerの仕組みである位置埋め込み(Position Embding)について説明します

Self-Attensionで内積を取り、類似性をみることができるが
画像で大事な「位置情報」を知ることができません。

そこで位置埋め込みを加算してあげることで、位置情報も得ることができます。

位置埋め込みも学習可能なパラメーターとなっており、初期値はクラストークン同様、標準正規分布に従った乱数を取ります。
損失が小さくなるように最適な値が学習されます。

3.Inputlayerについて数式を用いて理解

ここでは、Inputlayerについて数式を用いて説明しますが、学習時間の関係上、マークダウンは使わずに記述で説明します・・
ご容赦ください。。

どれが学習可能なパラメーターであるか認識しておくことがめちゃ大事ですね。

この最後のZoという行列が実際にMultiheadAttensionに入っていくことになります。
Np+1というのは行の数であり、classトークンとパッチ分の数になっています。
Dというのは、埋め込み層のベクトルの大きさになります。

4.次回の内容について簡単に説明

これまでにいろんなところからMultiHeadAttentionという言葉を使ってきました。
Vitの根幹がまさにそれといっても過言ではないのです。
まずは、Self-Attentionについて理解をしないと絶対に理解できないので、次の部ではSelf-Attentionについても詳しく説明します。


この記事が気に入ったらサポートをしてみませんか?