1P by GN⁺ 9달전 | ★ favorite | 댓글 1개

WordLlama

WordLlama는 빠르고 가벼운 NLP 도구로, 퍼지 중복 제거, 유사성 및 순위 매기기와 같은 작업을 최소한의 추론 시간 종속성으로 처리하며 CPU 하드웨어에 최적화되어 있음.

목차

  • 빠른 시작
  • 무엇인가?
  • MTEB 결과
  • 텍스트 임베딩
  • 훈련 노트
  • 로드맵
  • 토큰 임베딩 추출
  • 인용
  • 라이선스

빠른 시작

  • 설치:

    pip install wordllama
    
  • 256차원 모델 로드:

    from wordllama import WordLlama
    wl = WordLlama.load()
    
  • 두 문장 간 유사성 계산:

    similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
    print(similarity_score)  # 출력: 0.06641249096796882
    
  • 쿼리에 대한 문서 순위 매기기:

    query = "i went to the car"
    candidates = ["i went to the park", "i went to the shop", "i went to the truck", "i went to the vehicle"]
    ranked_docs = wl.rank(query, candidates)
    print(ranked_docs)
    # 출력:
    # [
    #  ('i went to the vehicle', 0.7441646856486314),
    #  ('i went to the truck', 0.2832691551894259),
    #  ('i went to the shop', 0.19732814982305436),
    #  ('i went to the park', 0.15101404519322253)
    # ]
    
  • 추가 추론 방법:

    wl.deduplicate(candidates, threshold=0.8)  # 퍼지 중복 제거
    wl.cluster(docs, k=5, max_iterations=100, tolerance=1e-4)  # kmeans/kmeans++ 초기화 사용 라벨링
    wl.filter(query, candidates, threshold=0.3)  # 쿼리를 기반으로 후보 필터링
    wl.topk(query, candidates, k=3)  # 쿼리를 기반으로 상위 k 문자열 반환
    

무엇인가?

WordLlama는 대형 언어 모델(LLM)의 구성 요소를 재활용하여 효율적이고 컴팩트한 단어 표현을 생성하는 NLP 및 단어 임베딩 모델임. GloVe, Word2Vec, FastText와 같은 모델과 유사함.

  • Matryoshka Representations: 필요에 따라 임베딩 차원 축소 가능
  • 낮은 자원 요구 사항: 평균 풀링을 사용한 간단한 토큰 조회로 CPU에서 빠르게 작동 가능
  • 이진화: 직통 추정기를 사용하여 훈련된 모델은 작은 정수 배열로 패킹 가능 (곧 제공 예정)
  • Numpy 전용 추론: 가볍고 단순함

WordLlama는 다양한 NLP 작업에 적합하며, 빠르고 휴대 가능한 크기로 탐색 분석 및 유틸리티 애플리케이션에 유용함.

MTEB 결과

Metric WL64 WL128 WL256 (X) WL512 WL1024 GloVe 300d Komninos all-MiniLM-L6-v2
Clustering 30.27 32.20 33.25 33.40 33.62 27.73 26.57 42.35
Reranking 50.38 51.52 52.03 52.32 52.39 43.29 44.75 58.04
Classification 53.14 56.25 58.21 59.13 59.50 57.29 57.65 63.05
Pair Classification 75.80 77.59 78.22 78.50 78.60 70.92 72.94 82.37
STS 66.24 67.53 67.91 68.22 68.27 61.85 62.46 78.90
CQA DupStack 18.76 22.54 24.12 24.59 24.83 15.47 16.79 41.32
SummEval 30.79 29.99 30.99 29.56 29.39 28.87 30.49 30.81

텍스트 임베딩

사전 훈련된 임베딩을 로드하고 텍스트를 임베딩하는 방법:

from wordllama import WordLlama
wl = WordLlama.load(trunc_dim=64)
embeddings = wl.embed(["the quick brown fox jumps over the lazy dog", "and all that jazz"])
print(embeddings.shape)  # (2, 64)

이진 임베딩 모델 사용 예:

wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car")  # 출력: array([[3029168427562626]], dtype=uint64)
wl = WordLlama.load(dim=1024, binary=True)
similarity_score = wl.similarity("i went to the car", "i went to the pawn shop")
print(similarity_score)  # 출력: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False  # 해밍 유사성 대신 코사인 유사성 사용
wl = WordLlama.load(config="l3_supercat", dim=1024)

훈련 노트

이진 임베딩 모델은 높은 차원에서 더 뚜렷한 개선을 보였으며, 512 또는 1024 차원이 권장됨. L2 Supercat은 단일 A100에서 12시간 동안 배치 크기 512로 훈련됨.

로드맵

  • 추론 기능 추가 작업 중:
    • 의미적 텍스트 분할
    • 예제 노트북 추가
    • DSPy 평가자
    • RAG 파이프라인

토큰 임베딩 추출

모델에서 토큰 임베딩을 추출하려면 사용자 동의서에 동의하고 Hugging Face CLI를 사용하여 로그인해야 함. 그런 다음 다음 스니펫을 사용할 수 있음:

from wordllama.extract import extract_safetensors
extract_safetensors("llama3_70B", "path/to/saved/model-0001-of-00XX.safetensors")

인용

WordLlama를 연구나 프로젝트에 사용할 경우 다음과 같이 인용해 주시기 바람:

@software{miller2024wordllama,
  author = {Miller, D. Lee},
  title = {WordLlama: Recycled Token Embeddings from Large Language Models},
  year = {2024},
  url = {https://github.com/dleemiller/wordllama},
  version = {0.2.6}
}

라이선스

이 프로젝트는 MIT 라이선스 하에 있음.

GN⁺의 정리

  • WordLlama는 대형 언어 모델의 구성 요소를 재활용하여 효율적이고 컴팩트한 단어 표현을 생성하는 NLP 도구임.
  • CPU에서 빠르게 작동하며, 다양한 NLP 작업에 적합한 "스위스 아미 나이프" 유틸리티로 활용 가능함.
  • 이진 임베딩 모델은 높은 차원에서 더 뚜렷한 개선을 보이며, 512 또는 1024 차원이 권장됨.
  • 빠르고 휴대 가능한 크기로 탐색 분석 및 유틸리티 애플리케이션에 유용함.
Hacker News 의견
  • 작은 크기가 마음에 듦, SBERT의 가장 작은 모델보다 유리함

    • 기술적으로 구식이지만 성능을 위한 타협임
    • 다양한 유사성 유형(예: 의미론적, NLI, 명사-추상적)을 전환할 수 있는 방법 제공 요청
    • 예를 들어, "Freezing"과 "Burning"을 신문 기사 분류에서는 유사하게, 화학 기사에서는 반대로 하고 싶음
    • NLI 임베딩을 사용하여 인과 관계를 파악하고 싶음
    • SBERT는 크기가 크고 여러 모델을 로드해야 하므로 자원 소모가 큼
  • 임베딩은 많은 의미 정보를 캡처하며 독립적으로 유용한 작업에 사용 가능함

    • CLIP 모델의 텍스트 인코더 임베딩을 사용하여 프롬프트를 보강함
    • 예를 들어, "building"이라는 단어가 주어지면 임베딩 매트릭스에서 "concrete", "underground" 등을 찾아 대체하거나 추가함
    • 제한된 실험에서 대부분의 쿼리에 대해 높은 리콜을 얻음
  • 영어 외 다른 언어에 대한 계획이 있는지 질문

    • 프랑스어에 완벽한 도구가 될 것임
  • 토큰 자체에 많은 의미 내용이 포함되어 있음을 보여줌

  • 임베딩을 사용하여 Little Alchemy를 해결하는 것에 대한 생각

  • 게임 제작에 매우 유용함, 감사함

  • 멋져 보임, mini-lm 모델의 장점에 대해 질문

    • 대부분의 mteb 작업에서 더 나은 것 같지만 추론 등에서 더 나은지 궁금함
  • 몇 년 전 비슷한 기능을 사용한 "언어 게임"을 작성함