Coding Collie Logo
Coding Collie

Embedding 是什么

Authors
  • avatar
    Name
    Kai Kang
    Role
    Staff Software Engineer @ Meta · Solo App Builder
    Twitter

我做了一个基于 embedding 的小游戏 :)

Embedding 是什么,为什么需要它?

Embedding Examples

现代神经网络的语言是数字数组、数字列表,也就是 tensor 或向量。 Embedding 向量本质上就是“数字列表”。比如 <0.21,0.34,...><0.21, 0.34, ...>

但它有一个很有意思的性质:语义相近的词,对应的向量也会相近。比如 “Cat” 和 “dog” 是相近的词,所以它们的向量也相近。它们和 “Hamburger” 差得很远,所以你也可以预期 hamburger 对应的 embedding 向量会很不一样。

我们需要 embedding 的原因是:就像英语、中文、日语是人类使用的语言一样,向量是神经网络和 LLM 使用的语言。

LLM 可以在 embedding 向量上做数学运算,这也是它只“理解” tensor / vector,却能输出人类语言的核心原因之一。最经典的例子是: kingman+womanqueenking - man + woman \approx queen

ChatGPT response to a chinese celebrity example


Embedding 怎么进入 LLM?

Embedding into LLM

当 “cat” 这样的词进入 LLM 时,它首先会被 tokenized。tokenization 这个概念我会在另一篇文章里讲。现在可以先理解成:一个词会变成一个 token(实际不是一一对应,一个词也可能被切成多个 token;为了简化先当作一个 token)。这个 token 再通过 lookup table 被转换成 embedding 向量。这个 embedding lookup table 来自 LLM 的训练过程。

initial_embedding = embedding_table[token]
contextual_embedding = ...
next_token = ...

更细节的内容我会放在 LLM 相关笔记里。


怎么拿到预训练 embedding

[1] OpenAI 提供在线 API:

from openai import OpenAI

client = OpenAI()

response = client.embeddings.create(
    model="text-embedding-3-small",
    input="The dog is playing in the park."
)

embedding = response.data[0].embedding
print(len(embedding))

[2] Sentence Transformers 是标准的 Python 离线方案:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

texts = [
    "A dog is running outside.",
    "A puppy is playing in the park.",
    "I want to eat a hamburger."
]

embeddings = model.encode(texts)

print(embeddings.shape)

[3] Hugging Face 可以直接访问模型,灵活性更高:

from transformers import AutoTokenizer, AutoModel
import torch

model_name = "sentence-transformers/all-MiniLM-L6-v2"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

text = "A dog is running outside."

inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True)

with torch.no_grad():
    outputs = model(**inputs)

token_embeddings = outputs.last_hidden_state
sentence_embedding = token_embeddings.mean(dim=1)

应用

  • 搜索(RAG)
    • RAG: embedding vector -> vector DB
  • 推荐系统
    • User Embedding, Item Embedding

这篇有意思的 Food Embeddings 论文展示了每个食材也可以有 embedding。Embedding 空间不是客观存在的,它编码的是你选择训练或检索的关系:比如哪些东西常被一起烹饪,或者哪些东西可以互相替代。

Enjoyed this post? Subscribe for more.