【NLP入門系列三】NLP文本嵌入(以Embedding和EmbeddingBag為例)

在這里插入圖片描述

  • 🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客
  • 🍖 原作者:K同學啊

博主簡介:努力學習的22級本科生一枚 🌟?;探索AI算法,C++,go語言的世界;在迷茫中尋找光芒?🌸
博客主頁:羊小豬~~-CSDN博客
內容簡介:NLP入門三,Embedding和EmbeddingBag嵌入.
🌸箴言🌸:去尋找理想的“天空“”之城
上一篇內容:【NLP入門系列二】NLP分詞和字典構建-CSDN博客

文章目錄

  • NLP文本嵌入
    • 前言
    • 1、Embedding嵌入
    • 2、EmbeddingBag嵌入
    • 3、參考資料

NLP文本嵌入

前言

📄 大模型語言理解文字方式: 將每一個詞當做一個數字,然后不斷地進行做計算題,從而不斷地輸出文字;

? 舉例

如果用一個數字表示一個詞,這里用1表示男人,2表示女人,這樣的作用是給詞進行了編號,但是表示無法表示詞與詞之間的關系。

但是,如果用兩位數字表示呢?

👀 參考b站大佬視頻:

在數學中,向量是有方向的,可以做運算,這里也一樣,如圖:

在這里插入圖片描述
在數學中,向量是有方向的,可以做運算,這里也一樣,如圖:
在這里插入圖片描述
這樣就實現了:將每一個詞當做一個數字,然后進行做計算題,從而輸出文字;


💠 詞嵌入: 用向量表示詞。**原理:**將詞嵌入到數學的維度空間,如果詞用二維表示,那么嵌入到一個二維空間里,以此類推;

本質: 將離散的詞匯映射到一個低維連續的向量空間中,這樣詞匯之間的關系就可以在向量空間中得到體現。


📘 大模型語言訓練過程

大模型語言訓練是一個很復雜的過程,但是了解最基本過程還是簡單的,如下圖表示(剛開始不同詞隨機分布在二維空間中不同位置):
在這里插入圖片描述

經過模型訓練后:
在這里插入圖片描述

將語義相近的分布在一起,但是也有一些中立詞,如蘋果這個詞,吃蘋果和蘋果手機是不同意思的,所以蘋果就是中立的,具體的意思需要根據模型訓練過程中結合上下文進行運算得出結果。

EmbeddingEmbeddingBagpytorch處理文本數據詞嵌入的工具。

1、Embedding嵌入

Embeddingpytorch中最基本的詞嵌入操作。

輸入:一整張向量,每個整數都代表一個詞匯的索引

輸出:是一個浮點型的張量,每個浮現數都代表著對應詞匯的詞嵌入向量。

維度變化

  • 輸入shape:[batch, seqSize] ,seqSize表示單個文本長度(注意:同一批次中每個樣本的序列長度(seq_len)必須相同);
  • 輸出shape:[batch, seqSize, embed_dim]embed_bim 表示嵌入維度。

👙 注意:嵌入層被定義為網絡的第一個隱藏層,采用隨機權重初始化的方式,既可以作為深度學習模型的一部分,一起訓練,也可以用于用于加載訓練好的詞嵌入模型。

函數原型

torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None,                     max_norm=None,norm_type=2.0,scale_grad_by_freq=False,                     sparse=False,_weight=None,_freeze=False, device=None,                     dtype=None)

常見參數:

  • num_embeddings:詞匯表大小, 即,最大整數 index + 1。
  • embedding_dim:詞向量的維度。

📚 以一個二分類案例為例:

1、導入庫和自定義數據格式

import torch
import torch.nn as nn 
import torch.nn.functional as F 
import torch.optim as optim 
from torch.utils.data import Dataset, DataLoader# 自定義數據維度
class MyDataset(Dataset):def __init__(self, texts, labels):super().__init__()self.texts = textsself.labels = labelsdef __len__(self):return len(self.labels)def __getitem__(self, idx):text = self.texts[idx]label = self.labels[idx]return text, label

2、定義填充函數(將所有詞長度變成一致)

