【論文筆記】Improving Language Understanding by Generative Pre-Training

Improving Language Understanding by Generative Pre-Training

文章目錄

  • Improving Language Understanding by Generative Pre-Training
    • Abstract
    • 1 Introduction
    • 2 Related Work
      • Semi-supervised learning for NLP
      • Unsupervised pre-training
      • Auxiliary training objectives
    • 3 Framework
      • 3.1 Unsupervised pre-training
      • 3.2 Supervised fine-tuning
      • 3.3 Task-specific input transformations
    • 4 Experiments
      • 4.1 Setup
        • Unsupervised pre-training
          • 數據集
          • 模型細節
          • 微調細節
      • 4.2 Supervised fine-tuning
        • Natural Language Inference
        • Question answering and commonsense reasoning
        • Semantic Similarity
        • Classification
    • 5 Analysis
      • Impact of number of layers transferred
      • Zero-shot Behaviors
      • Ablation studies
    • 6 Conclusion
    • 補充部分
      • 1. 遍歷式方法 (traversal-style approach)
      • 2. 字節對編碼 (Byte Pair Encoding)
        • Sub-word-based tokenization
        • Encoding and Decoding
        • Final Part
      • 3. 高斯誤差線性單元 (Gaussian Error Linear Unit, GELU)
    • 15

Abstract

背景:自然語言理解包括廣泛的不同任務,如文本蘊涵、QA問答、語義相似性評估和文檔分類。

問題:盡管大型未標記文本語料庫(corpora)非常豐富;但用于學習特定任務的標記數據卻很少,這使得采用傳統的有監督深度學習方法訓練得到的模型表現較差。

解決:通過對多樣未標記文本語料庫進行語言模型的生成式預訓練,再對每個特定任務進行針對性微調,可以在這些具體特定任務上具有良好表現。這也說明在早期 GPT 中還是強調 “預訓練+微調” 范式的,還沒有涉及到提示學習這方面的內容。

優勢:與以前的方法相比,GPT-1 在微調過程中利用有任務針對性(task-aware)的輸入信息變換來實現有效的下游任務遷移,同時只需要對模型架構進行極小的更改

實驗:通用任務無關的預訓練模型的性能優于經過針對性訓練的模型,這些針對性訓練的模型專門為每個任務設計獨特的網絡架構。在所研究的 12 個任務中,有 9 個任務顯著超越了現有模型,達到 SOTA (2018年)。在常識推理(Stories Cloze Test)上實現了8.9%的絕對提升;在問題回答(RACE)上實現了5.7%的絕對提升;在文本隱含題(MultiNLI)上實現了1.5%的絕對提升。

1 Introduction

模型具有從原始文本中有效學習的能力,對于減輕自然語言處理中對有監督學習的依賴至關重要。大多數深度學習方法都需要大量的手動標記數據,這是耗時和昂貴的,這限制了這些深度學習方法在許多缺乏注釋資源的領域中的適用性。無監督范式的學習相對更好,經過無監督范式的學習模型可以利用未標記文本中的語言信息,還可以學習良好的表征顯著提高性能。作者給出的無監督范式的例子就是預訓練詞嵌入,它提升了多個NLP任務能力。

從未標記的文本中利用更多的單詞級信息是具有挑戰性的,主要有兩個原因。首先,還不清楚哪種類型的優化目標在學習對特定任務遷移有效的文本表征時最有效(當時調研是:語言模型、機器翻譯和話語連貫性)。其次,對于將這些學習到的表征遷移到目標任務中的最有效的方法是什么(當時調研是:修改模型結構、使用復雜學習方案以及增加輔助學習目標),目前還沒有達成共識。

本文中探索了一種半監督的語言理解任務方法,使用無監督預訓練監督微調,目標是學習一種普遍的文本表征,它只需要很少的調整就能適應到廣泛的任務。假設存在大量的未標記文本語料庫和若干手動注釋的特定目標的有監督訓練樣本。論文設置不要求這些 目標任務未標記的語料庫 在相同的 任務領域 中。

論文的工作主線:采用了一個兩階段的訓練程序。首先,在未標記數據上使用語言建模目標來學習神經網絡模型的初始參數。隨后,使用相應的有監督目標將這些參數調整為適應目標任務的參數。

接下來作者提到了模型選擇:使用 Transformer 。它已經被證明在各種任務上表現出色。與循環神經網絡等方案相比,這個模型提供了更結構化的記憶/文本處理能力,用于處理文本中的長距離依賴關系,從而能在下游不同任務中表現出魯棒的遷移性能。在下游特定任務遷移過程中,源于遍歷式方法,使用任務特定的的輸入適應,該方法將結構化文本的輸入處理為單個連續的標記序列這些適應性處理能有效地對預訓練模型架構進行最小的調整。


2 Related Work

Semi-supervised learning for NLP

論文的工作廣泛地屬于自然語言處理的半監督學習的范疇。最早的方法使用未標記數據來計算單詞級或短語級統計數據,然后將其作為有監督學習模型的特征,例如詞嵌入模型。這些方法主要是傳遞單詞級的信息,而作者的目標是捕獲更高級別的語義。更高級別的語義信息也有人在研究,也出現了從未標記的數據中學習和利用更多的詞級語義的方法。短語級或句子級嵌入可以使用未標記語料庫進行訓練,已被用于將文本編碼為各種目標任務的向量表征。

Unsupervised pre-training

無監督預訓練是半監督學習的一種特殊情況,其目標是找到一個好的初始化點,而不是修改有監督的學習的目標。預訓練作為一種正則化方案,使深度神經網絡能夠更好的泛化無監督預訓練方法已被用于幫助訓練深度神經網絡的各種特定任務,如圖像分類、語音識別、實體消歧和機器翻譯。

