《從零構建大語言模型》學習筆記2,文本數據處理1(以及tiktoken庫無法下載gpt2參數,調用get_encoding時SSL超時的解決方法)

《從零構建大語言模型》學習筆記2,文本數據處理1

文章目錄

  • 《從零構建大語言模型》學習筆記2,文本數據處理1
    • 前言
    • 1、分詞
    • 2.將把提取出來的詞元轉換為數字ID
    • 3.添加特殊上下文標記
    • 4. 字節對編碼(以及tiktoken庫無法下載gpt2參數,調用get_encoding時SSL超時的解決方法)


前言

本書原項目地址:https://github.com/rasbt/LLMs-from-scratch
接下來就開始學習代碼了,在訓練我們的LLM模型之前,我們先要準備好學習的文本數據,所以第一步是把文本轉成計算機能運算的向量,這個過程也叫做embedding,如果有自己部署過開源大模型的小伙伴,就會知道除了要下載大預言模型,在這之前還有個embedding模型,我個人理解應該就是這個過程。其實就是建立一個把所有的文字或者詞句映射成方便計算機運算的一些向量庫。

這里就引用原作者的圖片來介紹了

當然不止是文本數據有這個過程,音視頻和圖片文件都有這個過程。
當然embedding 需要收集龐大的數據來構造,我們自己收集是比較麻煩的,所以我們后面會用開源的gpt2來進行映射。
有了這個向量庫之后,我們需要對我們自己的語料進行轉換,把普通的文字根據向量庫轉成數字。所有第一步要把我們的語料進行分詞,把一整句完整的句子拆分為單個的單詞和符號。

1、分詞

這一步前面的代碼還是比較好理解的,原作者用來一本小說的所有文字舉例來說明如何簡單的對語料進行分詞。關于代碼我就貼一些關鍵代碼進行解讀。
下面我就貼代碼了

with open("the-verdict.txt", "r", encoding="utf-8") as f:raw_text = f.read() ##讀入文件按照utf-8
print("Total number of character:", len(raw_text))##先輸出總長度
print(raw_text[:99])##輸出前一百個內容
preprocessed = re.split(r'([,.:;?_!"()\']|--|\s)', raw_text) ##按照符號繼續把原文件給分割了
preprocessed = [item.strip() for item in preprocessed if item.strip()]##去掉兩端的空白字符 也是去掉了空字符串和僅包含空白字符的項
print(preprocessed[:30])

以上代碼是為了把小說中的所有詞語和標點符號拆分為一個列表,后續好進行處理和索引。主要用的正則表達式來進行拆分。


2.將把提取出來的詞元轉換為數字ID

上一步提取出來的詞元列表,我們去重后編排一個數字ID列表,過程如下圖:

代碼如下:

all_words = sorted(set(preprocessed))#從去掉重復的字符
vocab_size = len(all_words)#計總的單詞書print(vocab_size)
print(all_words[:50])vocab = {token:integer for integer,token in enumerate(all_words)}##先把word進行編號,再按照單詞或者標點為索引(有HashList那味道了)class SimpleTokenizerV1:#一個實例的名字創立def __init__(self, vocab): ## 初始化一個字符串self.str_to_int = vocab #單詞到整數的映射self.int_to_str = {i:s for s,i in vocab.items()} #方便解碼,進行整數到詞匯的反向映射def encode(self, text):preprocessed = re.split(r'([,.:;?_!"()\']|--|\s)', text)##正則化分詞標點符號preprocessed = [item.strip() for item in preprocessed if item.strip()## 去掉兩端空格與全部的空句]ids = [self.str_to_int[s] for s in preprocessed]##整理完的額字符串列表對應到id,從字典出來return idsdef decode(self, ids):text = " ".join([self.int_to_str[i] for i in ids]) #映射整數id到字符串。join是用前面那個(“ ”)聯結成一個完整的字符串# Replace spaces before the specified punctuationstext = re.sub(r'\s+([,.?!"()\'])', r'\1', text) #使用正則表達式,去除標點符號前的多余空格# \s+匹配一個或者多個空白  \1 替換到匹配return texttokenizer = SimpleTokenizerV1(vocab) #用vocab創造一個實例
text = """"It's the last he painted, you know," Mrs. Gisburn said with pardonable pride."""
ids = tokenizer.encode(text) #按照這個例子里的encode函數處理text
print(ids)

all_words 是詞元去重排序后的一個字典。然后定義了一個SimpleTokenizerV1類,這個類里面定義了兩個函數,一個encode函數能把任意段話轉為數字ID列表,decode函數能把數字ID列表解碼為對應的文字段落。


