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.pswp.cn/news/710712.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710712.shtml
英文地址,請注明出處:http://en.pswp.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…