大模型系统和应用——自然语言处理大模型基础
引言
最近在公眾號中了解到了劉知遠團隊退出的視頻課程《大模型交叉研討課》,看了目錄覺得不錯,因此拜讀一下。
觀看地址: https://www.bilibili.com/video/BV1UG411p7zv
目錄:
基礎與應用
自然語言處理的目的是讓計算機理解人類所說的語言。在人工智能的最開始階段,圖靈提出了圖靈測試,是判斷機器智能的一個重要手段。
簡單來說,就是讓人類與機器對話,讓人類判斷對面是否為機器人。而機器只有非常好地理解人類語言并能生成合理地回應之后,才能讓人類無法判斷出對面是機器人還是人類。
Advances in Natural Language Processing是一個非常好的自然語言處理綜述介紹,是2015年發布的。
下面我們來看一下自然語言處理的基本任務和應用。
基本任務和應用
包括詞性標注(Part of speech)、命名識別識別(Named entity recognition)、共指消解(Co-reference)和依存關系(Basic dependencies):
還有一些和語言相關的任務,比如中文里面的中文分詞。
如果完成了上面的這些任務后,那么可以應用到非常多不同的任務中。
自然語言處理與結構化知識有密切的關系,如何從文本中抽取結構化知識來更好地支持我們獲取相關信息,常用的技術是知識圖譜。
知識圖譜需要自動地從大規模的文本中挖掘,這里就涉及到另一個非常重要的技術,機器閱讀理解。
自然語言處理還可以實現智能助理,比較有名的是鋼鐵俠電影中的賈維斯,盡管我們現在還無法實現這么智能。商業化的產品像小度、Siri有著非常廣泛的應用。
此外還有一個經典的任務,機器翻譯,現在比較厲害的應用Google翻譯,幾乎離不開它。
有時我們想知道一句話的情感,也可以應用自然語言處理的技術,情感分析。
還可以利用自然語言來分析人類的心理狀態。
我們看到了很多的應用,下面我們簡單了解一下自然語言處理的基本問題,即詞的表示問題。
詞表示
詞表示(Word representation):把自然語言中最基本的語言單位——詞,轉換成機器能理解的表示的過程。即讓機器理解單詞的意思。
那如何做到這件事呢?我們要想清楚有了詞表示后,那么計算機可以做什么。
- 計算單詞相似度
- 知道單詞語義關系
- 比如北京和中國是首都和國家的關系
同義詞和上位詞
在過去如何去表示一個詞的詞義呢,有一個非常簡單的做法,用一組相關詞(比如同義詞)來表示當前詞。
比如用"Good"有關的近義詞和反義詞來表示它的詞義;或者說用"NLP"相關的上位詞來表示它的詞義。
這是非常直觀的一種表示方案,但是這樣做有一些問題:
- 丟失細微差別
- 比如"proficient"與"good"只在某些情況下是同義詞
- 丟失單詞的新意
- 比如"Apple"除了有蘋果的意思,還是一家公司
- 主觀性問題
- 數據稀疏問題
- 需要大量人工構建維護詞典
One-hot表示
實際上對于計算機來說,最常用的還是將詞表示成獨立的符號,比如獨熱表示。
即任何一個詞都可以用詞表一樣大小維度的向量來表示,只有一個維度為1,其他都是0。
這種表示方式,比較適用于計算文檔之間的相似度,因為兩篇文檔理論上相同的單詞越多,證明越相似。
但是在表示詞的時候就會存在問題,因為它假設詞之前的向量都是正交的。
上下文表示
為了解決one-hot的問題,上下文分布表示被提出來,這里有一句名言"ou shall know a word by the company it keeps."。即我們可以利用詞的上下文詞來知道這個詞的意思,或來表示這個詞。
比如上面的例子,為了表示詞"stars",我們可以選取經常出現的上下文詞"shining"、"cold"和"bright"等來表示這個詞。
利用這種方式我們就可以用一個向量,它的長度也和詞典長度一樣,但里面的每一維度表示該詞的上下文它出現了多少次。這樣任何一個詞,都可以用它上下文出現的頻度來進行表示,從而得到每個詞的稠密向量。
然后可以利用該稠密向量計算兩個詞的相似度。
這樣的方法很好,但還是有問題,它有什么問題呢?
- 存儲需求隨著詞表大小增長
- 需要大量存儲空間
- 對于頻率特別少的詞,存在稀疏問題
- 導致該詞的表示效果不好
詞嵌入
針對上面的問題,深度學習或大模型所做的工作就是詞嵌入(Word Embedding)。
詞嵌入是一種分布式表示
- 從大規模文本中建立一個低維稠密向量空間
- 學習方法:比如Word2Vec
語言模型
自然語言處理的另外一個知識點是語言模型(Language Model)。
語言模型的任務就是根據前文來預測下一個單詞。
該任務是讓計算機去掌握語言能力的非常重要的一個任務。一旦計算機掌握了這種預測能力,那么它就掌握了如何更好地理解一句話、如何根據某句話生成后面的回復等工作。
語言模型主要完成兩個工作,一是計算一個單詞序列稱為一個合理語句的(聯合)概率:
P(W)=P(w1,w2,?,wn)P(W) = P(w_1,w_2,\cdots,w_n) P(W)=P(w1?,w2?,?,wn?)
另一個是根據前面的話來預測下一個詞的(條件)概率:
P(wn∣w1,w2,?,wn?1)P(w_n|w_1,w_2,\cdots,w_{n-1}) P(wn?∣w1?,w2?,?,wn?1?)
那么如何完成這兩個工作呢?
這里有一個語言模型的基本假設——未來的詞只受到前面詞的影響。這樣我們就可以把句子的聯合概率,拆解成條件概率的乘積:
所以語言模型可以寫成:
P(w1,w2,?,wn)=∏iP(wi∣w1,w2,?,wi?1)P(w_1,w_2,\cdots,w_n) = \prod_i P(w_i|w_1,w_2,\cdots,w_{i-1}) P(w1?,w2?,?,wn?)=i∏?P(wi?∣w1?,w2?,?,wi?1?)
一個句子的聯合概率等于句子中每個詞基于它前面已經出現的詞的條件概率之積。
那現在的問題是如何構建語言模型呢?
N-Gram
在過去,一個非常典型的做法叫N-Gram語言模型。它統計前面出現幾個詞之后,后面出現的那個詞的頻率是怎樣的,比如以4-gram為例:
P(wj∣too?late?to)=count(too?late?towj)count(too?late?to)P(w_j|\text{too late to}) = \frac{\text{ count} ( \text{too late to} \, w_j )}{\text{ count} ( \text{too late to})} P(wj?∣too?late?to)=?count(too?late?to)?count(too?late?towj?)?
N-Gram遵循了馬爾科夫假設,即一個句子出現的聯合概率,只考慮單詞前面幾個有限的詞:
P(w1,w2,?,wn)≈∏iP(wi∣wi?k,?,wi?1)P(w_1,w_2,\cdots,w_n) \approx \prod_i P(w_i|w_{i-k},\cdots,w_{i-1}) P(w1?,w2?,?,wn?)≈i∏?P(wi?∣wi?k?,?,wi?1?)
上面的公式表示只考慮前面kkk個詞。
因此根據前面i?1i-1i?1個詞來預測第iii個詞出現的概率,可以通過前面kkk個詞來簡化:
P(wi∣w1,w2,?,wi?1)≈P(wi∣wi?k,?,wi?1)P(w_i|w_1,w_2,\cdots,w_{i-1}) \approx P(w_i|w_{i-k},\cdots,w_{i-1}) P(wi?∣w1?,w2?,?,wi?1?)≈P(wi?∣wi?k?,?,wi?1?)
但N-Gram的問題是
- 需要存儲所有可能的n-gram,所以一般應用較多的是bi-gram或tri-gram
- 沒有捕獲到詞之間的相似性
神經語言模型
在深度學習出現之后,就產生出了神經語言模型,即基于神經網絡取學習詞的分布式表示,可以
- 將詞與分布式向量關聯起來
- 基于特征向量計算詞序列的聯合概率
- 優化詞特征向量(嵌入矩陣EEE)和損失函數的參數(映射矩陣WWW)
基本思路是,要預測詞wtw_twt?,需要考慮前文。這里前文就是固定大小窗口內的詞。假設窗口大小為3,那么就考慮該詞前面的三個詞。具體地,根據這三個詞的索引根據嵌入矩陣得到它們的特征向量,即分布式表示。然后拼接這幾個向量,形成一個維度更大的上下文向量。然后經過非線性轉換(tanh),之后通過Softmax函數來計算概率出概率最大的下一個詞。
因為所有的預測工作,都是基于對上下文的表示來完成的,可以想象由于每個詞的向量,和整個匹配的預測過程,都是基于神經網絡可學習的參數來完成,所以我們就可以利用大規模的數據來自動地學習這些詞向量,自動地去更新神經網絡的權重(嵌入矩陣)。
大模型之旅
可以看到,從2013年之后,隨著深度學習技術的發展,整個自然語言處理的發展也受到了很大地影響。從13年的Word2Vec,到14年的RNN,到18年的ELMo,以及同年出現的BERT,之后預訓練模型就被大量使用。
為什么大模型非常重要
首先在應用了大模型之后,它整個的表現有了突飛猛進的提升。以GLUE為例,該指標的結果有了非常顯著的提升。
除了自然語言理解中,在自然語言生成里面,比如對話系統,也取得了非常好的結果。
所以,自18年之后,大家的目光都集中于如何得到一個更好的預訓練語言模型,以及如何把預訓練語言模型用在更多的任務上。
總地來說,預訓練語言模型的發展有三個趨勢:
- 不斷地增大它的參數
- 不斷地增大數據量
- 不斷地增大計算量
最后大家發現對預訓練語言模型來說很重要的一個趨勢就是,增加參數量和數據量之后,訓練模型會變得更加有效,并且能顯著提升各種任務的表現。
圍繞這一點,可以發現,從18年之后,模型參數的增長速度是非常快的。
基本以每年十倍的速度往上增長,伴隨著模型參數量增大的同時,它們使用的數據規模也在不斷地增大,相應地所需要的計算量也不斷變大。這就是大模型發展的整體趨勢。
然后其實模型大到一定程度之后,我們會從中發現模型掌握了大量知識。比如從GPT-3中,我們會發現它具有一定程度地對世界的認知、常識以及邏輯推理。
如果我們把它應用到各種各樣的NLP任務上,那勢必就會產生很好的效果。
大模型的另外一方面,或者說一種能力,它具有很強的零樣本或少次學習(zero/few-shot learning)的能力。
我們知道深度學習需要大量的標注數據去支撐的,但是GPT-3讓我們看到了另外一面,即可以在大規模無標注數據上進行模型學習,學完后讓模型具備很多知識。然后在解決具體任務時,就不需要很多的樣本,只需要少量的樣本去告訴模型要做什么任務,同時引導模型把它與任務相關的知識摘取出來,去解決這個問題。
比如說上圖框出來的機器翻譯,以往我們需要大量的平行語料。但是對于GPT-3,在無標簽數據訓練后,哪怕只給出一些少量的翻譯樣本,該模型也能做出比較好的機器翻譯效果。
還有,在GPT-3中,很多復雜的任務,比如編程或下國際象棋,也能轉換為基于預訓練語言模型的動作序列生成任務。
同時從預訓練模型出來后,對于語言模型的關注度也在突然上漲。
大模型背后的范式
- 在預訓練階段,預訓練語言模型會從大規模無標注的數據中捕獲豐富的知識
- 接著,通過引入任務相關的數據進行微調來調整預訓練模型
即預訓練-微調范式。這種范式可以溯源到遷移學習。
遷移學習使用一個“預訓練然后微調”的框架來完成“知識獲取然后知識遷移”的工作。
特征表示遷移和參數遷移都被用于后續預訓練模型的工作。
詞嵌入(Word Embeddings)可以看成是簡單的預訓練語言模型,比如CBOW和Skip-Gram。
詞嵌入從無標簽數據中通過自監督學習的范式學習,然后可以當成下游任務的輸入。
這是特征表示遷移。
但這種詞嵌入技術有兩個主要問題:
- 無法處理多義詞
- I go to bank(銀行) for money deposit
- I go to bank(河岸) for fishing
- 無法處理反義詞
- I love this movie. The movie is so bad
- I don’t love this movie. The movie is so good
后來帶有上下文信息的詞嵌入被提了出來。
比較有代表性的就是ELMo模型
- 利用RNN在大規模無標簽數據上進行語言建模
- 使用該預訓練的RNN取生成任務特征的帶上下文的詞嵌入
說到這種技術,不得不提的一個是Transformer,可以說是一個劃時代的技術。
基于Transformer,一系列深度預訓練模型被開發出來:
大模型的典型案例
首先是GPT,把語言建模看成一個預訓練任務。
L1(C)=?∑ilog?P(wi∣w1w2?wi?1)L_1(C) = -\sum_i \log P(w_i|w_1w_2\cdots w_{i-1}) L1?(C)=?i∑?logP(wi?∣w1?w2??wi?1?)
既可以用在下游生成任務(作為解碼器),也可以用在下游語言理解任務(作為編碼器)。
另外一個是BERT,它基于兩個任務學習。
掩碼語言模型(Masked language model, MLM):
下一句預測(Next sentence prediction,NSP)
實際上這是一個分類任務。
BERT在微調不同的下游任務時會增加不同的特殊符號:
總結
以上是生活随笔為你收集整理的大模型系统和应用——自然语言处理大模型基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深延科技:基于深度学习的智能OCR识别技
- 下一篇: 地铁监控系统方案