"500마력 자동차", "1,200마력 자동차", "73마력 자동차"의 임베딩 간 코사인 유사도 (cosine sim)를 살펴보면, 임베딩 모델들이 숫자의 순서에 대한 감각이 전혀 없다는 것을 곧 알게 될 것입니다. (저는 Qwen과 ModernBERT 기반의 임베딩을 테스트했습니다.)
이는 주로 MLM (Masked Language Modeling) 사전 학습 (pre-training) 단계에서, 토크나이저 (tokenizer)와 로그 가능도 손실 (log likelihood loss)이 자릿수 (Order Of Magnitude) 예측보다 정확한 예측에 과도하게 보상을 주기 때문에 발생합니다.
저는 숫자에 대해 기본 토크나이저/예측 헤드 (prediction head)를 오버라이딩(overriding)하고, 수정된 아키텍처를 3억 개의 토큰(그 중 약 4백만 개의 숫자 포함)으로 MLM 미세 조정 (fine-tuning)함으로써 이를 완화하려고 시도했습니다.
그리고 효과가 있었습니다. 아이디어는 숫자 패턴을 정규 표현식 (regex)으로 추출하고, 이를 로그 자릿수 (log magnitude)로 표현하는 것입니다. 각 숫자는 128개의 빈 (bins)으로 부드럽게 인코딩되며 (인접한 빈 사이의 선형 보간 사용), 이 128개의 각 빈에 대해 임베딩 사전 (embedding dict) 항목이 할당됩니다. 디코딩 (decoding)도 거의 유사하게 작동합니다. 저는 128개의 출력 빈과 부드러운 CE (Cross-Entropy) 손실을 사용하는 분류-회귀 (classification-regression) 헤드를 사용했습니다.
MLM 사전 학습된 모델을 임베딩 모델로 만드는 것이 가장 흥미로운 부분이었습니다. JEPA를 시도했으나 실패했고, 그래서 인코더/디코더 (encoder/decoder) 설정을 사용했는데 잘 작동했습니다.
6시간의 H100 학습 결과: 저의 커스텀 벤치마크에서 (이 문장은 완전히 위험 신호(red flag) 같네요, 그렇죠?), 이 모델은 문장 삼중항 (triplets of sentences)을 59%의 확률로 정확하게 정렬할 수 있었습니다. 이는 ModernBERT (mean-pooling)의 38% 및 BGE-base-v1.5 (CLS)의 34%와 비교됩니다.
또한 숫자가 많은 HTML 테이블에서 구조화된/정량적 데이터를 추출하는 데에도 상당히 뛰어납니다.
(다소 학습이 덜 된) 모델은 여기에서 확인할 수 있습니다: https://huggingface.co/edereynal/financial_bert
전체 엔지니어링 과정에 관심이 있다면 블로그 포스트를 확인해 주세요. 기술적으로 꽤 밀도가 높지만, 흥미롭다고 생각합니다: https://www.eloidereynal.com/p/i-spent-1-year-trying-to-predict