Embedding 向量

快速了解 Embedding 向量

什么是 Embedding 向量?

Embedding 向量是指用数字表示非结构化数据,将其表示为多维数组。向量间可以表示数据对象之间的联系或相关性,可能是复杂或隐蔽的。非结构化数据可以是文本、图像、音频或视频。向量的主要功能是将大型且复杂的数据转换为机器可读的数据,以便供机器学习算法使用,并进行处理和分析。

假设您拥有大量的文本数据。使用 Embedding 技术,您可以将文档中的每个单词转换为其在多维空间中的数字向量。这个空间作为相似和不相似单词或概念的区域,相似单词或概念的向量空间上更接近,不同的则更远。例如,在单词 Embedding 中,“红色”和“蓝色”的向量在语义上表现为相似(都是指颜色)。

如何生成 Embedding 向量

通过利用在大量数据集上训练的机器学习模型来生成 Embedding 向量。这类模型将每个信息单元转换为一个数字向量,两个向量之间的距离代表它们在语义上的相似程度。

生成向量

  • 首先,选择数据并确定哪些变量将形成向量。这可能包括文本语料库中的词汇、视觉图像和用户喜好。
  • 其次,利用词元分析、词干提取和停用词删除等技术来从文本数据中提取相关特征。对图像数据使用卷积神经网络(CNN)来识别和提取图像特征。
  • 数据预处理后,将其输入到 Word2Vec、GloVe、OpenAI 或其他深度神经网络模型中。在训练过程中,模型学习为数据集中的每个项目创建向量表示。模型会重新缩放这些向量,以最大限度地减小相似项目之间的差异,同时增加不同项目之间的差异。
  • 结果会产生一个多维向量空间。在这个空间中,特定向量代表数据集中的每个项目。相似项目在这个空间中更接近,不相似项目则更远。通过利用大数据训练的机器学习模型,您可以生成 Embedding 向量。该模型将每个信息单位转换为一组数字向量,使得两个向量之间的距离代表它们在语义上的相似程度。

示例

以下示例展示了如何使用预训练的 Embedding 模型为词生成向量。在本例中,您需要安装 Python 和 Milvus 向量数据库。

首先,安装依赖项 Milvus、PyMilvus 和 Gensim。Pymilvus 是 Milvus 的 Python SDK,Gensim 是一个用于自然语言处理的 Python 库。

pip install milvus, pymilvus, gensim

导入库:

import gensim.downloader as api
from pymilvus import (
    connections, 
    FieldSchema, 
    CollectionSchema, 
    DataType, 
    Collection)

连接 Milvus 数据库:

connections.connect(
    alias="default",
    user='username',
    password='password',
    host='localhost',
    port='19530'
)

创建 Collection:

#Creates a collection:
fields = [
    FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="words", dtype=DataType.VARCHAR, max_length=50),
    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=50)
]
schema = CollectionSchema(fields, "Demo to store and retrieve embeddings")
demo_milvus = Collection("milvus_demo", schema)

从 Gensim 中导入预训练模型:

model = api.load("glove-wiki-gigaword-50")

为示例单词生成 Embedding:

ice = model['ice']
water = model['water']
cold = model['cold']
tree = model['tree']
man = model['man']
woman = model['woman']
child = model['child']
female = model['female']

以下是示例单词 female 的 Embedding 向量:

array([-0.31575 ,  0.74461 , -0.11566 , -0.30607 ,  1.524   ,  1.9137  ,
       -0.392   , -0.67556 , -0.1051  , -0.17457 ,  1.0692  , -0.68617 ,
        1.2178  ,  1.0286  ,  0.35633 , -0.40842 , -0.34413 ,  0.67533 ,
       -0.5443  , -0.21132 , -0.61226 ,  0.95619 ,  0.43981 ,  0.59639 ,
        0.02958 , -1.1064  , -0.48996 , -0.82416 , -0.97248 , -0.059594,
        2.396   ,  0.74269 , -0.16044 , -0.69316 ,  0.55892 ,  0.22892 ,
        0.013605, -0.44858 , -0.52965 , -0.96282 , -0.54444 ,  0.18284 ,
        0.16551 ,  0.33446 ,  0.53432 , -1.4824  , -0.34574 , -0.82834 ,
        0.10107 ,  0.024414], dtype=float32)

