안녕하세요, 오늘은 비디오 계의 훌륭한 pre-trained 모델을 만든 VideoMAE: Masked Autoencoders are Date-Efficient Learners for Self-supervised Video Pre-Training 논문을 설명하도록 하겠습니다. 참고로 이번 리뷰는 MAE(Masked Autoencoder)를 이해하고 있어야 이해가 빠릅니다. 그럼 시작하겠습니다.
Introduction
최근에는 자연어뿐만 아니라 이미지, 음성 등 많은 분야에서 Transformer를 채택해서 많은 성장이 있었죠? 연속적인 이미지의 집합인 비디오도 마찬가지로 효과가 좋지 않을까요? 일단 Transformer 계열의 모델의 장점을 살펴보면
- 데이터의 종류를 막론하고 Global dependency를 잘 해결하고 있음
(비디오로 치면 인접한 프레임만 보지 않고 저 멀리 떨어진 프레임과의 관계도 함께 추론한다는 뜻입니다) - 다양한 Attention mechanism을 통해 Inductive bias를 효과적으로 줄임
(Inductive bias는 특정 task에서 좋은 성능을 거두도록 설계하고 학습되는 것을 말합니다. 이게 높다면 일반화 성능이 떨어진다는 의미입니다. 좋은 참고 자료는 여기) - 결과적으로 다른 Task에서 좋은 성능을 거뒀음
분명 Transformer 계열의 모델은 효과가 확실합니다. 하지만 그전에 갖춰야 할 조건이 있는데 그건 바로 많은 데이터를 필요로 한다는 점입니다. 그런 맥락에서 비디오에 Transformer를 도입할 때의 문제점은
- 굉장히 많은 지도학습 데이터를 필요로 한다는 것
- 그리고 존재하는 비디오 데이터셋은 이미지 데이터셋에 비해 규모가 매우 작다는 것
입니다. 방대한 데이터만 있다면 성공이 보장된 Transformer 모델은 위와 같은 문제로 Supervised learning(지도학습) 이 어렵고 이를 어떻게든 비디오에 도입하려고 했던 연구가 있지만 이건 Transformer의 Image pre-trained model에 의존하고 있습니다. 사실상 비디오 이해가 아니고 이미지 단위로 쪼개서 뭔가 해보려고 했던 것인데, 시계열을 이해해야 하는 비디오 특성상 이건 근본이 부족하다고 볼 수 있습니다.
하지만 레이블링 된 비디오가 부족하다고 좌절할 수는 없죠. 지금 이 순간에도 수많은 비디오가 촬영되고 있고, Self-supervised learning이라면 이 많은 데이터를 이해할 수 있는 좋은 backbone을 만들 수 있지 않을까요? 그래서 이 논문이 연구하고 기여한 바는 아래와 같습니다.
- ViT Backbone을 활용한 첫 비디오 pre-training
- MAE 구조가 비디오에서도 효과적임을 증명
- 기존 이미지와 자연어에서는 잘 다뤄지지 않았던 Masked modeling계의 비밀을 찾아냄
- 그래서 3,500개라는 적은 비디오로도 훌륭하게 학습을 했고,
- 학습(Source) / 평가(Target) 데이터셋 간의 domain gap이 존재할 때 데이터의 양보다 질이 SSVP(Self-supervised Video Pre-training)에 더 중요함을 발견
Methods
Revisiting Image Masked Autoencoders
혹시 MAE를 잘 모르시는 분들이 계실까봐 살짝 정리하고 갑니다. 논문은 여기.
(Image)MAE는 Asymmetric Encoder-Decoder 구조를 활용해 Input / Ouput 이미지를 동일하게 만드는 Self-supervised learning 방법입니다. Asymmetric이라는 말은 인코더와 디코더의 구조가 서로 달라서 그렇고(좀 더 정확하게는 차원이), 왜 다르냐면 input 이미지를 마스킹하고 남은 패치들만 인코더에 들어갔다가, 디코더 시작하기 전에 마스킹했던 부분 임시로 채워 넣어서 복원하기 때문에 그렇습니다.
모델이 동작하는 순서를 살펴보면,
- 입력 이미지 \(\mathit{I}\) 를 겹침 없이 \(16\times16\) 사이즈의 패치로 분할
- 얻은 패치 중 75%를 마스킹 (없애버린다)
- 남은 25%의 패치만 Transformer Encoder \(\Phi_{enc}\) 에 넣음
- 그리고 Decoder \(\Phi_{dec}\) 가 \(\mathit{I}\) 와 동일한 차원의 이미지 \(\hat{\mathit{I}}\) 을 생성
- Loss function은 오로지 처음 마스킹 되었던 75%에 해당하는 부분을 잘 복원하도록 설계 \(\mathcal{L} = \frac{1}{\Omega}\sum_{p\in\Omega}\left | \mathit{I}(\mathit{p}) - \hat{\mathit{I}}(\mathit{p})\right |^{2}\)
이런 과정을 통해 모델이 이미지의 소실된 부분(마스킹 부분)을 스스로 복원하면서 이해할 수 있도록 학습합니다. 그나저나 정보를 75%나 날려버린다니 엄청 과감하지 않나요??
Characteristics of Video Data
MAE는 그렇게 성공했지만 Video에서 그대로 통한다는 보장은 없습니다. 그 이유는 아래 두가지라고 설명하고 있는데요,
- Temporal redundancy: 비디오 내 대상은 프레임을 따라 매우 천천히 움직이기 때문에 정보의 중복이 너무 많다! 이런 특징은
- 가만히 있거나(static) 천천히 움직이는 대상을 복원하는 일에 모델이 집중하게 되고
- Autoencoder를 통한 복원 작업을 너무 쉽게 만들어버린다
- Temporal correlation: 비디오는 정적 대상에 대한 Temporal extension이라고도 해석할 수 있는데, 인접한 프레임에서 너무 많은 정보를 얻을 수 있다는 점
- 그래서 위 그림의 Frame masking(b), Random masking(c)를 쉬운 작업으로 만들어버리고, SSVP의 효과를 반감시킨다
대충 감이 오시나요? 한마디로 프레임마다 동일 위치의 정보를 조금이라도 살려두거나, 정보를 많이 살려두면 너무 쉬운 학습이 되어버린다는 소리입니다. 그래서 위의 그림의 (d) Tube masking처럼 모든 프레임에 대해 같은 위치를 마스킹하는 방법을 제안했습니다. Frame masking, Random masking의 허점을 생각해 보자면,
- Frame masking: 높은 비율의 마스킹을 했을 때, 긴 시간 연속적으로 프레임 전체가 마스킹된다면 정보 손실이 너무 크다. 마치 10분짜리 영상에서 연속한 9분을 보여주지 않고 내용을 파악하라는 것과 같은 이치
- Random masking: 랜덤 하기 때문에 운이 좋으면 중요한 객체를 계속 보게 될 수도, 운이 나쁘면 아예 못 볼 수도 있다. 한마디로 우리가 의도하지 않은 학습이 일어날 수 있음
VideoMAE
자 그러면 저자들이 제안하는 방법 VideoMAE를 파헤쳐 보겠습니다.
Temporal Downsampling
일단 비디오 내에서 학습 데이터를 샘플링해야겠죠? 비디오를 통째로 넣는다는 건 불가능에 가깝기 때문이기도 하고, 불연속적 장면 전환이나 계속 정적으로 있으면서 대사만 내뱉는 장면 등은 이미지를 통한 비디오 이해에 도움이 안 되기 때문입니다.
- 비디오 \(V\) 가 있을 때, 서로 랜덤 한 위치에서 \(t\)개의 연속한 프레임을 샘플링한다
- 샘플링된 각 비디오 클립에서 \(T\)개 프레임으로 다시 샘플링한다
굳이 2단계로 나눠서 설명할 필요는 없지만 이해를 돕자면, 예를 들어 처음에는 60개의 프레임을 샘플링을 합니다. 그런데 연속된 프레임에서는 정보의 중복이 너무 심하겠죠? 그러니까 여기서 2 프레임 간격으로 다시 샘플링을 해서 총 30개의 프레임을 얻는다는 이야기입니다.
Cube Embedding
ViT에서는 \(16\times16\)이 하나의 패치였지만 이번에는 시간축까지 포함시켜야 합니다. 그래서 시간축으로는 크기를 2로 하여 총 \(2\times16\times16\)이 하나의 Token embedding이 됩니다. 코드를 보면 이것을 만들기 위해 2D Convolution이 아닌 3D Convolution을 쓰는 것을 확인할 수 있습니다 - 코드
class PatchEmbed(nn.Module):
""" Image to Patch Embedding
"""
def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768, num_frames=16, tubelet_size=2):
super().__init__()
img_size = to_2tuple(img_size)
patch_size = to_2tuple(patch_size)
self.tubelet_size = int(tubelet_size)
num_patches = (img_size[1] // patch_size[1]) * (img_size[0] // patch_size[0]) * (num_frames // self.tubelet_size)
self.img_size = img_size
self.patch_size = patch_size
self.num_patches = num_patches
self.proj = nn.Conv3d(in_channels=in_chans, out_channels=embed_dim,
kernel_size = (self.tubelet_size, patch_size[0],patch_size[1]),
stride=(self.tubelet_size, patch_size[0], patch_size[1]))
def forward(self, x, **kwargs):
B, C, T, H, W = x.shape
# FIXME look at relaxing size constraints
assert H == self.img_size[0] and W == self.img_size[1], \
f"Input image size ({H}*{W}) doesn't match model ({self.img_size[0]}*{self.img_size[1]})."
x = self.proj(x).flatten(2).transpose(1, 2)
return x
Tube Masking with Extremely High Ratios
거의 다 왔습니다. 제 생각엔 이 논문의 핵심이 여기인데 그건 바로 아주 높은 마스킹 비율을 가져간다는 것입니다.
전 개인적으로 75%도 원래 도저히 무엇이었는지 파악이 안 되고 90%, 95%는 정말 아무것도 모르겠습니다. 하지만 이건 동영상이기 때문에 저 구멍 사이로 보는 정보를 합치면 대체 무슨 일이 일어나고 있는지 어렴풋이 파악이 될까요... 아무튼 이건 실험적 근거가 있습니다.
위의 그래프 중 우측이 VideoMAE의 그래프인데, 90%까지는 마스킹 비율을 올리면서 성능 또한 올라가는 것을 알 수 있습니다. 그리고 좌측에는 MAE의 마스킹 비율에 따른 성능 그래프를 참고로 넣었습니다.
Backbone: Joint Space-time Attention
거의 대부분(90%)을 마스킹하고 나니까 남은 토큰이 얼마 없습니다. 그나마 남은 토큰을 살려서 비디오를 잘 복원하기 위해 ViT에 Joint Space-time Attention을 적용했습니다. 이 방법은 ViViT 논문에서 제안했고 먼저 Spatial attention을 수행한 후 그 결과들을 모아서 Temporal attention을 하는 방법입니다.
Attention을 여러 번 하니까 일반 Attention 같으면 \(\mathcal{O}(N^{2})\)의 복잡도를 가져서 연산량이 많을 텐데 생각해 보면 남은 토큰이 얼마 없어서 그렇지만도 않습니다. 그래서 \(\mathit{N}\) 자체가 작아 큰 문제가 아니라고 합니다.
Results
결과는 대성공입니다. 그 이유는
- 기존 SSVP 모델보다 눈에 띄는 성능 향상이 있었고
- 비슷한 사이즈의 기존 모델과 비교했을 때 Extra data 없이도 우수한 성능을 보여줌
MAE는 이미지에서 강력한 Self-supervised learning으로 자리 잡았으며, VideoMAE는 비디오에서 같은 종류의 훌륭한 모델임을 증명했습니다.
개인적인 궁금증을 달자면,
- Tube가 random보다 성능이 좋았지만 random의 경우 또한 마스킹 비율에 따른 성능 추이를 보여줬다면 더 좋았을 것 같습니다. 그 이유는 90%만큼이나 마스킹 해버리면 random의 경우 시간축을 따라 인접 픽셀에서 얻을 수 있는 정보가 아예 없을 수도 있기 때문에 90% 보다는 낮은 마스킹 비율에서 더 좋은 성능을 보일 수도 있을 것 같습니다
- Loss function에서 MSE(L2)가 가장 좋은 성능을 보였는데, 이는 reconstruction계의 전통 강자 MSE가 여기서도 유효함을 증명한 걸까요. 몇 가지 이유를 혼자 생각해 보자면
- Convex function이며
- Differentiable (미분 가능)하고,
- Gaussian noise에 대해 Maximum likelihood를 찾을 수 있다는 점에서 다른 애들보다 조금 더 나았겠다는 생각이 듭니다. Gaussian은 대표적인 Unimodal distribution인데 이것을 최적화하다 보면 결국 '가장 그럴싸한' 영상을 복원하게 됩니다. 이 특징은 이미지에서 결과물을 전체적으로 다소 흐릿하게 만드는 결과를 낳는데 비디오에서는 전체 행동을 이해하는 것이 중요하지, 픽셀 하나하나를 정확히 복원하는 게 중요한 일은 아닐 겁니다. 이것을 이해하려면 예를 들어 골프 치는 영상을 조금 흐릿하게 만들어도 "사람이 골프 치고 있구나"라는 맥락은 쉽게 이해할 수 있다고 생각하면 쉬울까요?
- 물론 Loss function 간의 성능에는 큰 차이는 없습니다
'기술 이야기 > 논문 리뷰' 카테고리의 다른 글
[논문 리뷰] Track Anything Models(TAM) 리뷰 (2) | 2023.05.05 |
---|---|
[논문 리뷰] DINOv2: Learning Robust Visual Features without Supervision 설명 (5) | 2023.04.21 |
[논문 리뷰] Consistency Models 리뷰 (4) | 2023.04.13 |
[논문 리뷰] Segment Anything 설명 (코드 살짝 포함) (4) | 2023.04.09 |
[논문 리뷰] Graph Convolutional Network (GCN) (0) | 2023.03.30 |
댓글