LLM基礎2_語言模型如何文本編碼

基于GitHub項目:https://github.com/datawhalechina/llms-from-scratch-cn

字節對編碼(BPE)

上一篇博文說到

為什么GPT模型不需要[PAD][UNK]

GPT使用更先進的字節對編碼(BPE),總能將詞語拆分成已知子詞

為什么需要BPE?

  • 簡單分詞器的問題:遇到新詞就卡住(如"Hello")

  • BPE的解決方案:把陌生詞拆成已知的小零件

BPE如何工作?

就像拼樂高:

  1. 基礎零件:先準備256個基礎字符(a-z, A-Z, 標點等)

  2. 拼裝訓練:統計哪些字符組合常出現

  3. 創建新零件:把高頻組合變成新"積木塊"

# 使用GPT-2的BPE分詞器
import tiktoken
tokenizer = tiktoken.get_encoding("gpt2")text = "Akwirw ier"  # 模型沒見過的詞
integers = tokenizer.encode(text)  # [33901, 86, 343, 86, 220, 959]# 查看每個部分的含義
for i in integers:print(f"{i} -> {tokenizer.decode([i])}")
# 33901 -> Ak
# 86 -> w
# 343 -> ir
# 86 -> w
# 220 -> (空格)
# 959 -> ier

舉例:

陌生詞BPE分解計算機理解
AkwirwAk + w + ir + w"Ak"是已知前綴,"w"是字母,"ir"是常見組合
someunknownPlacesome + unknown + Place拆成三個已知部分

滑動窗口 - 文本的"記憶訓練法"

語言模型的核心任務:根據上文預測下一個詞。比如:“白日依山_",語言模型會根據上文推測出下文可能是“盡”,“水”……等,最終經過對比,選取最可能的詞填上,得到“白日依山盡”。

#用滑動窗口創建訓練數據
文本:"I had a cat" → 分詞后:[40, 367, 2885, 1464]# 滑動窗口(窗口大小=4)
輸入(x)       目標(y)        訓練內容
[40]        → [367]        看到"I"預測"had"
[40, 367]   → [2885]       看到"I had"預測"a"
[40,367,2885]→[1464]      看到"I had a"預測"cat"

?使用舉例:

from torch.utils.data import Dataset
from transformers import GPT2Tokenizerclass GPTDatasetV1(Dataset):def __init__(self, txt, max_length=256, stride=128):    #stride控制相鄰片段間的重疊長度self.tokenizer = GPT2Tokenizer.from_pretrained('gpt2')    #使用GPT-2原生分詞器self.tokenizer.pad_token = self.tokenizer.eos_token    #用結束符代替填充符# 分詞得到ID序列,自動添加特殊標記(默認添加<|endoftext|>),但不會添加BOS(開始符)token_ids = self.tokenizer.encode(txt)# 用滑動窗口創建多個訓練片段self.examples = []for i in range(0, len(token_ids) - max_length, stride):input_ids = token_ids[i:i + max_length]target_ids = token_ids[i + 1:i + max_length + 1]self.examples.append((input_ids, target_ids))# 假設 token_ids = [1,2,3,4,5], max_length=3, stride=2# 窗口1:i=0 → input=[1,2,3], target=[2,3,4]# 窗口2:i=2 → input=[3,4,5], target=[4,5]def __len__(self):return len(self.examples)def __getitem__(self, idx):input_ids, target_ids = self.examples[idx]return input_ids, target_ids

i + max_length +1超過數組長度時,target_ids會自動截斷(可能產生短序列)

優化方向建議:

  1. 動態填充:使用attention_mask區分真實token與填充
  2. 緩存機制:對大型文本文件進行分塊處理
  3. 長度統計:添加樣本長度分布分析功能
  4. 批處理優化:結合collate_fn處理變長序列

參數選擇指南

  1. 短文本(<1k tokens):max_length=64-128,?stride=32-64
  2. 長文本(>10k tokens):max_length=512-1024,?stride=256-512
