BERT代碼簡單筆記

?參考視頻:BERT代碼(源碼)從零解讀【Pytorch-手把手教你從零實現一個BERT源碼模型】_嗶哩嗶哩_bilibili


一、BertTokenizer

BertTokenizer 是基于 WordPiece 算法的 BERT 分詞器,繼承自 PreTrainedTokenizer。

繼承的PretrainedTokenizer,具體操作的實現是在PretrainedTokenizer中的__call__執行。

1. 初始化 __init__

  • 加載詞匯表文件
  • 創建 token 到 ID 的映射
  • 初始化基礎分詞器和 WordPiece 分詞器
# 加載詞匯表
self.vocab = load_vocab(vocab_file)
# 創建反向映射 (ID -> token)
self.ids_to_tokens = collections.OrderedDict([(ids, tok) for tok, ids in self.vocab.items()])# 初始化兩個分詞器
if do_basic_tokenize:self.basic_tokenizer = BasicTokenizer(...)  # 基礎分詞
self.wordpiece_tokenizer = WordpieceTokenizer(...)  # WordPiece分詞

?

1.1 加載詞匯

Vocabvocabulary(詞匯表)的縮寫,指的是模型能夠理解和處理的所有詞匯的集合。

有不同類型的vocab:

?

在BERT中,有幾個特殊token:

special_tokens = {"[PAD]": "填充短序列","[UNK]": "未知詞匯","[CLS]": "分類任務的開始符","[SEP]": "句子分隔符","[MASK]": "掩碼語言模型的掩碼符"
}
1.2 BasicTokenizer 基礎分詞

BasicTokenizer 負責將原始文本轉換為基礎的 token 序列。

主要參數:

def __init__(self,do_lower_case=True,        # 是否轉換為小寫never_split=None,          # 永不分割的詞匯集合tokenize_chinese_chars=True, # 是否處理中文字符strip_accents=None,        # 是否去除重音符號do_split_on_punc=True,     # 是否在標點符號處分割
):

主要分詞方法:

1. 清理文本:清除無效字符和空白字符

2. 處理中文字符(在字符周圍添加空格)

3. unicode 標準化

Unicode 標準化有四種形式:NFC,NFKC,NFD,NFKD:

unicode_normalized_text = unicodedata.normalize("NFC", text)

NFC:規范分解后再組合,將字符分解后重新組合成最緊湊的形式;

NFD:規范分解,將組合字符分解為基礎字符 + 組合標記;

NFKC:兼容性分解后再組合,更激進的標準化,會轉換兼容性字符;

NFKD:兼容性分解,最徹底的分解形式。

4. 按空格分割成token

5. 對分割后的token做小寫化和去重音

6. 再通過標點分割

def tokenize(self, text, never_split=None):# 處理流程:# 1. 清理文本text = self._clean_text(text)# 2. 處理中文字符(在字符周圍添加空格)if self.tokenize_chinese_chars:text = self._tokenize_chinese_chars(text)# 3. Unicode 標準化unicode_normalized_text = unicodedata.normalize("NFC", text)# 4. 按空格分割orig_tokens = whitespace_tokenize(unicode_normalized_text)# 5. 處理每個 tokensplit_tokens = []for token in orig_tokens:if token not in never_split:# 小寫化和去重音if self.do_lower_case:token = token.lower()if self.strip_accents is not False:token = self._run_strip_accents(token)elif self.strip_accents:token = self._run_strip_accents(token)# 6. 標點符號分割split_tokens.extend(self._run_split_on_punc(token, never_split))# 7. 最終清理output_tokens = whitespace_tokenize(" ".join(split_tokens))return output_tokens
?1.3 WordPiece子詞分詞

WordPiece 是一種子詞分詞算法,它將單詞分解為更小的、有意義的片段,以解決:

  • 詞匯表大小限制
  • 未登錄詞(OOV)問題
  • 詞匯的組合性表示

主要參數:

def __init__(self, vocab, unk_token, max_input_chars_per_word=100):self.vocab = vocab                          # 詞匯表(字典)self.unk_token = unk_token                  # 未知詞標記,通常是 "[UNK]"self.max_input_chars_per_word = 100         # 單詞最大字符數限制

核心算法:最長貪心匹配

