当前位置: 首页 > news >正文

Embedding(嵌入):让机器理解世界的通用语言

一、什么是Embedding?为什么需要Embedding?

Embedding是一种将离散的、高维的符号数据转换为连续的、低维的向量表示的技术。简单来说,它就像为每个概念(如单词、用户、产品)创建一个独特的"数字身份证",这个身份证不仅代表身份,还包含了该概念的特征和关系信息。
在这里插入图片描述

1.1 解决"维度灾难"问题

在传统机器学习中,我们经常使用one-hot编码来表示类别数据:

# one-hot编码示例
城市 = {"北京": [1, 0, 0, 0],"上海": [0, 1, 0, 0], "广州": [0, 0, 1, 0],"深圳": [0, 0, 0, 1]
}

这种方法存在严重问题:

  • 维度爆炸:如果有100万个城市,每个城市需要100万维的向量
  • 计算困难:高维向量占用大量内存,计算效率低下
  • 语义缺失:所有向量都是正交的,无法表示"北京"和"上海"都是大城市的关系

1.2 捕获语义关系

Embedding的核心优势在于它能够学习数据中的内在关系

# 在embedding空间中,语义关系得以保留
向量("国王") - 向量("男人") + 向量("女人") ≈ 向量("女王")
向量("巴黎") - 向量("法国") + 向量("德国") ≈ 向量("柏林")

这种关系保持特性让机器能够进行类比推理,这是传统方法无法实现的。

1.3 支持深度学习模型

深度学习模型(如神经网络)需要连续的数值输入,无法直接处理文本、类别等离散数据。Embedding充当了桥梁作用:

原始数据 → Embedding层 → 连续向量 → 神经网络 → 预测结果

二、Embedding的工作原理

Embedding的基本原理是"相似的事物在嵌入空间中应该靠近"。这个思想通过不同的算法实现:

2.1 基于共现的Embedding

# 简化的共现矩阵示例
import numpy as np# 文本数据
corpus = ["I like machine learning","I love deep learning", "I enjoy artificial intelligence"
]# 构建共现矩阵(简化版)
cooccurrence_matrix = {"I": {"like": 1, "love": 1, "enjoy": 1},"like": {"machine": 1, "I": 1},"machine": {"learning": 1},# ... 其他词
}# 通过矩阵分解得到embedding
# 实际使用SVD或神经网络等方法

2.2 基于神经网络的Embedding

现代Embedding通常通过神经网络学习:

import torch
import torch.nn as nnclass WordEmbeddingModel(nn.Module):def __init__(self, vocab_size, embedding_dim):super().__init__()self.embedding = nn.Embedding(vocab_size, embedding_dim)# 神经网络继续处理embedding...def forward(self, input_ids):embeddings = self.embedding(input_ids)return embeddings

三、主要类型的Embedding

3.1 词嵌入

Word2Vec算法

from gensim.models import Word2Vec
sentences = [["I", "love", "machine", "learning"],["deep", "learning", "is", "awesome"],["natural", "language", "processing"]
]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
similar_words = model.wv.most_similar('learning', topn=3)
print(similar_words)
[('I', 0.21617142856121063), ('machine', 0.09291722625494003), ('love', 0.0270574688911438)]

3.2 句子/文档嵌入

将整个句子或文档表示为单个向量

from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
def get_sentence_embedding(text):inputs = tokenizer(text, return_tensors='pt', truncation=True, max_length=512)with torch.no_grad():outputs = model(**inputs)# 使用[CLS]标记的嵌入作为句子表示sentence_embedding = outputs.last_hidden_state[:, 0, :]return sentence_embedding
embedding = get_sentence_embedding("Hello, world!")
print(embedding.shape)
torch.Size([1, 768])

3.3 图嵌入

将图结构中的节点映射到向量空间

import networkx as nx
from node2vec import Node2VecG = nx.karate_club_graph()
node2vec = Node2Vec(G, dimensions=64, walk_length=30, num_walks=200, workers=4)
model = node2vec.fit(window=10, min_count=1, batch_words=4)
node_embeddings = model.wv
print(node_embeddings)
KeyedVectors<vector_size=64, 34 keys>

3.4 图像嵌入

使用卷积神经网络提取图像特征

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image# 加载预训练模型
model = models.resnet50(weights='IMAGENET1K_V1')  # 使用新的权重参数
model = torch.nn.Sequential(*(list(model.children())[:-1]))  # 移除最后一层
model.eval()# 图像预处理
transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])def get_image_embedding(image_path):image = Image.open(image_path).convert('RGB')  # 转换为 RGB 模式image_tensor = transform(image).unsqueeze(0)with torch.no_grad():embedding = model(image_tensor)return embedding.squeeze()# 获取图像嵌入
embedding = get_image_embedding("dog.png")
print(embedding.shape)
torch.Size([2048])

3.5 类别特征嵌入

在推荐系统和表格数据中使用

import torch.nn as nn
import torchclass CategoricalEmbedder(nn.Module):def __init__(self, category_sizes, embedding_dims):super().__init__()self.embeddings = nn.ModuleList([nn.Embedding(size, dim) for size, dim in zip(category_sizes, embedding_dims)])def forward(self, categorical_inputs):# categorical_inputs: (batch_size, num_categories)embedded_features = []for i, embedding_layer in enumerate(self.embeddings):embedded_features.append(embedding_layer(categorical_inputs[:, i]))return torch.cat(embedded_features, dim=1)# 示例:用户ID、物品ID、类目ID的嵌入
embedder = CategoricalEmbedder(category_sizes=[10000, 50000, 1000],  # 用户数、物品数、类目数embedding_dims=[50, 50, 20]  # 对应的嵌入维度
)
print(embedder)
CategoricalEmbedder((embeddings): ModuleList((0): Embedding(10000, 50)(1): Embedding(50000, 50)(2): Embedding(1000, 20))
)

