當人們談論大型語言模型的大小時,參數(shù)會讓我們了解神經(jīng)網(wǎng)絡的結構有多復雜,而token的大小會讓我們知道有多少數(shù)據(jù)用于訓練參數(shù)。
正像陸奇博士所說的那樣,大型語言模型為從文本生成到問題回答的各種任務提供了令人印象深刻的能力,不僅徹底改變了自然語言處理(NLP)領域,而且作為基礎模型會改變整個軟件生態(tài)。
這些模型的一個經(jīng)常被忽視的關鍵點是“token”的作用,即模型處理的各個信息單元。大型語言模型(LLM)不能真正理解原始文本,相反,文本被轉(zhuǎn)換為稱為token的數(shù)字表示形式,然后將這些token提供給模型進行處理。
token 在區(qū)塊鏈中代表是通證或者代幣,那么token在LLM中代表的是什么呢?
在 LLM 中,token代表模型可以理解和生成的最小意義單位,是模型的基礎單元。根據(jù)所使用的特定標記化方案,token可以表示單詞、單詞的一部分,甚至只表示字符。token被賦予數(shù)值或標識符,并按序列或向量排列,并被輸入或從模型中輸出,是模型的語言構件。
一般地,token可以被看作是單詞的片段,不會精確地從單詞的開始或結束處分割,可以包括尾隨空格以及子單詞,甚至更大的語言單位。token作為原始文本數(shù)據(jù)和 LLM 可以使用的數(shù)字表示之間的橋梁。LLM使用token來確保文本的連貫性和一致性,有效地處理各種任務,如寫作、翻譯和回答查詢。
下面是一些有用的經(jīng)驗法則,可以幫助理解token的長度:
1 token ~= 4 chars in English
1 token ~= ? words
100 tokens ~= 75 words
或者
1-2 句子 ~= 30 tokens
1 段落 ~= 100 tokens
1,500 單詞 ~= 2048 tokens
在OpenAI 的API 參數(shù)中,max _ tokens 參數(shù)指定模型應該生成一個最大長度為60個令牌的響應。可以通過https://platform.openai.com/tokenizer 來觀察token 的相關信息。
我們可以先用OpenAI 的playground 來看一個例子“Dec 31,1993. Things are getting crazy.”
使用 GPT-3 tokenizaer將相同的單詞轉(zhuǎn)換為token:
詞匯表將token映射到唯一的數(shù)值表示。LLM 使用數(shù)字輸入,因此詞匯表中的每個標記都被賦予一個唯一標識符或索引。這種映射允許 LLM 將文本數(shù)據(jù)作為數(shù)字序列進行處理和操作,從而實現(xiàn)高效的計算和建模。
為了捕獲token之間的意義和語義關系,LLM 采用token編碼技術。這些技術將token轉(zhuǎn)換成稱為嵌入的密集數(shù)字表示。嵌入式編碼語義和上下文信息,使 LLM 能夠理解和生成連貫的和上下文相關的文本。像transformer這樣的體系結構使用self-attention機制來學習token之間的依賴關系并生成高質(zhì)量的嵌入。
token級別的操作是對文本數(shù)據(jù)啟用細粒度操作。LLM 可以生成token、替換token或掩碼token,以有意義的方式修改文本。這些token級操作在各種自然語言處理任務中都有應用,例如機器翻譯、情感分析和文本摘要等。
在將文本發(fā)送到 LLM 進行生成之前,會對其進行tokenization。token是模型查看輸入的方式ーー單個字符、單詞、單詞的一部分或文本或代碼的其他部分。每個模型都以不同的方式執(zhí)行這一步驟,例如,GPT 模型使用字節(jié)對編碼(BPE)。
token會在tokenizer發(fā)生器的詞匯表中分配一個 id,這是一個將數(shù)字與相應的字符串綁定在一起的數(shù)字標識符。例如,“ Matt”在 GPT 中被編碼為token編號[13448],而 “Rickard”被編碼為兩個標記,“ Rick”,“ ard”帶有 id[8759,446],GPT-3擁有1400萬字符串組成的詞匯表。
token 的設計大概存在著以下的局限性:
大小寫區(qū)分:不同大小寫的單詞被視為不同的標記?!?hello”是token[31373] ,“ Hello”是[15496] ,而“ HELLO”有三個token[13909,3069,46]。
數(shù)字分塊不一致。數(shù)值“380”在 GPT 中標記為單個“380”token。但是“381”表示為兩個token[“38”,“1”]?!?82”同樣是兩個token,但“383”是單個token[“383”]。一些四位數(shù)字的token有: [“3000”] ,[“3”,“100”] ,[“35”,“00”] ,[“4”,“500”]。這或許就是為什么基于 GPT 的模型并不總是擅長數(shù)學計算的原因。
尾隨的空格。有些token有空格,這將導致提示詞和單詞補全的有趣行為。例如,帶有尾部空格的“once upon a ”被編碼為[“once”、“upon”、“a”、“ ”]。然而,“once on a time”被編碼為[“once”,“ upon”,“ a”,“ time”]。因為“ time”是帶有空格的單個token,所以將空格添加到提示詞將影響“ time”成為下一個token的概率。
關于token的數(shù)量如何影響模型的響應,常常感到困惑的是,更多的token是否使模型更加詳細而具體呢?個人認為,token 對大模型的影響集中在兩個方面:
上下文窗口: 這是模型一次可以處理的令牌的最大數(shù)量。如果要求模型比上下文窗口生成更多的標記,它將在塊中這樣做,這可能會失去塊之間的一致性。
訓練數(shù)據(jù)token: 模型的培訓數(shù)據(jù)中令牌的數(shù)量是模型已經(jīng)學習的信息量的度量。然而,模型的響是更“一般”還是“詳細”與這些象征性的措施沒有直接關系。
模型響應的普遍性或特異性更多地取決于它的訓練數(shù)據(jù)、微調(diào)和生成響應應時使用的解碼策略。大型語言模型中的令牌概念是理解這些模型如何工作以及如何有效使用它們的基礎。雖然模型可以處理或已經(jīng)接受過訓練的令牌數(shù)量確實影響其性能,但其響應的一般性或詳細程度更多地是其訓練數(shù)據(jù)、微調(diào)和所使用的解碼策略的產(chǎn)物。
對不同數(shù)據(jù)進行訓練的模型往往會產(chǎn)生一般性的響應,而對具體數(shù)據(jù)進行訓練的模型往往會產(chǎn)生更詳細的、針對具體情況的響應。例如,對醫(yī)學文本進行微調(diào)的模型可能會對醫(yī)學提示產(chǎn)生更詳細的響應。
解碼策略也起著重要的作用。修改模型輸出層中使用的SoftMax函數(shù)的“temperature”可以使模型的輸出更加多樣化(更高的溫度)或者更加確定(更低的溫度)。在OpenAI 的API中設置temperature的值可以調(diào)整確定性和不同輸出之間的平衡。
需要記住,每一個語言模型,不管它的大小或者它被訓練的數(shù)據(jù)量如何,只有它被訓練的數(shù)據(jù)、它被接收的微調(diào)以及在使用過程中使用的解碼策略才可能是最有效的。
為了突破 LLM 的極限,可以嘗試不同的訓練和微調(diào)方法,并使用不同的解碼策略。請注意這些模型的優(yōu)缺點,并始終確保用例與正在使用的模型功能保持一致。
將文本劃分為不同token的正式過程稱為 tokenization。tokenization捕獲文本的含義和語法結構,從而需要將文本分割成重要的組成部分。
tokenization是將輸入和輸出文本分割成更小的單元,由 LLM AI 模型處理的過程。tokenization可以幫助模型處理不同的語言、詞匯表和格式,并降低計算和內(nèi)存成本,還可以通過影響token的意義和語境來影響所生成文本的質(zhì)量和多樣性。根據(jù)文本的復雜性和可變性,可以使用不同的方法進行tokenization,比如基于規(guī)則的方法、統(tǒng)計方法或神經(jīng)方法。
OpenAI 以及 Azure OpenAI 為其基于 GPT 的模型使用了一種稱為“字節(jié)對編碼(Byte-Pair Encoding,BPE)”的子詞tokenization方法。BPE 是一種將最頻繁出現(xiàn)的字符對或字節(jié)合并到單個標記中的方法,直到達到一定數(shù)量的標記或詞匯表大小為止。BPE 可以幫助模型處理罕見或不可見的單詞,并創(chuàng)建更緊湊和一致的文本表示。BPE 還允許模型通過組合現(xiàn)有單詞或標記來生成新單詞或標記。詞匯表越大,模型生成的文本就越多樣化并富有表現(xiàn)力。但是,詞匯表越大,模型所需的內(nèi)存和計算資源就越多。因此,詞匯表的選擇取決于模型的質(zhì)量和效率之間的權衡。
基于用于與模型交互的token數(shù)量以及不同模型的不同速率,大模型的使用成本可能大不相同。例如,截至2023年2月,使用 Davinci 的費率為每1000個令牌0.06美元,而使用 Ada 的費率為每1000個令牌0.0008美元。這個比率也根據(jù)使用的類型而變化,比如playground和搜索等。因此,tokenization是影響運行大模型的成本和性能的一個重要因素。
tokenization涉及到將文本分割成有意義的單元,以捕捉其語義和句法結構,可以采用各種tokenization技術,如字級、子字級(例如,使用字節(jié)對編碼或 WordPiece)或字符級。根據(jù)特定語言和特定任務的需求,每種技術都有自己的優(yōu)勢和權衡。
字節(jié)對編碼(BPE):為AI模型構建子詞詞匯,用于合并出現(xiàn)頻繁的字符/子字對。
子詞級tokenization:為復雜語言和詞匯劃分單詞。將單詞拆分成更小的單元,這對于復雜的語言很重要。
單詞級tokenization:用于語言處理的基本文本tokenization。每個單詞都被用作一個不同的token,它很簡單,但受到限制。
句子片段:用習得的子詞片段分割文本,基于所學子單詞片段的分段。
分詞tokenization:采用不同合并方法的子詞單元。
字節(jié)級tokenization:使用字節(jié)級token處理文本多樣性,將每個字節(jié)視為令牌,這對于多語言任務非常重要。
混合tokenization:平衡精細細節(jié)和可解釋性,結合詞級和子詞級tokenization。
LLM 已經(jīng)擴展了處理多語言和多模式輸入的能力。為了適應這些數(shù)據(jù)的多樣性,已經(jīng)開發(fā)了專門的tokenization方法。通過利用特定語言的token或子詞技術,多語言標記在一個模型中處理多種語言。多模態(tài)標記將文本與其他模式(如圖像或音頻)結合起來,使用融合或連接等技術來有效地表示不同的數(shù)據(jù)源。
tokenization在 LLM 的效率、靈活性和泛化能力中起著至關重要的作用。通過將文本分解成更小的、可管理的單元,LLM 可以更有效地處理和生成文本,降低計算復雜度和內(nèi)存需求。此外,tokenization通過適應不同的語言、特定領域的術語,甚至是新興的文本形式(如互聯(lián)網(wǎng)俚語或表情符號)提供了靈活性。這種靈活性允許 LLM 處理范圍廣泛的文本輸入,增強了它們在不同領域和用戶上下文中的適用性。
tokenization技術的選擇涉及到粒度和語義理解之間的權衡。單詞級標記捕獲單個單詞的意義,但可能會遇到詞匯表外(OOV)術語或形態(tài)學上豐富的語言。子詞級tokenization提供了更大的靈活性,并通過將單詞分解為子詞單元來處理 OOV 術語。然而,在整個句子的語境中正確理解子詞標記的意義是一個挑戰(zhàn)。tokenization技術的選擇取決于特定的任務、語言特征和可用的計算資源。
真實世界的文本數(shù)據(jù)通常包含噪音、不規(guī)則性或不一致性。tokenization在處理拼寫錯誤、縮寫、俚語或語法錯誤的句子時面臨挑戰(zhàn)。處理這些噪音數(shù)據(jù)需要健壯的預處理技術和特定領域的tokenization規(guī)則調(diào)整。此外,在處理具有復雜編寫系統(tǒng)的語言時,tokenization可能會遇到困難,例如標志腳本或沒有明確詞邊界的語言。解決這些挑戰(zhàn)通常涉及專門的tokenization方法或?qū)ΜF(xiàn)有tokenizer的適應。
tokenization是特定于模型的。根據(jù)模型的詞匯表和tokenization方案,標記可能具有不同的大小和含義。例如,像“ running”和“ ran”這樣的單詞可以用不同的標記來表示,這會影響模型對時態(tài)或動詞形式的理解。不同模型訓練各自的tokenizer,而且盡管 LLaMa 也使用 BPE,但token也與ChatGPT不同,這使得預處理和多模態(tài)建模變得更加復雜。
我們需要知道當前任務的token 使用狀況,然后,面對大模型的token長度限制,可以嘗試一些解決方案
這里采用OpenAI 的API , 使用langchain 應用框架來構建簡單應用,進而描述當前文本輸入的token 使用狀態(tài)。
from langchain.llms import OpenAI
from langchain.callbacks import get_openai_callback
llm = OpenAI(model_name="text-davinci-002", n=2, best_of=2)
with get_openai_callback() as cb:
result = llm("給我講個笑話吧")
print(cb)
對于Agent 類型的應用而言,可以用類似的方法得到各自token的統(tǒng)計數(shù)據(jù)。
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(
tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
with get_openai_callback() as cb:
response = agent.run(
"Who is Olivia Wilde's boyfriend? What is his current age raised to the 2023?"
)
print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Total Cost (USD): ${cb.total_cost}")
像 GPT-3/4,LLaMA等這樣的大模型有一個最大token 數(shù)量限制,超過這個限制,它們就不能接受輸入或生成輸出。
截斷涉及刪除輸入文本的一部分以適應令牌限制。這可以通過刪除文本的開頭或結尾,或兩者的組合來完成。然而,截斷可能導致重要信息的丟失,并可能影響所產(chǎn)生的產(chǎn)出的質(zhì)量和一致性。
抽樣是一種從輸入文本中隨機選擇標記子集的技術。這允許您在輸入中保留一些多樣性,并且可以幫助生成不同的輸出。然而,這種方法(類似于截斷)可能會導致上下文信息的丟失,并降低生成輸出的質(zhì)量。
另一種方法是將輸入文本分割成符號限制內(nèi)的較小塊或段,并按順序處理它們。通過這種方式,可以獨立處理每個塊,并且可以連接輸出以獲得最終結果。
編碼和解碼是常見的自然語言處理技術,它們將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)字表示,反之亦然。這些技術可用于壓縮、解壓縮、截斷或展開文本以適應語言模型的標記限制。這種方法需要額外的預處理步驟,可能會影響生成輸出的可讀性。
微調(diào)允許使用較少的特定任務數(shù)據(jù)來調(diào)整預先訓練好的語言模型以適應特定任務或領域??梢岳梦⒄{(diào)來解決語言模型中的標記限制,方法是訓練模型預測一系列文本中的下一個標記,這些文本被分塊或分成更小的部分,每個部分都在模型的標記限制范圍內(nèi)。
雖然token傳統(tǒng)上代表文本單位,但是token的概念正在超越語言要素的范疇。最近的進展探索了其他模式(如圖像、音頻或視頻)的標記,允許 LLM 與這些模式一起處理和生成文本。這種多模式方法為在豐富多樣的數(shù)據(jù)源背景下理解和生成文本提供了新的機會。它使 LLM 能夠分析圖像標題,生成文本描述,甚至提供詳細的音頻轉(zhuǎn)錄。
tokenization領域是一個動態(tài)和不斷發(fā)展的研究領域。未來的進步可能集中于解決tokenization的局限性,改進 OOV 處理,并適應新興語言和文本格式的需要。而且,將繼續(xù)完善tokenization技術,納入特定領域的知識,并利用上下文信息來增強語義理解。tokenization的不斷發(fā)展將進一步賦予 LLM 以更高的準確性、效率和適應性來處理和生成文本。
Token是支持 LLM 語言處理能力的基本構件。理解token在 LLM 中的作用,以及tokenization方面的挑戰(zhàn)和進步,使我們能夠充分發(fā)揮這些模型的潛力。隨著繼續(xù)探索token的世界,我們將徹底改變機器理解和生成文本的方式,推動自然語言處理的邊界,促進各個領域的創(chuàng)新應用。
PS. One more thing, 我們在開發(fā)大模型應用時應該了解的一些數(shù)字如下:
聯(lián)系客服