def tokenize(self, text):output_tokens = []# 1. 按空格分割文本(假設已經過 BasicTokenizer 處理)for token in whitespace_tokenize(text):chars = list(token)# 2. 檢查單詞長度限制if len(chars) > self.max_input_chars_per_word:output_tokens.append(self.unk_token)continue# 3. 執行 WordPiece 分詞is_bad = Falsestart = 0sub_tokens = []while start < len(chars):end = len(chars)cur_substr = None# 4. 貪心最長匹配while start < end:substr = "".join(chars[start:end])# 5. 非首個子詞添加 "##" 前綴if start > 0:substr = "##" + substr# 6. 檢查是否在詞匯表中if substr in self.vocab:cur_substr = substrbreakend -= 1# 7. 如果沒找到匹配,標記為失敗if cur_substr is None:is_bad = Truebreaksub_tokens.append(cur_substr)start = end# 8. 根據結果添加到輸出if is_bad:output_tokens.append(self.unk_token)else:output_tokens.extend(sub_tokens)return output_tokens

2. 核心分詞方法 tokenize

分兩種情況,第一種do_basic_tokenize: 先基礎分詞在wordpiece;第二種直接wordpiece。

3. Token與ID轉換

def _convert_token_to_id(self, token):"""Token -> ID"""return self.vocab.get(token, self.vocab.get(self.unk_token))def _convert_id_to_token(self, index):"""ID -> Token"""return self.ids_to_tokens.get(index, self.unk_token)

?4. 特殊Token處理

def build_inputs_with_special_tokens(self, token_ids_0, token_ids_1=None):"""構建BERT輸入格式"""if token_ids_1 is None:# 單句:[CLS] X [SEP]return [self.cls_token_id] + token_ids_0 + [self.sep_token_id]else:# 句對:[CLS] A [SEP] B [SEP]cls = [self.cls_token_id]sep = [self.sep_token_id]return cls + token_ids_0 + sep + token_ids_1 + sep

5. 特殊Token掩碼

def get_special_tokens_mask(self, token_ids_0, token_ids_1=None, already_has_special_tokens=False):"""生成特殊token掩碼:1表示特殊token,0表示普通token"""if token_ids_1 is not None:# 句對:[1] + [0]*len(A) + [1] + [0]*len(B) + [1]return [1] + ([0] * len(token_ids_0)) + [1] + ([0] * len(token_ids_1)) + [1]# 單句:[1] + [0]*len(X) + [1]return [1] + ([0] * len(token_ids_0)) + [1]

二、DataFrame

Parquet文件

是一種列式存儲文件格式,專為大數據分析和處理設計。

?dfs 從數據集的單個文件讀取內容;

df concat合并dfs讀取到的兩個文件內容;

三、Dataset

?

dataset.map()流程

?

set_format()

