從零學(xué)習(xí)大模型(2)——從文字到數(shù)字:Tokenizer 與 Embedding 如何讓 AI 讀懂人類語言
從 ChatGPT 到文心一言,大模型已成產(chǎn)品革新的關(guān)鍵。但要真正理解它們的能力,產(chǎn)品經(jīng)理必須掌握底層的語言處理機(jī)制。這篇文章將拆解 Tokenizer 與 Embedding 的核心邏輯,用產(chǎn)品視角解析 AI 如何“讀懂”語言。
當(dāng)我們向 ChatGPT 輸入 “幫我寫一封請假郵件” 時,這個看似簡單的交互背后,隱藏著 AI 理解人類語言的核心步驟 —— 將文字轉(zhuǎn)化為機(jī)器可處理的數(shù)字信號。在這個過程中,Tokenizer(分詞器)和 Embedding(詞嵌入)扮演著 “語言翻譯官” 的角色:Tokenizer 負(fù)責(zé)把文本拆分成 AI 能理解的基本單元,Embedding 則將這些單元轉(zhuǎn)化為包含語義信息的數(shù)值向量。正是這兩個模塊的協(xié)同工作,讓機(jī)器得以跨越 “人類語言” 與 “機(jī)器語言” 的鴻溝。
為什么需要 Tokenizer?從 “單詞困境” 說起
在 AI 處理語言的早期,研究者們曾嘗試用 “單詞級” 的方式處理文本 —— 即給每個單詞分配一個唯一的數(shù)字(如 “蘋果”=1001,“手機(jī)”=1002)。這種方法簡單直接,但很快遇到了無法解決的問題。
首先是未登錄詞(OOV)難題,人類語言會不斷產(chǎn)生新詞(如 “內(nèi)卷”“AI 生成”),模型無法識別不在預(yù)設(shè)詞匯表里的詞,只能用 “未知標(biāo)記”()代替,導(dǎo)致語義丟失。其次是詞匯表爆炸,僅英語就有超過 100 萬個單詞,加上中文、法語等多語言場景,詞匯表會無限膨脹,不僅占用大量內(nèi)存,還會讓模型難以訓(xùn)練。最后是語義割裂,“蘋果”(水果)和 “蘋果”(公司)共用一個編碼,“開心” 和 “不開心” 被視為完全無關(guān)的詞,模型無法捕捉詞匯間的內(nèi)在聯(lián)系。
為解決這些問題,研究者們提出了子詞分詞(Subword Tokenization)思想:將單詞拆分成更小的語義單元(如 “unhappiness” 拆成 “un + happy + ness”)。這些子詞既能組合出所有可能的單詞(解決 OOV),又能通過共享子詞減少詞匯表大?。ㄈ?“happy” 可用于 “happiness”“unhappy”),還能保留語義關(guān)聯(lián)(“un-” 表示否定)。
而 Tokenizer 的核心任務(wù),就是實(shí)現(xiàn)這種 “智能拆分”—— 它就像一位精通詞根詞綴的語言學(xué)家,能根據(jù)語言規(guī)律將文本切分成最適合模型處理的子詞單元。
主流子詞分詞算法:BPE、BBPE 與 WordPiece 的 “拆分智慧”
目前主流的子詞分詞算法都基于 “從最小單元開始,逐步合并高頻組合” 的思路,但在細(xì)節(jié)上各有側(cè)重。理解這些算法,就能明白 AI 是如何 “拆解語言” 的。
1. BPE(字節(jié)對編碼):從字符到子詞的 “合并游戲”
BPE(Byte Pair Encoding)是最經(jīng)典的子詞算法,最初用于數(shù)據(jù)壓縮,2015 年被引入 NLP 領(lǐng)域后,成為 GPT、Transformer-XL 等模型的標(biāo)配分詞器。它的核心邏輯可以概括為 “從字符開始,不斷合并最常見的相鄰對”。
BPE 的工作原理分為三步完成子詞構(gòu)建。初始化階段,將所有單詞拆分成字符,并在詞尾添加特殊標(biāo)記(如</w>)區(qū)分詞邊界。例如 “cats” 拆分為 “c a t s ”,“cat” 拆分為 “c a t ”。然后進(jìn)入統(tǒng)計合并階段,遍歷所有文本,統(tǒng)計相鄰字符對的出現(xiàn)頻率,將最頻繁的對合并為新子詞。比如 “t” 和 “在“cat</w>”“bat</w>”中頻繁出現(xiàn),就合并為“t</w>;下次若 “ca” 出現(xiàn)次數(shù)最多,則合并為 “ca”。最后是迭代終止,重復(fù)合并過程,直到達(dá)到預(yù)設(shè)的詞匯表大小(如 32000)或迭代次數(shù)。最終詞匯表中會包含字符、常用子詞(如 “cat”“ing”)和完整單詞(如 “the”)。
當(dāng)處理新文本時,BPE 會用 “最長匹配” 策略拆分單詞:從最長可能的子詞開始嘗試匹配,若匹配失敗則縮短長度。例如處理 “cats” 時,先檢查整個單詞 “cats” 是否在詞匯表中(若不在則進(jìn)入下一步);嘗試 “cat”+“s”(若 “cat” 在詞匯表,“s” 也在,則拆分為 “cat + s”);最終輸出子詞序列(如 “cat + s”)。
這種方式既能保證常見詞被完整保留(如 “the” 直接作為一個子詞),又能將罕見詞拆分為已知子詞(如 “fluffiness” 拆為 “fluff + i + ness”)。
BPE 的最大優(yōu)勢是簡單高效 —— 僅通過頻率統(tǒng)計就能構(gòu)建子詞表,無需語言學(xué)知識,且能處理任意語言。但它完全依賴頻率,可能合并無意義的高頻組合(如 “ab” 在 “about”“able” 中頻繁出現(xiàn),但本身無語義),且對多語言混合文本的支持較弱(不同語言的字符編碼可能沖突)。
2. BBPE(字節(jié)級 BPE):打破語言壁壘的 “萬能拆分器”
BBPE(Byte-Level BPE)是 BPE 的升級版,由 OpenAI 在 GPT-2 中提出。它的核心改進(jìn)是將 “字符” 替換為 “字節(jié)” 作為最小單元(如 UTF-8 編碼下,一個漢字對應(yīng) 3 個字節(jié)),從而解決了多語言處理的痛點(diǎn)。
人類語言的字符編碼復(fù)雜:英文用 1 個字節(jié),中文用 3 個字節(jié),emoji 可能用 4 個字節(jié)。傳統(tǒng) BPE 需要先處理字符編碼,而 BBPE 直接以字節(jié)為單位(共 256 種可能的字節(jié)),天然支持所有語言和符號 —— 無論是中文、阿拉伯語,還是代碼符號(如{})、emoji(如??),都能被拆分為字節(jié)序列。
例如處理中文 “自然語言”,傳統(tǒng) BPE 需先將 “自”“然”“語”“言” 作為字符初始化;BBPE 直接使用它們的 UTF-8 字節(jié)(如 “自” 對應(yīng) 0xE8 0x87 0xAA 三個字節(jié)),通過合并高頻字節(jié)對(如 “自然” 的字節(jié)組合)形成子詞。
BBPE 的設(shè)計讓它特別適合處理 “非標(biāo)準(zhǔn)文本”。在代碼生成任務(wù)中,能精準(zhǔn)拆分for while等關(guān)鍵字和== !=等運(yùn)算符;在多語言對話中,可同時處理 “Hello!你好??” 中的英文、中文和 emoji;詞匯表大小可控(如 GPT-3 使用 50257 大小的詞表),兼顧覆蓋度和效率。
目前 BBPE 已成為多語言模型的主流選擇,GPT 系列、Claude 等均采用該算法。
3. WordPiece:兼顧語義的 “智能合并”
WordPiece 由谷歌提出,是 BERT、XLNet 等模型的分詞器。它與 BPE 的核心區(qū)別在于合并標(biāo)準(zhǔn) —— 不單純看頻率,而是通過 “互信息” 判斷子詞組合的必要性。
互信息(Mutual Information)衡量兩個子詞的 “綁定強(qiáng)度”:若兩個子詞經(jīng)常一起出現(xiàn)(如 “un” 和 “happy”),且很少單獨(dú)出現(xiàn),則互信息高,優(yōu)先合并。例如 “un” 和 “happy” 共現(xiàn) 50 次,“un” 單獨(dú)出現(xiàn) 10 次,“happy” 單獨(dú)出現(xiàn) 20 次,則互信息 = 50/(10×20)=0.25。若該值高于閾值,則合并為 “unhappy”。
這種策略能避免 BPE 的 “盲目合并”—— 例如 “New York” 中 “New” 和 “York” 互信息高,會被合并為子詞,而 “the” 和 “of” 雖頻率高但互信息低(可與其他詞搭配),則不會合并。
WordPiece 在分詞時,會給非首子詞添加 “##” 前綴(如 “unhappiness” 拆為 “un + ##happy + ##ness”)。這個標(biāo)記的作用是告訴模型:“##happy” 是單詞的中間部分,不是獨(dú)立單詞。這種設(shè)計能幫助模型區(qū)分 “happy”(獨(dú)立詞)和 “##happy”(詞綴),提升語義理解精度。
由于能更好地捕捉語義關(guān)聯(lián),WordPiece 在需要深度理解文本的任務(wù)(如問答、情感分析)中表現(xiàn)更優(yōu)。BERT 正是通過這種分詞方式,才能精準(zhǔn)理解 “蘋果” 在 “蘋果手機(jī)” 和 “吃蘋果” 中的不同含義。
不同模型的分詞選擇:為什么 GPT 用 BBPE,BERT 用 WordPiece?
模型對 Tokenizer 的選擇,本質(zhì)上是生成式模型更看重 “覆蓋范圍和效率”(選 BBPE),理解式模型更看重 “語義精度”(選 WordPiece)。
GPT 系列使用 BBPE,因?yàn)樾柚С侄嗾Z言生成、代碼和 emoji,BBPE 的字節(jié)級處理和全符號支持更適配。BERT 采用 WordPiece,由于專注自然語言理解,需精準(zhǔn)捕捉語義關(guān)聯(lián),WordPiece 的互信息合并更符合需求。T5 使用 SentencePiece,多語言任務(wù)需統(tǒng)一處理空格和標(biāo)點(diǎn),SentencePiece(基于 BPE 的擴(kuò)展)支持無空格文本。Llama 2 選擇 BBPE,兼顧多語言對話和長文本生成,BBPE 的高效性和兼容性更優(yōu)。
Tokenizer 在預(yù)訓(xùn)練中的 “全流程操作”
Tokenizer 不是簡單的 “拆分工具”,而是預(yù)訓(xùn)練過程的 “前端處理器”,其處理質(zhì)量直接影響模型性能。在實(shí)際預(yù)訓(xùn)練中,它需要完成以下關(guān)鍵操作。
面對原始語料(如網(wǎng)頁、書籍、對話記錄),Tokenizer 首先進(jìn)行標(biāo)準(zhǔn)化處理。統(tǒng)一大小寫(如將 “Apple”“APPLE” 轉(zhuǎn)為 “apple”);處理特殊符號(如去除多余空格、統(tǒng)一標(biāo)點(diǎn)為半角);過濾無效內(nèi)容(如亂碼、廣告鏈接)。這一步的目的是減少噪聲 —— 就像人類閱讀前會先整理排版混亂的文本,模型也需要 “干凈” 的輸入。
完成清洗后,Tokenizer 按算法拆分文本(如用 BBPE 將 “我愛自然語言” 拆分為子詞),再將每個子詞映射到詞匯表中的唯一索引(如 “我”=345,“愛”=678)。這個索引就像子詞的 “身份證”,模型通過索引找到對應(yīng)的嵌入向量。
為幫助模型理解文本結(jié)構(gòu),Tokenizer 會插入特殊標(biāo)記。<CLS>用于句子級任務(wù)(如分類),放在句首作為整個句子的代表;<SEP>分隔兩個句子(如問答任務(wù)中的 “問題 ++ 上下文”);<PAD>將不同長度的句子補(bǔ)成相同長度(便于批量訓(xùn)練);<MASK>在掩碼語言模型(如 BERT)中掩蓋部分子詞,用于訓(xùn)練模型預(yù)測能力。例如 BERT 處理 “我愛 AI。它很有趣” 時,最終的 token 序列為[CLS] 我 愛 AI 。 [SEP] 它 很 有 趣 [SEP] [PAD] [PAD]。
模型能處理的序列長度有限(如 BERT 最大 512 個 token,GPT-3 支持 2048 個)。當(dāng)文本過長時,Tokenizer 會截斷(保留前 N 個 token);過短時則用<PAD>補(bǔ)齊,確保輸入長度統(tǒng)一。這一步就像給文本 “定尺寸”—— 就像快遞需要按標(biāo)準(zhǔn)尺寸打包,模型也需要固定長度的輸入才能高效計算。
Embedding:給子詞賦予 “語義靈魂”
經(jīng)過 Tokenizer 處理的 token 索引只是 “數(shù)字標(biāo)簽”,無法直接用于計算。Embedding 的作用,就是將這些索引轉(zhuǎn)化為包含語義信息的向量 —— 讓 “蘋果” 的向量與 “水果” 更接近,與 “手機(jī)” 的向量有一定關(guān)聯(lián)。
嵌入層的核心作用:語義映射
Embedding 層本質(zhì)是一個 “l(fā)ookup table”(查詢表)。表的行數(shù)等于詞匯表大?。ㄈ?32000),列數(shù)等于嵌入維度(如 768);每行對應(yīng)一個子詞的向量(初始值隨機(jī),通過訓(xùn)練優(yōu)化);輸入 token 索引時,直接取出對應(yīng)行的向量作為輸出。
例如 “蘋果” 的索引是 123,嵌入層就返回第 123 行的 768 維向量。訓(xùn)練過程中,模型會不斷調(diào)整這些向量:當(dāng) “蘋果” 和 “香蕉” 經(jīng)常出現(xiàn)在類似語境(如 “吃”“水果” 附近),它們的向量會逐漸靠近;當(dāng) “蘋果” 既出現(xiàn)在 “水果” 又出現(xiàn)在 “手機(jī)” 語境中,其向量會成為兩種語義的 “混合體”,通過上下文進(jìn)一步區(qū)分。
與位置編碼的協(xié)同
如前文所述,Transformer 需要位置信息才能理解語序。在實(shí)際處理中,Embedding 向量會與位置編碼向量相加 —— 這相當(dāng)于給每個子詞的 “語義向量” 加上 “位置標(biāo)簽”,讓模型既知道 “這個詞是什么意思”,又知道 “它在句子的哪個位置”。
為什么說 Tokenizer 是 “模型的地基”?
在大語言模型的 “能力金字塔” 中,Tokenizer 處于最底層。它決定了模型能 “看到” 什么(子詞劃分方式直接影響語義捕捉);它限制了模型的 “表達(dá)范圍”(詞匯表未覆蓋的子詞會導(dǎo)致信息丟失);它影響模型的 “計算效率”(子詞過長會增加序列長度,過短會增加噪聲)。
例如,若 Tokenizer 無法正確拆分 “量子計算”(拆成 “量 + 子 + 計 + 算” 而非 “量子 + 計算”),模型就難以學(xué)習(xí)這一概念的完整語義;若詞匯表過小(如 8000),大量子詞會被重復(fù)拆分,增加模型學(xué)習(xí)負(fù)擔(dān)。
因此,設(shè)計 Tokenizer 時需要在 “詞匯表大小”“子詞粒度”“語言覆蓋度” 之間找到平衡 —— 這也是為什么頂級模型的 Tokenizer 往往需要經(jīng)過多輪調(diào)試和優(yōu)化。
結(jié)語:從拆分到理解的 “語言橋梁”
Tokenizer 和 Embedding 看似是 “預(yù)處理工具”,實(shí)則是 AI 理解語言的 “第一道智慧”。從 BPE 的簡單合并到 BBPE 的多語言支持,再到 WordPiece 的語義感知,這些算法的演進(jìn)本質(zhì)上是 “讓機(jī)器更懂人類語言規(guī)律” 的過程。
當(dāng)我們驚嘆于 GPT 能寫代碼、BERT 能回答問題時,不妨記?。哼@些能力的起點(diǎn),是 Tokenizer 將文本拆分成子詞的那一刻,是 Embedding 給子詞賦予語義向量的那一步。正是這 “拆分” 與 “映射” 的智慧,讓機(jī)器終于能跨越語言的鴻溝,與人類實(shí)現(xiàn)真正的 “對話”。
未來,隨著多模態(tài)模型的發(fā)展,Tokenizer 可能會進(jìn)化為 “跨模態(tài)拆分器”(同時處理文本、圖像、語音的基本單元),但核心邏輯不會改變 —— 理解的前提,是先學(xué)會 “拆解” 與 “關(guān)聯(lián)”。
本文由 @紅岸小兵 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)作者許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺僅提供信息存儲空間服務(wù)
- 目前還沒評論,等你發(fā)揮!