作者的工作主線是無標記的語料庫使用語言建模目標進行預訓練+下游任務有標簽樣本使用監督目標進行微調。之前也有學者做出相關的工作,但是這些學者對 LSTM 模型的使用無監督預訓練,將其預測能力限制在較短的句子長度范圍內。作者使用 Transformer 架構很好地處理文本中的長距離依賴關系,在自然語言推理,釋義檢測和故事完成等比較考驗長距離依賴的任務實驗中展現了高效性。

其他方法使用預訓練的語言或機器翻譯模型的表征信息作為特定任務有監督學習訓練模型的輔助特征。這種方法的側重點還是在特定任務的從 0 開始的有監督式訓練,這涉及到每個單獨的目標任務的大量新的參數的處理。而作者的 GPT-1 只需要對模型體系結構進行最小的更改。

Auxiliary training objectives

添加輔助無監督訓練的目標是半監督學習的另一種形式。早期的工作使用了多樣的輔助 NLP 任務,如 POS 標記、分塊、命名實體識別和語言建模來改進語義角色標記任務,也有工作在特定任務的目標中添加了一個輔助的語言建模目標。作者實驗也嘗試使用了一個輔助目標,但結果表明無監督的預訓練已經學習到了與目標任務相關的幾個語言方面的潛在知識。


3 Framework

3.1 Unsupervised pre-training

