embedding的原理和结构

embedding(向量化)是一个将数据转化为向量矩阵的过程,作用是:将高维稀疏向量转化为稠密向量,从而方便下游模型处理

简单的概念大家应该都知道了,以LLM为例
输入:文字
模型:embedding
输出:向量

我疑惑的难点主要为以下:
1.embedding的结构√
2.embedding的训练(根据不同的目标进行数据不同的组织形式,进行相对应任务的训练,可以看结构想到)
3.embedding的难点以及各种模型的优势(未解决)
4.embedding的技术原理(回归任务,根据离散token回归,帮助在得到一个新的语句时,生成对应的向量。)
5.embedding在检索任务和生成任务中的区别√

1.embedding的结构

对于嵌入模型,输出可以是两种常见形式之一:

类别概率分布: 如果你的任务是分类,模型的最后一层通常会输出每个类别的概率分布。这时,你可以使用交叉熵损失作为目标函数,模型的输出是对各个类别的概率预测。

嵌入向量: 如果你的任务是生成嵌入向量,模型的最后一层可能输出样本的嵌入表示。这时,你可以使用均方差损失(Mean Squared Error, MSE)或其他适当的损失函数,目标是使生成的嵌入向量接近于真实的嵌入。

分类任务

在分类任务中,一般来说,模型的最后一层输出类别概率分布更为常见。这是因为使用类别概率分布作为输出,可以直接使用交叉熵损失函数,它在多类别分类问题中效果良好。

#label
label1\tThis is a positive sentence.
label2\tNegative sentiment detected in this text.
label1\tThe product works well and meets my expectations.
label3\tI don't like the design of the app.
...

构建分类model

import torch
import torch.nn as nn
from torch.nn import TransformerEncoder, TransformerEncoderLayerclass TransformerEmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_size, nhead, num_layers):super(TransformerEmbeddingModel, self).__init__()self.embedding = nn.Embedding(vocab_size, embed_size)# Transformer Encoder Layersencoder_layers = TransformerEncoderLayer(d_model=embed_size, nhead=nhead)self.transformer_encoder = TransformerEncoder(encoder_layers, num_layers=num_layers)# Fully connected layer for outputself.fc = nn.Linear(embed_size, output_size)def forward(self, x):# Embedding layerembedded = self.embedding(x)# Transformer Encodertransformer_output = self.transformer_encoder(embedded)# Global average poolingpooled = torch.mean(transformer_output, dim=1)# Fully connected layeroutput = self.fc(pooled)return output
from torch.utils.data import Dataset, DataLoaderclass TextDataset(Dataset):def __init__(self, data_path):# 从文件加载数据集self.data = self.load_data(data_path)def __len__(self):return len(self.data)def __getitem__(self, idx):return self.data[idx]['text'], self.data[idx]['label']def load_data(self, data_path):# 实现从文件加载数据的逻辑,返回一个包含文本和标签的列表# 例如,每个样本可以表示为 {'text': 'This is a sentence.', 'label': 1}passmodel = TransformerEmbeddingModel(vocab_size, embed_size, nhead, num_layers, output_size)# 交叉熵损失函数
criterion = nn.CrossEntropyLoss()# 优化器(例如Adam)
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 示例数据加载逻辑
def load_data(self, data_path):data = []with open(data_path, 'r', encoding='utf-8') as file:for line in file:label, text = line.strip().split('\t')data.append({'text': text, 'label': int(label)})return data# 示例训练过程
for epoch in range(num_epochs):for input_data, labels in dataloader:# 模型前向传播outputs = model(input_data)# 计算损失loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()

嵌入任务

