深入理解Embedding模型:从原理到实践
大模型开发/技术交流
- LLM
2024.11.212378看过
深入理解Embedding模型:从原理到实践
目录
-
Embedding模型基础
-
词向量与相似度
-
训练过程详解
-
高效的相似度搜索
-
实际应用中的文本向量化
1. Embedding模型基础
在自然语言处理中,Embedding模型是将文本转换为密集向量表示的关键技术。要理解Embedding模型,首先需要了解其基本组成部分。
1.1 词表和向量的对应关系
在Embedding模型中,vocab.json文件中的token序号(index)与嵌入矩阵(embedding matrix)的行是一一对应的。具体来说:
-
每个token都有一个唯一的整数ID(从0开始编号)
-
embedding matrix是一个形状为 [vocab_size, embedding_dim] 的矩阵
-
token的ID对应着embedding matrix中的行号
-
查找某个token的embedding vector只需要用这个token的ID作为索引
例如,如果"hello"这个token在vocab.json中的ID是42,那么"hello"对应的embedding vector就是embedding matrix中的第42行。
2. 词向量与相似度
虽然vocab.json中的词序号只是简单的索引,但embedding向量之间的语义相似度是通过训练得到的。这种相似度可以通过多种方式计算。
2.1 相似度计算方法
最常用的相似度计算方法包括:
-
余弦相似度(最常用):
def cosine_similarity(v1, v2):dot_product = np.dot(v1, v2)norm1 = np.linalg.norm(v1)norm2 = np.linalg.norm(v2)return dot_product / (norm1 * norm2)
-
欧氏距离
-
向量点积
2.2 语义相似性的来源
这种语义相似性是在训练过程中学习到的,主要通过两种方式:
-
基于上下文预测的方法(如Word2Vec)
-
-
同一上下文窗口出现的词,其embedding会被训练得更相似
-
例如"cat"和"dog"经常出现在类似的上下文中
-
-
基于大规模语料的预训练(如BERT)
-
-
通过遮盖词预测等预训练任务
-
模型学习词的语义和语法特征
-
3. 训练过程详解
Embedding模型的训练是一个循序渐进的过程,通过优化目标函数来学习词向量。
3.1 训练算法示例
class Word2Vec:def __init__(self, vocab_size, embedding_dim):self.embeddings = np.random.randn(vocab_size, embedding_dim) # 随机初始化def train(self, center_word, context_words):# 1. 前向传播center_vec = self.embeddings[center_word]context_vecs = self.embeddings[context_words]# 2. 计算损失similarities = np.dot(center_vec, context_vecs.T)loss = -np.log(sigmoid(similarities))# 3. 反向传播,更新词向量gradients = compute_gradients(loss)self.embeddings -= learning_rate * gradients
3.2 训练目标
训练过程的主要目标是:
-
最大化同一上下文中词的相似度
-
最小化随机采样的负例的相似度
-
通过反向传播不断调整词向量
4. 高效的相似度搜索
在实际应用中,计算词与所有其他词的相似度是很耗时的。因此,通常会使用近似最近邻(ANN)搜索算法来优化。
4.1 LSH (Locality-Sensitive Hashing)
class LSH:def __init__(self, embeddings, num_hash_functions):self.hash_tables = []for i in range(num_hash_functions):random_vector = np.random.randn(embedding_dim)hash_values = np.sign(np.dot(embeddings, random_vector))self.hash_tables.append(hash_values)def search(self, query_vector):candidate_ids = self.get_candidates(query_vector)return candidate_ids
4.2 其他优化方法
-
基于树的搜索(KD-tree):
from sklearn.neighbors import KDTreetree = KDTree(embeddings)def find_nearest(query_vector, k=5):distances, indices = tree.query([query_vector], k=k)return indices[0]
2.FAISS库:
import faissdimension = 300index = faiss.IndexFlatL2(dimension)index.add(embeddings)def search_similar(query_vector, k=5):distances, indices = index.search(query_vector.reshape(1, -1), k)return indices[0]
5. 实际应用中的文本向量化
在实际应用中,文本向量化的过程非常直接。
5.1 基本流程
-
获取inputID:
from transformers import BertTokenizertokenizer = BertTokenizer.from_pretrained('bert-base-uncased')text = "I love machine learning"# 得到input_idsinput_ids = tokenizer.encode(text)
2.查询词向量:
# 直接通过input_ids索引embedding矩阵word_vectors = embedding_matrix[input_ids]# 获取单个词的向量word_id = input_ids[1]word_vector = embedding_matrix[word_id]
5.2 性能考虑
-
向量查询本质上是简单的查表操作,非常快速
-
预处理(tokenization)可能成为瓶颈
-
批处理可以提高处理大量文本的效率
总结
Embedding模型的强大之处在于:
-
能够捕捉词语间的语义关系
-
训练过程自动学习语义相似性
-
高效的向量化和检索机制
-
广泛的应用场景
通过理解Embedding模型的工作原理和实现细节,我们可以更好地利用这个强大的工具来解决各种自然语言处理任务。
————————————————
版权声明:本文为稀土掘金博主「Xier」的原创文章
原文链接:https://juejin.cn/post/7430720558381957155
如有侵权,请联系千帆社区进行删除
评论