def collate_batch(batch):# 解包texts, labels = zip(*batch) # texts、labels存儲在不同[]/()這樣的數據結構# 獲取最大長度max_len = max(len(text) for text in texts)# 填充, 不夠的填充為0padding_texts = [F.pad(text, (0, max_len - len(text)), value=0) for text in texts] # 采用右填充# 改變維度--> (batch_size, max_len)padding_texts = torch.stack(padding_texts)# 標簽格式化(改變維度)--> (batch_size) --> (batch_size, 1), 不改變值labels = torch.tensor(labels, dtype=torch.float).unsqueeze(1)return padding_texts, labels

3、定義數據

# 定義三個樣本
data = [torch.tensor([1, 1, 1], dtype=torch.long), torch.tensor([2, 2, 2], dtype=torch.long),torch.tensor([3, 3], dtype=torch.long)
]# 定義標簽
labels = torch.tensor([1, 2, 3], dtype=torch.float)# 創建數據
data = MyDataset(data, labels)
data_loader = DataLoader(data, batch_size=2, shuffle=True, collate_fn=collate_batch)# 展示
for batch in data_loader:print(batch)print("shape:", batch)
(tensor([[1, 1, 1],[3, 3, 0]]), tensor([[1.],[3.]]))
shape: (tensor([[1, 1, 1],[3, 3, 0]]), tensor([[1.],[3.]]))
(tensor([[2, 2, 2]]), tensor([[2.]]))
shape: (tensor([[2, 2, 2]]), tensor([[2.]]))

4、定義模型

class EmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_dim):super(EmbeddingModel, self).__init__()# 定義模型self.embedding = nn.Embedding(vocab_size, embed_dim) # 詞匯表大小 + 嵌入維度self.fc = nn.Linear(embed_dim, 1)  # 這里假設做二分類任務def forward(self, text):print("Embedding輸入文本是: ", text)print("Embedding輸入文本shape: ", text.shape)embedding = self.embedding(text)embedding_mean = embedding.mean(dim=1)print("embedding輸出文本維度: ", embedding_mean.shape)return self.fc(embedding_mean)

注意
如果使用embedding_mean = embedding.mean(dim=1)語句對每個樣本的嵌入向量求平均,輸出shape為[batch, embed_dim]。若注釋掉該語句,輸出shape則為[batch, seqSize, embed_dim]


5、模型訓練

# 定義詞表大小和嵌入維度
vacab_size = 10
embed_dim = 6# 創建模型
model = EmbeddingModel(vacab_size, embed_dim)# 設置超參數
cirterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 模型訓練
for epoch in range(1):for batch in data_loader:text, label = batch# 前向傳播outputs = model(text)loss = cirterion(outputs, label)# 方向傳播optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch {epoch+1}, Loss: {loss.item()}')
Embedding輸入文本是:  tensor([[2, 2, 2],[1, 1, 1]])
Embedding輸入文本shape:  torch.Size([2, 3])
embedding輸出文本維度:  torch.Size([2, 6])
Epoch 1, Loss: 0.6635428667068481
Embedding輸入文本是:  tensor([[3, 3]])
Embedding輸入文本shape:  torch.Size([1, 2])
embedding輸出文本維度:  torch.Size([1, 6])
Epoch 1, Loss: 0.5667202472686768

2、EmbeddingBag嵌入

EmbeddingBag是在Embedding基礎上進一步優化的工具,其核心思想是將每個輸入序列的嵌入向量進行合并,能夠處理可變長度的輸入序列,并且減少了計算和存儲的開銷,并且可以計算句子中所有詞匯的詞嵌入向量的均值或總和。

減少計算量:因為embedding嵌入中需要要求每一個詞向量長度需要一樣。

PyTorch中,EmbeddingBag輸入是一個 整數張量 和一個 偏移量張量每個整數都代表著一個詞匯的索引,偏移量則表示句子中每個詞匯的位置輸出是一個浮點型的張量,每個浮點數都代表著對應句子的詞嵌入向量的均值或總和。

  • 輸入shape:[seqsSize](seqsSize為單個batch文本總長度)
  • 輸出shape:[batch, embed_dim](embed_dim嵌入維度)