将生成的 Embedding 向量插入到 Collection:

#Insert data in collection
data = [
    [1,2,3,4,5,6,7,8],  # field pk
    ['ice','water','cold','tree','man','woman','child','female'],  # field words
    [ice, water, cold, tree, man, woman, child, female],  # field embeddings
]
insert_result = demo_milvus.insert(data)
# After final entity is inserted, it is best to call flush to have no growing segments left in memory
demo_milvus.flush()

为数据生成索引:

index = {
    "index_type": "IVF_FLAT",
    "metric_type": "L2",
    "params": {"nlist": 128},
}
demo_milvus.create_index("embeddings", index)

为确认 Embedding 是否插入成功,可以将 Collection 加载到内存,并进行向量相似性搜索:

demo_milvus.load()
# performs a vector similarity search:
data = [cold]
search_params = {
    "metric_type": "L2",
    "params": {"nprobe": 10},
}
result = demo_milvus.search(data, "embeddings", search_params, limit=4, output_fields=["words"])

将上述过程放在一个循环中,并打印出匹配向量对应的词:

for i in range(0,4):
    hit = result[0][i]
    print(hit.entity.get('words'))

预期回显如下:

cold
ice
water
man

Embedding 向量类型

不同类型的 Embedding 向量可以用于处理不同的数据和任务。常见的 Embedding 向量类型如下:

词向量

词向量使用连续向量空间来表示词汇的数字向量。这些向量是使用 Word2Vec、GloVe 或 fastText 等不同模型在大型文本语料库(如维基百科)上进行训练得到的。这些模型利用不同的机制将每个词表示为一个数字向量。Word2Vec 通过预测庞大文本语料库中的词汇来生成词向量,从而定义词汇之间的语义关系。例如,它可能将“国王”和“女王”表示为在向量空间中靠近的向量,显示它们在语义上的相似性。

相比之下,GloVe 依赖于词汇的共现数据来构建向量。GloVe 可能将"冰"和"水"表示为接近的向量,因为它们在文本中经常一起出现,并且在语义上相关。

fastText 则将词向量扩展到子词级别,允许处理未登录词(OOV)或词汇的变体。

句子和文档 Embedding 使用 Doc2Vec 或 BERT 等模型将整个句子或文档表示为数字向量。Doc2Vec 基于 Word2Vec 生成文档级别的 Embedding,可对整个文档或段落进行编码。BERT 则考虑句子中每个词的上下文,生成高度依赖上下文的 Embedding 向量。

图片 Embedding 卷积神经网络通过不同网络层次的特征提取可以为图片生成 Embedding 向量,这也为图片分类和检索提供了重要方法。例如,一张猫的照片可能具有代表其耳朵、皮毛和尾巴等视觉属性的图片 Embedding 向量。Inception 和 ResNet 同样具有可以从图像中提取特征的图层。Inception 模型可以按对象或模式生成代表图片视觉属性的 Embedding。

时序 Embedding 可以利用具有捕捉时序依赖能力的长短期记忆(LSTM)和门控循环单元(GRU)神经网络对时间序列数据生成 Embedding 向量。基于 LSTM 或 GRU 的 Embedding 可以捕捉股票价格等时间序列数据中的时序依赖。例如,这些 Embedding 向量可以代表股票价格走势中的模式。

音频 Embedding 在音频处理中,梅尔频率倒谱系数(MFCC)代表音频数据,可用于音频分类任务。在语音识别中,MFCC Embedding 可以捕捉音频信号的声学特征。例如,它们可以代表语音单词的频谱内容。

