1 คะแนน โดย GN⁺ 2024-09-16 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

WordLlama

WordLlama เป็นเครื่องมือ NLP ที่รวดเร็วและมีน้ำหนักเบา ออกแบบมาสำหรับงานอย่างการลบข้อมูลซ้ำแบบฟัซซี การวัดความคล้ายคลึง และการจัดอันดับ โดยมีการพึ่งพาเวลาอนุมานให้น้อยที่สุด และปรับให้เหมาะกับฮาร์ดแวร์ CPU

สารบัญ

  • เริ่มต้นอย่างรวดเร็ว
  • มันคืออะไร?
  • ผลลัพธ์ MTEB
  • การฝังข้อความ
  • หมายเหตุการฝึก
  • โรดแมป
  • การดึง token embedding
  • การอ้างอิง
  • ไลเซนส์

เริ่มต้นอย่างรวดเร็ว

  • การติดตั้ง:

    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)  # output: 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)
    # output:
    # [
    #  ('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)  # กรอง candidate ตามคิวรี
    wl.topk(query, candidates, k=3)  # คืนค่าสตริง top k ตามคิวรี
    

มันคืออะไร?

WordLlama เป็นโมเดล NLP และ word embedding ที่นำองค์ประกอบของโมเดลภาษาขนาดใหญ่ (LLM) มาใช้ซ้ำเพื่อสร้างตัวแทนคำที่มีประสิทธิภาพและกะทัดรัด คล้ายกับโมเดลอย่าง GloVe, Word2Vec และ FastText

  • Matryoshka Representations: ลดมิติของ embedding ได้ตามต้องการ
  • ใช้ทรัพยากรต่ำ: ทำงานได้รวดเร็วบน CPU ด้วยการ lookup token แบบง่ายร่วมกับ average pooling
  • การทำให้เป็นไบนารี: โมเดลที่ฝึกด้วย straight-through estimator สามารถแพ็กเป็นอาร์เรย์จำนวนเต็มขนาดเล็กได้ (จะมาเร็ว ๆ นี้)
  • อนุมานด้วย 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

การฝังข้อความ

วิธีโหลด embedding ที่ผ่านการฝึกล่วงหน้าและนำข้อความไปทำ embedding:

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)

ตัวอย่างการใช้งานโมเดล embedding แบบไบนารี:

wl = WordLlama.load(trunc_dim=64, binary=True)
wl.embed("I went to the car")  # output: 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)  # output: 0.57421875
ranked_docs = wl.rank("i went to the car", ["van", "truck"])
wl.binary = False  # ใช้ cosine similarity แทน hamming similarity
wl = WordLlama.load(config="l3_supercat", dim=1024)

หมายเหตุการฝึก

โมเดล embedding แบบไบนารีแสดงการปรับปรุงที่ชัดเจนยิ่งขึ้นเมื่อใช้มิติสูง โดยแนะนำให้ใช้ 512 หรือ 1024 มิติ ส่วน L2 Supercat ถูกฝึกบน A100 เดียวเป็นเวลา 12 ชั่วโมง ด้วย batch size 512

โรดแมป

  • กำลังเพิ่มความสามารถด้านการอนุมาน:
    • การแบ่งข้อความตามความหมาย
    • เพิ่มตัวอย่างโน้ตบุ๊ก
    • ตัวประเมิน DSPy
    • ไปป์ไลน์ RAG

การดึง token embedding

หากต้องการดึง token embedding จากโมเดล ต้องยอมรับข้อตกลงผู้ใช้และล็อกอินด้วย 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 และนำไปใช้เป็นยูทิลิตีแบบ "Swiss Army knife" สำหรับงาน NLP ได้หลากหลาย
  • โมเดล embedding แบบไบนารีให้การปรับปรุงที่ชัดเจนยิ่งขึ้นในมิติสูง โดยแนะนำให้ใช้ 512 หรือ 1024 มิติ
  • มีประโยชน์สำหรับการวิเคราะห์เชิงสำรวจและแอปพลิเคชันประเภทเครื่องมืออรรถประโยชน์ ด้วยความเร็วและขนาดที่พกพาได้

1 ความคิดเห็น

 
GN⁺ 2024-09-16
ความคิดเห็นบน Hacker News
  • ชอบตรงที่มีขนาดเล็ก ได้เปรียบกว่าโมเดลที่เล็กที่สุดของ SBERT

    • ในเชิงเทคนิคอาจล้าสมัย แต่เป็นการประนีประนอมเพื่อประสิทธิภาพ
    • ขอให้มีวิธีสลับประเภทความคล้ายคลึงได้หลากหลายแบบ (เช่น เชิงความหมาย, NLI, คำนาม-นามธรรม)
    • ตัวอย่างเช่น อยากให้ "Freezing" และ "Burning" ถูกมองว่าคล้ายกันในการจัดหมวดหมู่ข่าวหนังสือพิมพ์ แต่ตรงข้ามกันในบทความเคมี
    • อยากใช้งาน NLI embeddings เพื่อจับความสัมพันธ์เชิงเหตุและผล
    • SBERT มีขนาดใหญ่และต้องโหลดหลายโมเดล จึงใช้ทรัพยากรมาก
  • embeddings จับข้อมูลเชิงความหมายได้มาก และสามารถนำไปใช้กับงานที่มีประโยชน์ได้ด้วยตัวเอง

    • ใช้ embeddings จาก text encoder ของโมเดล CLIP เพื่อเสริมพรอมป์ต์
    • ตัวอย่างเช่น เมื่อให้คำว่า "building" ก็ไปหา "concrete", "underground" เป็นต้น จาก embedding matrix เพื่อแทนที่หรือเพิ่มเข้าไป
    • จากการทดลองแบบจำกัด ได้ค่า recall สูงสำหรับคิวรีส่วนใหญ่
  • มีการถามว่ามีแผนรองรับภาษาอื่นนอกจากภาษาอังกฤษหรือไม่

    • น่าจะเป็นเครื่องมือที่ยอดเยี่ยมสำหรับภาษาฝรั่งเศส
  • แสดงให้เห็นว่าในตัวโทเค็นเองมีเนื้อหาด้านความหมายอยู่มาก

  • แสดงความคิดเห็นเกี่ยวกับการใช้ embeddings เพื่อแก้เกม Little Alchemy

  • มีประโยชน์มากสำหรับการทำเกม ขอบคุณ

  • ดูเจ๋งมาก ถามถึงข้อดีของโมเดล mini-lm

    • ดูเหมือนจะดีกว่าในงาน mteb ส่วนใหญ่ แต่ก็สงสัยว่าจะดีกว่าในงานอย่างการอนุมานด้วยหรือไม่
  • เคยเขียน "เกมภาษา" ที่ใช้ความสามารถคล้ายกันเมื่อหลายปีก่อน