四、Embedding的可视化与分析

4.1 降维可视化

import gensim.downloader as api
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE# 自动下载并加载较小的 GloVe 模型
model = api.load("glove-wiki-gigaword-50")  # 下载 50 维的 GloVe 模型def visualize_embeddings(embeddings, labels, words, title="Embedding Visualization"):"""使用t-SNE将高维嵌入降维到2D进行可视化"""# 降维tsne = TSNE(n_components=2, random_state=42, perplexity=5)  # 将 perplexity 设置为 5embeddings_2d = tsne.fit_transform(embeddings)# 可视化plt.figure(figsize=(12, 8))scatter = plt.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1],c=labels, cmap='tab10', alpha=0.6)# 添加每个单词的标签for i, word in enumerate(words):plt.text(embeddings_2d[i, 0], embeddings_2d[i, 1], word, fontsize=12)plt.colorbar(scatter)plt.title(title)plt.show()# 示例:可视化单词嵌入
words = ['king', 'queen', 'man', 'woman', 'paris', 'france', 'london', 'england']
word_embeddings = [model[word] for word in words]  # 获取词嵌入# 将列表转换为 NumPy 数组
word_embeddings = np.array(word_embeddings)# 可视化
visualize_embeddings(word_embeddings, range(len(words)), words)

在这里插入图片描述

4.2 相似度分析

import gensim.downloader as api
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import cosine_similarity# 自动下载并加载较小的 GloVe 模型
model = api.load("glove-wiki-gigaword-50")  # 下载 50 维的 GloVe 模型def analyze_semantic_relationships(model, word_pairs):"""分析词语之间的语义关系"""results = {}for word1, word2 in word_pairs:emb1 = model[word1]  # 获取词嵌入emb2 = model[word2]  # 获取词嵌入# 计算余弦相似度similarity = cosine_similarity(emb1.reshape(1, -1), emb2.reshape(1, -1))[0][0]results[f"{word1}-{word2}"] = similarityreturn results# 示例分析,增加更多的词对
word_pairs = [('king', 'queen'),  # 相似('man', 'woman'),  # 相似('paris', 'france'),  # 相似('apple', 'orange'),  # 相似('car', 'bicycle'),  # 相似('dog', 'cat'),  # 相似('computer', 'banana'),  # 不相似('happy', 'sad'),  # 相似('teacher', 'student'),  # 相似('sun', 'moon'),  # 相似('love', 'hate'),  # 相似('ocean', 'mountain'),  # 不相似('book', 'table'),  # 不相似('music', 'silence'),  # 不相似
]# 计算相似度
similarities = analyze_semantic_relationships(model, word_pairs)# 打印结果
for pair, sim in similarities.items():print(f"{pair}: {sim:.3f}")# 按相似度排序
sorted_similarities = sorted(similarities.items(), key=lambda x: x[1], reverse=True)# 可视化相似度
pairs = [pair for pair, sim in sorted_similarities]
scores = [sim for pair, sim in sorted_similarities]plt.figure(figsize=(10, 5))
plt.barh(pairs, scores, color='skyblue')
plt.xlabel('Cosine Similarity')
plt.title('Cosine Similarity between Word Pairs (Sorted)')
plt.xlim(0, 1)  # 余弦相似度范围是 [0, 1]
plt.show()

在这里插入图片描述

http://www.dtcms.com/a/465056.html

相关文章:

  • sql练习题单-知识点总结
  • 网站空间域名续费湖南送变电建设公司 网站
  • 国产化PDF处理控件Spire.PDF教程:C#中轻松修改 PDF 文档内容
  • 文件预览(pdf、docx、xlsx)
  • AutoCAD如何将指定窗口导出成PDF?
  • 测试DuckDB电子表格读取插件rusty_sheet 0.2版
  • 用「心率」重塑极限,以「中国精度」见证热爱——宜准产品体验官于淼成功挑战北京七环
  • 18003.TwinCat3配置LAN9253从站XML文件(Ethercat)- 示例(一)
  • 解锁特征工程:机器学习的秘密武器
  • 南昌企业网站开发公司hao123网址导航
  • 中山市有什么网站推广长臂挖机出租东莞网站建设
  • 网站建设多少钱一个月青岛网站公司哪家好
  • PowerBI一直在为个人版用户赋能,QuickBI目前正在拥抱个人版用户,FineBI正在抛弃个人版用户
  • 做网站和平台多少钱dedecms 网站地图 插件
  • 在 C# 中显示或隐藏 PDF 图层
  • 货车智能化配置手机控车远程启动一键启动无钥匙进入
  • Unity 项目外部浏览并读取PDF文件在RawImage中显示,使用PDFRender插件
  • 网站规划与建设评分标准昆明的互联网公司有哪些
  • 免费网站登录口看完你会感谢我wordpress能承载多少数据库
  • PostgreSQL选Join策略有啥小九九?Nested Loop/Merge/Hash谁是它的菜?
  • 数据链路层协议之RSTP协议
  • 让AI说“人话“:TypeChat.NET如何用强类型驯服大语言模型的“野性“
  • .pth文件
  • 北京网站建设销售招聘宣传式网站
  • Navicat笔记之使用技巧
  • 第五天:自动化爬虫
  • 长春企业网站哪里做的好12306网站制作
  • Java学习之旅第二季-16:接口
  • 147、【OS】【Nuttx】【周边】效果呈现方案解析:$PATH 隔离
  • 前端笔试复盘 | 知识点总结