# 示例使用方式
text = "Self-explanatory knowledge, human intelligence, personal knowledge..."  # 你的長文本數據
dataset = GPTDatasetV1(text)# 獲取第一個樣本
input_seq, target_seq = dataset[0]

詞元嵌入

之前的ID只是編號,沒有含義。嵌入層給每個詞從多個維度作向量表示

# 創建嵌入層(詞匯表大小=6,向量維度=3)
embedding = torch.nn.Embedding(6, 3)# 查看權重矩陣
print(embedding.weight)
"""
tensor([[ 0.3374, -0.1778, -0.1690],  # ID=0的向量[ 0.9178,  1.5810,  1.3010],  # ID=1的向量...                           # 以此類推], requires_grad=True)         # 可學習!
"""

嵌入層的本質:

相當于高效版的"獨熱編碼+矩陣乘法":

獨熱編碼:[0,0,0,0,1] → 矩陣乘法 → [0.1, -0.5, 0.8]
嵌入層:直接取矩陣的第5行 → [0.1, -0.5, 0.8]

流程總結:原始文本->BPE分詞->ID序列->滑動窗口->訓練樣本->嵌入層->詞向量

單詞位置編碼

?為什么需要位置編碼?

簡單詞嵌入的局限:

  • 詞嵌入只表示詞語含義,不包含位置信息

  • 模型會把所有詞語當作無序集合處理

比如"貓追老鼠"和"老鼠追貓",雖然詞語相同但意思完全相反!

?位置編碼的解決方案

就像給教室座位編號:每個詞語有"含義身份證"(詞嵌入)->再加個"座位號"(位置編碼)

詞嵌入層實現

import torch
import torch.nn as nn# 定義詞嵌入層
token_embedding = nn.Embedding(num_embeddings=50257, embedding_dim=256)#num_embeddings參數表示嵌入字典的大小
#embedding_dim參數控制輸出向量的維度

位置嵌入層實現

# 定義位置嵌入層(假設序列最大長度為4)
pos_embedding = nn.Embedding(num_embeddings=4, embedding_dim=256)

生成位置編碼向量

# 生成位置編號0-3的序列
position_ids = torch.arange(4)  # tensor([0, 1, 2, 3])# 獲取位置向量(形狀為[4, 256])
position_vectors = pos_embedding(position_ids)

組合詞嵌入與位置嵌入

# 假設輸入的token_ids形狀為[batch_size, seq_len]
token_vectors = token_embedding(token_ids)
final_embeddings = token_vectors + position_vectors.unsqueeze(0)

#廣播機制
position_vectors擴展為(batch_size, seq_len, embedding_dim),與token_vectors維度對齊??

假設參數:
batch_size = 4    #4個樣本
seq_len = 16    #每個樣本有16個tokens
embedding_dim = 512    #詞嵌入為512維向量操作流程:
Token IDs形狀      : (4, 16)
↓ 經過嵌入層
Token向量形狀      : (4, 16, 512)
Position向量原始形狀 : (16, 512)
↓ unsqueeze(0)
Position向量調整后  : (1, 16, 512)
↓ 廣播相加
Final嵌入形狀      : (4, 16, 512)
  • 位置嵌入通常需要擴展到與詞嵌入相同的維度
  • 在Transformer架構中,位置嵌入可以是可學習的(如本例)或使用固定公式計算

?為什么用加法而不是拼接?

????????維度一致:保持向量維度不變(256維)

????????計算高效:加法比拼接更省資源

????????信息融合:位置和語義自然融合

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

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

相關文章

監控升級:可視化如何讓每一個細節 “說話”

你有沒有遇到過這樣的情況&#xff1f; 監控畫面里明明有“異常”&#xff0c;但值班人員愣是沒發現&#xff1b; 報警響起卻不知道具體發生了什么&#xff0c;只能靠猜、靠翻錄像&#xff1b; 出了事回看錄像&#xff0c;才發現線索早就在眼前&#xff0c;只是沒人注意到………

單片機bootloader(APP的自我復制)