📐 假設原始輸入數據為 [[1, 1, 1, 1], [2, 2, 2], [3, 3]]

  1. 展平的詞匯索引張量

    • 將所有樣本的數據合并成一個一維數組。如 [1, 1, 1, 1, 2, 2, 2, 3, 3]
  2. 偏移量

    偏移量表示每個樣本在展平張量中的起始位置。如本案例: [0, 4, 7]

  3. 合并操作

    • 根據偏移量進行合并
    • 合并操作可以是求和、平均或取最大值,默認是平均(mean)。以平均為例:
      • 第一個樣本的平均值:(1 + 1 + 1 + 1) / 4 = 1
      • 第二個樣本的平均值:(2 + 2 + 2) / 3 = 2
      • 第三個樣本的平均值:(3 + 3) / 2 = 3
      • 最后結果為 [1, 2, 3],即batch維度

📑 一個簡單的案例如下:

1、導入庫和自定義數據格式

import torch
import torch.nn as nn 
import torch.nn.functional as F 
import torch.optim as optim 
from torch.utils.data import Dataset, DataLoader# 自定義數據維度
class MyDataset(Dataset):def __init__(self, texts, labels):super().__init__()self.texts = textsself.labels = labelsdef __len__(self):return len(self.labels)def __getitem__(self, idx):text = self.texts[idx]label = self.labels[idx]return text, label

2、定義數據

# 定義三個樣本
data = [torch.tensor([1, 1, 1], dtype=torch.long), torch.tensor([2, 2, 2], dtype=torch.long),torch.tensor([3, 3], dtype=torch.long)
]# 定義標簽
labels = torch.tensor([1, 2, 3], dtype=torch.float)# 創建數據
data = MyDataset(data, labels)
data_loader = DataLoader(data, batch_size=2, shuffle=True, collate_fn=lambda x : x)# 展示
for batch in data_loader:print(batch)
[(tensor([1, 1, 1]), tensor(1.)), (tensor([3, 3]), tensor(3.))]
[(tensor([2, 2, 2]), tensor(2.))]

3、定義模型

class EmbeddingModel(nn.Module):def __init__(self, vocab_size, embed_dim):super(EmbeddingModel, self).__init__()# 定義模型self.embedding_bag = nn.EmbeddingBag(vocab_size, embed_dim, mode='mean')self.fc = nn.Linear(embed_dim, 1)  # 這里假設做二分類任務def forward(self, text, offsets):print("Embedding輸入文本是: ", text)print("Embedding輸入文本shape: ", text.shape)embedding_bag = self.embedding_bag(text, offsets)print("embedding_bag輸出文本維度: ", embedding_bag.shape)return self.fc(embedding_bag)

4、模型訓練

# 定義詞表大小和嵌入維度
vacab_size = 10
embed_dim = 6# 創建模型
model = EmbeddingModel(vacab_size, embed_dim)# 設置超參數
cirterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 模型訓練
for epoch in range(1):for batch in data_loader:# 展平和計算偏移量texts, labels = zip(*batch)# 偏移量計算,就是統計文本長度offset = [0] + [len(text) for text in texts[:-1]] # 統計長度offset = torch.tensor(offset).cumsum(dim=0) # 生成偏移量,累計求和texts = torch.cat(texts)  # 合并文本labels = torch.tensor(labels).unsqueeze(1)  # 增加維度-->(batch_size, 1)# 前向傳播outputs = model(texts, offset)loss = cirterion(outputs, labels)# 方向傳播optimizer.zero_grad()loss.backward()optimizer.step()print(f'Epoch {epoch+1}, Loss: {loss.item()}')
Embedding輸入文本是:  tensor([2, 2, 2, 1, 1, 1])
Embedding輸入文本shape:  torch.Size([6])
embedding_bag輸出文本維度:  torch.Size([2, 6])
Epoch 1, Loss: 0.07764509320259094
Embedding輸入文本是:  tensor([3, 3])
Embedding輸入文本shape:  torch.Size([2])
embedding_bag輸出文本維度:  torch.Size([1, 6])
Epoch 1, Loss: 3.315852642059326

3、參考資料

  • 【大模型靠啥理解文字?通俗解釋:詞嵌入embedding】https://www.bilibili.com/video/BV1bfoQYCEHC?vd_source=1fd424333dd77a7d3e2e741f7d6fd4ee
  • PyTorch 簡單易懂的 Embedding 和 EmbeddingBag - 解析與實踐_nn.embeddingbag-CSDN博客
  • 小團體~第十二波

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84801.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文心一言(ERNIE Bot):百度打造的知識增強大語言模型

