
bag-of-embeddings-v1 는 모든 토큰을 평균했지만, 실제 Transformer 배치는 padding-mask-v1 로 pad 위치를 표시함. pad 는 평균에서 제외 해야 문장 임베딩이 정확해짐 (Sentence-BERT 의 "mean pooling" 도 동일).
x: shape (B, L, d) — 토큰별 벡터.mask: shape (B, L) bool — True = 실제 토큰, False = pad.(B, d).m = mask[..., None].astype(float) # (B, L, 1)
num = (x * m).sum(axis=1) # (B, d)
den = m.sum(axis=1).clip(min=1e-9) # (B, 1)
return num / den
0 으로 나눗셈 방지 위해 clip(min=eps) 를 쓰거나, 호출측에서 전부 pad 인 배치는 없다고 가정하세요.
| # | 이름 | 검증 |
|---|---|---|
| 1 | shape (B, d) | |
| 2 | mask 전부 True → 평범한 mean | |
| 3 | pad 제외됨 | pad 값 바뀌어도 출력 불변 |
| 4 | 수식 일치 | numerator/denominator ref |
| 5 | 서로 다른 유효 길이 | 올바른 분모 |
코드를 작성하고 Run 을 눌러보세요.