1P by neo 3달전 | 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 작업에서 더 나은 것 같지만 추론 등에서 더 나은지 궁금함
  • 몇 년 전 비슷한 기능을 사용한 "언어 게임"을 작성함