对于训练嵌入模型,是否需要使用标签(label)取决于具体的任务和目标。嵌入模型通常有两种主要应用场景:
监督学习任务
目标: 生成的嵌入向量在某个监督学习任务中有用。
训练方式: 在这种情况下,你可能需要使用标签,以便在训练过程中调整模型参数,使生成的嵌入向量对监督学习任务有更好的表现。
示例: 基于用户行为数据生成用户嵌入,用于预测用户行为的监督学习任务。
无监督学习任务
目标: 生成的嵌入向量本身是任务的目标,而不需要标签。
训练方式: 在这种情况下,你可以仅使用输入数据,无需关联的标签。模型被训练为捕捉数据中的潜在结构,使得相似的输入在嵌入空间中更接近。
示例: Word2Vec、FastText等无监督学习嵌入模型,它们通过学习输入数据的上下文信息生成嵌入。
在实际应用中,根据任务需求选择是否使用标签。如果嵌入向量在监督学习任务中发挥作用,那么使用标签进行监督训练通常是有意义的。如果目标是学习数据的结构或生成通用的嵌入表示,那么可以在无监督或自监督的设置中进行训练,无需标签。

监督学习任务
import torch
import torch.nn as nn
import torch.optim as optimclass EmbeddingModel(nn.Module):def __init__(self, input_size, embedding_size, output_size):super(EmbeddingModel, self).__init__()self.fc = nn.Linear(input_size, embedding_size)self.output_layer = nn.Linear(embedding_size, output_size)def forward(self, x):x = self.fc(x)embedding_vector = torch.relu(x)  # 示例中使用了ReLU激活函数output = self.output_layer(embedding_vector)return output# 参数设置
input_size = 100  # 输入维度
embedding_size = 50  # 嵌入向量维度
output_size = 1  # 输出维度,可以根据任务需求调整# 创建模型实例
model = EmbeddingModel(input_size, embedding_size, output_size)# 选择均方差损失函数
criterion = nn.MSELoss()# 选择优化器(例如Adam)
optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 示例数据集加载逻辑
def load_data(self, data_path):data = []with open(data_path, 'r', encoding='utf-8') as file:for line in file:embedding_vector, label = line.strip().split('\t')embedding_vector = [float(value) for value in embedding_vector.split(',')]label = float(label)data.append({'embedding_vector': torch.tensor(embedding_vector), 'label': torch.tensor(label)})return data# 创建数据集实例
data_path = "path/to/your/data.txt"
dataset = EmbeddingDataset(data_path)# 创建数据加载器
batch_size = 32
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)# 模型训练
for epoch in range(num_epochs):for sample in dataloader:input_data, labels = sample['embedding_vector'], sample['label']# 模型前向传播outputs = model(input_data)# 计算均方差损失loss = criterion(outputs, labels.view(-1, 1))  # 保持形状一致# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()

label组织形式

embedding_vector1\tlabel1
embedding_vector2\tlabel2
embedding_vector3\tlabel1
embedding_vector4\tlabel3
...
非监督 学习任务(在大模型应用时,此处为常用任务)

训练基础示意代码:数据集中的每个样本只包含输入数据,模型的目标是学习将输入数据映射到嵌入向量。
这种训练的目标是学习一个映射函数,能够将输入数据映射到一个嵌入向量空间。通过最小化均方差损失,我们迫使模型生成的嵌入向量在这个空间中更接近于真实输入数据。

import torch
import torch.nn as nn
import torch.optim as optim# 示例嵌入模型
class TextEmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_size):super(TextEmbeddingModel, self).__init__()self.embedding = nn.Embedding(vocab_size, embed_size)def forward(self, x):embedded = self.embedding(x)embedding_vector = torch.mean(embedded, dim=1)  # 简单地取平均作为嵌入向量return embedding_vector# 参数设置
vocab_size = 10000  # 假设有10000个词
embed_size = 50    # 假设嵌入向量维度为50# 创建模型实例
model = TextEmbeddingModel(vocab_size, embed_size)# 选择均方差损失
criterion = nn.MSELoss()# 选择优化器(例如Adam)
optimizer = optim.Adam(model.parameters(), lr=0.001)# 示例数据集加载逻辑
def load_data(data_path):data = []with open(data_path, 'r', encoding='utf-8') as file:for line in file:data.append(line.strip())return data# 示例文本预处理逻辑
def preprocess_text(text, word_to_index):# 假设已经建立了词到索引的映射表 word_to_indextokens = text.split()indexed_tokens = [word_to_index[word] for word in tokens]return torch.tensor(indexed_tokens)# 创建数据集实例
data_path = "path/to/your/data.txt"
data = load_data(data_path)# 示例词到索引的映射
word_to_index = {"This": 0, "is": 1, "a": 2, "positive": 3, "sentence": 4, ...}# 预处理文本数据
indexed_data = [preprocess_text(text, word_to_index) for text in data]# 创建数据加载器
batch_size = 32
dataloader = DataLoader(indexed_data, batch_size=batch_size, shuffle=True)# 模型训练
for epoch in range(num_epochs):for indexed_text in dataloader:# 模型前向传播outputs = model(indexed_text)# 计算均方差损失loss = criterion(outputs, indexed_text.float())  # 输入数据需要是浮点型# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()