3.添加特殊上下文標記

上面的SimpleTokenizerV1類還有些缺陷,就是all_words這個字典太小了,可能會有很多沒有收錄的詞語,這時候就要對SimpleTokenizerV1類進行改進了,通過判斷來添加"<|endoftext|>", “<|unk|>” 這兩個標簽,一個是段落結束標志,一個是沒有對應詞元時的標志。


代碼如下:

class SimpleTokenizerV2:##版本2.0,啟動!def __init__(self, vocab):self.str_to_int = vocabself.int_to_str = { i:s for s,i in vocab.items()}#s為單詞,i是keydef encode(self, text):preprocessed = re.split(r'([,.:;?_!"()\']|--|\s)', text)#正則化按照標點分類preprocessed = [item.strip() for item in preprocessed if item.strip()]#去掉兩頭與所有空余句preprocessed = [item if item in self.str_to_int else "<|unk|>" for item in preprocessed#遍歷 preprocessed 中的每個 item,如果 item 存在于 self.str_to_int(即詞匯表)中,就保留 item#如果不存在(即該單詞或符號未定義在詞匯表中),就替換為特殊標記 <|unk|>。#拓展:推導式(如列表推導式)是一種緊湊的語法,專門用于生成新列表(或其他容器)#與普通 for 循環相比,它更加簡潔和高效,但邏輯復雜時可能會降低可讀性。]ids = [self.str_to_int[s] for s in preprocessed]#單詞或標點映射為整數列表return idsdef decode(self, ids):text = " ".join([self.int_to_str[i] for i in ids])# Replace spaces before the specified punctuationstext = re.sub(r'\s+([,.:;?!"()\'])', r'\1', text)return texttokenizer = SimpleTokenizerV2(vocab)text1 = "Hello, do you like tea?"
text2 = "In the sunlit terraces of the palace."text = " <|endoftext|> ".join((text1, text2))#用句子分隔符鏈接兩個句子print(text) #跟第一個一樣,但不會報錯了
tokenizer.decode(tokenizer.encode(text))

主要是編碼的時候做了一次未知詞元的判斷

4. 字節對編碼(以及tiktoken庫無法下載gpt2參數,調用get_encoding時SSL超時的解決方法)

以上提到的分詞方式是比較簡單的,主要是方便大家理解。接下來使用一種基于字節對編碼(BPE)概念的更復雜的分詞方案。BPE分詞器被用于訓練諸如GPT-2、GPT-3以及ChatGPT最初使用的模型等大型語言模型。那具體怎么實現的我這里也不深究了,我們直接拿過來用就好,下面需要使用到tiktoken這個庫。

import importlib
import tiktoken
print("tiktoken version:", importlib.metadata.version("tiktoken"))#驗證下載并輸出版本信息
tokenizer = tiktoken.get_encoding("gpt2")#初始化GPT2!

到這里需要注意一下,因為這里需要下載gpt2的參數,但是大部分人的網絡應該下載不下來,根據錯誤提示可以手動下載vocab.bpe和encoder.json這兩個文件,下載后在當前路徑創建一個文件夾 .tiktoken,把文件放在這里面。然后還需要把緩存路徑設置為該路徑,同時手動修改vocab.bpe文件名為6d1cbeee0f20b3d9449abfede4726ed8212e3aee,修改encoder.json文件名為6c7ea1a7e38e3a7f062df639a5b80947f075ffe6。
vocab.bpe下載地址:https://openaipublic.blob.core.windows.net/gpt-2/encodings/main/vocab.bpe
encoder.json下載地址:https://openaipublic.blob.core.windows.net/gpt-2/encodings/main/encoder.json
修改后的代碼如下:

import importlib
import tiktoken
print("tiktoken version:", importlib.metadata.version("tiktoken"))#驗證下載并輸出版本信息import hashlib
blobpath = "https://openaipublic.blob.core.windows.net/gpt-2/encodings/main/vocab.bpe"
vocab_key = hashlib.sha1(blobpath.encode()).hexdigest()
print(vocab_key)
blobpath = "https://openaipublic.blob.core.windows.net/gpt-2/encodings/main/encoder.json"
encoder_key = hashlib.sha1(blobpath.encode()).hexdigest()
print(encoder_key)import os
tiktoken_cache_dir = ".tiktoken"
os.environ["TIKTOKEN_CACHE_DIR"] = tiktoken_cache_dir
# validate
assert os.path.exists(os.path.join(tiktoken_cache_dir, vocab_key))
assert os.path.exists(os.path.join(tiktoken_cache_dir, encoder_key))tokenizer = tiktoken.get_encoding("gpt2")#初始化GPT2!

