Paper Review 8 : Code Review & Test
이번에 리뷰할 논문은 소위 ConvNeXt V2로 알려진 'ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders'입니다. ConvNeXt V1이 swin v1에 영감을 받은 것처럼 ConvNeXt V2 또한 Swin v2에 영감을 받은 것처럼 보이는 모습입니다. 다만 디테일한 부분에서는 조금 다른데요, Swin V2가 swin 구조가 더 큰 사이즈의 이미지를 다루는 과정에서 발생한 비효율성을 개선하기 위한 구조에 초점을 맞춰 VRAM 소모를 줄일 수 있는 방법과 모델 구조 개선, 그리고 기존 2단계 학습 구조에서 3단계 학습 구조로 변경했다면, ConvNeXt V2는 ConvNeXt를 포함한 ConvNet 계열의 모델들이 SSH(Self-Supervised Learning)의 효과를 보이지 못하는 문제를 해소하는 것에 초점이 맞춰져 있습니다.
이를 위해 본 논문에서는 크게 두 가지를 제시하는데요, 하나는 사전 자기주도학습을 위한 학습 구조(FCMAE)이고, 다른 하나는 보다 개선된 모델 구조(GRN)입니다.
이번 포스팅에서는 모델링 과정을 디테일하게 다루지는 않을 것이며, 그 이유에는 크게 두 가지가 있습니다. 첫 번째는 ConvNeXt V2의 모델 구조 자체는 거의 바뀌지 않기 때문입니다. 그래서 수정된 부분만 간략히 다루게 될 예정입니다. 두 번째로는 본 논문에서 사전자기주도학습과 호환가능하도록 제시한 방법(FCMAE)은 이전에 Swin V2에서 다뤄보았던 SimMIM과 같은 Masked Image Model 계열의 Masked AutoEncoder이며, 이에 대한 코드 또한 마스크를 씌우고 그 부분을 예측하는 등 일반적인 코드와 다를 바가 없어 굳이 직접 구현하지 않고 공식 코드를 가져와 사용했기 때문입니다.
참고로 해당 코드를 수정하기 위해선 근본적으로 Sparse Tensor를 다루는 라이브러리를 직접 구현하거나 이번 포스팅 및 본 논문에서 제시한 MinkowskiEngine이라는 라이브러리를 사용해야 하는데, 다른 라이브러리와 달리 compile의 과정이 필요합니다. 이를 일일히 수정하고, 설명하는 것은 본 포스팅의 목적에서 벗어나기에 간략하게 개념만을 다루도록 하겠습니다.
본 논문에서 제시하는 방법론은 크게 두 가지입니다. 하나는 FCMAE(Fully Convolutional Masked AutoEncoder)로, 사전 자기주도학습(SSH) 방법 중 하나인 Masked AutoEncoder를 ConvNeXt 구조에 맞게 수정한 것입니다. 이전에 swin v2에서는 동일한 MIM(Masked Image Modeling) 방법론 중 하나인 SimMIM을 사용했었는데요, 전체적인 구조와 개념은 당시와 거의 흡사합니다.
SimMIM과 동일하게 Masked AutoEncoder 또한 이미지의 특정 부분에 마스크를 씌우고, 마스크가 씌워지지 않은 부분을 통해 원본 이미지를 재구성하는 방식으로 구현됩니다. 다만 이렇게 마스크가 씌워진 영역을 제대로 처리하기 위해 Sparse Convolution을 사용함으로써 마스크된 영역으로부터 정보 유출을 방지한다고 합니다.
ConvNeXt V2에서 제시하는 두 가지 방법 중 다른 하나는 바로 GRN(Global Response Normalization)입니다. 이는 차원이 확장되는 Block의 두 번째 레이어의 결과로 발생하는 feature collapse를 방지하고자 도입되었습니다. feature collapse란 특정 레이어에 존재하는 여러 차원 간 데이터를 분석하는 방식이 흡사하며 동시에 그 중 다수가 죽거나 포화된 상태여서 제대로 된 정보처리를 하지 못하는 것을 의미합니다. 이는 커널 자체가 무용해지거나 중복된 방식으로 데이터를 처리하기 때문에 모델의 성능 저하를 발생시킵니다.
이를 시각적으로 확인하면 아래와 같습니다.
위 그림에서 볼 수 있듯 ConvNeXt V1은 비슷한 형상으로 겹치는 결과물이 상당수 존재하며, 그 중 상당수는 죽었거나 포화된 상태의 커널입니다. 본 논문에서는 이러한 문제를 위와 같은 시각화 말고도 Cosine 유사도를 이용해 표시하기도 하였으며, 그 결과는 아래와 같습니다.
위 그림에서 볼 수 있다시피 ConvNeXt V1의 경우, SSH 방법인 FCMAE를 적용했을 경우 오히려 지도 학습만을 적용했을 때보다 심한 feature collapse(cosine distance가 가까움)를 보이는 것을 수치적으로 확인할 수 있으며, GRN이 도입된 V2에서는 반대로 그보다 높은 수준의 다양성을 지니고 있는 것을 알 수 있습니다. 이러한 GRN은 우리의 뇌가 수많은 뉴런 간의 다양성을 촉진하는 메커니즘에 착안해 만들어졌다고 합니다.
본 논문에서 제시한 바를 확인하기 위해 다음과 같은 순서로 진행할 것입니다. 이는 본 논문에서 제시한 ConvNeXt V2 모델을 그대로 학습시킬 경우 V1과의 성능 차이는 어떻게 되는지, 그리고 추가적으로 사전 자기주도학습을 적용할 경우의 성능은 어떻게 되는지 등을 테스트하기 위한 것입니다.
참고로 이 부분부터는 제 코드를 참조하며 이해하면 더욱 쉽습니다. 제 코드는 여기에서 확인할 수 있습니다.
1. ConvNeXt V2 Modeling : -layerscale +GRN
2. ConvNeXt V2 Supervised Training
3. FCMAE Modeling with Sparse Conv
4. ConvNeXt V2 FineTuning After FCMAE
ConvNeXt V2의 모델링은 위와 같이 간단합니다. 기존 ConvNeXt V1 Block에서 LayerScale을 제거하고, 본 논문에서 제시하는 GRN 개념을 구현하는 코드를 GELU 활성화 층 이후에 추가하면 됩니다. GRN은 위에서 이미 설명했다시피 뇌의 뉴런 간 반응 다양성을 유지하기 위한 방법에서 영감을 받아 구현되었으며, 주 목적은 모델의 특성 붕괴(Feature collapse)를 막음으로써 커널의 붕괴 혹은 포화 상태를 방지하고, 각 커널이 차별적이면서도 디테일한 영역에 이르기까지 다양한 분석을 할 수 있는 커널을 구성하는 것입니다.
본 논문에서 제시하는 GRN의 수도 코드는 아래와 같습니다.
GRN은 Feature Aggregation → Divisive Normalization → Calibration의 세 가지 단계로 구성되며, 여기에 잔차학습과 학습가능한 파라미터를 추가함으로써 완성됩니다.
첫 번째 Feature Aggregation은 위 수도코드에서 gx에 해당하는 항목으로 공간차원에 대해 feature aggreagation을 하는 과정으로 일반적으로는 global average pooling을 이용하지만, 아래 표를 통해 확인할 수 있듯 global average pooling은 L1 혹은 L2 norm을 사용하는 것에 비해 성능이 낮았다고 합니다.
위 ablation study의 결과 본 논문에서는 L2 norm을 위해서 aggregation을 적용하고, 이는 각 채널별로 공간차원에 대해 L2 norm을 적용한 것과 같은 결과를 만들어내게 됩니다.
두 번째는 분할 정규화(Divisive Normalization)로, 풀어서 설명하자면 이전 단계에서 공간 차원에 대해 정규화가 진행됨으로써 채널별로 구성된 X에 대해서 어떤 채널이 더 중요하고, 덜 중요한지 상대적 중요성을 계산하는 단계입니다. 이 과정을 통해 상호억제를 통해 채널 간에 특징 경쟁을 일으키게 되며, 이에 대해서도 다양한 정규화 방식 연구가 이뤄졌지만 아래 그림처럼 단순 분할 정규화가 가장 잘 작동하였습니다.
물론 위 그림에서 알 수 있다시피 표준화를 이용한 정규화 방법도 거의 유사한 성능을 내긴 합니다.
마지막 단계는 이전 단계에서 구한 값들을 이용해 X를 보정(Calibration)하는 것입니다. 본 논문에서는 이러한 세 단계로 구성된 GRN의 효과를 증명하기 위해 다양한 실험을 진행하기도 했으며, 그 결과는 아래와 같습니다.
위 표에서 볼 수 있듯 현재의 방식으로 구성한 GRN이 안정적이면서도 가장 높은 성능을 달성할 수 있었습니다. 또한 추가적으로 위 수식에 추가적으로 학습가능한 파라미터 gamma와 beta를 추가함으로써 최적화가 용이하도록 구현합니다. 또한 이렇게 적용된 GRN이 모델이 깊어짐에 따른 성능 문제 등을 해소하기 위해 Residual Connection 방법을 이용합니다. 이에 대한 적용 유무에 대해서도 아래와 같이 실험한 후 적용한 것입니다.
잔차학습까지가 우리가 사용할 GRN의 최종 형태입니다. 이에 대한 코드 구현은 아래와 같습니다.
이러한 GRN을 Block에 적용하는 코드는 아래와 같습니다. 참고로 GRN을 적용함으로써 LayerScale이 불필요해져, 이를 제거합니다. 명확한 비교를 위해 V1 Block과 V2 Block을 함께 보여드립니다(참고로 공식 코드에서는 pointwise convolution을 Linear 레이어로 대체해 사용했기 때문에, gamma와 beta의 shape이 다릅니다).
V1에서의 Block은 dwconv → layernorm → pwconv 1st → activation(GELU) → pwconv 2nd → layerscale → dropath → residual connection로 구성됐었습니다. V2에서는 Layerscale을 GRN으로 대체하며(정확히는 GRN이 추가되며, Layerscale이 빠진 것으로 그 위치는 다릅니다), 코드는 아래와 같습니다.
위 그림과 같이 V2에서의 Block은 dwconv → layernorm → pwconv 1st → activation(GELU) → GRN → pwconv 2nd → layerscale → dropath → residual connection로 구성됩니다.
이렇게 구현된 모델의 성능을 살펴보도록 하겠습니다. 참고로 우리가 구현한 모델 타입은 Tiny이며, embed dim은 96, depths는 [3,3,9,3]으로 구현된 기본적인 모델입니다. 이 모델의 parameter 수는 아래 그림에서 확인할 수 있듯 기존보다 약간 늘어난 숫자입니다.
다음으로는 모델의 성능입니다. 학습에는 우리가 계속해서 사용했던 sports dataset을 사용했으며, 동일한 데이터 증강과 EMA, Grad Norm 등으로 통일해 학습하였습니다.
100 에포크의 학습만으로 꽤나 유의미한 성능을 내는 것을 확인할 수 있습니다. 추가적으로 ConvNeXt V2의 학습을 500에포크로 늘리고 보다 복잡한 Augmentation을 적용할 경우 각각 다음과 같은 성능을 보이게 됩니다.
복잡한 데이터 증강이 적용되지 않은 수준으로도 이미 swin이나 CvT보다 높은 수준의 성능을 보이고 있는 것을 확인할 수 있습니다. 다만 데이터셋의 사이즈가 작기 때문에 비교적 ConvNet 계열에 유리했음은 감안해야 합니다. 참고로 이러한 성능은 ImageNet에 대해 사전학습된 모델을 가져와 파인튜닝한 수준의 성능입니다.
FCMAE의 특징은 크게 두 가지입니다. 하나는 사전 자기주도학습 방법 중 하나인 Masked AutoEncoder 방법을 채택했다는 것이고, 다른 하나는 이를 Convolution과 어울릴 수 있도록 Sparse Tensor를 이용한 ConvNeXt를 모델링해 encoder로 사용한 것입니다.
FCMAE(Fully Convolutional Masked AutoEncoder) 기법은 말 그대로 MAE와 Convolution을 결합하기 위한 방법입니다. MAE는 이전에 적용했던 SimMIM과 같은 Masked Image Model 계열의 모델로써 이미지 중 임의의 부분을 마스크로 가리고 주변 이미지를 통해 마스크 이미지를 복원해내는 과정을 반복함으로써 locality를 학습시키는 방법입니다.
이러한 MIM 계열의 방법론은 대표적인 사전자기주도학습 방법 중 하나입니다. 일반적으로 MIM 외에는 CL(Contrastive Learning) 계열의 방법론이 존재하며, MoCo가 그 대표적인 예입니다. Contrastive Learning의 경우, 입력된 데이터들 간의 차이와 유사도를 학습하게 되는데요. 레이블링이 있다면 같은 레이블인지, 아닌지만을 학습하거나 레이블이 없다면 입력된 복수의 데이터를 기반으로 증강기법을 적용해 같은 원본 이미지와 증강 이미지는 유사하게, 다른 이미지와는 차이가 발생하도록 학습하는 방식입니다.
두 계열의 자기주도학습 방법을 직관적으로 비교한 결과는 아래와 같습니다.
위 그림은 마지막 레이어의 query token에 대한 depth별 attention map을 시각화한 것인데요, 위 그림은 배경에 대한 query token과 홍학의 몸통에 해당하는 query token에 대한 attention map이 어떻게 나타나는지를 보여줍니다. 결과적으로 CL 계열은 어떤 depth의 token이든 이미지 전체적으로 핵심이 되는 객체(홍학)에 대해서만 집중을 하는 경향(배경에서도 홍학에 집중)이 있지만, MIM 계열은 해당 토큰의 주변 및 비슷한 값을 가지는 토큰에 집중하는 것을 확인할 수 있었다고 합니다.
이러한 특징은 MIM 계열의 모델을 통해 Transformer가 가진 Inductive Bias 문제를 해소하는데 도움을 주고, 파인튜닝 시 더 나은 성능이 나올 수 있도록 최적의 사전학습 혹은 가중치 초기화를 하는 방법으로 작동하는 셈입니다. 해당 논문[2]에서는 이러한 특징으로 인해 Linear Probing(사전학습한 backbone은 고정해두고, task에 맞는 head를 추가해 모델을 튜닝하는 것)에서는 CL 계열이 우수했고, 사전학습한 부분도 가중치를 업데이트하는 FineTuning에서는 MIM 계열이 더욱 우수했다고 합니다.
그 외에도 큰 모델일수록 MIM이, 작은 모델일수록 CL이 더욱 높은 성능을 보였으며, 가장 성능이 높았던 것은 CL의 비중을 0.2 정도로 해서 두 방법론을 모두 적용하는게 가장 높았다고 합니다. 또한 제 경험적 사항을 추가적하자면 적어도 수만 개 이내의 작은 데이터셋에 대해선 MIM 계열의 방법론을 적용할 때 더 많은 사전학습 epoch 및 튜닝 epoch가 필요했습니다. 해당 내용에 대해 더 알고 싶다면 해당 논문[2]을 참조하시는 것을 추천드립니다.
해당 논문[2]을 보고 나면 MIM 계열의 사전 자기주도학습이 Transformer에 부족한 Inductive Bias를 해소해줄 수 있는 방향으로 초기 가중치를 세팅해주는 역할을 하는 듯해 보이는데요, 이로 인해 ConvNet 모델에게는 오히려 CL 계열의 자기주도 학습법이 더 적절하지 않나하는 의문이 생길 수 있습니다. 이를 고려해 본 논문에서도 MoCo V3를 이용한 사전학습과 성능 비교를 해놓았는데요, 그 결과는 다음과 같습니다.
위 지표로만 보면 MAE가 더 현명한 선택처럼 보이기도 하는데요, 개인적으로 의아한 부분은 사전학습 없이 진행한 지도학습보다도 성능이 떨어진다는 것입니다. 이와 관련해 참고할만한 지표로는 본 논문에서 채택한 FCMAE에 Sparse Convolution이 적용되기 전후의 성능입니다.
위 지표는 ConvNeXt V1을 이용한 지표로 V2를 적용할 경우 83.7은 84.6이 됩니다. 저 위의 84.9의 성능은 더 많은 epoch(1,600)로 FCMAE를 사전학습한 뒤 파인튜닝했을 경우의 성능입니다. 개인적으로 여기서 MAE를 ConvNeXt에 적용하기 위해 Sparse Tensor를 적용한 FCMAE가 적용된 것과 같이 MoCo V3를 적용할 경우에도 그에 맞는 최적화 전략이 필요하지는 않았나 의문이 듭니다.
FCMAE 모델링 코드는 ConvNeXt V2 공식 github[3]에서 가져왔습니다. FCMAE를 구현하기 위해선 크게 두 가지 작업이 추가되어야 하는데요, 첫 번째는 Sparse Tensor를 이용한 ConvNeXt V2 모델이고, 다른 하나는 이를 이용한 FCMAE 모델 구조입니다.
Sparse Convolution은 존재하는 값의 대다수가 0인 Sparse Tensor(data)를 다루기 위한 Convolution 방식으로, 일반적으로 padding 등을 고려해 함께 계산되는 일반적인 convolution과 달리 Sparse Tensor에 대해 효율적으로 특징을 추출하고, 불필요한 계산을 줄이는 효과가 있습니다.
좀 더 구체적으로는, Dense Convolution에서는 0이라는 값은 그 자체적으로 혹은 주변 값과 어우러지며 분석되는 의미가 존재합니다. 반면 값의 과반수 이상이 0으로 구성된 Sparse Tensor를 다루기 위한 Sparse Convolution에서는 무의미한 값을 최소한도로 다루기 위한 전략을 채택하는 것입니다. 우리가 일반적으로 사용하는 Dense Convolution과 Sparse Convolution 차이를 시각화한 것은 아래 그림과 같습니다.
Sparse Tensor를 이용한 ConvNeXt-V2는 Minkowski Engine 라이브러리를 사용했으며, 최신 버전의 torch 등과 호환되지 않아 이를 설치하기 위한 매뉴얼을 작성하였습니다. 만약 직접 설치해 진행해보고 싶다면 제 이전 포스팅을 참조하시길 바랍니다.
Minkowski Engine을 이용해 Sparse Tensor 베이스의 ConvNeXt-V2 모델링을 완료했다면, 다음으로는 이를 이용한 FCMAE를 작업해야 합니다. 이는 위에서 제시한 MAE의 개념에 따라 Sparse ConvNeXt를 encoder로 삼고, Dense ConvNeXt(torch로 모델링한 것을 말합니다. 차이를 두고자 이렇게 표현했습니다)의 마지막 블록 하나를 decoder로 둠으로써 원본 이미지를 재생성하는 구조로 이뤄져 있습니다. 이때 추가적으로 고려할 것은 MAE 구조를 적용하기 위해 Mask를 생성하고, 적용하는 부분을 추가해야 한다는 것입니다. 이에 대해서는 여기를 눌러 전체 코드를 살펴볼 수 있습니다.
또한 실험적으로 FCMAE를 다양한 하이퍼 파라미터 환경 하에서 테스트해보았는데요, 제가 확인한 것은 본 논문에서 제시한 바와 같이 생각보다 큰 학습 epoch가 필요하다는 것이었습니다. 본 논문에서는 800 에포크와 1,600에포크를 제시했습니다. 또한 이렇게 사전학습된 모델을 파인튜닝할 때에는 LLRD를 적용하기는 하지만 한 번에 지도학습할 때보다 높은 학습율을 적용해야 가시적인 효과를 보였습니다.
그 외에는 epoch가 길어져도 FCMAE로 학습시킨 모델의 최적 지점(가장 낮은 loss를 보이는 지점)은 항상 학습 종료 시점에 임박해서 이뤄졌으며, sparse tensor를 이용한 학습하는 과정 및 이후에 finetuning하는 과정에서도 amp를 적용할 경우 loss가 nan으로 나와 amp 적용이 불가능했다는 문제가 있었습니다. 공식 github에서는 JAX를 이용해 가속화했는데, 아직 JAX에 대한 이해가 부족해 이를 이용해 가속화시키진 못했습니다. (여유가 되면 추후에 추가해보도록 하겠습니다)
마지막 부분은 테스트입니다. 이 부분은 swin v2에서 SimMIM으로 학습시켰던 모델 가중치를 불러와 적용했던 방식과 동일합니다. 1)사전 자기주도학습한 가중치를 불러와 2)사용할 수 있는 부분만을 제외하고 삭제한 뒤, 보간하거나 형태를 바꿔야하는 것을 수정합니다. 이후에는 3)Layer-Wise Learning Rate Decay를 적용하고, 4)학습하면 모든 학습이 완료되게 됩니다.
첫 번째로는 사전학습시킨 가중치를 불러와 리맵핑하는 과정입니다. decoder 가중치를 삭제하고, encoder prefix를 제거하고, sparse tensor로 구성된 레이어의 형상을 dense tensor용으로 reshape해 적용합니다.
위 코드를 통해 mask 관련 가중치 및 projection, decoder 가중치를 제거하고 'encoder' prefix를 제거한 뒤 가중치를 업데이트합니다. 이러한 코드를 적용했을 때, 출력되는 결과는 다음과 같습니다.
위 그림의 마지막 부분에서 사용되지 않는 가중치 및 초기화는 FCMAE 혹은 Sparse Tensor를 이용해 구현한 ConvNeXt 모델링에서만 사용된 weight입니다. 정확히는 모델이 초기화(init)되며 인식된 모듈명 중 일부가 함께 저장됐었던 결과물로 보이나 문제는 없습니다. 사전학습 때만 존재했던 가중치를 사용하지 않는다는 의미이기 때문이며, 굳이 해결하려고 한다면 처음부터 self로 지정한 downsampling layers를 마지막에 지정하는 식으로 조정할 수 있을 것 같습니다(다만 여기선 시간적 제약으로 인해 해당 부분을 수정하고, 재학습시키지는 않았습니다).
이렇게 가중치를 불러온 뒤에는 사전 자기주도학습의 성능을 확인해볼 차례입니다. 우선 사전학습된 가중치를 불러온 모델을 그대로 학습해본 뒤, Swin V2에서와 같이 Layerwise Learning Rate Decay를 적용해볼 것입니다. 참고로 본 논문에서 제시한 LLRD는 크게 두 가지 방식이 있는데요, 하나는 우리가 이전에 했던 바와 같이 하나의 블록을 단일 레이어로 취급해 적용하는 방식이고, 다른 하나는 세 개의 블록을 묶어서 하나로 취급해 적용하는 Group-Wise Learning Rate Decay 방식입니다. 하나씩 살펴보도록 하겠습니다.
참고로 이 학습 과정에서는 위에서 한 번 언급한 적 있었던 복잡한 데이터 증강 방식을 적용하며, 이에 대한 코드는 아래와 같습니다.
위 그림에서 적용된 TrivialAugmentWide 코드를 통해 여러 증강 코드를 한 번에 적용할 수 있습니다. 다만 이러한 증강 코드를 적용함으로써 에포크 당 학습 속도가 약 15초 정도 늘어나는 것은 감수해야 합니다. 이 방식을 적용해 각각 100, 500, 1,000에포크를 학습시킨 결과는 다음과 같습니다.
1,000 에포크 학습 시 여태까지 리뷰했던 모델들 중 가장 높은 성능이 나왔으며, 500에포크 학습시 사전학습이 없었을 경우(500에포크 기준 0.9541)보다 높은 성능을 확인할 수 있었습니다. 참고로 FCMAE를 800에포크에서 1,600에포크 학습시킨 가중치를 적용했을 때에는 500에포크 학습 시 F1-Score가 0.959515에서 0.962545로 증가했습니다.
이번에는 swin v2에서 적용한 Layer-wise Learning Rate Decay(LLRD)를 적용해보겠습니다. 이전의 포스팅에서 확인할 수 있었듯, 비지도학습 방법을 적용해 사전학습을 진행한 경우 이 과정에서 모델의 입력부분에 가까운 레이어들이 충분히 입력된 데이터의 특징을 잘 해석할 수 있었기 때문에 LLRD를 적용함으로써 모델의 입력부분에 가까울수록 낮은 학습율(Learning Rate)를 적용함으로써 오히려 더 높은 성능을 확인할 수 있었습니다.
이때 ConvNeXt V2에서는 크게 두 가지 방법의 LLRD를 제안하는데요, 하나는 우리가 일반적으로 사용했던 방식과 동일하게 하나의 블록을 하나의 레이어로 취급해, 블록별로 다른 학습율을 적용하는 것이고, 다른 하나는 세 개의 블록을 하나로 묶어서 좀 더 낮은 가중치로 학습율을 decay하는 Group-wise Learning Rate Decay가 있습니다. 참고로 이때 downsampling layer는 이전 블록의 학습율과 동일하게 가져가고, 모든 레이어의 bias, 그리고 layernorm과 grn은 weight decay 제외 대상입니다.
이를 적용하기 위한 코드는 아래와 같습니다.
순서대로 모든 layer를 출력해 핸들링하기 쉬웠던 swin v2와는 달리 convnext v2에서는 순서에 맞는 레이어를 출력해 적절히 다뤄줄 수 있는 코드가 추가되어야 합니다. 이렇게 적용된 레이어별 가중치는 다음과 같습니다.
이러한 llrd가 적용된 후의 성능은 아래와 같습니다.
llrd를 적용하지 않았을 때보다 오히려 성능적으로 약간 낮아진 모습인데요, 혹여나 구현 과정에서 어떤 실수가 있었나 싶어서 여러 모로 검토해보고, 자문을 구했지만 구조상 문제는 없었습니다. 추가적으로 하이퍼 파라미터 튜닝을 통해 모델의 파라미터부터 EMA와 LLRD도 다양하게 바꾸고 조합해가며 테스트해봤지만, LLRD를 적용하지 않는 경우가 더 성능이 높았습니다(같은 말이지만 정확하게 표현하면 모델의 앞단으로 향할수록 곱해지는 가중치 값인 t mult를 1에 가깝게 할수록 성능이 높았습니다).
다만 이러한 성능은 FCMAE의 의미 자체를 부정하는 것은 아니며, FCMAE를 통해 사전학습함에 따라 성능이 비약적으로 증가한 것은 사실입니다. 다만 데이터셋의 규모가 작을 경우에는 Transformer 구조에서와는 달리 ConvNet 구조를 이용한 파인튜닝 시 LLRD의 적용에 주의해야 한다 정도의 결론이 내려질 수 있을 것 같습니다.
Group-wise learning rate decay는 엄밀히 말해 저희가 구현한 tiny 모델을 위한 방법론은 아닙니다. 위 본 논문의 내용에서 볼 수 있듯 GLRD는 모델의 사이즈가 큰 경우, 세 개의 레이어를 묶어 하나의 레이어로 취급해 학습율을 조정하는 방식입니다. 이에 대한 코드는 아래와 같습니다.
이렇게 적용한 코드의 결과 가중치는 아래와 같이 세 개의 레이어씩 묶어서 출력되게 됩니다.
이렇게 적용한 모델의 학습 성능은 아래와 같습니다.
이러한 glrd의 결과 또한 각 레이어마다 희석되는 가중치인 t mult값을 1에 가깝게 할수록 성능이 높아졌습니다. 다만 LLRD나 GLRD가 원하는 목적의 성능을 내고 있지 못하더라도, 여전히 Swin 등 여태까지 리뷰한 모델들 중 가장 높은 성능을 내고 있는 것을 확인할 수 있습니다.
다시 정리하면 GRN을 적용한 ConvNeXt V2 모델은 (적어도 작은 데이터셋에 대해선) 그 자체만으로도 V1이나 여타 모델에 비해 성능이 좋았으며, FCMAE를 이용해 사전학습시켰을 경우 더욱 성능이 올라가는 것을 확인할 수 있었습니다. 다만 학습시키는 데이터셋이 작은 이유에선지 LLRD의 적용결과는 썩 좋지 못했습니다.
[1] Zhuang Liu, Hanzi Mao, Chao-Yuan Wu, Christoph Feichtenhofer, Trevor Darrell, Saining Xie. A ConvNet for the 2020s. https://arxiv.org/abs/2201.03545
[2] Namuk Park, Wonjae Kim, Byeongho Heo, Taekyung Kim, Sangdoo Yun. WHAT DO SELF-SUPERVISED VISION TRANSFORMERS LEARN?. https://arxiv.org/pdf/2305.00729
[3] facebookresearch. ConvNeXt-V2. https://github.com/facebookresearch/ConvNeXt-V2