indexed_text是一个样本对应的预处理后的文本表示,outputs是模型生成的嵌入向量。损失计算时,使用均方差损失来比较模型生成的嵌入向量和原始文本的表示。在实际应用中,需要更复杂的嵌入模型结构和更复杂的文本预处理逻辑。
优化:考虑使用更复杂的嵌入模型,可能包括多层、多头注意力等结构,以提高模型的表示能力,这样的结构可能使模型能够更好地捕捉输入序列的复杂关系。

5.embedding在检索任务和生成任务中的区别

在文本生成任务中,通常采用的是对每个token进行embedding,生成的向量维度是(序列长度,embedding大小)。这是因为对于一个给定的序列,嵌入模型将每个token映射为一个固定大小的嵌入向量。整个序列的嵌入表示是通过将每个token的嵌入向量按序列顺序连接起来形成的。这个嵌入表示通常被送入生成模型,比如循环神经网络(RNN)或Transformer,用于生成下一个token。

对于生成嵌入向量的任务,嵌入模型是对整个句子进行embedding,生成的向量是一个单一的向量,维度为(1,embedding大小)。这个向量的目标是捕捉整个句子的语义信息,可以用于后续任务,比如文本分类、聚类等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++高精度乘法的原理及c++代码讲解

高精度乘法的原理主要是利用数学中乘法的基本原理,将大整数拆分成各个位数的相乘,然后累加得到最终结果。其过程如下: 将两个大整数相乘,从低位开始逐位相乘,得到部分乘积;将每一位的部分乘积相加&#xf…

【Emgu CV教程】7.8、图像锐化(增强)之同态滤波

文章目录 一、同态滤波大体原理二、代码三、效果举例 一、同态滤波大体原理 之前介绍的几个锐化、增强方法,包括更早之前介绍的图像模糊方法,都是基于空间域进行处理,也就是直接对目标点周边像素值进行各种数学运算。而这篇文章提到的同态滤…

学习计算机的好处

之前写了那么多计算机知识,却没有一篇写我学计算机的初衷。 掌握计算机技术不仅可以提高我们的就业能力和竞争力,同时有助于我们更好地认识世界,提高工作效率和解决问题的能力,更好地利用科技创造更美好的未来。 因此&#xff0c…

pyvisa库实现仪器控制

python控制仪器实现自动化常用pyvisa库,基本控制可大致分为创建仪器控制对象、写入控制指令、读取仪表信息和查询仪表状态,下面进行基本的讲解。 pyvisa库创建仪表控制对象 import tkinter.messagebox import pyvisaclass InstrumentControl:inst Non…

喜迎乔迁,开启新章 ▏易我科技新办公区乔迁庆典隆重举行

2024年1月18日,易我科技新办公区乔迁庆典在热烈而喜庆的氛围中隆重举行。新办公区的投入使用,标志着易我科技将以崭新姿态迈向新的发展阶段。 ▲ 易我科技新办公区 随着公司业务的不断发展和壮大,为了更好地适应公司发展的需要,…

2024-02-29(Flink)

1.Flink原理(角色分工) 2.Flink执行流程 on yarn版: 3.相关概念 1)DataFlow:Flink程序在执行的时候会被映射成一个数据流模型; 2)Operator:数据流模型中的每一个操作被称作Operat…

Spring Boot 高级实践探索:深度解读与实战演练

随着开发者对Spring Boot框架的基础运用日渐娴熟,迈向更深层次的技术探究和应用场景拓展显得尤为重要。本文将带领读者深入研究Spring Boot的若干核心进阶特性,并结合实际项目案例,涵盖自动化测试策略的深化应用、高级配置管理机制的巧妙运用…

