논문링크 : CoCoOp: Conditional Prompt Learning for Vision-Language Models

Implementation : https://github.com/KaiyangZhou/CoOp

CoCoOp: Conditional Prompt Learning for Vision-Language Models은 선행 연구인 CoOp의 unseen class에 대한 weak generalizability 문제를 해결하기 위한 간단한 방법론들에 대해 다루고 있습니다. CVPR 2022 accepted paper입니다.



1. Abstract

    최근 vision 분야에서 Vision-Language Model이 뛰어난 성능을 보이기 시작하면서, 해당 모델을 사용한 다양한 연구들이 제안되고 있습니다. 그 중 CoOp이라는 모델은, NLP 분야의 prompt learning 개념을 도입하여 학습 기반으로 prompt engineering을 수행함으로써, manual prompt 대비 상당한 성능 향상과 시간 절약이라는 큰 업적을 이루어냈습니다.

    그러나 CoOp에는 한 가지 문제점이 존재하는데, unseen class에 대한 generalizable 퍼포먼스가 떨어진다는 것 입니다. 같은 dataset 내에 있는 class이더라도, 학습 과정에서 보지 못한 class에 대해서는 퍼포먼스가 급격하게 떨어지며, 저자는 이에 대해 CoOp이 seen class에 대해 오버피팅된 것 같다고 원인을 밝히고 있습니다.

    이러한 문제를 다루기 위해 제안된 새로운 방법론이 Conditional Context Optimization(CoCoOp)입니다. CoCoOp은 기존 CoOp을 확장하여, 추가적으로 작은 신경망을 하나 더 학습함으로써 각 image에 대해 input-conditional token vector를 생성합니다. 이를 통해 CoCoOp은 기존 CoOp의 static prompt대비 unseen class에 대한 generalize 퍼포먼스뿐만 아니라, 학습에 사용되지 않은 다른 dataset에 대한 transferbility 퍼포먼스 측면에서도 주목할만한 실험 결과를 보여주었다고 합니다.



2. Introduction

    VLM의 등장 배경이나 CoOp에 대해 더 자세히 알고 싶으신 분들은 앞선 CLIP, CoOp에 대한 포스팅을 참고해주시면 감사하겠습니다.


    해당 연구에서, 저자는 CoOp에 대한 치명적인 문제점을 발견했다고 합니다. 위 figure에서 볼 수 있듯이, CoOp이 기존 manual prompt보다 더 높은 performance를 내는 것은 사실이지만, 학습 과정에서 한번도 보지 못한 unseen class에 대해서는 generalization 능력이 현저히 떨어집니다.

    저자는 이러한 문제점의 원인이 CoOp의 구조에 있다고 추측하고 있습니다. CoOp의 context는 training class만을 바라보고 학습을 하게 되며, 일단 학습이 완료되면 fix됩니다. 따라서, 해당 class에 대해 오버피팅 되었을 가능성이 높고, 더 다양한 scene에 대한 여러가지 중요한 요소들을 놓치게 될 가능성이 있다고 합니다. 게다가, 이러한 generalization 능력은 오히려 선행연구인 manually-designed prompt보다도 떨어진다고 합니다.


    이러한 CoOp의 weak generalizability problem을 해결하기 위해, 저자는 conditional prompt learning이라는 새로운 방법론을 제시합니다. 해당 방법론은, 기존 CLIP의 image encoder 뒤에 작은 layer(Meta-Net)를 하나 더 붙여서 image feature에 대한 token을 뽑고, 이를 context token에 더하여 text encoder의 input으로 넣어주는 것입니다. 이를 통해, context token이 class에 대해서만 optimize되는 것이 아니라 각 instance에 대해서도 optimize되는, 좀 더 유연한 context vector가 학습된다고 합니다.

    지금까지의 내용을 간단히 정리해보자면, 모델이 class뿐만 아니라 image도 같이 보게끔 instance에 대한 condition을 줘서, unseen class에 대한 대응력을 높인 prompt를 찾겠다는 이야기로 이해할 수 있을 것 같습니다(class만 보고 학습한 모델은 unseen class에 대한 대응력이 낮기 떄문). 이러한 내용들이 위 figure에 자세히 표현되어 있으며, 해당 방법론을 사용함으로써 class shift에 대한 모델의 robustness를 크게 향상시킬 수 있었다고 합니다.


    CoCoOp은 총 11개의 데이터셋에 대해 실험을 진행하였으며, generalization 성능을 확인하기 위해 test시에는 train에서 한번도 보지 못한 완전히 새로운 class만을 사용했다고 합니다. 그 결과, zero-shot method & CoOp 대비 뛰어난 퍼포먼스를 보여줬으며, unseen classes에 대한 manual과 learning-based prompt 사이의 퍼포먼스 차이를 상당히 줄였다고 합니다. 또한, 더욱 challenging한 상황을 가정하기 위해 오직 하나의 task에 대해서만 context를 학습시킨 뒤, 이를 완전히 다를 class로 transfer하는 실험도 진행하였으며, 해당 실험에서도 여전히 CoCoOp이 매우 큰 차이로 CoOp의 퍼포먼스를 앞질렀다고 합니다. 이를 통해, instance-conditional prompt가 CoOp의 fixed prompt보다 더 transferable함이 증명되었으며, dynamic pormpt의 강점을 증명할 수 있었다고 합니다.


