(1) NLP 介紹
NLP 是什么?
NLP (Natural Language Processing) 自然語言處理,是計算機科學、人工智能和語言學的交叉學科,目的是讓計算機處理或“理解”自然語言。自然語言通常是指一種自然地隨文化演化的語言,如漢語、英語、日語。
NLP 可以用來做什么?以及它的應用領域是什么?
文本朗讀(Text to speech)/ 語音合成(Speech synthesis)
語音識別(Speech recognition)
中文自動分詞(Chinese word segmentation)
詞性標注(Part-of-speech tagging)
句法分析(Parsing)
自然語言生成(Natural language generation)
文本分類(Text categorization)
信息檢索(Information retrieval)
信息抽取(Information extraction)
文字校對(Text-proofing)
問答系統(Question answering)
機器翻譯(Machine translation)
自動摘要(Automatic summarization)
文字蘊涵(Textual entailment)
(2)NLP 技術發展路線
從時間軸角度,可以看到 NLP 中重要模型的發布鏈:
word2vec -> seq2seq -> Attention model -> Transformer(vanilla) -> ELMO -> Transformer(universal) -> GPT -> BERT -> GPT-2 -> Transformer-XL -> XLNet
但是被廣為使用的模型迭代圖是:ELMO -> Transformer -> GPT -> BERT
以下對上述模型做初步介紹:
word2vec
時間:2013.01
論文地址:https://arxiv.org/abs/1301.3781
github: https://github.com/danielfrg/word2vec
問題提出:
one-hot編碼解決了文本特征離散表示的問題,但它假設詞與詞相互獨立並且特征向量會過於稀疏,會造成維度災難。
方法:
通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。
word2vec的具體實現分為CBOW和Skip-Gram兩種模型。CBOW模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。
Skip-Gram模型和CBOW的思路是反着來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。
結論:
CBOW對小型數據庫比較合適,而Skip-Gram在大型語料中表現更好。Skip-Gram模型的訓練需要更長的時間。
seq2seq
時間:2014.09
論文地址:https://arxiv.org/pdf/1409.3215.pdf
問題提出:
原始的RNN要求序列等長,然而我們遇到的大部分問題序列都是不等長的,如機器翻譯中,源語言和目標語言的句子往往並沒有相同的長度。
方法:
結論:
這一結構在機器翻譯。文本摘要、閱讀理解、語音識別等領域能取得很好的性能。
Attention model
時間:2015.02
論文地址: https://arxiv.org/abs/1502.03044v1
問題提出:
在Encoder-Decoder框架中,在預測每一個yi時對應的語義編碼c都是一樣的,也就意味着無論句子X中的每個單詞對輸出Y中的每一個單詞的影響都是相同的。這樣就會產生兩個弊端:一是語義向量無法完全表示整個序列的信息,再者就是先輸入的內容攜帶的信息會被后輸入的信息稀釋掉,或者說被覆蓋了。輸入序列越長,這個現象就越嚴重。這就使得在解碼的時候一開始就沒有獲得輸入序列足夠的信息, 那么解碼的准確度自然也就要打個折扣了。
方法:
注意力機制模型中,Decoder 的輸出會與Encoder每一個時間點的輸出進行分數計算,具體的算方法很多,常見的方式為內積。接著通過softmax層便可得到每一個encoder hidden state’s attention weights,和為1,可表示為該decoder步驟注重encoder 輸出的權重分布,之后將每個encoder輸出與 attention weights 作加權求合即得到最終的attention vector,Decoder在每一個時間點都會進行上述的注意力計算。
結論:
注意力機制能大大提升LSTM,GRU的整體性能。
Transformer(vanilla)
時間:2017.06
論文地址:https://arxiv.org/abs/1706.03762
github:https://github.com/tensorflow/tensor2tensor
問題提出:
RNN結構本身比較簡單,也很適合序列建模,但RNN的明顯缺點之一就是無法並行,因此速度較慢,這是遞歸的天然缺陷。另外RNN無法很好地學習到全局的結構信息,因為它本質是一個馬爾科夫決策過程。CNN事實上只能獲取局部信息,是通過層疊來增大感受野。
方法:
- 通過多頭自注意力結構一步到位獲取了全局信息。其中單個自注意力模塊的計算公式如下:
2. 由於self-Attention無法並不能捕捉序列的順序,通過Position Embedding,將每個位置編號,然后通過正余弦函數將編號映射為一個向量,就給每個詞都引入了一定的位置信息。
式中pos表示位置編號rang(0,100),i表示維度rang(0,512)。
結論:
實驗驗證transformer在翻譯任務做到了SOFA,比循環神經網絡快,效果好。
ELMO
時間:2018.02
論文地址:https://arxiv.org/abs/1802.05365
問題提出:
詞向量需要解決兩個問題:(1)詞使用的復雜特性,如句法和語法。(2)如何在具體的語境下使用詞,比如多義詞的問題。傳統的詞向量如word2vec能夠解決第一類問題,但是無法解決第二類問題。
方法:
Elmo主要使用了一個兩層雙向的LSTM語言模型,結合上下文來理解詞義。先在一個大型的預料庫上面進行訓練,用模型的內部狀態來表征一個詞的向量,此時內部狀態混合了所有的語義;然后將下游任務的文本輸入模型,此時的詞具備了具體的上下文語境,再用內部狀態的線性組合來表征詞。這種線性組合是在下游任務中進行訓練得到的。
結論:
biLSTM層能有效地編碼上下文中不同類型的語法和語義信息,提高整體任務性能。
Transformer(universal)
時間:2018.07
論文地址:https://arxiv.org/abs/1807.03819
問題提出:
Transformer 中 Encoder和Decoder Block執行的次數仍是人為設定的超參數,這意味著,模型架構無法隨著任務的特性、難易,自動的調整訓練的策略和次數。
方法:
Universal Transformer 通過正弦函數具周期的特性,Position embedding將位置信息加入每一個input symbol,除此之外,Timestep embedding(遞回次數)也使用相同方法處理。將position和timestep embedding 一並與輸入作加法運算,即成功將位置和遞回次數信息加入模型中。
使用Transition function,除了增加非線性變換的次數外,與Vanilla Transformer不同的是,每一個Symbol都有自己獨立的Transition function,這能夠有效率的學習到更深層的語意資訊。每一個symbol在著訓練的過程,都能自由的控制iteration次數,因為有些symbol需要多次的iteration才能充分理解其語意,有些則不需要,先停止的symbol會復制相同的數據到下一個step,直到所有的symbol都停止,或到達了iteration的上限值。
Transition function 是有別於Vanilla Transformer一個重要的特點,Transition function可以是一個簡單的Dense Layer,也可以是CNN Layer,差別在於,Vanilla Transformer再通過self-attention后,將所有的輸出一並送進Dense Layer,而Universal Transformer的Transition function則是基於每一個不同的symbol分頭進行。通過此方法,能提升訓練收斂速度且讓每個symbol有更好的vector representation,因此能提升整體表現。
結論:
Universal Transformer采用了 adaptive computation time (ACT)讓模型可以動態地調整每個symbol的計算次數,借以獲得最好的向量表達,此外有別於傳統做法,此方法在transition function依照個別symbol分頭進行,這能夠有效率的學習每個symbol的向量表達,並保留了Vanilla Transformer的優點,解決傳統方法梯度爆炸/消失和資訊遺失的問題;實驗發現Universal Transformer不僅讓機器翻譯達到更准確的效果,也補足了algorithmic tasks 成效低落的缺點,讓Universal Transformer能更泛用於各式各樣不同的任務,成為計算通用模型。
GPT
問題提出:
首次提出結合無監督的預訓練(pre-training)和有監督的微調(fine-tuning),旨在學習一種通用的表示方式,轉移到各種類型的NLP任務中都可以做很少的改變。
方法:
單向自回歸Transformer模型,詞向量+位置向量
結論:
對四種類型的NLP任務(12個task)進行了評估 ,在9個做到了SOFA。
BERT
時間:2018.10
論文地址:https://arxiv.org/abs/1810.04805
github: https://github.com/google-research/bert
問題提出:
ELMo 使用兩條獨立訓練的LSTM獲取雙向信息,但融合方式是直接concat,太過粗暴。而 GPT 使用自回歸模式的Transformer 只能獲取單向信息。
方法:
采用3種embedding相加的方式作為模型輸入:Token Embeddings+Segment Embeddings+Position Embeddings,其中token embedding采用的是word piece embedding,Position Embeddings不同於Transformer,使用了一組隨機初始化的參數同模型一起學習,模型同Transformer。
最關鍵的點在於對模型的預訓練。采用了2種不同的預訓練任務。
(1)把一篇文章中,15% 的詞匯遮蓋,讓模型根據上下文全向地預測被遮蓋的詞。假如有 1 萬篇文章,每篇文章平均有 100 個詞匯,隨機遮蓋 15% 的詞匯,模型的任務是正確地預測這 15 萬個被遮蓋的詞匯。通過全向預測被遮蓋住的詞匯,來初步訓練 Transformer 模型的參數。
(2)預測下一句是否連續。譬如從上述 1 萬篇文章中,挑選 20 萬對語句(總共 40 萬條語句)。挑選語句對的時候,其中 10 萬對語句,是連續的兩條上下文語句,另外 10 萬對語句,不是連續的語句。然后讓 Transformer 模型來識別這 20 萬對語句,哪些是連續的,哪些不連續。
結論:
BERT主要貢獻是將無監督pre-training+有監督fine-tuning這一模式推廣到更深層的雙向結構中。
GPT-2
時間:2019.02
論文地址:https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf
github: https://github.com/openai/gpt-2
問題提出:
目前主流的機器學習模型都是在指定的任務上去用一部分數據來訓練模型,再用一部分不相同但同分布的數據來測試其性能。這樣的模式在特定場景效果的確不錯,但是對於字幕或者說閱讀理解、圖像分類這樣的任務來說,輸入的多樣性和不確定性就會把缺點給暴露出來。目前普遍采用的用單一領域的數據來訓練單一模型是該問題的罪魁禍首,如果要構建一個泛化能力更強的模型,需要在更廣泛的任務和領域上進行訓練。
方法:
把多任務學習和無監督學習聯系起來,將條件概率由p(output|input) 改為p(output|input,task) 。在多個任務上進行預訓練,無監督地做下游任務。
模型沿用GPT 1.0 單向自回歸語言模型, 數據質量高、更寬泛、量更大。 Transformer模型也更大(48層,15億參數)。
結論:
當一個大的語言模型被訓練在一個足夠大和不同的數據集上時,它能夠在許多領域和數據集上表現良好。GPT-2在測試的8個數據集中有7個數據集,該模型能夠在零樣本的情況下取得SOFA,經過訓練的高容量模型能夠最大限度地提高文本語料庫多樣性的可能性,從而在不需要做監督學習的情況下執行數量驚人的任務。
Transformer-XL
時間:2019.06
論文地址:https://arxiv.org/abs/1901.02860
github: https://github.com/kimiyoung/transformer-xl
問題提出:
vanilla Transformers使用固定長度的上下文來實現,即將一個長的文本序列截斷為512個字符的固定長度片段,然后分別處理每個片段。這造成了3個限制:
1. 上下文長度受限:字符之間的最大依賴距離受輸入長度的限制,模型看不到出現在幾個句子之前的單詞。
2. 上下文碎片:對於長度超過512個字符的文本,都是從頭開始單獨訓練的。段與段之間沒有上下文依賴性,會讓訓練效率低下,也會影響模型的性能。
3. 推理速度慢:在測試階段,每次預測下一個單詞,都需要重新構建一遍上下文,並從頭開始計算,這樣的計算速度非常慢。
方法:
1. 提出片段級遞歸機制。Transformer-XL仍然是使用分段的方式進行建模,但其與vanilla Transformer的本質不同是在於引入了段與段之間的循環機制,使得當前段在建模的時候能夠利用之前段的信息來實現長期依賴性。
在訓練階段,處理后面的段時,每個隱藏層都會接收兩個輸入:
(1)該段的低隱藏層的輸出(與vanilla Transformer相同)。
(2)前面段的隱藏層的輸出,可以使模型創建長期依賴關系。
2. 使用了相對位置編碼來重新實現postion embedding。在分段的情況下,如果僅僅對於每個段仍直接使用Transformer中的位置編碼,即每個不同段在同一個位置上的表示使用相同的位置編碼,就會出現問題。比如,第i−2段和第i−1段的第一個位置將具有相同的位置編碼,但它們對於第i段的建模重要性顯然並不相同(例如第i−2段中的第一個位置重要性可能要低一些)。因此,需要對這種位置進行區分。
結論:
對於長文檔建模能力有明顯的提升,依賴關系的有效長度比循環網絡長80%,比vanilla Transforme長450%。在驗證階段比vanilla Transforme快1,800+倍。
XLNet
時間:2019.06
論文地址:https://arxiv.org/pdf/1906.08237.pdf
github: https://github.com/zihangdai/xlnet
問題提出:
- BERT在預訓練階段引入[mask]標記,而在下游任務中不存在,破壞了預訓練與下游任務的一致性。
- BERT在根據句子的其他詞預測Mask掉的單詞時,對被Mask掉的單詞做了獨立性假設,即假設被Mask掉的單詞之間相互獨立。
方法:
- 采用自回歸語言模型的模式,通過對輸入全排列來引入上下文信息(通過雙流自注意力機制和Attention掩碼實現)。
- 使用了最新的Transformer-XL模型,直接使用了相對位置編碼,並將遞歸機制整合到全排列設定中。
結論:
維持了表面看上去的自回歸語言模型的從左向右的模式,這個有明顯的好處,就是對於生成類的任務,能夠在維持表面從左向右的生成過程前提下,模型里隱含了上下文的信息。引入了Transformer XL的機制,所以對於長文檔輸入類型的NLP任務,也會比Bert有明顯優勢。
參考文獻:
https://blog.csdn.net/qq_33360393/article/details/100045351
https://www.toutiao.com/a6742415474396496387/?traffic_source=&in_ogs=&utm_source=&source=search_tab&utm_medium=wap_search&original_source=&in_tfs=&channel=
attention,命名實體識別,
word2vec,embading