## LLMs **大部分的LLMs都源於Transformer設計,該設計包含了由自我注意機制驅動的編碼器和解碼器模組。基於架構結構,LLMs可以被分類為三類** - 如圖所示,彙總了一些具有不同模型架構、模型大小以及開源可用性的代表性LLMs。 ![](https://hackmd.io/_uploads/H1BmXNeu2.png) ### Encoder-only的大型語言模型 Encoder-only 的大型語言模型(LLMs)僅使用編碼器對句子進行編碼並理解詞語之間的關係。這些模型的常見訓練範例是預測輸入句子中的掩碼詞。這種方法是無監督的,可以在大規模語料庫上進行訓練。像BERT [1]、ALBERT [51]、RoBERTa [2]和ELECTRA [52]等 Encoder-only 的LLMs需要添加額外的預測頭部來解決下游任務。這些模型對於需要理解整個句子的任務最為有效,如==文本分類==[53]和==命名實體識別==[54]。 ### Encoder-Decoder的大型語言模型 Encoder-Decoder 的大型語言模型採用編碼器和解碼器模組。編碼器模組負責將輸入句子編碼到隱藏空間,解碼器用於生成目標輸出文本。Decoder-only LLMs 的訓練策略可以更靈活。例如,T5 [3]通過掩碼和預測掩碼詞的範疇來進行預訓練。UL2 [55]整合了若干訓練目標,如不同的掩碼範疇和掩碼頻率。Decoder-only LLMs(例如T0 [56],ST-MoE [57],和GLM-130B [58])能夠直接解決基於一些上下文生成句子的任務,如摘要、翻譯和問答[59]。 ### Decoder-only的大型語言模型 Decoder-only 的大型語言模型只採用解碼器模組來生成目標輸出文本。這些模型的訓練範例是預測句子中的下一個詞。大型Decoder-only的LLMs通常可以通過幾個例子或簡單指令來完成下游任務,無需添加預測頭部或微調[60]。許多最先進的LLMs(例如Chat-GPT [61]和GPT-44)遵循 Decoder-only 的架構。然而,由於這些模型是閉源的,對學術研究人員進行進一步的研究來說具有挑戰性。最近,一些研究已經開始探索如何在 Decoder-only 的模型上實施有效的下游任務微調,以優化其性能和適應性。 **對於大型語言模型(LLMs)來說,它們可以分為編碼器-只有(Encoder-only),解碼器-只有(Decoder-only),以及編碼器-解碼器(Encoder-Decoder)模型。以下是一個以表格形式呈現它們各自的優點和缺點:** | | 優點 | 缺點 | | ------------- | ------------- | ------------- | | **Encoder-only** | 1. 具有良好的句子表達學習能力。 <br/> 2. 通常對於解析和理解語境有較強的能力。 | 1. 不直接適合於生成任務,因為模型通常不生成序列,而是提取特徵。 <br/> 2. 較難控制生成文本的細節。 | | **Decoder-only** | 1. 由於其自回歸性質,這些模型適合生成任務。 <br/> 2. 可以較易於控制生成的文本。 | 1. 較為依賴上下文的順序,使得對於語境的瞬時理解較為困難。 <br/> 2. 不適合用於分類或其他需要瞬時理解全部輸入的任務。 | | **Encoder-Decoder** | 1. 靈活,可以適用於各種任務,包括生成和分類任務。 <br/> 2. 編碼器可以學習輸入的語境,而解碼器可以控制輸出的生成。 | 1. 較為複雜,需要更多的計算資源。 <br/> 2. 兩階段的學習(編碼和解碼)可能需要更精細的調校。 | ### 模型如何學習文本中詞與詞之間的關係,需要怎麼樣的損失函數? Transformers模型(例如BERT或GPT)主要通過捕捉文本中的上下文信息來學習詞與詞之間的關係。不同的模型可能有不同的學習策略,但基本都是在大量未標記文本上進行無監督學習。 例如,**GPT使用了一種稱為"==自回歸=="(Autoregressive)的策略,它在每一步儘量去預測下一個詞**,也就是給定前面的詞去預測後面的詞。這種設定允許模型捕捉詞序列中的統計規律,並且學習到詞與詞之間的關係。 **BERT則使用了一種稱為"==掩碼語言模型=="(Masked Language Model)的策略,它隨機地從輸入中掩蔽一些詞**,然後儘量去預測這些被掩蔽的詞。這種設定允許模型在預測每個詞時都能看到其左右的上下文,從而能夠更好地捕捉詞與詞之間的關係。 對於這些設定,常用的損失函數是交叉熵損失(Cross-Entropy Loss)。在實際操作中,這個損失函數會優化模型的預測結果,使其越來越接近實際的目標結果。具體來說,模型會試圖最大化預測正確詞的概率,並最小化預測錯誤詞的概率。 在實際應用中,我們通常不需要自己設計這些策略和損失函數,因為現有的深度學習框架(例如TensorFlow或PyTorch)和相關的轉換器模型庫(例如Hugging Face的Transformers)已經提供了這些功能。我們只需要選擇適當的預訓練模型,並根據我們的任務需求進行微調即可。 ## Embedding ### Embedding是如何被訓練出來的? 在語言模型中,詞嵌入(word embeddings)是將單詞或詞語從語料庫中轉換為向量的過程。詞嵌入方法可被視為學習一種映射,其中相似的詞會被映射到向量空間中的相近位置。以下是一些常見的詞嵌入模型,並說明了它們是如何被訓練的: 1. **Word2Vec**:Word2Vec是一種常見的詞嵌入方法,由Google於2013年提出。Word2Vec包含兩種模型:CBOW(Continuous Bag of Words 和 Skip-gram。CBOW模型預測目標詞(中心詞)給定上下文(周圍的詞),而Skip-gram模型則嘗試預測上下文給定目標詞。通過這種方式,詞嵌入被學習為一種結果,其中相似的詞被映射到向量空間的相近位置。 2. **GloVe**(Global Vectors for Word Representation):GloVe是由斯坦福大學開發的詞嵌入方法。GloVe將整個語料庫的統計信息集合在一起,並且在這些信息上訓練詞嵌入。特別是,它將共現矩陣(即詞與詞共同出現的次數)分解為兩個詞嵌入向量的點積。 3. **FastText**:FastText是Facebook於2016年提出的詞嵌入方法。不同於Word2Vec和GloVe只考慮整個詞的表示,FastText會將詞分解為子詞,然後學習子詞的詞嵌入。這使FastText能夠更好地處理罕見詞和新詞。 4. **Transformers**:轉換器模型(如BERT、GPT等)也學習詞嵌入,它們通常在更大的上下文中考慮詞,包括考慮詞的左側和右側的詞。這種類型的模型通常使用自我注意力機制來學習詞和其他詞之間的關係。 在所有這些方法中,詞嵌入是通過優化一種目標函數來學習的,該函數捕獲了詞與詞之間的關係。 ### Transformers是如學習學習詞嵌入,與需要準備什麼樣形態的資料? Transformers模型,例如BERT(Bidirectional Encoder Representations from Transformers)或GPT(Generative Pretrained Transformer),學習詞嵌入的方法與Word2Vec或GloVe等傳統詞嵌入技術有所不同。他們通常在更大的上下文中考慮單詞,包括考慮單詞的左側和右側的詞。以下是該過程的詳細步驟: 1. **Tokenization**:首先,原始文本會被分解成一個一個的詞或子詞,這個過程被稱為分詞(Tokenization)。比如BERT模型使用WordPiece算法將單詞分解成更小的子詞,這樣可以更好地處理罕見詞和新詞。 2. **Embedding**:每個詞或子詞被映射到一個初始的詞向量,該向量是在模型訓練過程中被學習的。這個初始詞向量通常是隨機初始化的,然後通過訓練來更新。 3. **Position Encoding**:因為Transformer模型本身並不考慮詞的順序,所以需要添加位置編碼(Position Encoding)來捕獲詞序的信息。每個詞的位置編碼被添加到它的詞向量上。 4. **Self-Attention**:在self-attention階段,模型會計算每個詞與其他所有詞的關係。具體來說,模型會學習每個詞應該“關注”其他哪些詞,並且這些“關注”的程度是多少。 **在自注意力(Self-Attention)機制中,V、Q和K分別代表"Value"、"Query"和"Key"。以下是這些項目的具體含義:** ![](https://hackmd.io/_uploads/ByIZq4g_3.png) - **Query(Q)**:Query是對當前輸入的表示,它將用來與Key進行比較以判斷各個輸入的重要性。每個輸入都有一個Query。 - **Key(K)**:Key是用於與Query進行匹配的表示。通常,每個輸入都有一個Key,並且這些Key將用於計算與每個Query的匹配程度。這個匹配程度(或相似性得分)進一步確定了各個輸入對最終輸出的貢獻程度。 - **Value(V)**:Value是每個輸入的實際表示。一旦根據Query和Key計算出了各個輸入的重要性,就可以用這些重要性權重來對Value進行加權平均,得出最終的輸出。 **在Transformer模型中的自注意力機制裡,Q(Query)、K(Key)、和V(Value)會經過以下的運算:** ![](https://hackmd.io/_uploads/SkaN9NgO2.png) 1. **Dot Product**:首先,會對Query(Q)和Key(K)進行點積運算。也就是說,對於每一個Query,都會和所有的Keys進行點積運算,產生一個分數。這個分數表示了每一個Key(和對應的Value)對該Query的重要性。 2. **Scaling**:接著,將點積後的分數除以一個縮放因子,通常是Key向量維度的平方根。這個縮放可以幫助穩定模型,避免在計算軟最大化時因為分數過大而導致的梯度消失問題。 3. **Softmax**:然後,對縮放後的分數進行softmax運算,將分數轉換成概率分布。這樣,所有的Keys對該Query的影響力加總起來會等於1。 4. **Multiplication**:接下來,將這些概率分布與對應的Value(V)相乘。這就給了我們每一個Value一個權重,該權重由Query和對應的Key的關聯性決定。 5. **Summation**:最後,將所有的加權Value相加,產生了該Query的輸出。 以上的步驟會對每一個Query執行,從而產生一系列的輸出。每個輸出都是輸入的加權組合,並且這些權重由每個輸入與該Query的關聯性決定。 5. **Aggregation**:在多個self-attention頭中,模型將學習到的詞向量進行匯聚和轉換,從而生成新的詞向量。 ![](https://hackmd.io/_uploads/HJB4sExdn.png) 至於所需的數據,Transformers通常需要大量的未標記的文本數據。這些數據不需要特殊的標註或格式,模型會自動學習文本中詞與詞之間的關係。但需要注意的是,由於Transformer模型的大小通常非常大,所以在實際運用中,我們通常會使用預訓練好的模型,而不是從頭開始訓練。