文章目錄 Bootloader 中 APP 的自我復制與啟動機制解析一、為什么要進行自我復制?二、程序整體結構概述三、匯編啟動代碼分析重點解釋:四、C 語言部分分析核心功能:五、start\_app 函數:手動啟動指定 APP六、總結七、適用場景Bootloader 中 APP 的自我復制與啟動機制解析 …

瀏覽器工作原理11 [#] this:從JavaScript執行上下文視角講this

引用 《瀏覽器工作原理與實踐》 在上篇文章中&#xff0c;我們講了詞法作用域、作用域鏈以及閉包&#xff0c;并在最后思考題中留了下面這樣一段代碼 var bar {myName:"time.geekbang.com",printName: function () {console.log(myName)} } function foo() {le…

【C語言】-遞歸

1、遞歸概念 遞歸&#xff08;Recursion&#xff09;是編程中一種重要的解決問題的方法&#xff0c;其核心思想是函數通過調用自身來解決規模更小的子問題&#xff0c;直到達到最小的、可以直接解決的基準情形&#xff08;Base Case&#xff09;。 核心&#xff1a;自己調用…

12.5Swing控件3Jpanel JOptionPane

JPanel JPanel是一個輕量級容器組件&#xff0c;用于組織和管理其他 GUI 組件。它繼承自JComponent類&#xff0c;屬于javax.swing包&#xff0c;可以容納按鈕、文本框、標簽等控件 JPanel 默認使用的布局管理器是 FlowLayout&#xff0c;也可以嵌套其他面板&#xff0c;以便…

MIPI信號為什么不能進行長距離傳輸

1.關于MIPI信號傳輸 MIPI信號是不適合長距離傳輸的。 2.MIPI的信號擺幅小&#xff0c;抗干擾能力比較弱 MIPI信號的差分擺幅比較小&#xff0c;通常只有100mV~200mV,遠遠低于LVDS的350mV的擺幅 小擺幅信號在長線纜上傳輸的時候更容易被噪聲淹沒&#xff0c;信噪比下降&#xf…

Qt的學習(二)

1. 創建Hello Word 兩種方式&#xff0c;實現helloworld&#xff1a; 1.通過圖形化的方式&#xff0c;在界面上創建出一個控件&#xff0c;顯示helloworld 2.通過純代碼的方式&#xff0c;通過編寫代碼&#xff0c;在界面上創建控件&#xff0c; 顯示hello world&#xff1b; …

Windows11+VS2019配置Libigl-2.4.1

Windows11VS2019配置Libigl-2.4.1 由于課題需要&#xff0c;所以出一篇配置Libigl的博客&#xff0c;制作不易&#xff0c;請多多點贊 一、官網下載 官網&#xff1a;https://libigl.github.io/ GitHub下載地址&#xff1a;https://github.com/libigl/libigl 這里我們選擇…

地球科學方向(Geoscience and Remote Sensing),1天見刊,當月可檢索!

CSP科學出版社&#xff0c;旨在通過為研究人員提供最佳環境來發表、參考、閱讀和引用他們的作品&#xff0c;從而為科學界服務。現已與科檢易學術達成出版戰略合作&#xff0c;現在聯合共同出版高質量學術水平的期刊&#xff0c;為方便廣大科研學者投稿方便&#xff0c;現已經建…

基于 Three.js 的 3D 模型快照生成方案

基于 Three.js 的 3D 模型快照生成方案 此方案通過 Three.js 渲染場景并異步生成圖像數據&#xff0c;同時支持分辨率縮放和 Blob 格式輸出&#xff0c;為模型預覽、截圖保存等需求提供完整解決方案。 問題分析&#xff1a; 使用html2canvas 生成的快照畫布顯示為空&#xff…

「Java基本語法」變量的使用

變量定義 變量是程序中存儲數據的容器&#xff0c;用于保存可變的數據值。在Java中&#xff0c;變量必須先聲明后使用&#xff0c;聲明時需指定變量的數據類型和變量名。 語法 數據類型 變量名 [ 初始值]; 示例&#xff1a;聲明與初始化 public class VariableDemo {publi…

SpringCloud學習筆記-2

說明&#xff1a;來源于網絡&#xff0c;如有侵權請聯系我刪除 1.提問&#xff1a;如果注冊中心宕機&#xff0c;遠程調用還能成功嗎 答&#xff1a;當微服務發起請求時&#xff0c;會向注冊中心請求所有的微服務地址&#xff0c;然后在向指定的微服務地址發起請求。在設計實…

Hac - NBh標準JSON協議使用說明文檔

Hac - NBh 標準 JSON 協議使用說明文檔 一、協議概述 Hac - NBh 標準 JSON 協議是專為物聯網設備與服務器數據交互設計的通信協議。以 JSON 格式為基礎,采用鍵值對(KV 值)組織數據,支持靈活選取數據項,通過 CBOR 格式實現高效傳輸,并利用 AES 128 加密保障數據安全。 …

k8s從入門到放棄之Service負載均衡

k8s從入門到放棄之Service負載均衡 在 Kubernetes (K8s) 中&#xff0c;Service 是一種抽象&#xff0c;它定義了一組邏輯上的 Pod 和訪問它們的策略。Service 的主要目的是提供一種可靠的方式來訪問一組具有相同標簽&#xff08;Label&#xff09;的 Pod&#xff0c;即使這些…

【題解-洛谷】P10480 可達性統計

題目&#xff1a;P10480 可達性統計 題目描述 給定一張 N N N 個點 M M M 條邊的有向無環圖&#xff0c;分別統計從每個點出發能夠到達的點的數量。 輸入格式 第一行兩個整數 N , M N,M N,M&#xff0c;接下來 M M M 行每行兩個整數 x , y x,y x,y&#xff0c;表示從 …

SpringCloud2025+SpringBoot3.5.0+gateway+webflux子服務路由報503

文章目錄 前言一、問題二、原因1.分析2.配置靜態路由再試3.定位 總結 前言 本來昨天就應該也記錄下&#xff0c;免得忘記的&#xff0c;但是有點晚了&#xff0c;酒沒寫&#xff0c;真的是被坑慘了。 當然這也是追求最新的代價&#xff0c;也是對新技術、老知識點的重溫…

破解路內監管盲區:免布線低位視頻樁重塑停車管理新標準

城市路內停車管理常因行道樹遮擋、高位設備盲區等問題&#xff0c;導致車牌識別率低、逃費率高&#xff0c;傳統模式在復雜路段束手無策。免布線低位視頻樁憑借超低視角部署與智能算法&#xff0c;正成為破局關鍵。該設備安裝于車位側方0.5-0.7米高度&#xff0c;直接規避樹枝遮…

RAG 文檔解析難點1:多欄布局的 PDF 如何解析

寫在前面 在構建檢索增強生成 (Retrieval-Augmented Generation, RAG) 應用時,高質量的數據源是成功的基石。PDF 作為一種廣泛使用的文檔格式,承載著海量的知識。然而,許多 PDF 文檔,特別是學術論文、期刊、雜志和一些報告,都采用了多欄布局 (multi-column layout)。 直…

全面掌握Pandas時間序列處理:從基礎到實戰

時間序列數據在金融分析、物聯網、商業智能等領域無處不在。作為Python數據分析的核心庫&#xff0c;Pandas提供了強大而全面的時間序列處理功能。本文將系統介紹Pandas時間序列處理的各個方面&#xff0c;從基礎概念到高級應用&#xff0c;幫助您在實際工作中高效處理時間序列…

vscode 離線安裝第三方庫跳轉庫

我安裝的是C/C的函數跳轉 下載的離線庫&#xff1a; 項目首頁 - vscode代碼自動補全跳轉插件離線安裝包:cpptools-win32.vsix是一款專為VSCode設計的離線安裝插件&#xff0c;特別適合無法連接網絡的電腦環境。通過安裝此插件&#xff0c;您的VSCode將獲得強大的代碼自動跳轉…