图 Embedding 类比于社交网络图,Node2Vec 可以生成节点 Embedding,其中相似用户(节点)具有更近的向量。例如,兴趣相同的用户可能具有相似的 Embedding 向量。还可以使用图神经网络(GNN)为节点生成 Embedding 来捕捉图中的复杂关系。GNN 可以在推荐系统中表示用户和项目,并预测用户和项目之间的交互。

应用场景

使用 Embedding 向量

以下是 Embedding 向量在不同领域中的应用场景:

图像、视频和音频相似性搜索:利用 CNN 或特征提取技术从图像、视频帧或音频片段中提取 Embedding,然后将其存储到向量数据库中。当用户查询图像、视频帧或音频片段时,通过测量 Embedding 间的相似度来检索相似项目。

AI 药物发现:使用 Embedding 度量药物化合物之间的相似性,通过将化合物的化学结构编码为 Embedding,预测药物化合物的潜在靶点蛋白。

语义搜索引擎:Embedding 向量通过匹配查询和相关文档的含义来提升搜索引擎能力,提高搜索相关性。

推荐系统:将用户和项目表示为 Embedding。通过测量用户项目相似度来进行个性化推荐。定制化推荐可以提升用户体验。

异常检测:通过将数据点表示为 Embedding,可以识别数据中的非常规模式。这可以通过计算数据点之间的距离或差异来实现。距离极大的数据点可能是潜在异常。这对欺诈检测、网络安全、工业设备或过程监测等应用都有很大的帮助。

为什么要使用 Embedding 向量

特征识别:Embedding 向量可以捕获数据中的模式、相似性和差异性。Embedding 向量可以代表有意义的数据模式,有利于机器学习模型在分类、聚类等任务中的表现。

降维:Embedding 向量能降低数据的维度,将高维数据转化为低维向量,简化计算任务且通常会提高效率。

语义理解:Embedding 向量可以编码数据点之间的语义关系,有助于机器理解和解释复杂信息。

高效处理:数字向量在计算上更高效,机器学习算法可以更快速更低成本地处理数字数据。

可迁移学习:预训练 Embedding 模型,如 NLP 中的词 Embedding 或计算机视觉中的图像 Embedding,可以通过微调以适用于特定任务场景。这可以减少对有标签数据的依赖,加速模型收敛,提高模型性能。

FAQ

Embedding 向量可以存储在哪里?

您可以将 Embedding 向量存储在类似于 Milvus 这样的向量数据库中,或者存储在 Redis 这样的内存数据库中,也可以存储在 PostgreSQL 数据库或文件系统中。选择存储位置需要考虑数据量、访问模式以及应用的具体需求。

向量数据库与 Embedding 向量的区别是什么?

向量数据库是专门用于索引、存储和检索向量数据的数据库。Embedding 向量是在连续向量空间中的数据点(如句子、图像等)的数字表示,它能够捕获数据中的语义关系和模式。向量数据库可以存储向量并优化基于向量相似度度量的相似性搜索。

Embedding 与向量的区别是什么?

向量是基础的数学对象,由数字数组表示。Embedding 是将非结构化数据转换为数字向量的技术,用以捕获数据点之间的语义关系。

什么是向量索引?

向量索引也称为向量数据库索引或相似度索引,是向量数据库用于根据相似度度量组织和优化向量数据检索的数据结构。常见的索引类型包括基于 CPU 的 ANN 搜索的 FLAT、IVF_FLAT、IVF_PQ、IVF_SQ8、HNSW 和SCANN,以及基于 GPU 的 ANN 搜索的 GPU_IVF_FLAT 和 GPU_IVF_PQ。

预训练 Embedding 和自定义 Embedding 有什么区别?

预训练 Embedding 是指预训练深度学习模型的“检查点”,通常是在公开数据上训练的开源 Transformer 模型。自定义 Embedding 是指在特定领域数据上训练的深度学习模型。