[논문리뷰 & 코드살펴보기] Bridging the Gap between Model Explanations in Partially Annotated Multi-label Classification
오늘은 다중 레이블 분류 문제에 대한 논문을 다루어보겠다.
논문:
Bridging the Gap Between Model Explanations in Partially Annotated Multi-Label Classification, Youngwook Kim, Jae Myung Kim, Jieun Jeong, Cordelia Schmid, Zeynep Akata, Jungwoo Lee; Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2023, pp. 3408-3417
CVPR 2023 Open Access Repository
Bridging the Gap Between Model Explanations in Partially Annotated Multi-Label Classification Youngwook Kim, Jae Myung Kim, Jieun Jeong, Cordelia Schmid, Zeynep Akata, Jungwoo Lee; Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recog
openaccess.thecvf.com
논문의 중요한 아이디어 포인트
“how” false negative labels influence a multi-label classification model
-> 기존 연구에서 다루지 않았던, false negative가 모델의 explainability에 미치는 영향을 분석한다.
This observation leads us to think that if we scale up the damaged score of the highlighted region in the model trained with false negatives, the explanation of this model will become similar to that of the model trained with full annotation.
-> false negative 레이블로 인해 강조된 영역의 점수를 증가시키면, 부분 레이블로 학습된 모델의 설명이 완전한 Annotation으로 학습된 모델의 표현력과 유사해질 것이라는 생각에 이르게 되었습니다.
We propose a simple but effective function, named BoostLU, that compensates for the damage of false negatives in a multi-label classification model with lit- tle extra computational cost.
-> 위의 생각 후, BoostLU라는 간단하지만 효과적인 함수를 제안, 이는 멀티레이블 분류 모델에서 오탐(false negatives)으로 인한 damage를 추가적인 계산 비용 매꿀수 있다.
Impact of false negative on CAM
Full anotation, partial anotation를 spearman 상관 계수 등으로 시각화 하여 분석하여 방법론을 탐구해보자.
(a) CAM의 유사성 (Spearman 상관 계수)
그래프 (a)는 CAM_full(완전 레이블로 학습한 모델의 CAM)과 CAM_partial(부분 레이블로 학습한 모델의 CAM) 간 Spearman 상관 계수 분포를 보여준다. 이 값은 같은 이미지에 대해 두 모델이 출력한 CAM의 유사도를 나타낸다.
녹색 분포는 CAM_full과 CAM_partial 간의 상관성을 나타내며, 전반적으로 양의 상관 관계가 있다. 이는 부분 레이블로 학습된 모델도 구조적으로는 CAM_full과 유사한 영역을 강조하지만, 점수의 스케일이 다를 수 있다는 것을 시각화한다.
회색 분포(Control group)는 비교를 위해 생성된 무작위 CAM의 상관성을 나타내며, 대부분의 상관 계수가 0에 가까워 두 CAM 간 상관성이 없음을 보여줌.
(b) 상위 랭킹 attribution 점수
그래프 (b)는 CAM_full 과 CAM_partial의 상위 5% attribution 점수를 비교한 박스 플롯.
양성 레이블에 대해 CAM_partial의 상위 점수가 **CAM_full보다 상당히 낮은 것을 알 수 있다. 이는 false negative 레이블이 모델 학습에 영향을 주어 양성 클래스에 대한 점수를 낮추는 현상을 보여준다.
반면, 음성 레이블에 대해서는 두 CAM 간 큰 차이가 없음을 확인할 수 있다.
(c) 하위 랭킹 attribution 점수
그래프 (c)는 CAM_full과 CAM_partial의 하위 5% attribution 점수를 보여줌.
양성과 음성 레이블 모두에서 하위 점수는 두 CAM 간 차이가 거의 없음을 볼 수 있다. 이는 false negative로 인해 모델의 상위 점수만 영향을 받고, 전반적인 구조는 유지됨을 의미.
이 분석은 false negative 레이블이 CAM의 구조적 형태에는 큰 영향을 미치지 않지만, 양성 레이블의 상위 점수를 감소시킨다는 점을 알수 있다. 따라서 BoostLU와 같은 Compensation 함수를 통해 CAM의 상위 점수를 강화하면, 부분 레이블로 학습한 모델의 설명이 완전 레이블 학습 모델과 유사해질 수 있다는 연구의 배경이 된다.
-> 하위 점수는 유사, 상위 점수를 scailing 하는 방향으로 방법론 확립
코드 설명: BoostLU가 적용된 이미지 분류 모델
사용자가 제공한 코드는 PyTorch를 사용하여 멀티레이블 이미지 분류를 위한 신경망 모델을 구현한 것이다. 이 모델은 ResNet을 백본으로 사용하며, BoostLU 함수를 적용하여 오탐(False Negative) 레이블로 인한 문제를 해결.
이제 이 코드의 주요 부분을 단계별로 설명하고, BoostLU가 어떻게 적용되었는지 자세히 알아보겠다.
글로벌 평균 풀링 클래스 정의
class GlobalAvgPool2d(nn.Module):
def __init__(self):
super(GlobalAvgPool2d, self).__init__()
def forward(self, feature_map):
return F.adaptive_avg_pool2d(feature_map, 1).squeeze(-1).squeeze(-1)
역할: 입력된 특징 맵(feature map)에 대해 공간 차원에서 글로벌 평균 풀링을 수행하여 채널별로 하나의 값으로 축소한다.
forward 메서드:
F.adaptive_avg_pool2d(feature_map, 1): 입력 특징 맵을 출력 크기가 이 되도록 평균 풀링한다.
.squeeze(-1).squeeze(-1): 마지막 두 차원(H, W)을 제거하여 텐서의 크기를 [Batch, Channels]로 만든다.
이미지 분류기 클래스 정의
class ImageClassifier(torch.nn.Module):
def __init__(self, P):
super(ImageClassifier, self).__init__()
self.arch = P['arch']
if P['dataset'] == 'OPENIMAGES':
feature_extractor = torchvision.models.resnet101(pretrained=P['use_pretrained'])
else:
feature_extractor = torchvision.models.resnet50(pretrained=P['use_pretrained'])
feature_extractor = torch.nn.Sequential(*list(feature_extractor.children())[:-2])
if P['freeze_feature_extractor']:
for param in feature_extractor.parameters():
param.requires_grad = False
else:
for param in feature_extractor.parameters():
param.requires_grad = True
self.feature_extractor = feature_extractor
self.avgpool = GlobalAvgPool2d()
self.onebyone_conv = nn.Conv2d(P['feat_dim'], P['num_classes'], 1)
self.alpha = P['alpha']
초기화 메서드 (__init__):
• P['freeze_feature_extractor']: 백본의 가중치를 고정할지 여부.
• P['feat_dim']: 특징 맵의 채널 수 (예: ResNet50의 경우 2048).
• P['alpha']: BoostLU 함수에서 사용할 스케일링 파라미터.
백본 모델 선택 및 초기화:
데이터셋에 따라 ResNet50 또는 ResNet101을 사용한다.
feature_extractor = torch.nn.Sequential(*list(feature_extractor.children())[:-2]):
ResNet 모델에서 마지막 두 개의 레이어(AdaptiveAvgPool2d와 FC 레이어)를 제거하여 특징 추출기를 만든다.
백본의 가중치 고정 여부 설정:
P['freeze_feature_extractor']가 True이면 백본의 가중치를 학습하지 않도록 고정한다.
False이면 백본의 가중치를 학습하도록 설정한다.
추가 레이어 정의:
self.avgpool: 앞서 정의한 글로벌 평균 풀링 레이어이다.
self.onebyone_conv: CAM 생성을 위한 합성곱 레이어로, 입력 채널 수는 P['feat_dim'], 출력 채널 수는 P['num_classes'].
self.alpha: BoostLU 함수에서 사용할 스케일링 파라미터이다.
순전파 메서드 (forward) - 중요!
def forward(self, x):
feats = self.feature_extractor(x)
CAM = self.onebyone_conv(feats)
CAM = torch.where(CAM > 0, CAM * self.alpha, CAM) # BoostLU operation
logits = F.adaptive_avg_pool2d(CAM, 1).squeeze(-1).squeeze(-1)
return logits
입력: 이미지 배치 x ([Batch, Channels, Height, Width]).
특징 맵 추출:
• feats = self.feature_extractor(x)
• 백본 모델을 통해 입력 이미지로부터 특징 맵을 추출한다.
클래스 활성화 맵(CAM) 생성:
• CAM = self.onebyone_conv(feats)
• 합성곱 레이어를 통해 클래스별 CAM을 생성한다.
BoostLU 함수 적용:
CAM = torch.where(CAM > 0, CAM * self.alpha, CAM)
BoostLU 연산으로, CAM 값이 양수인 위치에 self.alpha를 곱하여 강조한다. 양수인 CAM 값으로 해당 위치는 모델이 중요하다고 판단하는 영역이므로, 이를 더 강조하기 위해 self.alpha를 곱한다. 음수인 CAM 값은 그대로 유지하여 영향 없이 둔다.
로짓(logit) 값 계산:
logits = F.adaptive_avg_pool2d(CAM, 1).squeeze(-1).squeeze(-1)
BoostLU가 적용된 CAM에 대해 공간적 평균 풀링을 수행하여 각 클래스에 대한 로짓 값을 얻는다.
BoostLU의 목적은 오탐 레이블로 인해 감소된 CAM의 기여도 점수를 보상하여, 모델의 예측 성능을 향상시키는 것이다.
구현 방식:
- torch.where 함수를 사용하여 CAM의 각 요소에 대해 조건부 연산을 수행한다.
- CAM > 0인 경우: 해당 요소에 self.alpha를 곱한다.
- 그렇지 않은 경우: 해당 요소를 그대로 둔다.
- self.alpha는 1보다 큰 값으로 설정하여, 양성 클래스에 대한 기여도를 증가시킨다.
효과는 첫 번째로, 강조된 영역의 점수를 높여 양성 레이블의 로짓 값을 증가시킨다. 또한 오탐 레이블로 인해 감소된 CAM의 기여도를 보상한다. 가장 중요한 효과로, 추가적인 계산 비용 없이 모델의 예측 성능을 향상시킬 수 있다.
추가적인 고려 사항은 다음과 같다.
하이퍼파라미터 튜닝
self.alpha 값은 데이터셋과 모델에 따라 조정되어야 한다. 일반적으로 alpha를 1보다 크게 설정하여 CAM의 양성 값을 강조한다. 너무 큰 값은 과도한 강조로 모델의 일반화 성능을 저하시킬 수 있으므로 검증 데이터셋을 통해 최적의 값을 찾아야 한다.
백본 가중치 고정 여부 또한 추가적인 고려 사항이다. P['freeze_feature_extractor'] 를 통해 백본의 가중치를 학습할지 결정한다. 데이터셋이 크고 다양하다면 백본을 학습하도록 설정하여 성능을 향상시킬 수 있다.
데이터 전처리 및 증강:
• 이미지 전처리(transform)는 모델의 성능에 큰 영향을 미친다.
• 학습 단계에서 데이터 증강(예: 랜덤 수평 뒤집기)을 적용하여 모델의 일반화 능력을 향상시킬 수 있다.
결론:
이 논문에서, partially annotated 멀티라벨 데이터에서 발생하는 ‘AN’ 문제로 인해 model explanation 스케일링이 손상되는 현상을 분석하고, 이를 보정하기 위한 단순 선형 함수인 BoostLU를 제안하였다.
BoostLU는 모델 설명을 Full labels 로 학습한 모델과 유사한 수준으로 끌어올렸으며, 대규모 손실 수정 기법(large loss modification...논문과 연계)과 결합하여 여러 멀티라벨 데이터셋에서 State-of-the-art 성능을 달성하였다.
...오늘 논문에 대한 main 아이디어를 파악 후 방법론을 알아보고 그에 알맞는 코드에 대해 살펴보았다.