ConvNet 은 성공할 수 밖에 없을까? CNN 은 몇가지 inductive biases (새로운 데이터에도 추론을 할 수 있게 몇가지 가정을 하는 것) 가 있는데, 그 중에서도
Translational equivariance
이미지가 9x9 라고 하고, 컨볼루션 필터가 3x3 이라고 했을 때, 필터를 어디에 적용하던 결과만 같으면 그 필터가 적용된 곳에는 같은 feature 이 있다.
가 대표적이겠다. 따라서, CNN 은 적절한 feature 을 뽑아낼 수 있는 필터만 학습한다면, 그 필터를 어디든 재활용할 수 있기 때문에 이미지의 형식에 크게 영향을 받지 않고 잘 활용할 수 있었다.
하지만, 이는 ViT (2020) 가 transformer 구조를 차용하면서 박살나버리게 되는데, 이는 ViT 가 이미지를 작은 패치로 나눈 뒤 패치 사이의 관계에 의존해 추론을 하기 때문이다. 단점이라면, ViT 는 한 패치와 다른 모든 패치 사이의 self attention 을 계산하기 때문에 계산복잡도가 무려 O(n^2) 에 육박하는데, 이는 크기가 작은 이미지넷 에서는 납득 가능하겠지만, 고 해상도의 데이터에는 전혀 쓸모가 없어진다.
그래서 Swin Transformer 이 self attention 의 시간복잡도를 O(n) 으로 줄이기 위해 제안되었다. Swin transformer 도 ViT 처럼 이미지를 패치로 나누기는 하지만, 그 전에 sliding windows 라는 더 큰 구분을 도입해 window 안에서만 self-attention 을 하도록 설계해 transformer 계열이 generic vision backbone 으로 사용될 수 있게 했다.
자... 근데 왜 transformer 모델이 이렇게 잘나갈까? 학게는 transformer의 multi-head self attention 의 scalability 가 중요하다고 하지만, 저자는 training procedure 이 차이난다는 것을 의심하고 있다. 따라서, 저자들은 간단하게 ResNet 에 다양한 procedure 을 적용하는 것으로부터 다음의 질문에 답하려 한다.
Transformer 모델의 디자인은 ConvNet 의 성능에 어떤 영향을 줄까?
주요 반영사항은 다음과 같다.
90 -> 300
AdamW
Mixup, Cutmix, RandAugment, Random Erasing, regularization schemes (sthochastic depth, label smoothing).
결과: 76.1% -> 78.8%
Stage compute ratio
블럭의 갯수다. 원래 (3,4,6,3) 이였던 것을 SwinT 의 1:1:3:1 비율에 맞춰 (3,3,9,3) 으로 바꾸었다.
결과: 78.8% -> 79.4% (근데 왜??)
Patchfy
Natural language 와 달리 image 는 최소 224 x 224 급이라 transformer 이 처리하기 어려웠음. 그래서 패치 사이즈를 4x4 로 했던 거고. 따라서, "patchfy" 연산을 도입해서 한번 이미지를 작게 하고 시작함.
stem = nn.Sequential(
nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4),
LayerNorm(dims[0], eps=1e-6, data_format="channels_first")
)
별건 아니고, conv 필터를 4 하고 stride 를 4 넣은거임. 이러면 겹치지 않게 filter 을 적용하기 때문에 "patchfy" 가 되겠지.
결과: 79.4% -> 79.5%
ResNeXt 는 FLOPs/accuracy trade-off 가 ResNet 보다 좋은데, 그 이유를 grouped convolution 에서 찾음.