給定一個無監督標簽的 token 形式的語料庫 U = { u 1 , ? , u n } U = \{u_1,\cdots ,u_{n}\} U={u1?,?,un?} 使用一個標準的語言建模目標來最大化以下似然函數:
L 1 ( U ) = ∑ i log ? P ( u i ∣ u i ? 1 , ? , u i ? k ; Θ ) (1) L_{1}(U)=\sum\limits_{i}\log P(u_{i}|u_{i-1},\cdots,u_{i-k};\Theta) \tag{1} L1?(U)=i?logP(ui?ui?1?,?,ui?k?;Θ)(1)
其中, k k k 為上下文窗口(context window)的大小,條件概率 P P P 使用參數為 Θ \Theta Θ 的神經網絡建模(也就是搭建一個參數為 Θ \Theta Θ 的神經網絡,輸入為 { u i ? 1 , ? , u i ? k } \{u_{i-1},\cdots,u_{i-k}\} {ui?1?,?,ui?k?} 的 token 序列,輸出是 u i u_{i} ui?。參數為 Θ \Theta Θ 的神經網絡采用隨機梯度下降法進行訓練。

1

GPT-1 是一個多層 Transformer 解碼器的語言模型,這是原來 Transformer 的一個變體。該模型對輸入上下文 token 序列進行多端自注意力計算,然后進行位置級 FFNN 計算,以產生目標 token 在總 token 列表上的輸出分布。
{ h 0 = U W e + W p MaskedAttention ( Q , K , V ) = softmax ( Mask ( Q K T d k ) ) V h i = transformer?block ( h i ? 1 ) , ? i = 1 ? n P ( U ) = softmax ( h n W e T ) (2) \begin{cases} h_{0} &= UW_{e}+W_{p} \\ \text{MaskedAttention}(Q,K,V) &= \text{softmax}\big(\text{Mask}(\frac{QK^{T}}{\sqrt{d_{k}}})\big)V \\ h_{i} &= \text{transformer block}(h_{i-1}),\forall i=1\cdots n \\ P(U) &= \text{softmax}(h_{n}W_{e}^{T}) \\ \end{cases} \tag{2} ? ? ??h0?MaskedAttention(Q,K,V)hi?P(U)?=UWe?+Wp?=softmax(Mask(dk? ?QKT?))V=transformer?block(hi?1?),?i=1?n=softmax(hn?WeT?)?(2)
其中 U ? = ( u : ? k , ? , u : ? 1 ) \vec{U}= (u_{:?k},\cdots, u_{:?1}) U =(u:?k?,?,u:?1?) 是 token 的上下文向量, n n n 是層數

W e W_{e} We? 是 token 的嵌入矩陣, W p W_{p} Wp? 是位置嵌入矩陣(位置編碼)。

3.2 Supervised fine-tuning

After training the model with the objective in ( 1 ) (1) (1), we adapt the parameters to the supervised target task. We assume a labeled dataset C C C, where each instance consists of a sequence of input tokens, x 1 , ? , x m x_1,\cdots ,x_m x1?,?,xm? along with a label y y y. The inputs are passed through our pre-trained model to obtain the final transformer block’s activation h l m h^{m}_{l} hlm? , which is then fed into an added linear output layer with parameters W y W_y Wy? to predict y y y.

2

( 1 ) (1) (1) 的目標預訓練模型后,根據下游特定任務調整參數。假設一個有標簽的數據集 C C C,其中每個實例由一系列輸入token x 1 , ? , x m x_1,\cdots ,x_m x1?,?,xm? 以及標簽 y y y 組成。輸入 token 輸入到預先訓練的模型,以獲得最終 transformer 解碼器塊的激活函數輸出 h l m h^{m}_{l} hlm? ,然后將 h l m h^{m}_{l} hlm? 輸入到添加的帶有參數 W y W_y Wy? 的線性輸出層以預測 y y y
P ( y ∣ x 1 , ? , x m ) = softmax ( h l m W y ) (3) P(y|x_{1},\cdots,x_{m})=\text{softmax}(h_{l}^{m}W_{y}) \tag{3} P(yx1?,?,xm?)=softmax(hlm?Wy?)(3)
這就衍生出了監督學習階段的訓練目標:
L 2 ( C ) = ∑ ( x 1 , ? , x m ; y ) log ? P ( y ∣ x 1 , ? , x m ) (4) L_{2}(C)=\sum\limits_{(x_{1},\cdots,x_{m};y)}\log P(y|x_{1},\cdots,x_{m}) \tag{4} L2?(C)=(x1?,?,xm?;y)?logP(yx1?,?,xm?)(4)
此外作者發現,將語言建模目標作為微調的輔助目標(也就是額外增加類似 ( 1 ) (1) (1) 的目標只是把 ( 1 ) (1) (1) 中的上下文向量換成標簽數據集的 x 1 , ? , x m x_1,\cdots ,x_m x1?,?,xm?有助于學習、改進有監督學習下的模型泛化程度,以及加速有監督學習的收斂。感覺也強化了在下游特定數據集上的語言建模,更深入一點的想法就是將預訓練的語言知識對齊到了下游特定數據集的語言知識,所以輔助目標可以加強下游本質知識的學習(自我發散一下hhhh)。
L 3 ( C ) = L 2 ( C ) + λ L 1 ( C ) (5) L_{3}(C)=L_{2}(C)+\lambda L_{1}(C) \tag{5} L3?(C)=L2?(C)+λL1?(C)(5)
這個涉及到了一點點多目標優化方面, L 1 ( C ) L_{1}(C) L1?(C) 是額外的語言建模目標,可以設置優先級程度,來評判是 “特定數據集標簽學習” 優先還是 “特定數據集的語言知識學習” 優先,靠的是 λ \lambda λ 參數的調節。

總的來說,在微調過程中唯一需要的額外添加的參數是 W y W_y Wy? 和分隔符標記的嵌入 W e W_{e} We?

還要注意一點是,GPT-1 的微調過程,對特定數據集的句子是經過處理的,具體是每個句子前后都增加了特殊的 token ,以及多個句子之間的銜接 token 。這在論文的 3.3 部分提及。

3.3 Task-specific input transformations

對于一些任務,比如文本分類,可以直接微調如上所述的模型。某些其他任務,如問題回答或文本蘊含,都有結構化的輸入,如:有序的句子對,或三元組文檔、問題和答案。由于預訓練模型是在連續的文本序列上進行訓練的,所以需要進行一些修改來將其應用于這些特定的任務。

作者使用了一種遍歷風格的方法,將結構化的輸入轉換為一個有序的序列,這樣便可以在預訓練過的模型中處理。這些輸入轉換避免了跨任務對模型結構進行大量的更改。所有的輸入轉換都包括添加隨機初始化的開始和結束 token (<s>,<e>)

task namedescription
Textual entailment將前提 p p p 和假設 h h h token 序列連接起來,中間有一個分隔符標記($
Similarity對于相似性任務,被比較的兩個句子沒有固有的排序。作者修改了輸入序列,以包含兩個可能的句子順序(中間有一個分隔符,也就是 “前” + “后” 和 “后” + “前” ,組成兩個序列),并獨立處理每個序列,以生成兩個序列表示 h l , 1 m h_{l,1}^{m} hl,1m? h l , 2 m h_{l,2}^{m} hl,2m?,在輸入線性輸出層之前按元素添加。
Question Answering and Commonsense Reasoning對于這些任務,有一個上下文文檔 z z z 、一個問題 q q q 和一組可能的答案 a k {a_k} ak? 。將文檔上下文、問題和每個可能的答案連接起來,在中間添加一個分隔符標記,以獲得 [ z ; q ; [z;q; [z;q;$ ; a k ] ;a_k] ;ak?] 。這些序列中的每一個都用單獨的一個模型獨立處理,然后通過一個 softmax 層進行歸一化,以產生一個可能答案的輸出分布。

4 Experiments

4.1 Setup

Unsupervised pre-training
數據集

使用 BooksCorpus 數據集來訓練語言模型。它包含 7000 多本獨特的未出版書籍,涵蓋 冒險、奇幻和浪漫 等多種類型。它包含長段的連續文本,這使得生成模型具有長序列文本的學習條件。作者給出了不選擇其他數據集的原因: the 1B Word Benchmark 在句子級就被打亂了,破壞了長序列文本的結構。GPT-1 語言模型在這個 1B Word Benchmark 上實現了非常低的 token 級別 18.4 困惑度。

模型細節

GPT-1 模型在很大程度上遵循了原始的 Transformer 工作。

訓練了一個 12 層堆疊解碼器的、具有多端自注意力機制的 Transformer 解碼器( d m o d e l = d_{model}= dmodel?= 768 維嵌入維度12 個注意頭如果按照 Transformer 分端但是不改變總維度的話,每個端分到 768 12 = 64 \frac{768}{12}=64 12768?=64 維度的子空間)。

位置級 FFNN 中間層是 3072 維也就是 768 → 3072 = 768 × 4 → 768 768\rightarrow 3072=768\times 4\rightarrow 768 7683072=768×4768

使用了 Adam 優化方案,最大學習率為 2.5 e ? 4 2.5e^{-4} 2.5e?4 。在前 2000 次更新中,學習率從 0 線性增加,隨后使用余弦函數方案退火到 0 ,根據原始 Transformer 的論文, w a r m u p _ s t e p = 2000 warmup\_step=2000 warmup_step=2000

在 64 個隨機采樣的、包含 512 個 token 的連續序列的小批量上訓練 100 個 epoch。

layernorm 歸一化處理在整個模型中被廣泛使用,所以需要一個簡單的服從 N ( 0 , 0.02 ) N(0,0.02) N(0,0.02) 正態分布的權重初始化。

使用了一個包含 40000 個的字節對編碼(Byte Pair Encoding)詞匯表。將嵌入注意力機制用 dropout=0.1 進行正則化。對所有非偏置參數權值采用了 w = 0.01 w=0.01 w=0.01 的 L2 正則化。

對于激活函數,使用高斯誤差線性單元(Gaussian Error Linear Unit, GELU)

使用了學習到的位置嵌入,而不是在原始工作中提出的正弦版本。

使用 ftfy 庫來清理 BooksCorpus 數據集中的原始文本,標準化一些標點符號和空格,使用 spaCy 標記器獲得 token 。


微調細節

除非特別指定,否則將重用來自無監督的預訓練的超參數設置。

對于分類任務以 dropout=0.1 正則化。對于大多數任務,使用的學習率為 6.25 e ? 5 6.25e^{-5} 6.25e?5 ,批量大小為32。

模型微調 3 個 epoch 對于大多數情況下是足夠的。

使用一個線性學習率衰減計劃。

( 5 ) (5) (5) 中的 λ λ λ 被設置為 0.5 ,也就是用于特定任務的微調的工作優先級高于特定數據集語義理解的兩倍

4.2 Supervised fine-tuning

4

在各種監督任務上進行實驗,包括自然語言推理、問題回答、語義相似性和文本分類。其中一些任務可以作為最近發布的 GLUE 多任務基準測試的一部分使用。

Natural Language Inference

5

自然語言推理的任務,也稱為識別文本蘊含,包括閱讀一對句子,從蘊含、矛盾或中性來判斷它們之間的關系。這項任務仍然具有挑戰性是因為存在各種各樣的現象,如詞匯隱含、共引用、詞匯和句法歧義。實驗中對 5 個來源不同的數據集進行了評估,包括圖像標題(SNLI)、轉錄演講、流行小說和政府報告(MNLI)、維基百科文章(QNLI)、科學考試(SciTail)或新聞文章(RTE),括號里面都是數據集名稱

GPT-1 在 5 個數據集中的 4 個顯著優于基線,在政府報告(MNLI)數據集上,達到 5%,在維基百科文章(QNLI)上達到 5.8%,在圖像標題(SNLI)上達到 0.6%。這表明了 GPT-1 能夠更好地推理多個句子,并處理語言歧義的各個方面。在新聞文章(RTE)上,評估一個較小的數據集(2490個例子),GPT-1 實現了 56% 的準確率,低于多任務biLSTM模型報告的 61.7% 。

Question answering and commonsense reasoning

5

另一個需要單句和多句推理方面的任務是回答問題。使用最近發布的 RACE 數據集,包括英語段落和中學考試的相關問題。與其他數據集如 CNN 或 SQuaD 相比,這個語料庫包含了更多的推理類型問題,適合訓練 GPT-1 來處理長上下文。

還對 Story Cloze Test 進行了評估,它涉及到從兩個選項中選擇多句故事的正確結尾。在這些任務上, GPT-1 再次顯著地超過了之前的最佳結果——在 Story Cloze Test 上高出 8.9% ,在 RACE 上高達 5.7% 。這證明了 GPT-1 能夠有效地處理長上下文。

Semantic Similarity

7

語義相似性(或釋義檢測)任務包括預測兩個句子在語義上是否相等。挑戰在于識別概念的重新措辭,理解否定和處理句法歧義。使用三個數據集來完成這個任務——從新聞來源收集的微軟釋義語料庫(MRPC)、Quora問題對(QQP)數據集和語義文本相似度基準(STS-B)。在三個語義相似性任務中的兩個任務上獲得了最好的結果,在語義文本相似度基準(STS-B)上,該任務的絕對漲點為 1 分。Quora問題對上的性能增量是顯著的,比單任務BiLSTM + ELMo + Attn 有 4.2% 的絕對改進。

Classification

評估了兩種不同的文本分類任務。語言可接受性語料庫(CoLA)包含了對一個句子是否符合語法要求的專家判斷,并測試了訓練模型的先天語言偏見。斯坦福情緒 Treebank(SST-2)是一項標準的二元分類任務。 GPT-1 在 CoLA 上得到了 45.4 分,比之前 35.0 的最佳結果有一個巨大的飛躍,顯示了 GPT-1 所學到的先天語言偏差GPT-1 在 SST-2 上也達到了 91.3% 的準確率。在 GLUE 基準測試上也獲得了 72.8 分的總分,這明顯優于之前最好的 68.9 分。


總的來說, GPT-1 在評估的 12 個數據集中有 9 個實現了新 SOTA ,在許多情況下優于模型的集成版本。 GPT-1 在不同大小的數據集上也有良好表現,從較小的數據集,如語義文本相似度基準(STS-B)數據集( ≈ 5.7 k \approx 5.7k 5.7k 訓練示例)到最大的一個圖像標題(SNLI)數據集( ≈ 550 k \approx 550k 550k 訓練示例)。

5 Analysis

Impact of number of layers transferred

8

觀察了將可變數量的解碼器層無監督的預訓練結果遷移到有監督的目標任務的影響。圖2左半部分說明了 GPT-1 在文本隱含題(MultiNLI)數據集和 RACE 數據集上的精度性能,作為傳輸層數的函數。觀察到標準結果是:傳輸嵌入提高性能,每個 Transformer 的解碼器層在文本隱含題(MultiNLI)數據集上完全遷移可提供高達 9% 的好處。沒有遷移層則說明是預訓練模型直接用于特定數據集的推理,也有 50-60% 的效果。這表明,預先訓練過的模型中的每一層都包含了用于解決目標任務的有用功能。

Zero-shot Behaviors

9

這部分主要是回答為什么 Transformer 的語言模型預訓練是有效的。

一個假設是,底層生成式模型在微調過程中學會了執行評估的許多任務,以進一步提高其語言建模能力,并且與 LSTM 相比,Transformer 內在的更結構化的注意力記憶有助于遷移。‘

作者進一步設計了一系列啟發式解決方案,使用底層生成式模型來執行任務,而無需監督微調。

結果發現:這些啟發式方法的性能是穩定的,并且在訓練過程中穩步增加,這表明生成式預訓練語言模型支持各種任務相關功能的進一步/持續地學習,此外,LSTM 在其 zero-shot 性能上表現出更高的方差,這表明 Transformer 架構的內在偏差(自身學習到了更 meta-wise 的語言知識,有種 “以不變應萬變” 的感覺,因此更加穩定)有助于遷移。

Ablation studies

作者進行了三種不同的消融研究。

首先,在微調過程中檢驗了沒有輔助語言模型訓練目標方法的性能。結果顯示,輔助目標有助于自然語言理解任務和特定的 Quora 問題對(QQP)數據集。這表明,較大的數據集受益于輔助目標,但較小的數據集卻沒有

其次,通過與單層 2048 單元 LSTM 進行比較來分析 Transformer 的效果。結果顯示,當使用 LSTM 而不是 Transformer 時,平均分數下降了 5.6 分。LSTM 只在一個數據集——微軟釋義語料庫(MRPC)特定數據集的性能優于 Transformer 。

最后,還比較了用 Transformer 架構直接訓練的監督目標任務,沒有預先訓練。結果顯示,訓練的缺乏損害了所有任務的表現,導致與我們的完整模型相比下降了14.8%。

6 Conclusion

這篇論文引入了一個基于 Transformer 的框架,通過生成式預訓練和微調,獲得了一個任務無關的語言模型來實現強大的自然語言理解能力。通過在不同的語料庫與長的連續文本中預訓練一個語言模型獲得重要的世界知識和處理長句子的能力,并成功地遷移到特定任務,如問題回答、語義相似性評估、文本蘊含和文本分類,在 12 個特定任務中的 9 個達到領先水平。

使用無監督(預)訓練來提高針對性任務的性能,長期以來一直是機器學習研究的一個重要目標。作者工作表明,實現顯著的性能提升確實是可能的,并提供了關于哪些模型(Transformer 還是 LSTM)和數據集(具有長期依賴關系的文本)最適合這種方法的方案。

補充部分

1. 遍歷式方法 (traversal-style approach)

參考這篇博客。

For some tasks, like text classification, we can directly fine-tune the model by adding a linear+softmax layer. Other tasks, like question answering or textual entailment, have structured inputs such as ordered sentence pairs, or triplets of document, question, and answers. GPT model uses a traversal-style approach, where we convert structured inputs into an ordered sequence that our pre-trained model can process. These input transformations allow us to avoid making extensive changes to the architecture across tasks. All transformations include adding initialized start token, a delimiter to separate multiple sentence inputs and end tokens (Extract). For example, for textual entailment or question answering, the inputs are transformed as one sequence, with premise and hypothesis separated by the delimiter and surrounded by the Start and Extract tokens. We can also use multiple transformers and merge the outputs in the last layer for multiple choice tasks.

1

對于某些任務,比如文本分類,可以通過添加 “線性 + softmax 層” 來直接微調模型。其他任務(例如QA問答,或文本蘊涵任務)具有結構化輸入,例如有序句子對文檔、問題和答案的三元組。 GPT 模型使用遍歷式方法結構化輸入轉換為預訓練模型可以處理的有序序列這些輸入轉換能夠避免遷移到不同任務時對架構進行大量更改。所有轉換過程包括:添加初始化的開始標記、用于分隔多個句子輸入的分隔符結束標記。例如,對于文本蘊涵或QA問題回答,輸入的多個小句子被轉換為一個序列,前提和假設由分隔符分開,并由開始和提取標記包圍。還可以使用多個 Transformer 并合并最后一層的輸出以進行多項選擇任務(有點像模型集成)。

2. 字節對編碼 (Byte Pair Encoding)

參考這篇博客。

理解人類語言的主要部分之一是由 分詞器(tokenizers) 發揮的。 分詞(Tokenization) 算法可以是基于單詞、子詞或字符的。每種類型的分詞器都幫助機器以不同的方式處理文本,分詞器各自具有優勢。

單詞(word)和子詞(sub-word)是語言學中常用的術語。單詞是語言中最小的、能夠獨立使用的單位,具有獨立的意義。而子詞是指構成單詞的更小的單元,通常是指單詞中的前綴后綴或者詞根等部分。子詞通常不能獨立使用,需要依附在其他單詞上才能發揮作用。在自然語言處理和計算機領域,子詞也指的是單詞的部分,常用于分詞(tokenization)和詞嵌入(word embedding)等任務中。總的來說,單詞是語言的基本單位,而子詞是構成單詞的更小部分。

在這些分詞器中,最流行的是基于子詞的分詞器。大多數 SOTA 的 NLP 模型都使用該分詞器。

Sub-word-based tokenization

基于子詞的 tokenization 是基于單詞和基于字符(character)的 tokenization 之間的解決方案。主要思想是解決基于單詞的 tokenization 存在非常大的詞匯量、大量的詞匯分布外的 tokenization 以及非常相似的單詞的不同含義(比如 knownunknown 之間);以及基于字符的 tokenization 存在非常長的序列和意義不大的單個 token 所面臨的問題。

基于子詞的 tokenization 算法不會將頻繁使用的單詞分割成更小的子詞。它將罕見的單詞分成更小的、有意義的子詞。boy 不被拆分,但 boys 被拆分為 boys 。這有助于模型了解到單詞 boys 是由單詞 boy 組成的,含義略有不同,但詞根相同。

一些流行的子詞 tokenization 算法是 WordPiece、字節對編碼 (Byte Pair Encoding, BPE)、Unigram 和 SentencePiece。字節對編碼用于 GPT-2、RoBERTa、XLM、FlauBERT 等語言模型。其中一些模型使用空間標記化(Space tokenization)作為 預標記化(pre-tokenization) 方法,而少數模型使用 Moses、spaCY、ftfy 提供的更高級的預標記化方法。

字節對編碼 BPE 是一種簡單的數據壓縮算法,它將數據中最常見的一對連續字節替換為該數據中不出現的字節。它首次在 1994 年發表的文章 “A New Algorithm for Data Compression” 中被描述。

假設有需要編碼壓縮的數據 aaabdaaabac 。字節對 aa 出現的頻率最高,因此用 Z 代替字節對 aa ,因為 Z 不會出現在原來數據中。因此,現在有了 ZabdZabac ,其中 Z = aa 。下一個常見的字節對是 ab ,因此用 Y 來替換它。現在有 ZYdZYac ,其中 Z = aaY = ab剩下的唯一字節對是 ac ,它只出現一次,所以不對它進行編碼。可以使用 遞歸字節對編碼(recursive byte pair encoding)ZY 編碼為 X 。現在,數據已轉換為 XdXac ,其中 X = ZYY = abZ = aa 。由于轉換后的數據 XdXac 沒有出現超過一次的字節對,因此無法進一步壓縮。以相反的順序進行替換,對數據進行解壓縮。


BPE 確保 最常見的單詞 表示為在詞匯表中的 單個 token ,而 生僻單詞 被分解為 兩個或多個子詞 token ,這與基于子詞的 tokenization 算法的功能一致。

假設有一個包含若干單詞的語料庫(在 Space pre-tokenization 之后):oldolderfinestloweast 。然后計算這些單詞在語料庫中出現的頻率。假設這些詞,在每個單詞后面增加一個 token </w>,其頻率如下:{“old</w>”: 7, “older</w>”: 3, “finest</w>”: 9, “lowest</w>”: 4} 在每個單詞的末尾添加 </w> token 以標識單詞邊界,以便算法知道每個單詞的結尾位置,這有助于算法查看每個字符并找到頻率最高的字符配對。

接下來,將每個單詞拆分為字符并計算它們的出現次數。初始 token 將是所有字符和 </w> 標記。

10

由于總共有 23=7+3+9+4 個單詞,因此有 23 個 </w> token ;第二高頻率的 token 是 e ;總共有 12 種不同的 token 。The next step in the BPE algorithm is to look for the most frequent pairing, merge them, and perform the same iteration again and again until we reach our token limit or iteration limit.
BPE 算法的下一步是尋找最頻繁的配對,合并它們,并一次又一次地執行相同的迭代,直到達到令牌限制迭代限制
合并操作可以用最少數量的 token 表示語料庫,這是 BPE 算法的主要目標,即數據壓縮。為了進行合并操作,BPE 會查找最常表示的字節對。BPE 概念中將字符(character)視為與字節(byte)相同,這是英語的情況,在其他語言中可能會有所不同。現在,將合并最常見的字節對以形成一個 token ,并將它們添加到 token 列表中,并重新計算每個 token 的出現頻率。這意味著頻率計數將在每個合并步驟后發生變化。將繼續執行此合并步驟,直到達到迭代次數達到令牌限制大小


迭代 1:將從第二個最常見的標記 e 開始(這就意味著不會找 de 而是會找 eres )。在語料庫中,最常見的帶有 e 的字節對是 es (在 finestloweast 的單詞中),它們出現了 9 + 4 = 13 次。將它們合并以形成一個新的 token es ,并將其頻率記為 13。還將從單個 token ( es )中減少計數 13。這將使我們知道剩余的 es token。可以看到, s 根本不單獨出現, e 出現了 3 次。以下是更新后的表格:

11

迭代 2:現在將合并 est 這兩個詞,因為它們在語料庫中出現了 13=9+4 次。這樣,就有了一個頻率為 13 的新標記詞 est ,將 est 的頻率降低 13。

12

迭代 3:現在來處理 </w> token 。 est</w> 這對字節在語料庫中出現了 13 次。

13

注意:合并停止 token </w> 非常重要。這有助于算法理解 estimatehighest 等詞之間的區別。這兩個詞都有 est 的共同點,但一個在末尾有一個 est token,一個在開頭有一個 est token。因此,像 estest</w> 這樣的 token 將以不同的方式處理。如果算法看到 est</w> ,它將知道它是單詞 highest 的 token ,而不是單詞 estimate 的 token 。


經過多輪合并后,得到的表格是這樣的:

14

如果我們現在查看表格,會發現 fin 的頻率是 9,但只有一個單詞包含這些字符,因此不會將它們合并。為了本文的簡單起見,現在停止迭代并仔細查看 token 。從表格中可以發現:頻率計數為 0 的標記已從表中刪除;現在可以看到總標記數為 11,這比最初的計數少 12 個。這是一個很小的語料庫,但在實踐中,大小減少了很多。這個包含 11 個 token 列表將作為詞匯表。


當添加 token 時,每個 token 的計數頻率會增加或減少或保持不變。實際上, token 數量先增加然后減少。停止標準可以是 token 的計數計數頻率迭代的次數。選擇合適的停止標準,以便數據集可以以最有效的方式分解為 token 。

Encoding and Decoding

如何解碼?要解碼,必須簡單地將所有 token 連接在一起以獲得整個單詞。例如,編碼序列 [“the</w>”, “high”, “est</w>”, “range</w>”, “in</w>”, “Seattle</w>” ] 將被解碼為 [“the”, “highest”, “range”, “in”, “Seattle”] 而不是 [“the”, “high”, “estrange”, “in”, “Seattle ”] 。請注意 est</w> 中存在 </w> 標記。

新數據的編碼過程也很簡單。但是,編碼本身的計算成本很高。假設詞序列為 ["the", "highest", "range", "in", "Seattle"] 。將遍歷我們在語料庫中找到的從最長到最短的所有 token ,并嘗試使用這些 token 替換給定詞序中的子串。最后,將遍歷所有 token ,子串將被 token 列表中已有的 token 所替換。如果還剩下一些子串(模型在訓練中沒有看到的單詞),將用 unknown token 來替換它們。一般來說,詞匯量很大,但仍然有可能出現未知單詞。在實踐中,將 pre-tokenization 的單詞保存在字典中。對于未知(新)單詞,應用上述編碼方法對新單詞進行 tokenize ,并將新單詞的 token 添加到詞典中以供將來參考。這有助于未來建立更強大的詞匯量。

Final Part

為了以最有效的方式表示語料庫,BPE 通過查看其頻率來遍歷每個潛在的選項,以便在每次迭代時進行合并。BPE 遵循貪婪的方法來優化最佳可能的解決方案。BPE 是最廣泛使用的子詞 tokenization 算法之一,盡管算法本身是貪婪的,但它仍具有良好的性能。

3. 高斯誤差線性單元 (Gaussian Error Linear Unit, GELU)

參考這篇博客。

  1. ReLU、ELU 和 PReLU 等激活函數比 sigmoid 函數更能使神經網絡更快更好地收斂。
  2. Dropout 正則化能將一些激活神經元隨機乘以 0 來正則化模型。
  3. 一個名為 Zoneout 的新 RNN 正則化器會將輸入隨機乘以 1

上述方法共同決定神經元的輸出;然而,都是相互獨立工作的。
GELU 激活函數旨在將這些技術結合起來。

15

之所以選擇這個分布,是因為神經元的輸入遵循正態分布,尤其是在批量歸一化之后。

16

但任何激活函數的輸出都應該是確定的,而不是隨機的。由于 ? ( x ) \phi(x) ?(x) 是高斯分布的累積分布(正態分布從負無窮到當前值的積分),通常用誤差函數計算,因此我們將高斯誤差線性單元(GELU)定義如下:

17

? ( x ) \phi(x) ?(x) 是高斯分布的累積分布,通常用誤差函數計算。

18
這篇博客介紹了 GELU 的一些優勢:

  1. 平滑度:GELU 是一個平滑函數,這意味著它是連續可微的,與 ReLU 不同,ReLU 的不連續性為零。平滑屬性有助于在訓練期間進行基于梯度的優化。
  2. 恒等逼近:對于較小的 x x x 值( x < ? 2 x<-2 x<?2 的情況),GELU 類似于恒等函數,這使得它即使對于較小的激活也可以保留網絡中的信息,當 x < ? 2 x<-2 x<?2?時候,基本就是數值 0 ,這相當于小的激活函數被抑制了??
  3. 非線性:GELU 向網絡引入了非線性,這對于捕獲數據中的復雜關系至關重要。
  4. Sigmoid 和 Tanh 組件:GELU 使用 sigmoid 和雙曲正切 (tanh) 函數的組合,這有助于有效地對負值( x ∈ ( ? 2 , 0 ) x\in(-2,0) x(?2,0) 的情況)和梯度進行建模。
  5. 歸一化:GELU 包含歸一化項 2 π \sqrt{\frac{2}{\pi}} π2? ? ,以確保輸出的標準差接近 1,這有助于穩定深度神經網絡的訓練。

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

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

相關文章

Java 網絡面試題解析

1. Http 協議的狀態碼有哪些&#xff1f;含義是什么&#xff1f;【重點】 200&#xff1a;OK&#xff0c;客戶端請求成功。 301&#xff1a;Moved Permanently&#xff08;永久移除&#xff09;&#xff0c;請求的URL已移走。Response中應該包含一個Location URL&#xff0c;…

steam++加速問題:出現顯示443端口被 vmware-hostd(9860)占用的錯誤。

目錄 前言&#xff1a; 正文&#xff1a; 前言&#xff1a; 使用Steam對GitHub進行加速處理時&#xff0c;建議使用2.8.6版本。 下載地址如下&#xff1a;Release 2.8.6 BeyondDimension/SteamTools GitHub 下載時注意自己的系統位數 正文&#xff1a; 使用GitHub時會使…

NOC2023軟件創意編程(學而思賽道)python初中組初賽真題

軟件創意編程 一、參賽范圍 1.參賽組別:小學低年級組(1-3 年級)、小學高年級組(4-6 年級)、初中組。 2.參賽人數:1 人。 3.指導教師:1 人(可空缺)。 4.每人限參加 1 個賽項。 組別確定:以地方教育行政主管部門(教委、教育廳、教育局) 認定的選手所屬學段為準。 二、…

Mybatis-Plus+SpringBoot多數據源注解方式@DS

前言 最近接到一個新需求需要處理多數據源的問題 &#xff0c;今天就來和大家一起學習一下。 一、使用步驟 1.引入庫 代碼如下&#xff08;示例&#xff09;&#xff1a; <!--配置多數據源--><dependency><groupId>com.baomidou</groupId><artif…

藍橋杯Java B組歷年真題(2013年-2021年)

一、2013年真題 1、世紀末的星期 使用日期類判斷就行&#xff0c;這里使用LocalDate&#xff0c;也可以使用Calendar類 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:無需package // 2: 類名必須Main, 不可修改p…

常見問題和解決方案

OOM overview 發現監控告警 定位日志java.lang.OutOfMemoryError 避免參數配置代碼規范 example jvm性能調優實戰 -55RPC調用引發的OOM故障-阿里云開發者社區 (aliyun.com) 發現監控告警 定位日志java.lang.OutOfMemoryErrorA rpc BMAT打開堆快照文件分析histogram右擊看引…

CentOS7 Hive2.3.8安裝

CentOS7 Hive2.3.8 安裝 建議從頭用我的博客&#xff0c;如果用外教的文件到 一、9)步驟了&#xff0c;就用他的弄完&#xff0c;數據庫不一樣&#xff0c;在9步驟前還能繼續看我的 一、 安裝MySQL 0.0&#xff09;查詢mariadb,有就去0.1&#xff09;&#xff0c;沒有就不管…

python3裝飾器

裝飾器 它允許你修改函數或類的行為&#xff0c;而不更改其源代碼。實質上&#xff0c;裝飾器是接受另一個函數作為參數并返回一個包裝原始函數的新函數。這樣&#xff0c;你可以在不修改原始函數的情況下&#xff0c;添加一些額外的功能或邏輯。 def time_cost(func):"…

排隊接水問題

時間限制&#xff1a;1秒 內存限制&#xff1a;128M 題目描述 有n個人在一個水龍頭前排隊接水&#xff0c;假如每個人接水的時間為Ti&#xff0c;請編程找出這n個人排隊的一種順序&#xff08;若有多種順序則編號小的在前&#xff09;&#xff0c; 使得n個人的平均時間…

ARCGIS進行視域分析及地形圖制作

問題說明 開發商要在本區域建造觀景亭,希望在觀景亭上能看到優美的景色。根據提供的數據,完成以下要求。 一、 數據說明(見“題目3”文件夾) 1. DEM.tif:研究區域的數據高程模型數據。 2. 觀察點.shp:需要建造觀景亭的位置。

美團分布式 ID 框架 Leaf 介紹和使用

一、Leaf 在當今日益數字化的世界里&#xff0c;軟件系統的開發已經成為了幾乎所有行業的核心。然而&#xff0c;隨著應用程序的規模不斷擴大&#xff0c;以及對性能和可擴展性的需求不斷增加&#xff0c;傳統的軟件架構和設計模式也在不斷地面臨挑戰。其中一個主要挑戰就是如…

學生云服務器_學生云主機_學生云數據庫_云+校園特惠套餐

2024年騰訊云學生服務器優惠活動「云校園」&#xff0c;學生服務器優惠價格&#xff1a;輕量應用服務器2核2G學生價30元3個月、58元6個月、112元一年&#xff0c;輕量應用服務器4核8G配置191.1元3個月、352.8元6個月、646.8元一年&#xff0c;CVM云服務器2核4G配置842.4元一年&…

自注意力機制(Self-Attention)

注意&#xff1a;本文引用自專業人工智能社區Venus AI 更多AI知識請參考原站&#xff08;【http://www.aideeplearning.cn】&#xff09; Transformer模型中最關鍵部分就是自注意力&#xff08;Self-Attention&#xff09;機制&#xff0c;正如 Transformer 的論文的標題是“…

【Vue3】函數式編程(h 函數)

h 函數的原理就是 createVNode。可以使用 h 函數封裝一些小組件。 <template><table border><tr><th>name</th><th>age</th><th>操作</th></tr><tr v-for"item in list" :key"item.age"&…

shell封裝

shift 命令用于對參數的移動(左移)&#xff0c;通常用于在不知道傳入參數個數的情況下依次遍歷每個參數然后進行相應處理&#xff08;常見于Linux中各種程序的啟動腳本&#xff09; shift(shift 1) 命令每執行一次&#xff0c;變量的個數($#)減一&#xff0c;移動2位可以 執行…

數據結構實現-線性表

順序存儲 #include<iostream> using namespace std; #define MaxSize 50 //靜態順序表 template<typename ElemType> struct sqList{ElemType data[MaxSize];//元素int length;//長度 }; //動態順序表 #ifdef DEBUG //關閉啟用 #define InitSize 100 template<…

嵌入式LINUX移植、配置ssh

編譯 https://quantum6.blog.csdn.net/article/details/136299665 編譯時指定prefix&#xff0c;產生的文件會自帶這個目錄。所以直接忽略。 ./configure# 不指定編譯路徑&#xff0c;手動復制。 復制 編譯后的整個目錄打包&#xff0c;復制到開發板。寫個腳本&#xff0c…

kamacoder13.鏤空三角形的C語言解法

13. 鏤空三角形 時間限制&#xff1a;1.000S 空間限制&#xff1a;32MB 題目描述 把一個字符三角形掏空&#xff0c;就能節省材料成本&#xff0c;減輕重量&#xff0c;但關鍵是為了追求另一種視覺效果。在設計的過程中&#xff0c;需要給出各種花紋的材料和大小尺寸的三角…

零拷貝技術深入分析

一、零拷貝 在前面的文章“深淺拷貝、COW及零拷貝”中對零拷貝進行過分析&#xff0c;但沒有舉例子&#xff0c;也沒有深入進行展開分析。本文將結合實際的例程對零拷貝進行更深入的分析和說明。 在傳統的IO操作中&#xff0c;以文件通過網絡傳輸為例 &#xff0c;一般會經歷以…

go語言是如何連接mysql數據庫的?

在 Go 語言中連接 MySQL 數據庫通常使用第三方庫。目前比較流行的 MySQL 客戶端庫包括 github.com/go-sql-driver/mysql、github.com/go-xorm/xorm、github.com/jmoiron/sqlx 等。下面是一個使用 github.com/go-sql-driver/mysql 庫連接 MySQL 數據庫的簡單示例&#xff1a; 首…