Sentence-Transformers (UKPlab)
Sentence embedding 관련 패키지 리서치 중 Sentence-Transformers Github 코드를 자세히 살펴볼 기회가 생겼다.
해당 패키지의 구조부터 자세한 상세 기능, 그리고 BERT 모델 사용 시 HuggingFace Transformers 와의 호환성까지 살펴보려 한다.
Sentence-Transformers > Loss
- BatchAllTripletLoss
- BatchHardSoftMarginTripletLoss
- BatchHardTripletLoss
- BatchSemiHardTripletLoss
- ContrastiveLoss
- 두 emb. vector 간 거리(유클리드, 코사인, 맨하탄)를 구해서 아래와 같이 계산
- losses = 0.5 * (labels.float() * distances.pow(2) + (1 - labels).float() * F.relu(self.margin - distances).pow(2))
- 데이터셋이 Binary class일 때만 사용 가능
- input: sentence1, sentence2, label (binary class)
- 두 emb. vector 간 거리(유클리드, 코사인, 맨하탄)를 구해서 아래와 같이 계산
- CosineSimilarityLoss
- DenoisingAutoEncoderLoss
- This loss expects as input a batch consisting of damaged sentences and the corresponding original ones → Input 형태로 (원문, 약간 변형된 원문)의 pair로 구성하는 것으로 보여짐
- MegaBatchMarginLoss
- triplet과 구조는 같으나 negative 샘플을 어떻게 선택하는지 약간의 차이가 있음
- MarginMSELoss
- gold sim이 필요 → 얼마나 유사한지 score값이 label에 있어야 하는 것으로 보임
- MSELoss
- multilingual 모델을 만들때 새로운 언어를 확장하기 위한 목적으로 만든 loss
- MultipleNegativesRankingLoss
- positive pair로만 input 데이터를 구성
- pair외에 문장은 전부 negative로 취급함
- label 없음
- OnlineContrastiveLoss
- 계산 방식은 ContrastiveLoss와 거의 동일 ([pos or neg] distance 구하는 방식이 살짝 다름)
데이터셋이 Binary class일 때만 사용 가능 - input: sentence1, sentence2, label (binary class)
- 계산 방식은 ContrastiveLoss와 거의 동일 ([pos or neg] distance 구하는 방식이 살짝 다름)
- SoftmaxLoss
- SoftmaxLoss: loss는 아래와 같이 계산
- loss = softmax(W_t(u, v,|u-v|))
- 데이터셋이 Binary class일 때 + Multi class 일 때 모두 사용 가능
- input: sentence1, sentence2, label
- SoftmaxLoss: loss는 아래와 같이 계산
- TripletLoss
- loss는 anchor와 pos는 가깝도록, anchor와 neg는 멀도록 구성
- max(||anchor - pos|| - ||anchor - neg|| + margin, 0)
- input: anchor(=standard sentence), pos_sentence, neg_sentence
- loss는 anchor와 pos는 가깝도록, anchor와 neg는 멀도록 구성
Sentence-Transformers > evaluator
- BinaryClassificationEvaluator
- (두 문장이) 유사하다 vs 유사하지 않다 → 이진 분류
- input: sentence1, sentence2, label
- output: cos sim, distance(유클리드, 맨해튼), metrics
metrics list: accuracy, f1, recall, precision, acc_threshold, f1_threshold, ap(average precision score)
- EmbeddingSimilarityEvaluator
- gold label과 비교하여 상관 관계 계산(스피어만, 피어슨)
임베딩 sim 기반 모델 평가 → sts - input: sentence1, sentence2, score(=gold label)
- output: cos sim, distance(유클리드, 맨해튼), metrics
스피어만, 피어슨 상관 관계 (스피어만 맨해튼, 스피어만 유클리드, etc…)
- gold label과 비교하여 상관 관계 계산(스피어만, 피어슨)
- InformationRetrievalEvaluator
- 정보 검색 설정 평가
- LabelAccuracyEvaluator
- label이 있는 데이터셋 accuracy 측정
Loss function이 있는 모델을 해당 class에 넣어 사용해야 됨
Loss: SoftmaxLoss class를 evaluate 객체 만들 때 인자로 사용 - input: sentence1, sentence2, label
- output: accuracy
- label이 있는 데이터셋 accuracy 측정
- MSEEvaluator
- 임베딩 사이의 MSE(x100) 계산
- input: source_sentences, target_sentences
- output: mse
- MSEEvaluatorFromDataFrame
- MSEEvaluator와 동일
- ParaphraseMiningEvaluator
- 큰 문장 세트가 주어지면, 이 평가자는 패러프레이즈(중복) 마이닝을 수행하고 유사성이 가장 높은 쌍을 식별. 추출된 패러프레이즈 쌍을 비교
gold label 사용하여 F1 점수를 계산
- 큰 문장 세트가 주어지면, 이 평가자는 패러프레이즈(중복) 마이닝을 수행하고 유사성이 가장 높은 쌍을 식별. 추출된 패러프레이즈 쌍을 비교
- RerankingEvaluator
- re-rank task 위한 평가
- input: query, positive, negative sentences
- output: mean mrr score, mean ap score
- SentenceEvaluator
- 모든 evaluator의 기본 class
- 이 class를 확장하고 사용자 지정 evaluator를 위해 __call__ 메서드 구현
- 다른 모든 evaluator에서 이 class를 사용하고 있음 (ex. class ~~(SentenceEvaluator))
- SentenceEvaluator 내부에는 별 기능 없음 just format
- 모든 evaluator의 기본 class
- SequentialEvaluator
- 이것도 9번처럼 format 제공용 class
- TranslationEvaluator
- 번역된 sentence 간의 유사도 측정
- input: source_sentences, target_sentences
- output: cos_sim, acc of src2trg & trg2src)
- TripletEvaluator
- 거리(문장, 양수_예시) < 거리(문장, 음수_예시)인지 확인
true 이면 acc에 +1 / false 이면 acc에 +0 - input: anchors, positives, negatives, main_distance_function
- output: accuracy of each distances
- 거리(문장, 양수_예시) < 거리(문장, 음수_예시)인지 확인
- SimilarityFunction
- each distance index class
Comments
Sentence-Transformers 학습에 사용되는 loss와 eval은 용도와 input 데이터셋의 format, 결과 metric 리스트가 다르다. 때문에 무엇을 하고자 하는지, 어떤 metric 값을 원하는지 등 미리 점검한 뒤 실험해야 한다.
다음 포스팅은 sentence-transformers의 구조가 HuggingFace transformers와 어떻게 다른지에 대해 살펴볼 예정이다.
학습 Process검증 및 예측 Processsentence-transformers 상세 기능- HuggingFace transformers와 어떻게 다른지
To Be Continued.....
반응형
'Natural Language Processing > Github 훑어보기' 카테고리의 다른 글
[Code review] Sentence-Transformers 비교 hug/trans (0) | 2022.07.08 |
---|---|
[Code review] Sentence-Transformers 검증 및 예측 Process (0) | 2022.07.06 |
[Code review] Sentence-Transformers 학습 Process (0) | 2022.07.05 |
[Code review] Sentence-Transformers 훑어보기: 구조 (0) | 2022.07.04 |
댓글