추가적으로 개선할 사항 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 방안
a. 클러스터링 단계와 결합
- 소규모 노이즈 클러스터 처리
- HDBSCAN에서 label = –1(노이즈)인 이미지는 별도 softmax 할당으로만 처리하거나,
- 인접 클러스터와 병합해 대표 태그 선정에 활용
b. 클러스터 내 대표 태그 선정 단계와 결합
- Prototype 안정화 (평균/중간값)
- 프롬프트별 4개 임베딩 중 max 대신 mean 또는 median 사용 → 잡음 감소
- 분산 기반 가중치
- 각 태그별로 프롬프트 임베딩 간 variance를 계산해,
- 분산 작을수록(=일관성 높을수록)
T_j
에 추가 점수 부여
- 분산 작을수록(=일관성 높을수록)
- 각 태그별로 프롬프트 임베딩 간 variance를 계산해,
- 동적 τ 설정
- 클러스터 내 모든 유사도 분포의 평균±σ 또는 백분위수 기반으로 τ 자동 산출#
c. 이미지별 할당 & “기타” 처리 단계와 결합
- Softmax 온도 조절
probs = (sims/temperature).softmax(dim=-1)
로 분포 샤프닝 → confidence 조절
- Calibration (평균 보정)
sims = sims – sims.mean()
해주면 모달 갭 편향 완화
- 동적 confidence_threshold 설정
- 전체 이미지의 softmax max 분포를 보고 (예: 75번째 백분위수) 기준치 자동 산출
d. Cross-Encoder 재랭킹 (선택적)
- 1차로 뽑힌 상위 5개 태그에 대해,
- cross-encoder (이미지 + 각 태그 텍스트) 를 돌려 최종 1순위 재랭킹
- (단, 추가 모델 inference 비용이 수용 가능할 때 사용)
2. 도입 예시
a. 이미지 클러스터링
-
목적: 비슷한 이미지끼리 그룹화하여, 같은 클러스터 내에서 일관된 태그를 뽑아 노이즈 감소
-
방법 예시
# image_feats: (N, D) tensor import hdbscan clusterer = hdbscan.HDBSCAN(min_cluster_size=10, metric='cosine') labels = clusterer.fit_predict(image_feats.cpu().numpy()) # -1: 노이즈
min_cluster_size
,metric
등을 튜닝해 적절한 군집 수와 품질 확보
b. 클러스터 내 대표 태그 선정
-
점수 계산
- 각 클러스터 C, 태그 후보 j에 대해
-
유사도 합산:
$S_j = \sum_{i\in C} \cos(f_i, p_j)$
-
강한 자신감 보너스: 특정 Threshold ($\tau$) 초과의 유사도를 가지는 태그가 있으면 가중치 부여
$B_j = w;\bigl|{i\in C \mid \cos(f_i, p_j) > \tau}\bigr|$
-
총합:
$T_j = S_j + B_j$
-
- 각 클러스터 C, 태그 후보 j에 대해
-
대표 5개 태그:
- $T_j$ 기준 상위 5개 태그 추출
- 노이즈 클러스터(label=-1)는 ‘기타’ 처리
c. 이미지별 최종 할당 & “기타” 처리
-
Softmax 기반 할당
# img_feat: (D,), candidate_text_feats: (5, D) sims = img_feat @ candidate_text_feats.T # (5,) probs = sims.softmax(dim=-1) # (5,) pred = probs.argmax() # 0~4 인덱스 conf = probs.max().item() # 최고 확신도
-
“기타” 분류
conf < confidence_threshold
(예: 0.2) 이면 → “기타” 로 분류- 그렇지 않으면
pred
인덱스에 해당하는 태그 할당