1. 產品概述 文心一言(ERNIE Bot)是百度自主研發的知識增強大語言模型,于2023年3月16日正式發布,對標OpenAI的ChatGPT,具備文本生成、多模態交互、邏輯推理、中文理解等能力。該模型基于百度的飛槳深度學習平臺和文心…

Java-49 深入淺出 Tomcat 手寫 Tomcat 實現【02】HttpServlet Request RequestProcessor

點一下關注吧!!!非常感謝!!持續更新!!! 🚀 AI篇持續更新中!(長期更新) 目前2025年06月13日更新到: AI煉丹日志-28 - Aud…

在VB.net中,文本插入的幾個自定義函數

一、如果你是高手&#xff0c;一定“識貨”&#xff0c;分享給你 二、可應用于文本插入的幾種方式&#xff1a;6種 三、需要用到以下的幾個函數&#xff1a; 上代碼&#xff1a; Module TextModule <summary> 在指定位置插入文本 </summary> <p…

QC -io 服務器排查報錯方式/報錯: Failed to convert string to integer of varId variable!“

進斷點控制臺有報錯之后&#xff0c;復制報錯信息到 頭部菜單欄 1.編輯 -> 2.Find/Replace ->3.Advanced Find ->4. Project“xxxxx” 能找到問題點 再分析定位 在排查報錯時候&#xff0c;進入了這個報錯&#xff0c;msgInfo "MyTcpRedis: Failed to conver…

c++中auto與decltype使用

在 C11及后續版本中&#xff0c;關鍵字auto和decltype都是用于類型推導的&#xff0c;但它們的使用場景和行為有所不同。 1. auto 關鍵字 作用 auto 用于自動推導變量的類型&#xff0c;由編譯器根據初始化表達式來確定。 常見用法 // 基本用法 auto x 42; // int…

LabVIEW機器視覺零件檢測

基于LabVIEW 圖形化編程平臺與機器視覺技術&#xff0c;構建集圖像采集、處理、尺寸計算與合格性分析于一體的自動化檢測方案。通過模塊化硬件架構與自適應算法設計&#xff0c;實現對機械零件多維度尺寸的非接觸式高精度測量&#xff0c;相比人工檢測效率提升 12 倍&#xff0…

大數據治理域——實時數據開發

摘要 本文深入探討了大數據治理域中的實時數據開發&#xff0c;重點介紹了流式數據處理的核心價值、特點、技術挑戰、典型能力和應用場景。同時&#xff0c;詳細闡述了流式技術架構&#xff0c;包括數據采集、處理、存儲和服務等環節&#xff0c;并針對大促場景提出了相應的技…

Halcon/C# 圖像窗口、讀取圖片及仿射變換

一、Halcon 清理窗口 清除圖像窗口的顯示。 dev_clear_window() 二、Halcon 讀取圖片 (一) 讀取一張圖片 read_image (Image, printer_chip/printer_chip_01)Image&#xff1a;&#xff08;輸出參數&#xff09;讀取到的圖片變量名 第二個參數&#xff1a;圖片路徑&#xf…

Nginx 反向代理服務和安裝docker-compose

Nginx 反向代理服務和安裝docker-compose Nginx Proxy Manager 他是一個可視化的nginx的反向代理神器&#xff0c;動動手指輕松的配置Nginx&#xff0c;我們可以通過一些網頁&#xff0c;即可完成網站的代理配置&#xff0c;無需在動手安裝Nginx&#xff1b; dockoer-compose部…

FPGA基礎 -- Verilog 鎖存器簡介

由淺入深地講解 Verilog 中的鎖存器&#xff08;Latch&#xff09;**&#xff0c;包括&#xff1a; 什么是鎖存器&#xff08;定義與作用&#xff09;鎖存器的分類&#xff08;透明鎖存器 vs 邊沿觸發器&#xff09;Verilog 中鎖存器的建模方式鎖存器與觸發器的區別鎖存器的時…

Eclipse Memory Analyzer (MAT) 相關配置調整

