在人工智能领域工作,尤其是与大型语言模型(LLMs)打交道时,一定听说过“嵌入”这个术语。简单来说,嵌入是对句子或单词的压缩表示,它本质上是一个浮点数向量,大小可以从100到5000不等。
嵌入模型经过多年的发展已经变得非常强大。最早的模型基于单热编码或词频,但随着技术发展和数据可用性的增加,嵌入模型变得更加强大。
使用单热编码表示单词作为嵌入的最简单方式是使用与文本语料库的总词汇量大小相同的单热编码。然而,这种表示方式非常低效,因为表示非常稀疏,且嵌入的大小与词汇量大小一样,可能达到数百万。
另一种方法是使用NGram模型,它使用一个简单的全连接神经网络。有两种方法:Skip-gram和连续词袋(CBOW)。这些方法非常高效,属于Word2Vec的范畴。CBOW从其上下文中预测目标词,而Skip-gram则尝试从目标词预测上下文词。
另一种方法是GloVe(全局向量词表示)。GloVe专注于利用大量语料库中单词共现的统计信息。
双向编码器变换器(BERT)是最早使用变换器构建上下文嵌入的方法之一。BERT是一种自监督的方式来预测被遮蔽的词。这意味着如果在句子中[MASK]一个词,它就会尝试预测这个词可能是什么,因此信息从被遮蔽词的左右两侧流动。
到目前为止,所看到的是如何创建单词嵌入。但在许多情况下,想要捕捉句子的表示,而不仅仅是句子中的单词。有几种方法可以从单词嵌入中创建句子嵌入。最流行的方法之一是使用预训练模型,如SBERT(句子BERT)。这些模型通过创建相似句子对的数据集,并进行对比学习与相似性评分来训练。
多模态嵌入是将多种类型的数据编码到一个共同的向量空间中的向量表示。这允许模型理解和关联不同模态之间的信息。最常用的多模态嵌入模型之一是CLIP,它将文本和图像嵌入到共享的嵌入空间中。
嵌入在各个行业中有许多应用。以下是一些最常见的用例:
信息检索、搜索引擎:嵌入用于提高搜索相关性,通过理解查询和文档的语义含义。
检索增强生成(RAG):嵌入用于为大型语言模型检索知识。这被称为LLM Grounding。
文档聚类和主题建模:嵌入有助于将相似的文档分组在一起,并在语料库中发现潜在的主题。
多模态应用:图像描述、视觉问答、多模态情感分析等。
AI模型不易运行。它们计算非常密集,不易部署,且难以监控。EmbedAnything让能够高效地运行嵌入模型,并使它们部署友好。
以下是使用EmbedAnything的一些好处:
与本地和云模型兼容:与本地和基于云的嵌入模型无缝集成。
高速性能:快速处理以满足苛刻的应用程序需求。
多模态能力:灵活性以处理各种模态。
CPU和GPU加速:为CPU和GPU环境优化性能。
轻量级设计:最小化占用空间,以实现高效的资源利用。
让来看一个例子,看看使用EmbedAnything有多方便。将看看零样本分类时尚图像。假设有这样一些图像:
pip install embed-anything
import embed_anything
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
data = embed_anything.embed_directory("images", embeder="Clip") # 嵌入 "images" 文件夹
embeddings = np.array([data.embedding for data in data])
labels = ['Shirt', 'Coat', 'Jeans', 'Skirt', 'Hat', 'Shoes', 'Bag']
label_embeddings = embed_anything.embed_query(labels, embeder="Clip")
label_embeddings = np.array([label.embedding for label in label_embeddings])
fig, ax = plt.subplots(1, 5, figsize=(20, 5))
for i in range(len(data)):
similarities = np.dot(label_embeddings, data[i].embedding)
max_index = np.argmax(similarities)
image_path = data[i].text
img = Image.open(image_path)
ax[i].imshow(img)
ax[i].axis('off')
ax[i].set_title(labels[max_index])