作用
指定數據集返回的數據格式為 PyTorch 張量(torch.Tensor),并篩選需要保留的列(如 input_idsattention_mask

關鍵參數

  • type:目標格式(支持 "torch""numpy""pandas" 等)。

  • columns:保留的字段列表(其他字段將被隱藏,但不會刪除)。

  • output_all_columns:若為 True,即使未在 columns 中指定,也會保留所有字段(默認為 False)。

為什么要這一步:

(1) 適配 PyTorch 訓練

  • PyTorch 的 DataLoader 和模型輸入要求張量格式,直接使用 NumPy/列表會報錯。

  • 自動轉換省去手動調用 torch.tensor() 的麻煩。

(2) 減少內存占用

  • 隱藏不需要的字段(如未使用的 token_type_ids),避免數據加載時的冗余傳輸。

(3) 靈活性

  • 可隨時切換格式(例如從 "torch" 改為 "numpy")或重置為默認狀態:

# 重置為原始格式(Arrow)
tokenized_dataset.reset_format()

?DataCollatorForLanguageModeling

DataCollatorForLanguageModeling 是 HuggingFace Transformers 庫中專門為語言模型(如 BERT)訓練設計的數據整理器,主要用于 動態生成掩碼語言模型(MLM)任務所需的輸入

核心功能

(1) 動態掩碼(Dynamic Masking)

mlm=True:啟用掩碼語言模型任務,隨機遮蓋輸入 Token(如 BERT 的預訓練方式)。

mlm_probability=0.15:每個 Token 有 15% 的概率被遮蓋(原始 BERT 論文的設置)。

其中:

????????80% 替換為 [MASK](如 "hello" → "[MASK]"

????????10% 替換為隨機 Token(如 "hello" → "apple"

????????10% 保持原 Token(如 "hello" → "hello"

(2) 批量填充(Padding)

自動將一批樣本填充到相同長度(根據 tokenizer.pad_token_id)。

生成 attention_mask 標記有效 Token。

(3) 標簽生成(Labels)

自動生成與 input_ids 長度相同的 labels,其中:

被遮蓋的 Token 位置:標注原始 Token ID(用于計算損失)。

未被遮蓋的位置:標注為 -100(PyTorch 中忽略損失計算)。

?默認都是-100,在損失計算中設置忽略labels=-100的位置:

為什么需要DataCollatorForLanguageModeling

?關鍵參數:

def __init__(self,tokenizer,                # 必須傳入的分詞器實例mlm=True,                 # 是否啟用MLM任務mlm_probability=0.15,     # 單Token被掩碼的概率mask_replace_prob=0.8,    # 掩碼Token替換為[MASK]的比例random_replace_prob=0.1,  # 掩碼Token替換為隨機詞的比例pad_to_multiple_of=None,  # 填充長度對齊(如8的倍數優化GPU顯存)return_tensors="pt",      # 輸出格式(pt/tf/np)seed=None                 # 隨機種子
):

?

訓練

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

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

相關文章

PID控制算法理論學習基礎——單級PID控制

這是一篇我在學習PID控制算法的過程中的學習記錄。在一開始學習PID的時候&#xff0c;我也看了市面上許多的資料&#xff0c;好的資料固然有&#xff0c;但是更多的是不知所云。&#xff08;有的是寫的太過深奧&#xff0c;有的則是照搬挪用&#xff0c;對原理則一問三不知&…

【Elasticsearch】function_score與rescore

它們倆都是用來“**干涉評分**”的&#xff0c;但**工作階段不同、性能開銷不同、能做的事也不同**。一句話總結&#xff1a;> **function_score** 在 **第一次算分** 時就動手腳&#xff1b; > **rescore** 在 **拿到 Top-N 結果后** 再“重新打分”。下面把“能干嘛”…

無廣告純凈體驗 WPS2016 精簡版:移除聯網模塊 + 非核心組件,古董電腦也能跑

各位辦公小能手們&#xff01;今天給你們介紹一款超神的辦公軟件——WPS2016精簡版&#xff01;它有多小呢&#xff1f;才33MB&#xff0c;簡直就是軟件界的小不點兒&#xff01;別看它個頭小&#xff0c;功能可一點兒都不含糊&#xff0c;文字、表格、演示這三大功能它全都有。…

《PyWin32:Python與Windows的橋梁,解鎖系統自動化新姿勢》

什么是 PyWin32在 Windows 平臺的 Python 開發領域中&#xff0c;PyWin32 是一個舉足輕重的庫&#xff0c;它為 Python 開發者打開了一扇直接通往 Windows 操作系統底層功能的大門。簡單來說&#xff0c;PyWin32 是用于 Python 訪問 Windows API&#xff08;Application Progra…

vite如何生成gzip,并在服務器上如何設置開啟

1. 安裝插件npm install vite-plugin-compression -D2. 在 vite.config.ts 中配置TypeScriptimport { defineConfig } from vite import compression from vite-plugin-compressionexport default defineConfig({plugins: [compression({algorithm: gzip,ext: .gz,threshold: 1…

1068萬預算!中國足協大模型項目招標,用AI技術驅動足球革命

中國足協啟動國際足聯“前進計劃”下的大數據模型項目&#xff0c;預算1068萬元。該項目將建立足球大數據分析平臺&#xff0c;利用AI技術為國家隊、青少年足球、業余球員及教練員裁判員提供精準數據分析服務&#xff0c;旨在通過科技手段提升中國足球競技水平。 中國足球迎來數…

AI產品經理面試寶典第12天:AI產品經理的思維與轉型路徑面試題與答法

多樣化思維:如何跳出單一框架解題? 面試官:AI產品常面臨復雜場景,請舉例說明你如何運用多樣化思維解決問題? 你的回答:我會從三個維度展開:多角度拆解需求本質,多層級融合思維模式,多變量尋找最優解。比如設計兒童教育機器人時,不僅考慮功能實現(技術層),還融入情…

vscode.window對象講解

一、vscode.window 核心架構圖 #mermaid-svg-fyCxPz1vVhkf96nE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fyCxPz1vVhkf96nE .error-icon{fill:#552222;}#mermaid-svg-fyCxPz1vVhkf96nE .error-text{fill:#5522…

為什么一個 @Transactional 注解就能開啟事務?揭秘 Spring AOP 的底層魔法

你是否也曾深陷在各種“額外”邏輯的泥潭&#xff0c;為了給一個核心業務方法增加日志、權限校驗或緩存&#xff0c;而不得不將這些非核心代碼硬塞進業務類中&#xff0c;導致代碼臃腫、職責不清&#xff1f;是時候用代理設計模式 (Proxy Design Pattern) 來解脫了&#xff01;…

《Spring 中上下文傳遞的那些事兒》Part 8:構建統一上下文框架設計與實現(實戰篇)

&#x1f4dd; Part 8&#xff1a;構建統一上下文框架設計與實現&#xff08;實戰篇&#xff09; 在實際項目中&#xff0c;我們往往需要處理多種上下文來源&#xff0c;例如&#xff1a; Web 請求上下文&#xff08;RequestContextHolder&#xff09;日志追蹤上下文&#xf…

配置驅動開發:初探零代碼構建嵌入式軟件配置工具

前言在嵌入式軟件開發中&#xff0c;硬件初始化與寄存器配置長期依賴人工編寫重復代碼。以STM32外設初始化為例&#xff0c;開發者需手動完成時鐘使能、引腳模式設置、參數配置等步驟&#xff0c;不僅耗時易錯&#xff08;如位掩碼寫反、模式枚舉值混淆&#xff09;&#xff0c…

Elasticsearch混合搜索深度解析(下):執行機制與完整流程

引言 在上篇中&#xff0c;我們發現了KNN結果通過SubSearch機制被保留的關鍵事實。本篇將繼續深入分析混合搜索的執行機制&#xff0c;揭示完整的處理流程&#xff0c;并解答之前的所有疑惑。 深入源碼分析 1. SubSearch的執行機制 1.1 KnnScoreDocQueryBuilder的實現 KNN結果被…

Apache HTTP Server 從安裝到配置

一、Apache 是什么&#xff1f;Apache&#xff08;全稱 Apache HTTP Server&#xff09;是當前最流行的開源Web服務器軟件之一&#xff0c;由Apache軟件基金會維護。它以穩定性高、模塊化設計和靈活的配置著稱&#xff0c;支持Linux、Windows等多平臺&#xff0c;是搭建個人博客…

php中調用對象的方法可以使用array($object, ‘methodName‘)?

是的&#xff0c;在PHP中&#xff0c;array($object, methodName) 是一種標準的回調語法&#xff0c;用于表示“調用某個對象的特定方法”。這種語法可以被許多函數&#xff08;如 call_user_func()、call_user_func_array()、usort() 等&#xff09;識別并執行。 語法原理 在P…

【設計模式】單例模式 餓漢式單例與懶漢式單例

單例模式&#xff08;Singleton Pattern&#xff09;詳解一、單例模式簡介 單例模式&#xff08;Singleton Pattern&#xff09; 是一種 創建型設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。&#xff08;對象創建型模式&…

vue3 el-table 行數據沾滿格自動換行

在使用 Vue 3 結合 Element Plus 的 <el-table> 組件時&#xff0c;如果你希望當表格中的行數據文本過長時能夠自動換行&#xff0c;而不是溢出到其他單元格或簡單地截斷&#xff0c;你可以通過以下幾種方式來實現&#xff1a;方法 1&#xff1a;使用 CSS最簡單的方法是通…

windows電腦遠程win系統服務器上的wsl2

情況 我自己使用win11筆記本電腦&#xff0c;想要遠程win11服務器上的wsl2 我這里只有服務器安裝了wsl2&#xff0c;win11筆記本沒有安裝 因此下面提到的Ubuntu終端指的是win服務器上的wsl2終端 一定要區分是在哪里輸入命令&#xff01;&#xff01; 安裝SSH 在服務器上&#x…

神經輻射場 (NeRF):重構三維世界的AI新視角

神經輻射場 (NeRF)&#xff1a;重構三維世界的AI新視角 舊金山蜿蜒起伏的街道上&#xff0c;一輛裝備12個攝像頭的Waymo自動駕駛測試車緩緩駛過。它記錄的280萬張街景圖像并未被簡單地拼接成平面地圖&#xff0c;而是被輸入一個名為Block-NeRF的神經網絡。數周后&#xff0c;一…

Kubernetes自動擴縮容方案對比與實踐指南

Kubernetes自動擴縮容方案對比與實踐指南 隨著微服務架構和容器化的廣泛采用&#xff0c;Kubernetes 自動擴縮容&#xff08;Autoscaling&#xff09;成為保障生產環境性能穩定與資源高效利用的關鍵技術。面對水平 Pod 擴縮容、垂直資源調整、集群節點擴縮容以及事件驅動擴縮容…

【CVPR2025】計算機視覺|SIREN: 元學習賦能!突破INR高分辨率圖像分類難題

論文地址&#xff1a;https://arxiv.org/pdf/2503.18123v1 代碼地址&#xff1a;https://github.com/SanderGielisse/MWT 關注UP CV縫合怪&#xff0c;分享最計算機視覺新即插即用模塊&#xff0c;并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要 …