해당 논문의 contibution은 다음과 같습니다.

  • prompt learning에서의 generalizability problem에 대해 시기적절한 insight 제공

  • 다양한 문제 상황을 가정하여 dynamic prompt의 효과를 증명함



3. Method

    초기 저자들은 총 $M$개의 token에 대해 각각 따로따로 condition을 주기 위해 총 M개의 neural networks를 학습하고자 하였습니다. 하지만, $M \times$ size의 neural network을 학습하는 것은 기존 CoOp대비 모델의 사이즈가 너무 커지기 떄문에, 모든 $M$개의 token에 대해 같은 condition($\pi$)을 주기로 하였다고 합니다.

    instance에 대한 token을 생성하기 위해 image encoder 뒤에 Meta-Net($h_\theta(\cdot)$)이라고 불리는 작은 neural net을 붙였으며, 해당 네트워크는 2개의 bottleneck으로 이루어져 있다고 합니다. 각 context token $v_m(x)는$, Meta-Net으로부터 얻어진 meta token(instance-condition) $\pi = h_\theta(x)$과 함께 더해지며, $v_m(x) = v_m + \pi$와 같이 표현됩니다. 이렇게 얻어진 promt $t_i(x) = \{ v_1(x), v_2(x), …, v_m(x), c_i \}$는 text encoder $g(\cdot)$의 input으로 들어가게 되며, 이후의 과정은 CLIP과 동일합니다. 따라서 prediction probability는 다음과 같이 표현될 수 있습니다.


\[p(y|x) = \frac{ exp( \; sim( x,g(t_y(x)) )/\tau \; ) }{ \sum^K_{i=1} exp( \; sim(x,g(t_i(x)))/\tau \; ) }\]

    전체적으로 CLIP과 동일한 수식을 사용하며, text encoder의 input으로 $t_i(x)$가 들어가게 되었다는 점만 확인하시면 될 것 같습니다.



4. Experiments

    CoOp과 CoCoOp의 저자가 같다보니, 실험 세팅이나 내용또한 CoOp과 비슷합니다. 간단하게만 설명하고 넘어가도록 하겠습니다.


    11개의 데이터셋에 대한 평균 accuracy입니다. 여기서 New는 unseen class를 의미하며, H는 Base + New를 의미합니다. CoOp이 Base class에 대해 가장 좋은 성능을 내지만, New class에 대해서는 가장 형편없는 성능을 보이는 것이, base class에 대해 오버피팅 되었음을 반증하고 있습니다. CLIP은 unseen class에 대해 가장 좋은 zero-shot 성능을 보이지만, base class에 대해서는 가장 좋지 않은 성능을 보이고 있습니다. 따라서, seen class와 unseen class 모두에서 준수한 성능을 보이는 CoCoOp이 가장 generalizable하다는 것을 알 수 있습니다.


    첫 번째 figure에 대한 내용을 CoCoOp vs CoOp 중심으로 더 자세히 표현한 figure입니다. unseen class에 대해서는 11개 데이터셋에 대해 모두 CoCoOp이 매우 큰 마진(최대 17%)으로 CoOp을 압도하고 있는 모습을 확인할 수 있습니다. seen class에 대해서는 CoOp이 오버피팅 되어있기 떄문에 성능은 더 높게 나타나지만, 그 수치 또한 CoCoOp과 큰 차이는 없는(최대 7%) 것을 확인할 수 있습니다.


    Domain generalization 능력을 비교한 figure입니다. ImageNet에 대해서는 CoOp과 CoCoOp의 성능 모두 비슷하며, CLIP의 성능을 큰 마진으로 앞서고 있는 것을 확인할 수 있습니다. 반면, domain이 크게 변할 경우 CoCoOp이 CoOp보다 더 robust한 것을 확인할 수 있습니다.



5. Limitations

  1. Training efficiency
    • CoCoOp은 instance-conditional design에 기반을 두고 있기 떄문에 학습 속도가 매우 느리며, 상당한 양의 GPU 메모리를 필요로 한다고 합니다.

    • Memory efficiency 측면에서는 CoOp보다도 더 뒤떨어집니다.

  2. Performance in unseen class
    • unseen class에 대한 zero-shot 성능은 여전히 CLIP보다 떨어지는 경우가 많습니다.

    • manual과 learning-based prompt 사이의 간극을 줄이기 위한 노력이 필요해보입니다.

댓글남기기