논문에서는 ViViT보다 6.8배 적은 계산량에 파라미터 수는 1/8.5라고 한다. - Related work에 분야별로 transformer 연구에 대해 아주 잘 적혀있어서 꼭 보면 좋을듯.
input tensor는 위 그림에서 보라색인 Linear layer를 지나면서 vanilla transformer식 QKV 임베딩을 거친다. 식으로 나타내면 아래와 같다 :
그 다음 3D CNN에서 자주 사용하던 것과 같이 dimension reduction을 한다. 무슨 말이냐면 pooling을 하는 임의의 어떤(max/average/conv) 커널이 있고, kernel size, stride, padding을 조정해서 L을 줄인다는 것.
논문에서는 아래와 같이 정의했다 :
이제 QKV는 차원이 가 되고, 가 된다. H와 W도 마찬가지이다. 식으로 나타내면
그 다음 pooling 된 QKV로 attention을 하는데, 이건 기존 transformer의 어텐션과 동일한 방식이다 :
이때 d는 head 하나의 dimension이다. 이후에는 layernorm 하고 residual path를 만드는 방식으로 기존의 transformer architecture를 그대로 차용했다.
3D CNN처럼, 깊어질수록 spatial dimension은 줄이되 channel dimsnsion은 늘려 나간다. 이를 위해 CVT와 같이 Scale stage를 4단계로 나눈다.
data layer : 그냥 dataloader이다. 우리가 가지고 있는 비디오를 프레임 간격 로 샘플링한다. 예를 들어 120프레임짜리, H=W=224인 비디오가 있다면 data layer를 거치고 나서는 THW=T/, H, W가 된다. 는 2, 4를 사용하였다.
cube1 : CvT와 비슷한 embedding layer이다. Kernel size = 인 convolution을 사용하고 stride는 가 되도록 한다. MViT-Base model의 경우 , 를 사용하였으며 embedding dimension은 96으로 하였다.
여기서 큰 문제가 하나 발생하는데, 만약 들어온 비디오의 THW=64,224,224라고 하면 data layer를 거치고 나서는 16,224,224가 되고, embedding을 거치면 patch의 수가 개가 된다. 만약 16-bits training을 한다고 하면 한 비디오에서 나오는 attention weight matrix의 용량이 1.3GB에 달한다. 결국 본 논문에서는 64GPU에 한 gpu당 batch size = 8로 세팅하였다.
scale2~5 : transformer layer. embedding하는 패치들의 spatial resolution은 줄여나가면서(==receptive field를 키우면서) embedding dimension은 2배씩 늘려나가는 전략을 취한다. 여기에는 4가지의 중요한 요소가 있다 :
query pooling : CvT의 근본이 되는 작업. 기존의 ViT들은 naive하게 각각 patch들을 linear layer를 태워서 QKV로 만들었으나 MViT는 3x3x3 Conv를 사용해 query를 만든다. 논문에는 나와 있지 않지만 아마 depthwise-separable convolution을 사용했을 것이고, max나 avgpool보다 성능이 확연하게 좋았다고 한다.
key/value pooling : 하지만 가만 생각해 보면 attention block에서 최종적인 output dimension을 정하는 것은 query이다. 예를 들어 이고 라 한다면 Attention score matrix 는 의 shape을 갖게 될 것이며 output energy 는 query의 차원을 그대로 따라간다.
요점만 말하면 key/value를 생성하는 conv kernel의 stride를 1보다 크게 만들자는 것이다. 논문에서는 를 사용했을 경우가 계산량 대비 성능이 가장 좋았다고 한다. 하지만 성능이 가장 좋았던 모델은 stride=1로 두는 모델이다. 이는 CvT에서의 실험과 일치하는 결과이다. 어찌되었든 stride>1이면 필연적으로 downsampling이 되기 때문에 일어나는 현상으로 보인다.
skip-connection position layernorm 뒤에 skip connection path를 만드는 것이 가장 좋은 성능을 보였다.
positional encoding : ViT의 경우엔 PE 자체가 성능에 아무런 영향을 미치지 않았다. 반면 MViT는 시간축과 공간축에 독립적인 PE를 채택했다. 구현 방법은 나오지 않아 코드를 참조해야 할 것 같다.
ViT-base와 두 MViT 모델을 만들어 실험했다. 위의 실험 결과는 Kinetics-400 dataset에서 baseline 모델들을 테스트한 결과. 여기에 리폿된 77.2%와 같은 결과는 QKV pooling을 할 때 maxpool을 적용한 결과로 보인다. 흔히 vision transformer 계열에서 view라는 단어를 사용하는데, 이는 test 당시에 "하나의 비디오에서 몇 번 다른 sampling을 하였는가" 로 정의된다. 본 논문에서 모든 실험은 spatial하게 하나의 center crop만을 사용하고 temporal하게 5번의 sampling을 통해 score를 낸다.
K400 dataset에서 가장 좋은 성능을 거둔 모델은 input video를 3프레임 간격으로 샘플링해 64프레임을 사용한 모델. 어찌되었든 input data 크기가 커질수록 성능이 올라가는 건 당연하다. 하지만 아무런 pre-training이 없었다는 점이 주목해야 할 부분이다.
사실상 CvT랑 별반 다를 게 없는 결과. 비디오 모델이지만 concurrent한 이미지 모델에 비해 뒤지지 않는 성능이다.
Something-something-V2의 약자로, human-object interaction에 초점이 맞춰진 데이터셋이다. 물체가 무엇인지는 중요하지 않고 비디오에서 사람이 하고 있는 행위가 중요한 데이터셋. 라벨들은 아래와 같다 :
성능 리포트할 때에는 kinetics 400/600 pretraining을 거친 모델을 사용했다. 다른 논문들도 그렇고, paperswithcode에서 살펴보면 pretraining을 하지 않은 모델들이 거의 없다. 아마 spatio-temporal modeling이 어려워서 더 큰 데이터셋에 훈련시키고 테스트한 것이 아닌가 싶지만, pretraining을 하지 않고 성능이 얼마나 나올지도 궁금하긴 하다.
평균 길이 30초의 long ranged video들을 모아놓은 데이터셋. 신기하게도 TokenLearner가 SOTA 자리를 지키고 있다. 뿐만 아니라 TokenLearner는 additional pretraining을 하지 않았다. MViT는 k400/600 pretraining을 했으며, 성능은 아래와 같다.
frame을 shuffle해서 넣어주면(==비디오 프레임 순서를 바꿔 학습시키면) 아래와 같이 성능이 크게 떨어진다. 모델의 temporal modeling이 잘 되었음을 보여주는 실험.
view에 따른 cost VS accuracy
크게 확대해 보면 각 scatter마다 몇 개의 view가 사용되었는지 나타나 있다. imagenet pretraining을 한 VTN이나 VIVIT보다 월등한 계산량 대비 성능을 보였으며 CNN 기반 모델들도 이겼다.
다만 조금 걸리는 것은 왜 transformer 기반 모델들이 charades video dataset에서 그렇게 성능이 낮았으며, tokenlearner는 왜 성능이 그렇게 높은지 의문이다. 과연 video 영역에서도 이미지 모델과 비슷한 attention을 사용하는 것만이 답일까?
TokenLearner를 보면 확실히 key information을 내재하고 있는 토큰들은 불과 몇 개에 지니지 않는다는 점은 확실해 보인다. AdaViT처럼 stochastic하게 attention을 하고 TokenLearner처럼 token purning을 진행하면 더 개선된 모델을 만들 수 있지 않을까 하는 생각이 든다.