完整的解決思路可以參考下面兩個鏈接:
how to use tiktoken in offline mode computer
SSLError: HTTPSConnectionPool(host=‘openaipublic.blob.core.windows.net’, port=443)

后面的代碼就是使用gpt2的參數對本地語料進行加解碼了。

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

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

相關文章

【AI工具】解放雙手,操控瀏覽器的工具對比,來了

&#x1f4d2;前言在github上面&#xff0c;有幾個操作瀏覽器的mcp工具&#xff1a;browser-use / browser-usemicrosoft / playwright-mcpAgentDeskAI / browser-tools-mcphangwin / mcp-chrome想知道他們的區別嗎&#xff0c;想知道那個更適合你嗎&#xff0c;想。。。&#…

Linux 操作系統基礎知識總結

1、操作系統總體介紹 CPU&#xff1a; 就像人的大腦&#xff0c;主要負責相關事情的判斷以及實際處理的機制。 查詢指令&#xff1a; cat /proc/cpuinfo 內存&#xff1a; 大腦中的記憶區塊&#xff0c;將皮膚、眼睛等所收集到的信息記錄起來的地方&#xff0c;以供CPU進行判斷…

cudagraph 本質詳解

理解 CUDA Graph 的本質,關鍵在于理解它解決了什么問題,以及它通過什么機制來解決這個問題。 一、 核心問題:傳統 CUDA 編程的“CPU 瓶頸” 在 CUDA Graph 出現之前,我們通常使用 CUDA Stream 來向 GPU 提交任務。這是一個動態的過程: CPU 作為指揮官:CPU 循環地、逐條…

Spring MVC 父子容器深度解析:原理、實戰與優化

1. 父子容器的定義與設計初衷一句話總結&#xff1a;父子容器的核心價值在于解耦 Web 層與業務層&#xff0c;實現職責分離與上下文隔離。1.1 父子容器的層次關系在 Spring MVC 中&#xff0c;容器分為兩類&#xff1a;父容器&#xff08;Root ApplicationContext&#xff09;&…

AI賦能SEO關鍵詞優化策略

內容概要 人工智能&#xff08;AI&#xff09;技術正深刻改變著搜索引擎優化&#xff08;SEO&#xff09;的實踐方式&#xff0c;尤其在關鍵詞研究這一核心領域帶來了革命性的影響。本文聚焦于AI如何賦能SEO關鍵詞優化策略&#xff0c;系統性地探討其核心價值與應用路徑。我們將…

虛擬機Ubuntu圖形化界面root用戶登錄錯誤

當在 Ubuntu 圖形界面登錄 root 用戶出現錯誤無法進入時 1. 檢查 PAM 配置文件 PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插拔認證模塊&#xff09;負責管理用戶認證相關的策略。圖形登錄界面的 PAM 配置文件通常是 /etc/pam.d/gdm-password 。以管理員權…

【雜談】-逆縮放悖論:為何更多思考會讓AI變“笨“?

逆縮放悖論&#xff1a;為何更多思考會讓AI變"笨"&#xff1f; 文章目錄逆縮放悖論&#xff1a;為何更多思考會讓AI變"笨"&#xff1f;1、解碼逆縮放現象2、AI 推理失效的五大癥結3、AI 推理應對復雜度的策略圖譜4、人工智能評估體系的反思5、人工智能推理…

強制用戶更改WordPress密碼的重要性及實現方法

確保 WordPress 網站的安全性是每位網站管理者的重要任務。在網絡安全日益受到關注的今天&#xff0c;為用戶提供安全、穩定的網絡環境至關重要。而一個有效的方法就是強制用戶定期更改密碼。這篇文章將介紹為什么要強制用戶更改密碼以及如何在 WordPress 中實現這一功能。同時…

計算機基礎速通--數據結構·串的應用

如有問題大概率是我的理解比較片面&#xff0c;歡迎評論區或者私信指正。 友友們&#xff0c;我遇到了一個大問題&#xff0c;技術類的英文面&#xff08;ai應用開發/java后端偏金融方向&#xff09;該如何準備&#xff1f;本人英語就過了個六級&#xff0c;腦闊疼額。友友們有…

05--STL認識(了解)

1. STL概念——標準模板庫 STL(standard template libaray-標準模板庫)&#xff1a;是C標準庫的重要組成部分&#xff0c;不僅是一個可復用的組件庫&#xff0c;而且是一個包羅數據結構與算法的軟件框架。 STL與CPP標準庫的關系&#xff1a; 2. STL的版本 3. STL的組成 4. STL…