一、JDK版本過低提示 已安裝高于 jdk 17 的版本依舊提示 jdk 版本過低&#xff0c;打開MAT的安裝目錄&#xff0c;在配置文件 MemoryAnalyzer.ini 中添加配置指向JDK即可。新增兩行配置&#xff1a; -vm D:/jdk_21.0.7/bin/javaw.exe //jdk安裝路徑 bin 目錄下的javaw.exe二…

機器學習常用評估指標

機器學習常用評估指標 機器學習的評價指標有精度、精確率、召回率、P-R曲線、F1 值、TPR、FPR、ROC等指標&#xff0c;還有在生物領域常用的敏感性、特異性等指標。 基礎 在分類任務中&#xff0c;各指標的計算基礎都來自于對正負樣本的分類結果&#xff0c;用混淆矩陣表示&…

視頻相似度檢測算法(帶課設報告)

摘 要 本文提出了一種基于關鍵幀特征提取的視頻相似度檢測方法&#xff0c;通過融合自適應采樣與特征降維技術實現高效準確的視頻內容比對。系統采用三階段處理流程&#xff1a;首先對輸入視頻進行自適應關鍵幀采樣&#xff0c;通過均勻間隔算法提取固定數量&#xff08;默…

微服務江湖的愛恨情仇:Spring Cloud 與 Kubernetes 的雙雄演義

引言&#xff1a;雙雄并立&#xff0c;一個時代的序幕 微服務革命&#xff0c;如同一場燎原之火&#xff0c;將龐大、笨重的單體應用燒成灰燼&#xff0c;宣告了一個敏捷、獨立、快速迭代的新紀元。然而&#xff0c;這場革命在摧毀舊世界的同時&#xff0c;也催生了一片混沌的新…

深度拆解RAGFlow分片引擎之切片實現

上一篇深度拆解RAGFlow分片引擎&#xff01;3大階段視覺增強&#xff0c;全網最硬核架構解析 講了切片的整體流程&#xff0c;今天我們來拆下切片的實現。 我們在設置的時候&#xff0c;可以選擇切片方法。這個參數是parser_id 在創建知識庫的時候&#xff0c;選擇對應的切片方…

CSS平滑滾動效果實現方法

一、純CSS實現方案 使用 scroll-behavior 屬性 屬性值 auto (默認值)&#xff1a;滾動框立即滾動smooth&#xff1a;滾動框以平滑的方式滾動 /* 全局平滑滾動 */ html {scroll-behavior: smooth; }/* 特定容器平滑滾動 */ .scroll-container {scroll-behavior: smooth;over…

李沐動手深度學習(pycharm中運行筆記)——12.權重衰退

12.權重衰退&#xff08;與課程對應&#xff09; 目錄 一、權重衰退 1、使用均方范數作為硬性限制 2、使用均方范數作為柔性限制&#xff08;通常這么做&#xff09; 3、演示對最優解的影響 4、參數更新法則 5、總結 二、代碼實現從零實現 三、代碼實現簡介實現 一、權重…

React Native【實戰范例】同步跟隨滾動

最終效果 實現原理 主動滾動區觸發滾動事件&#xff0c;原生監聽滾動值的變化&#xff0c;并用動畫的方式實時同步到跟隨滾動區 技術要點 使用 Animated.ScrollView 使用動畫變量 const scrollY useRef(new Animated.Value(0)).current;主動滾動觸發 onScroll&#xff0c;用 …

如何僅用AI開發完整的小程序<3>—創建小程序基礎框架

1、啟動小程序開發者工具-選擇小程序&#xff0c;點擊 2、創建一個項目工程 項目名稱&#xff1a;自己填默認的也行&#xff0c;最好不要中文&#xff0c;拼音也行 目錄&#xff1a;選擇你的項目創建路徑 AppID&#xff1a;可以先點測試號&#xff0c;后面再替換自己的AppID就…

SQL等價改寫優化

or 與 union all的優化 在SQL開發中&#xff0c;我們經常會遇到這樣的情況&#xff1a;需要組合多個相似但略有不同的查詢結果。大多數開發者本能地使用UNION/UNION ALL來解決&#xff0c;這種方式直觀易懂&#xff0c;但在特定場景下卻隱藏著巨大的性能浪費。 本案例將從執行…