Redis 之四:Redis 事务和乐观锁

事务特点 Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。不具备原子性。 在事务执…

通讯录——C语言实现

头文件Contact.h #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #pragma once #define MAX 100 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30//表示一个人的信息 //struct…

npm使用国内淘宝镜像的方法整理

命令配置安装&#xff1a; 淘宝镜像&#xff1a; npm config set registry https://registry.npm.taobao.org/ 官方镜像&#xff1a; npm config set registry https://registry.npmjs.org 通过cnpm安装&#xff1a; npm install -g cnpm --registryhttps://registry.npm.…

PTA L2-003 月饼 (附坑点说明)

月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出的情形是这样的&#…

如何在Java中反转字符串?

目录 1. 使用StringBuilder的reverse方法&#xff1a; 2. 使用for循环和字符数组&#xff1a; 3. 使用递归&#xff1a; 4. 使用Java 8的Stream API&#xff1a; More Java中&#xff0c;反转字符串可以通过多种方式实现。以下是一些常见的方法&#xff1a; 1. Java中使用…

【Python】PyGameUI控件

哈里前段时间写了一个windows平板上自娱自乐&#xff08;春节和家人一起玩&#xff09;基于pygame的大富翁游戏。 pygame没有按钮之类的UI控件&#xff0c;写起来不怎么顺手。就自己写一个简单的框架。 仓库地址 哈里PygameUi: pygame ui封装自用 (gitee.com) 使用示例 示…

上海亚商投顾:沪指终结月线6连阴 北向资金净买入超160亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日低开高走&#xff0c;沪指重新站上3000点&#xff0c;深成指、创业板指大涨超3%。半导体产业链全…

实时聊天系统PHP

实时聊天系统可以让用户在网站上实时交流&#xff0c;这对社交平台、在线客服等网站非常有帮助。以下是一个简单的基于 PHP 和 WebSocket 的实时聊天系统示例&#xff1a; 1. 首先创建一个 HTML 文件 index.html 来显示聊天界面和发送消息的表单&#xff1a; html <!DOCTYP…

【C#】 List.Sort 方法

【C#】 List.Sort 方法 在C#中&#xff0c;List.Sort()不仅为系统自带的变量(int, float, double …)类型的集合提供默认排序&#xff0c;还提供了自定义的排序方法。 List自带排序 List<int> list new List<int>(); list.Add(5); list.Add(3); list.Add(4); l…

探索那些能唤起情感共鸣的壁纸

1、方小童在线工具集 网址&#xff1a; 方小童 该网站是一款在线工具集合的网站&#xff0c;目前包含PDF文件在线转换、随机生成美女图片、精美壁纸、电子书搜索等功能&#xff0c;喜欢的可以赶紧去试试&#xff01;

Python:关于数据服务中的Web API的设计

搭建类似joinquant、tushare类似的私有数据服务应用&#xff0c;有以下一些点需要注意&#xff1a; 需要说明的是&#xff0c;这里讨论的是web api前后端&#xff0c;当然还有其它方案&#xff0c;thrift&#xff0c;grpc等。因为要考虑到一鱼两吃&#xff0c;本文只探讨web ap…

高项软考电子版论文答题纸(附下载)

24年软考又要来了&#xff0c;作为高项软考的拦路虎&#xff0c;论文你准备好了吗&#xff1f;&#xff01;记住在开始考试之前一定要用论文答题纸上把准备好的论文&#xff0c;在规定的时间内写上几遍&#xff0c;一是现在很少动笔写字了。二是、熟悉一下论文考试的感觉。 准备…

UniApp Vue 3 中的网络请求封装详解及用法

在UniApp中&#xff0c;结合Vue 3的强大特性&#xff0c;进行网络请求的封装是项目中常见的需求。这样的封装不仅提高了代码的可维护性&#xff0c;还使得在组件中使用网络请求更加简洁。本文将详细介绍UniApp Vue 3中的网络请求封装&#xff0c;并提供一个简单的用法示例。 1…