VBA經典應用69例應用9:ReDim語句的語法

《VBA經典應用69例》&#xff08;版權10178981&#xff09;&#xff0c;是我推出的第九套教程&#xff0c;教程是專門針對初級、中級學員在學習VBA過程中可能遇到的案例展開&#xff0c;這套教程案例眾多&#xff0c;緊貼“實戰”&#xff0c;并做“戰術總結”&#xff0c;以便…

連鎖店管理系統的庫存跟蹤功能:數字化轉型下的零售運營核心

在連鎖零售行業&#xff0c;庫存管理的效率直接決定著運營成敗。傳統人工庫存管理模式早已難以應對全渠道銷售時代的復雜需求&#xff0c;而連鎖店管理系統的庫存跟蹤功能&#xff0c;正成為解決庫存難題、提升客戶體驗的關鍵武器。本文將深入解析施易德&#xff08;cegid&…

Nestjs框架: 接口安全與響應脫敏實踐 --- 從攔截器到自定義序列化裝飾器

接口安全問題&#xff1a;敏感數據脫敏的必要性 在用戶注冊成功后&#xff0c;若直接將用戶數據&#xff08;如密碼、ID 等&#xff09;返回給前端&#xff0c;存在嚴重的安全風險 為此&#xff0c;需要在接口響應前對數據進行脫敏處理 關鍵點&#xff1a; 敏感字段&#xff…

Python包與虛擬環境工具全景對比:從virtualenv到uv的演進

Python 的開發環境管理一直是綜合性的工程問題。隨著工具和規范的不斷進化&#xff0c;我們看到了從 virtualenv / pip 開始&#xff0c;到 pipenv 和 poetry 的環境一體化&#xff0c;再到 uv 和 hatch 這樣的一體化、高性能新生代工具。 本文將對比這些工具的特點、優勢和選型…

期貨和期權對沖后能盈利嗎?

本文主要介紹期貨和期權對沖后能盈利嗎&#xff1f;期貨和期權作為金融衍生品的兩大核心工具&#xff0c;其組合對沖策略的盈利性取決于市場走勢、策略設計、成本管控及風險對沖效果。對沖的本質是降低風險&#xff0c;但通過合理設計&#xff0c;部分策略可在對沖風險的同時創…

【其他分類】Showrunner AI版的Netflix 互動故事創作平臺 進行動畫生成與微調、角色場景創建

Showrunner是一個AI 驅動的角色場景動畫。視覺風格較為統一&#xff0c;偏向 3D Q 版卡通風格&#xff0c;支持語音對白修改、鏡頭相機切換、動畫角色和場景設置等功能。 論文原文中文翻譯官方地址pdf版 、網頁版pdf版https://www.showrunner.xyz/ 當前的2D 動畫軟件&#xff…

K8s 常見故障案例分析

#作者&#xff1a;程宏斌 文章目錄一、節點故障&#xff08;一&#xff09;節點 NotReady 狀態排查步驟解決方案二、Pod 故障&#xff08;一&#xff09;Pod 一直處于 Pending 狀態排查步驟解決方案&#xff08;二&#xff09;Pod 頻繁重啟故障現象排查步驟解決方案三、控制器故…

半精度權重 及 Phi-3線性層的權重分布

半精度權重 我們可以使用張量的 to() 方法以及適當的類型 torch.float16,將權重轉換為 FP16: torch.manual_seed(11) weights = torch.randn(1000) * .07 weights.min(),

Linux怎么安裝Docker?環境怎么搭建?步驟是什么?如何配置?有哪些注意事項?出現問題怎么排除?

一、Docker簡介與環境準備 1.1 什么是Docker Docker是一個開源的容器化平臺&#xff0c;它使用Linux內核的cgroup&#xff0c;namespace以及OverlayFS類的UnionFS等技術&#xff0c;對進程進行封裝隔離&#xff0c;屬于操作系統層面的虛擬化技術。Docker能夠自動執行重復性任務…

apiSQL網關調優:釋放單節點的最大潛能

前言 在構建高性能、高可用的API服務時&#xff0c;apiSQL 提供了強大的集群部署模式&#xff0c;通過橫向擴展來分散負載、提高吞吐量。然而&#xff0c;在某些場景下&#xff0c;我們同樣需要關注并最大化單個節點的處理能力。當單個 apiSQL 網關節點需要處理高并發請求或承載…