【Transformers】第 1 章:从Bag-of-Words到Transformer
???🔎大家好,我是Sonhhxg_柒,希望你看完之后,能對你有所幫助,不足請指正!共同學習交流🔎
📝個人主頁-Sonhhxg_柒的博客_CSDN博客?📃
🎁歡迎各位→點贊👍 + 收藏?? + 留言📝?
📣系列專欄 - 機器學習【ML】?自然語言處理【NLP】? 深度學習【DL】
?
?🖍foreword
?說明?本人講解主要包括Python、機器學習(ML)、深度學習(DL)、自然語言處理(NLP)等內容。
如果你對這個系列感興趣的話,可以關注訂閱喲👋
文章目錄
技術要求
NLP 向 Transformers 的演變
理解分布語義
BoW?的實施
克服維度問題
語言建模和生成
利用深度學習
學習詞嵌入
RNN 的簡要概述
LSTM 和門控循環(huán)單元
使用 Keras 實現 LSTM 的溫和實現
CNN的簡要概述
Transformer 架構概述
注意力機制
多頭注意力機制
將 TL 與 Transformer 一起使用
概括
在本章中,我們將討論自然語言處理(?NLP?) 二十年來發(fā)生的變化。我們經歷了不同的范式,最終進入了 Transformer 架構的時代。所有范式都幫助我們更好地表示單詞和文檔以解決問題。分布語義用矢量表示來描述單詞或文檔的含義,查看文章集合中的分布證據。向量用于解決有監(jiān)督和無監(jiān)督管道中的許多問題。對于語言生成問題,n-gram 語言模型多年來一直被用作傳統(tǒng)方法。然而,這些傳統(tǒng)方法有很多弱點,我們將在本章中討論這些弱點。
我們將進一步討論經典的深度學習(?DL?) 架構,例如循環(huán)神經網絡(RNN)、前饋神經網絡 (?FFNN?)和卷積神經網絡(?CNN?))。這些改進了該領域問題的性能,并克服了傳統(tǒng)方法的局限性。然而,這些模型也有自己的問題。最近,Transformer 模型因其在從文本分類到文本生成的所有 NLP 任務中的有效性而引起了極大的興趣。然而,主要的成功在于 Transformers 有效地提高了多語言和多任務 NLP 問題的性能,以及單語言和單任務的性能。這些貢獻使遷移學習(?TL?) 在 NLP 中更有可能實現,其目的是使模型可重用于不同的任務或不同的語言。
從注意力機制開始,我們將簡要討論 Transformer 架構以及之前 NLP 模型之間的差異。在進行理論討論的同時,我們將展示流行的 NLP 框架的實際示例。為了簡單起見,我們將選擇盡可能短的介紹性代碼示例。
在本章中,我們將介紹以下主題:
- NLP 向 Transformers 的演變
- 理解分布語義
- 利用深度學習
- Transformer 架構概述
- 將 TL 與 Transformer 一起使用
技術要求
我們將使用 Jupyter Notebook 運行需要python >=3.6.0的編碼練習,以及需要使用pip install命令安裝的以下軟件包:
- sklearn
- nltk==3.5.0
- Gensim==3.8.3
- fasttext
- keras>=2.3.0
- Transformers >=4.00
所有帶有編碼練習的筆記本都可以在以下 GitHub 鏈接中找到:https?://github.com/PacktPublishing/Advanced-Natural-Language-Processing-with-Transformers/tree/main/CH01 。
查看以下鏈接以查看代碼實戰(zhàn)視頻:https ://bit.ly/2UFPuVd
NLP 向 Transformers 的演變
我們看到了深刻的過去 20 年 NLP 的變化。在此期間,我們經歷了不同的范式,最終進入了一個以魔幻Transformer架構為主的新時代。這種架構并非憑空出現。在各種基于神經的 NLP 方法的幫助下,它逐漸演變?yōu)榛谧⒁饬Φ木幋a器-解碼器類型架構,并且仍在不斷發(fā)展。該架構及其變體已過去十年取得的成功得益于以下發(fā)展:
- 上下文詞嵌入
- 更好的子詞標記化算法,用于處理看不見的詞或稀有詞
- 注入額外的記憶令牌成句子,例如Doc2vec中的段落 ID或來自 Transformers?(?BERT?)的雙向編碼器表示中的分類(?CLS?) 標記
- 注意力機制,它克服了強制輸入句子將所有信息編碼到一個上下文向量中的問題
- 多頭自注意力
- 位置編碼到大小寫詞序
- 可并行化的架構,可加快訓練和微調
- 模型壓縮(蒸餾、量化等)
- TL(跨語言、多任務學習)
多年來,我們使用傳統(tǒng)的 NLP 方法,例如n-gram 語言模型、基于 TF-IDF 的信息檢索模型和one-hot 編碼的文檔術語矩陣。所有這些方法都為解決序列分類、語言生成、語言理解等許多 NLP 問題做出了很大貢獻。另一方面,這些傳統(tǒng)的 NLP 方法也有其自身的弱點——例如,在解決稀疏性、看不見的單詞表示、跟蹤長期依賴等問題方面存在不足。為了應對這些弱點,我們開發(fā)了基于 DL 的方法,例如:
- RNNs
- CNNs
- FFNNs
- RNNs、CNNs 和 FFNNs 的幾種變體
2013 年,作為兩層 FFNN 字編碼器模型Word2vec,通過產生短而密的詞的表示,稱為詞嵌入。這個早期的模型成功地產生了快速有效的靜態(tài)詞嵌入。它通過使用上下文預測目標詞或基于滑動窗口預測相鄰詞,將無監(jiān)督文本數據轉換為監(jiān)督數據(自我監(jiān)督學習)。手套,另一種廣泛使用和流行的模型,認為基于計數的模型可以比神經模型更好。它利用語料庫的全局和局部統(tǒng)計數據來學習基于詞-詞共現統(tǒng)計的嵌入。它在一些句法和語義任務上表現良好,如下圖所示。屏幕截圖告訴我們,術語之間的嵌入偏移有助于應用面向向量的推理。我們可以學習性別關系的泛化,這是從男人和女人之間的偏移量(男人->女人)的語義關系。然后,我們可以通過添加術語actor的向量來算術估計actor的向量和之前計算的偏移量。同樣,我們可以學習諸如單詞復數形式之類的句法關系。例如,如果給定Actor、Actors和Actress的向量,我們可以估計 Actors 的向量:
圖 1.1 – 關系提取的詞嵌入偏移
循環(huán)和卷積RNN、長短期記憶(?LSTM?) 和 CNN 等架構開始被用作序列到序列(?seq2seq?) 問題的編碼器和解碼器。主要的這些早期模型的挑戰(zhàn)是多義詞。由于為每個單詞分配了一個固定的表示,因此忽略了單詞的意義,這對于多義詞和句子語義尤其嚴重。
進一步的先驅神經網絡模型,例如通用語言模型微調(?ULMFit?) 和語言模型嵌入(?ELMo?) 管理與靜態(tài)詞嵌入不同,對句子級信息進行編碼并最終緩解多義問題。這兩種重要的方法都是基于 LSTM 網絡的。他們還引入了預訓練和微調的概念。它們幫助我們應用 TL,使用針對具有大量文本數據集的一般任務訓練的預訓練模型。然后,我們可以通過在有監(jiān)督的目標任務上恢復預訓練網絡的訓練來輕松地進行微調。表示不同于傳統(tǒng)的詞嵌入,因此每個詞表示都是整個輸入句子的函數。現代 Transformer 架構利用了這個想法。
與此同時,注意力機制的想法在 NLP 領域留下了深刻的印象并取得了顯著的成功,尤其是在 seq2seq 問題中。早期的方法將通過最后狀態(tài)(稱為上下文向量或思想向量)從整個輸入序列到輸出序列,沒有鏈接或消除。注意力機制能夠通過將從輸入序列確定的標記鏈接到輸出序列中的特定標記來構建更復雜的模型。例如,假設您在英語到土耳其語翻譯任務的輸入句子中有一個關鍵字詞組Government of Canada 。在輸出句子中,Kanada Hükümeti標記與輸入短語建立了強連接,并與輸入中的其余單詞建立了較弱的連接,如下面的屏幕截圖所示:
圖 1.2 – 注意機制的粗略可視化
因此,這種機制使得模型在翻譯、問??答和文本摘要等 seq2seq 問題上更加成功。
2017 年,提出了基于 Transformer 的編碼器-解碼器模型并取得了成功。該設計基于 FFNN,丟棄 RNN 重復性并僅使用注意力機制(Vaswani 等人,All you need is attention, 2017)。迄今為止,基于 Transformer 的模型已經克服了其他方法面臨的許多困難,并已成為一種新的范式。在本書中,您將探索和理解基于 Transformer 的模型是如何工作的。
理解分布語義
分布語義用矢量表示來描述單詞的含義,最好查看其分布證據,而不是查看其預定義的字典定義。該理論表明,在相似環(huán)境中同時出現的單詞往往具有相似的含義。這首先由學者哈里斯(Distributional Structure Word,1954)提出。例如,狗和貓等相似詞大多同時出現在相同的上下文中。分布式方法的優(yōu)點之一是幫助研究人員理解和監(jiān)控單詞跨時間和跨域的語義演變,也稱為作為詞匯語義變化問題。
傳統(tǒng)方法多年來一直應用詞袋(?BoW?) 和 n-gram 語言模型來構建單詞和句子的表示。在 BoW 方法中,單詞和文檔用 one-hot 編碼表示,作為一種稀疏表示方式,也稱為作為向量空間模型(VSM)。
文本分類、詞相似度、語義關系抽取、詞義消歧等多年來,這些 one-hot 編碼技術已經解決了 NLP 問題。另一方面,n-gram 語言模型為單詞序列分配概率,以便我們可以計算序列屬于語料庫的概率,或者根據給定的語料庫生成隨機序列。
BoW?的實施
BoW 是一種文檔表示技術數著里面的字。該技術的主要數據結構是文檔術語矩陣。讓我們看一下使用 Python 的 BoW 的簡單實現。以下代碼說明了如何使用 Python?sklearn庫為包含三個句子的玩具語料庫構建文檔術語矩陣:
from sklearn.feature_extraction.text import TfidfVectorizer import numpy as np import pandas as pdtoy_corpus= ["the fat cat sat on the mat","the big cat slept","the dog chased a cat"]vectorizer=TfidfVectorizer() corpus_tfidf=vectorizer.fit_transform(toy_corpus)print(f"The vocabulary size is \{len(vectorizer.vocabulary_.keys())} ") print(f"The document-term matrix shape is\{corpus_tfidf.shape}")df=pd.DataFrame(np.round(corpus_tfidf.toarray(),2)) df.columns=vectorizer.get_feature_names()代碼的輸出是一個文檔術語矩陣,如以下屏幕截圖所示。大小為 (3 x 10),但在現實場景中,矩陣大小可以增長到更大的數字,例如 10K x 10M:
圖 1.3 – 文檔術語矩陣
該表指示基于計數的數學矩陣,其中單元格值被轉換通過詞頻-逆文檔頻率(?TF-IDF?) 加權模式。這種方法不關心單詞的位置。由于詞序強烈地決定了意義,忽視它會導致意義的喪失。這是BoW方法中的常見問題,最終通過RNN中的遞歸機制和Transformers中的位置編碼來解決。
矩陣中的每一列代表一個向量詞表中的單詞,每一行代表一個文檔的向量。語義相似度度量可用于計算單詞和文檔的相似度或不相似度。大多數時候,我們使用cat_sat和the_street等二元組來豐富文檔表示。例如,當參數ngram_range=(1,2)被傳遞給TfidfVectorizer時,它會構建一個向量空間,其中包含一元組(big、cat、dog)和二元組(big_cat、big_dog)。因此,此類模型也稱為bag-of-n-grams,即BoW的自然延伸。
如果一個詞在每個文檔中都被常用到,那么就可以認為是高頻詞,比如和?。相反,有些詞幾乎不會出現在文檔中,稱為低頻(或稀有)詞。由于高頻和低頻詞可能會妨礙模型正常工作,因此這里使用最重要和最知名的加權機制之一 TF-IDF 作為解決方案。
逆文檔頻率(?IDF?) 是用于衡量文檔中單詞重要性的統(tǒng)計權重——例如,雖然單詞the沒有區(qū)分能力,但Chasched可以提供大量信息并提供有關文本主題的線索。這是因為高頻詞(停用詞、功能詞)在理解文檔方面幾乎沒有辨別力。
術語的區(qū)分性還取決于在域上——例如,一個深度學習文章列表最有可能在幾乎每個文檔中都有網絡這個詞。IDF 可以通過使用它們的文檔頻率(?DF?)來縮小所有術語的權重,其中一個詞的 DF 是由一個詞出現在其中的文檔的數量來計算的。詞頻(?TF?) 是文檔中術語(單詞)的原始計數。
下面列出了基于 TF-IDF 的 BoW 模型的一些優(yōu)缺點:
表 1 – TF-IDF BoW 模型的優(yōu)缺點
克服維度問題
為了克服維度BoW模型的問題,潛在語義分析(LSA)被廣泛用于在低維空間中捕獲語義。它是一種線性方法,可捕獲術語之間的成對相關性。基于 LSA 的概率方法仍然可以被視為隱藏主題變量的單層。然而,當前的 DL 模型包括多個隱藏層,具有數十億個參數。除此之外,基于 Transformer 的模型表明,它們可以比此類傳統(tǒng)模型更好地發(fā)現潛在表示。
對于自然語言理解(?NLU?) 任務,傳統(tǒng)管道從一些準備步驟開始,例如標記化、詞干提取、名詞短語檢測、分塊、停用詞消除等等。之后,使用任何加權模式構建文檔術語矩陣,其中 TF-IDF 是最流行的。最后,矩陣被用作列表機器學習(?ML?) 管道、情感分析、文檔相似性、文檔聚類或測量查詢與文檔之間的相關性分數的輸入。同樣,術語表示為表格矩陣,并且可以輸入到令牌分類問題中,我們可以在其中應用命名實體識別、語義關系提取等。
分類階段包括監(jiān)督 ML 算法的直接實現例如支持向量機(?SVM?)、隨機森林、邏輯、樸素貝葉斯和多學習器(Boosting 或 Bagging)。實際上,這種管道的實現可以簡單地編碼如下:
from sklearn.pipeline import make_pipeline from sklearn.svm import SVClabels= [0,1,0] clf = SVC() clf.fit(df.to_numpy(), labels)如前面的代碼所示,我們可以很容易地應用擬合操作感謝sklearn?應用程序編程接口(?API?)。為了將學習到的模型應用于訓練數據,執(zhí)行以下代碼:
clf.predict(df.to_numpy())# Output: array([0, 1, 0])讓我們繼續(xù)下一節(jié)吧!
語言建模和生成
對于語言生成問題,傳統(tǒng)方法是基于利用 n-gram 語言模型。這是也稱為馬爾科夫過程,它是一個隨機模型,其中每個單詞(事件)依賴于先前單詞的子集——unigram、bigram或n-gram,概述如下:
- Unigram(所有單詞都是獨立的,沒有鏈):這個估計單詞在詞匯表中的概率,簡單地通過它的頻率計算到總單詞數。
- Bigram(一階馬爾可夫過程):這個根據wordi-1估計 wordi 的P?(word?i?| wordi?-1?)概率,它簡單地通過P (word?i?, wordi?-1?)與P (wordi?-1?)的比率來計算。
- Ngram(N階馬爾可夫過程):這個估計P (wordi | wordi0, ..., wordi-1)。
讓我們給出一個簡單的語言模型使用自然語言工具包(?NLTK?) 庫實現。在下面的實現中,我們訓練一個最大似然估計器(MLE),階數為n=2。我們可以選擇任何 n-gram 順序,例如n=1表示一元組,n=2表示二元組,n=3表示三元組,等等:
import nltk from nltk.corpus import gutenberg from nltk.lm import MLE from nltk.lm.preprocessing import padded_everygram_pipelinenltk.download('gutenberg') nltk.download('punkt') macbeth = gutenberg.sents('shakespeare-macbeth.txt') model, vocab = padded_everygram_pipeline(2, macbeth) lm=MLE(2) lm.fit(model,vocab)print(list(lm.vocab)[:10]) print(f"The number of words is {len(lm.vocab)}")nltk包首先下載古騰堡語料庫,其中包括來自托管在https://www.gutenberg.org的古騰堡計劃電子文本檔案中的一些文本。它還下載用于標點符號處理的punkt?tokenizer 工具。該分詞器使用無監(jiān)督算法將原始文本劃分為句子列表。nltk包已經包含一個用于縮寫詞和搭配的預訓練英語 punkt 標記器模型。它可以在使用前接受任何語言的文本列表的培訓。在接下來的章節(jié)中,我們還將討論如何為 Transformer 模型訓練不同且更有效的標記器。以下代碼生成語言模型到目前為止所學的內容:
print(f"The frequency of the term 'Macbeth' is {lm.counts['Macbeth']}") print(f"The language model probability score of 'Macbeth' is {lm.score('Macbeth')}") print(f"The number of times 'Macbeth' follows 'Enter' is {lm.counts[['Enter']]['Macbeth']} ") print(f"P(Macbeth | Enter) is {lm.score('Macbeth', ['Enter'])}") print(f"P(shaking | for) is {lm.score('shaking', ['for'])}")這是輸出:
The frequency of the term 'Macbeth' is 61 The language model probability score of 'Macbeth' is 0.00226 The number of times 'Macbeth' follows 'Enter' is 15 P(Macbeth | Enter) is 0.1875 P(shaking | for) is 0.0121n-gram 語言模型保持n-gram計數并計算句子生成的條件概率。lm=MLE(2)代表 MLE,它從每個標記概率中產生最大可能的句子。以下代碼生成一個包含 10 個單詞的隨機句子,并給出了<s>起始條件:
lm.generate(10, text_seed=['<s>'], random_seed=42)輸出顯示在以下代碼段中:
['My', 'Bosome', 'franchis', "'", 's', 'of', 'time', ',', 'We', 'are']
我們可以給出一個通過text_seed參數指定特定的起始條件,使生成以前面的上下文為條件。在我們前面的例子中,前面的上下文是<s>,它是一個表示句子開頭的特殊標記。
到目前為止,我們已經討論了傳統(tǒng) NLP 模型的范式,并提供了非常簡單的流行框架實現。我們現在轉到 DL 部分,討論神經語言模型如何塑造 NLP 領域以及神經模型如何克服傳統(tǒng)模型的局限性。
利用深度學習
NLP 是其中之一深度學習架構已被廣泛且成功地使用。幾十年來,我們見證了成功的架構,尤其是在單詞和句子表示方面。在本節(jié)中,我們將與常用框架分享這些不同方法的故事。
學習詞嵌入
基于神經網絡的語言模型有效地解決了特征表示和語言建模問題,因為可以在更大的數據集上訓練更復雜的神經架構來構建短而密集的表示。2013 年,流行的Word2vec 模型詞嵌入技術,使用簡單有效的架構來學習高質量的連續(xù)詞表示。它在各種句法和語義語言任務(例如情感分析、釋義檢測、關系提取等)方面優(yōu)于其他模型。該模型流行的另一個關鍵因素是其計算復雜度低得多。在給定任何周圍的上下文單詞的情況下,它最大化當前單詞的概率,反之亦然。
下面一段代碼說明了如何訓練詞向量對于戲劇麥克白的句子:
from gensim.models import Word2vecmodel = Word2vec(sentences=macbeth, size=100, window= 4, min_count=10, workers=4, iter=10)該代碼通過一個滑動的 5 長度上下文窗口來訓練向量大小為 100 的詞嵌入。為了可視化單詞嵌入,我們需要通過應用主成分分析(?PCA?)將維度減少到 3如下代碼片段所示:
import matplotlib.pyplot as plt from sklearn.decomposition import PCA import randomnp.random.seed(42) words=list([e for e in model.wv.vocab if len(e)>4]) random.shuffle(words) words3d = PCA(n_components=3,random_state=42).fit_transform(model.wv[words[:100]])def plotWords3D(vecs, words, title):...plotWords3D(words3d, words, "Visualizing Word2vec Word Embeddings using PCA")這是輸出:
圖 1.4 – 使用 PCA 可視化詞嵌入
如圖所示,莎士比亞戲劇的主要人物——麥克白、馬爾科姆、班柯、麥克德夫等——被映射到接近彼此。同樣,助動詞shall、should和will在圖1.4的左下角彼此靠近。我們還可以通過使用嵌入偏移來捕捉諸如man-woman= uncle-aunt 之類的類比。有關此主題的更多有趣的視覺示例,請查看以下項目:https?://projector.tensorflow.org/ 。
類似 Word2vec 的模型通過采用基于預測的神經架構來學習詞嵌入。他們對一些目標函數和附近的詞預測采用梯度下降。傳統(tǒng)方法應用基于計數的方法,而神經模型為分布式語義設計了基于預測的架構。基于計數的方法或基于預測的方法是分布式詞表示的最佳選擇嗎?GloVe 方法解決了這個問題,并認為這兩種方法沒有顯著不同。杰弗里·佩寧頓等人。甚至支持基于計數的方法可以通過捕獲全球統(tǒng)計數據更成功的想法。他們表示 GloVe 表現優(yōu)于其他關于詞類比、詞相似性和命名實體識別(?NER?) 任務的神經網絡語言模型。
然而,這兩種范式確實沒有提供有用的解決方案看不見的單詞和詞義問題。它們不利用子詞信息,因此無法學習稀有和不可見詞的嵌入。
FastText?, 另一個廣泛使用的模型,提出了一種新的使用子詞信息的豐富方法,其中每個詞都表示為一袋字符 n-gram。該模型為每個字符 n-gram 設置一個常量向量,并將單詞表示為其子向量的總和,這是 Hinrich Schütze 首次引入的想法(Word Space,1993 年)。該模型甚至可以計算看不見的單詞的單詞表示,并學習單詞的內部結構,例如后綴/詞綴,這對于芬蘭語、匈牙利語、土耳其語、蒙古語、韓語、日語、印度尼西亞語等形態(tài)豐富的語言尤其重要.?目前,現代變壓器架構使用各種子詞標記化WordPiece?、SentencePiece或字節(jié)對編碼(?BPE?) 等方法。
RNN 的簡要概述
RNN 模型可以學習每個令牌表示通過在較早的時間步匯總其他標記的信息并在最后一個時間步學習句子表示。已發(fā)現這種機制在許多方面都是有益的,概述如下:
- 首先,RNN 可以重新設計為一對多模型,用于語言生成或音樂生成。
- 其次,多對一模型可用于文本分類或情感分析。
- 最后,多對多模型用于 NER 問題。多對多模型的第二個用途是解決編碼器-解碼器問題,例如機器翻譯、問答和文本摘要。
與其他神經網絡模型一樣,RNN 模型采用由標記化算法生成的標記,該算法將整個原始文本分解為原子單元,也稱為標記。此外,它將標記單元與在訓練期間學習的數字向量(標記嵌入)相關聯。作為替代方案,我們可以提前將嵌入式學習任務分配給眾所周知的詞嵌入算法,例如 Word2vec 或 FastText。
這是一個簡單的例子RNN 架構句子貓很傷心。,其中 x?0是 的向量嵌入,?x?1是cat的向量嵌入,依此類推。圖 1.5說明了一個RNN 被展開成一個完整的深度神經網絡(?DNN?)。
展開意味著我們?yōu)槊總€單詞關聯一個層。因為貓很傷心。序列,我們處理五個單詞的序列。每一層的隱藏狀態(tài)充當網絡的記憶。它編碼有關所有先前時間步和當前時間步中發(fā)生的事情的信息。這在下圖中表示:
圖 1.5 – RNN 架構
以下是a的一些優(yōu)點RNN 架構:
- 可變長度輸入:無論輸入的句子大小如何,都可以處理可變長度輸入。我們可以在不更改參數的情況下向網絡提供 3 或 300 個單詞的句子。
- 關心詞序:按順序逐詞處理序列,關心詞的位置。
- 適合在各種模式下工作(多對多、一對多):我們可以使用相同的遞歸范式訓練機器翻譯模型或情感分析。兩種架構都將基于 RNN。
這RNN 架構的缺點是此處列出:
- 長期依賴問題:當我們處理一個很長的文檔并嘗試鏈接彼此相距較遠的術語時,我們需要關心和編碼這些術語之間所有不相關的其他術語。
- 容易出現梯度爆炸或消失問題:在處理長文檔時,更新第一個單詞的權重是一件大事,這使得模型由于梯度消失問題而無法訓練。
- 難以應用可并行化訓練:并行化將主要問題分解為較小的問題并同時執(zhí)行解決方案,但 RNN 遵循經典的順序方法。每一層都強烈依賴于前一層,這使得并行化變得不可能。
- 由于序列很長,計算速度很慢:RNN 對于短文本問題可能非常有效。除了長期依賴問題之外,它處理較長文檔的速度非常慢。
雖然 RNN 理論上可以在之前的許多時間步長上參與信息,但在現實世界中,長文檔和長期依賴等問題是不可能發(fā)現的。長序列在許多深層中表示。許多研究已經解決了這些問題,其中一些其中是此處概述:
- 霍克賴特和施米德胡伯。長短期記憶。1997 年。
- 本吉奧等人。用梯度下降學習長期依賴是很困難的。1993 年。
- K. Cho 等人。使用 RNN 編碼器-解碼器學習短語表示以進行統(tǒng)計機器翻譯。2014 年。
LSTM 和門控循環(huán)單元
LSTM (?Schmidhuber, 1997?) 和門控循環(huán)單元(?GRUs?) (?Cho, 2014?) 是 RNN 的新變體,具有長期解決依賴問題,并且有引起了極大的關注。LSTM 是專門為解決長期依賴問題而開發(fā)的。LSTM 模型的優(yōu)勢在于它使用了額外的單元狀態(tài),即 LSTM 單元頂部的水平序列線。此單元狀態(tài)由用于忘記、插入或更新操作的專用門控制。LSTM 架構的復雜單元如下圖所示:
圖 1.6 – 一個 LSTM 單元
它能夠決定以下內容:
- 我們將在細胞狀態(tài)中存儲什么樣的信息
- 哪些信息會被遺忘或刪除
在原始 RNN 中,在為了學習I 標記的狀態(tài),它在時間步0和時間步-1之間反復處理先前標記的整個狀態(tài)。攜帶全部信息來自較早的時間步長會導致梯度消失問題,這使得模型無法訓練。LSTM 中的門機制允許架構在某個時間步跳過一些不相關的令牌或記住遠程狀態(tài)以學習當前令牌狀態(tài)。
GRU 在很多方面類似于 LSTM,主要區(qū)別在于 GRU 不使用單元狀態(tài)。相反,通過將單元狀態(tài)的功能轉移到隱藏狀態(tài),它只包括兩個門:更新門和重置門。更新門決定有多少來自先前和當前時間步的信息將被向前推進。此功能有助于模型保留過去的相關信息,從而將梯度消失問題的風險降至最低。重置門檢測到不相關的數據并讓模型忘記它。
使用 Keras 實現 LSTM 的溫和實現
我們要下載斯坦福情緒樹庫(?SST-2?) 情緒數據集來自通用語言理解評估(?GLUE?) 基準。我們可以通過運行以下代碼:
$ wget https://dl.fbaipublicfiles.com/glue/data/SST-2.zip$ unzip SST-2.zip重要的提示
SST-2:這是一個完全標記的解析樹,允許用英語進行完整的情感分析。語料庫最初由從電影評論中提取的大約 12K 單句組成。它由斯坦福解析器解析,包含超過 20 萬個獨特的短語,每個短語都由三名人工評委注釋。有關詳細信息,請參閱Socher 等人的 Parsing With Compositional Vector Grammars,EMNLP。2013?(?Recursive Deep Models for Semantic Compositionality Over a Sentiment Treebank?)。
下載完數據后,我們將其讀取為pandas對象,如下:
import tensorflow as tf import pandas as pddf=pd.read_csv('SST-2/train.tsv',sep="\t") sentences=df.sentence labels=df.label我們需要設置最大句子長度,構建詞匯和字典(word2idx,idx2words),最后將每個句子表示為索引列表而不是字符串。我們可以通過運行以下代碼來做到這一點:
max_sen_len=max([len(s.split()) for s in sentences]) words = ["PAD"]+\list(set([w for s in sentences for w in s.split()])) word2idx= {w:i for i,w in enumerate(words)} max_words=max(word2idx.values())+1idx2word= {i:w for i,w in enumerate(words)} train=[list(map(lambda x:word2idx[x], s.split()))\for s in sentences]短于max_sen_len(最大句子長度)的序列會被填充一個PAD值,直到它們的長度為max_sen_len。另一方面,較長的序列被截斷,以便它們適合max_sen_len。這是實現:
from keras import preprocessing train_pad = preprocessing.sequence.pad_sequences(train,maxlen=max_sen_len) print('Train shape:', train_pad.shape)# Output: Train shape: (67349, 52)我們準備設計和訓練一個 LSTM 模型,如下:
from keras.layers import LSTM, Embedding, Dense from keras.models import Sequentialmodel = Sequential() model.add(Embedding(max_words, 32)) model.add(LSTM(32)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop',loss='binary_crossentropy', metrics=['acc']) history = model.fit(train_pad,labels, epochs=30, batch_size=32, validation_split=0.2)該模型將是訓練了 30 個 epoch。為了要繪制 LSTM 模型到目前為止所學的內容,我們可以執(zhí)行以下代碼:
import matplotlib.pyplot as pltdef plot_graphs(history, string):...plot_graphs(history, 'acc') plot_graphs(history, 'loss')該代碼生成以下圖表,它向我們展示了基于 LSTM 的文本分類的訓練和驗證性能:
圖 1.7 – LSTM 網絡的分類性能
正如我們之前提到的,的主要問題基于 RNN 的編碼器-解碼器模型是它為序列生成單個固定表示。然而,注意力機制允許 RNN 在將輸入標記映射到輸出標記的某個部分時專注于輸入標記的某些部分。這種注意力機制被發(fā)現是有用的,并且已經成為 Transformer 架構的基本思想之一。我們將在下一部分和整本書中討論 Transformer 架構如何利用注意力。
CNN的簡要概述
CNNs,在他們的計算機視覺的成功,是在建模句子或語義文本分類等任務方面移植到 NLP。在許多實踐中,CNN 由卷積層和密集神經網絡組成。卷積層對數據執(zhí)行以提取有用的特征。與任何 DL 模型一樣,卷積層扮演著特征提取的角色以自動提取特征。在 NLP 的情況下,這個特征層由一個嵌入層提供,該嵌入層將句子作為單熱向量化格式的輸入。one-hot 向量由構成句子的每個單詞的token-id生成。以下屏幕截圖的左側顯示了一個句子的 one-hot 表示:
圖 1.8 – One-hot 向量
每個令牌,代表通過 one-hot 向量,被饋送到嵌入層。嵌入層可以通過隨機值或使用預先訓練的詞向量(如 GloVe、Word2vec 或 FastText)進行初始化。然后將一個句子轉換為 NxE 形狀的密集矩陣(其中N是句子中的標記數,E是嵌入大小)。以下屏幕截圖說明了 1D CNN 如何處理該密集矩陣:
圖 1.9 – 一個包含五個標記的句子的 1D CNN 網絡
卷積將采取放在上面使用不同的層和內核進行操作。卷積層的超參數是內核大小和內核數量。還需要注意的是,這里應用了 1D 卷積,其原因是令牌嵌入不能被視為部分,我們希望應用能夠按順序查看多個令牌的內核。您可以將其視為具有指定窗口的 n-gram 之類的東西。將淺層 TL 與 CNN 模型結合使用也是此類模型的另一個很好的能力。如以下屏幕截圖所示,我們還可以使用多種標記表示的組合來傳播網絡,正如 Yoon Kim 在 2014 年研究中提出的,用于句子分類的卷積神經網絡:
圖 1.10 – CNN 中多種表示的組合
例如,我們可以使用三個嵌入層而不是一個,并為每個令牌連接它們。鑒于此設置,如果所有三個不同嵌入的嵌入大小為 128,則諸如fall之類的標記將具有 3x128 的向量大小。這些嵌入可以使用來自 Word2vec、GloVe 和 FastText 的預訓練向量進行初始化。每一步的卷積操作將看到 N 個單詞及其各自的三個向量(N 是卷積濾波器大小)。這里使用的卷積類型是一維卷積。此處的尺寸表示進行操作時可能的移動。例如,2D 卷積將沿兩個軸移動,而 1D 卷積僅沿一個軸移動。以下屏幕截圖顯示了它們之間的差異:
圖 1.11 – 卷積方向
以下代碼片段是一維 CNN 實現處理 LSTM 管道中使用的相同數據。它包括Conv1D和MaxPooling層的組合,然后是GlobalMaxPooling層。我們可以通過調整參數和添加更多層來優(yōu)化模型來擴展管道:
from keras import layersmodel = Sequential() model.add(layers.Embedding(max_words, 32, input_length=max_sen_len)) model.add(layers.Conv1D(32, 8, activation='relu')) model.add(layers.MaxPooling1D(4)) model.add(layers.Conv1D(32, 3, activation='relu')) model.add(layers.GlobalMaxPooling1D()) model.add(layers.Dense(1, activation= 'sigmoid') model.compile(loss='binary_crossentropy', metrics=['acc'])history = model.fit(train_pad,labels, epochs=15, batch_size=32, validation_split=0.2)事實證明,CNN 模型的性能與其 LSTM 模型相當。盡管 CNN已經成為標準在圖像處理中,我們已經看到了 CNN 在 NLP 中的許多成功應用。LSTM 模型被訓練為跨時間識別模式,而 CNN 模型可以跨空間識別模式。
Transformer 架構概述
變壓器型號有由于它們在從文本分類到文本生成的大量 NLP 問題中的有效性而引起了極大的興趣。注意機制是這些模型的重要組成部分,起著非常關鍵的作用。在 Transformer 模型之前,注意力機制被提出來作為改進傳統(tǒng) DL 模型(如 RNN)的輔助工具。為了更好地理解 Transformer 及其對 NLP 的影響,我們將首先研究注意力機制。
注意力機制
的第一個變體之一注意機制是由Bahdanau 等人提出。(2015 年)。這種機制基于這樣一個事實,即 GRU 或 LSTM 等基于 RNN 的模型具有信息神經機器翻譯(?NMT?)等任務的瓶頸。這些基于編碼器-解碼器的模型以令牌 ID的形式獲取輸入,并以循環(huán)方式(編碼器)對其進行處理。之后,處理后的中間表示被送入另一個循環(huán)單元(解碼器)以提取結果。這種雪崩式的信息就像一個滾動的球,消耗了所有的信息,對于解碼器部分來說,滾動它是很困難的,因為解碼器部分看不到所有的依賴關系,只得到中間表示(上下文向量)作為輸入。
為了調整這種機制,Bahdanau 提出了一種注意力機制,在中間隱藏值上使用權重。這些權重與模型在每個解碼步驟中必須對輸入的關注量保持一致。如此精彩的指導幫助模型完成特定任務,例如 NMT,這是一個多對多的任務。這里提供了一個典型的注意力機制圖:
圖 1.12 – 注意力機制
不同的注意力機制有被提議與不同的改進。加法、乘法、一般和點積注意力出現在這些機制的家族中。后者是具有縮放參數的修改版本,被稱為縮放點積注意力。這種特定的注意力類型是變形金剛模型的基礎,并且是稱為多頭注意力機制。附加注意力也是前面介紹的 NMT 任務的顯著變化。您可以在此處查看不同類型的注意力機制的概述:
表 2 – 注意力機制的類型(圖片來自 https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html)
由于注意力機制不是特定于 NLP 的,它們是還用于從計算機視覺到語音識別等各個領域的不同用例。以下屏幕截圖顯示了針對神經圖像字幕訓練的多模態(tài)方法的可視化(K Xu 等人,展示、參加和講述:具有視覺注意力的神經圖像字幕生成,2015 年):
圖 1.13 – 計算機視覺中的注意力機制
多頭注意力如圖所示的機制下圖是 Transformer 架構的重要組成部分:
圖 1.14 – 多頭注意力機制
接下來,讓我們了解一下多頭注意力機制。
多頭注意力機制
在跳入之前規(guī)模化的點積注意力機制,更好得到一個好的對自注意力的理解。自注意力,如圖 1.15所示,是縮放自注意力機制的基本形式。該機制使用顯示為X的輸入矩陣,并在X中的各個項目之間產生注意力分數。我們將X視為 3x4 矩陣,其中 3 表示標記的數量,4 表示嵌入大小。圖 1.15中的Q也稱為查詢,K稱為鍵,V稱為值。三種類型的矩陣顯示為theta、phi和g在產生Q、K和V之前乘以X。查詢 ( Q?) 和關鍵 (?K?)之間的相乘結果產生一個注意力得分矩陣。這也可以看作是一個數據庫,我們使用查詢和鍵來找出各種項目在數值評估方面的相關程度。注意力分數和V矩陣的乘積產生了這種注意力機制的最終結果。它被稱為self-attention的主要原因是它的統(tǒng)一輸入X;Q、K和V從X計算。您可以在下圖中看到所有這些:
圖 1.15 – 注意力機制的數學表示(圖片來自 https://blogs.oracle.com/datascience/multi-head-self-attention-in-nlp)
縮放的點積注意機制與自我注意(點積)機制非常相似,只是它使用了縮放因子。另一方面,多頭部分確保模型能夠查看各個級別的輸入的各個方面。變壓器模型參加編碼器注釋和來自過去層的隱藏值。Transformer 模型的架構沒有循環(huán)的分步流程;相反,它使用位置編碼來獲得有關輸入序列中每個標記的位置的信息。嵌入的連接值(隨機初始化)和位置編碼的固定值是輸入到第一個編碼器部分的層中,并通過架構傳播,如下圖所示:
圖 1.16 – Transformer
通過評估不同頻率的正弦波和余弦波來獲得位置信息。以下屏幕截圖顯示了位置編碼的示例:
圖 1.17 – 位置編碼(圖片來自 http://jalammar.github.io/illustrated-Transformer/)
一個很好的例子上的表現Transformer 架構和縮放的點積注意力機制在以下流行的屏幕截圖中給出:
圖 1.18 – Transformers 的注意力映射(圖片靈感來自 https://ai.googleblog.com/2017/08/Transformer-novel-neural-network.html)
從前面的屏幕截圖可以看出,它在不同的上下文中指的是不同的實體。使用 Transformer 架構的另一個改進是并行性。傳統(tǒng)的順序循環(huán)模型,如 LSTM 和 GRU 不具備這樣的能力因為他們處理逐個令牌輸入令牌。另一方面,前饋層的速度要快一些,因為單矩陣乘法比循環(huán)單元快得多。堆疊的多頭注意力層可以更好地理解復雜的句子。以下屏幕截圖顯示了多頭注意力機制的一個很好的視覺示例:
圖 1.19 - 多頭注意力機制(圖片來自 https://imgur.com/gallery/FBQqrxw)
在注意力機制的解碼器端,使用與編碼器非常相似的方法,只需稍作修改。多頭注意力機制是相同的,但也使用了編碼器堆棧的輸出。這種編碼被賦予第二個多頭注意力層中的每個解碼器堆棧。這個小小的修改在解碼時引入了編碼器堆棧的輸出。這種修改讓模型在解碼時知道編碼器的輸出,同時在訓練期間幫助它在各個層上有更好的梯度流。解碼器層末尾的最終 softmax 層用于為各種用例(例如 NMT)提供輸出,為此引入了原始的 Transformer 架構。
該架構有兩個輸入,稱為輸入和輸出(右移)。一個總是存在于訓練和推理中(輸入),而另一個只存在于訓練和推理中,這是由模型產生的。我們在推理中不使用模型預測的原因是為了防止模型本身出錯。但是這是什么意思?想象一個神經翻譯模型試圖將一個句子從英語翻譯成法語——在每一步,它都會對一個單詞進行預測,并使用該預測的單詞來預測下一個單詞。但是,如果它在某個步驟出錯,那么以下所有預測也將是錯誤的。為了阻止模型出現這樣的錯誤,我們提供了正確的單詞作為右移版本。
一個視覺示例變壓器型號為在下圖中給出。它顯示了一個帶有兩個編碼器和兩個解碼器層的 Transformer 模型。此圖中的Add & Normalize層添加并規(guī)范化它從前饋層獲取的輸入:
圖 1.20 – Transformer 模型(圖片來自 http://jalammar.github.io/illustrated-Transformer/)
基于 Transformer 的架構使用的另一個主要改進是基于簡單的通用文本壓縮方案,以防止在輸入端出現看不見的標記。這種方法通過使用不同的方法(例如字節(jié)對編碼和句子編碼)來實現,提高了 Transformer 在處理看不見的標記方面的性能。當模型遇到形態(tài)上接近的標記時,它也會指導模型。這樣的標記在過去是看不見的,也很少在訓練中使用,然而,一個推論可能會被看到。在某些情況下,塊在訓練中可以看到它;后者發(fā)生在形態(tài)豐富的語言中,例如土耳其語、德語、捷克語和拉脫維亞語。例如,模型可能會看到單詞training但看不到trainings。在這種情況下,它可以將訓練標記為training+s。當我們將它們視為兩個部分時,通常會看到這兩個。
基于 Transformer 的模型具有相當普遍的特征——例如,它們都基于這種原始架構,但它們使用和不使用的步驟不同。在某些情況下,會有細微的差異——例如,對多頭注意力機制的改進。
將 TL 與 Transformer 一起使用
TL是人工智能(?AI?) 和 ML的一個領域旨在使模型可重復用于不同的任務——例如,在給定任務(例如A )上訓練的模型可在不同任務(例如B)上重用(微調)。在 NLP 領域,這可以通過使用類似 Transformer 的架構來實現,該架構可以通過語言建模來捕捉對語言本身的理解。這樣的模型被稱為語言模型——它們?yōu)樗麄冇柧氝^的語言提供了一個模型。TL 并不是一項新技術,它已被用于計算機視覺等各個領域。ResNet、Inception、VGG 和 EfficientNet 是此類模型的示例,它們可以用作能夠在不同的計算機視覺任務上進行微調的預訓練模型。
在 NLP 中也可以使用Word2vec、GloVe和Doc2vec等模型進行淺 TL 。之所以稱為淺層,是因為這種 TL 背后沒有模型,而是使用了詞/標記的預訓練向量。您可以使用這些令牌或文檔嵌入模型,然后使用分類器,或者將它們與 RNN 等其他模型結合使用,而不是使用隨機嵌入。
使用 Transformer 模型的 NLP 中的 TL 也是可能的,因為這些模型可以在沒有任何標記數據的情況下學習語言本身。語言建模是一項用于訓練各種問題的可轉移權重的任務。掩蔽語言建模是用于學習語言本身的方法之一。與 Word2vec 用于預測中心標記的基于窗口的模型一樣,在掩碼語言建模中,也采用了類似的方法,但存在關鍵差異。給定一個概率,每個單詞都被屏蔽并替換為一個特殊的標記,例如[MASK]。語言模型(在我們的例子中是基于 Transformer 的模型)必須預測被屏蔽的單詞。與 Word2vec 不同的是,它沒有使用窗口,而是給出了一個完整的句子,并且模型的輸出必須是填充了掩碼單詞的同一個句子。
使用 Transformer 架構進行語言建模的首批模型之一是BERT,它基于Transformer 架構的編碼器部分。掩碼語言建模是由 BERT 通過使用在訓練語言模型之前和之后描述的相同方法來完成的。BERT 是一種可遷移的語言模型,適用于不同的 NLP 任務,例如令牌分類、序列分類,甚至是問答。
一旦訓練了語言模型,這些任務中的每一個都是 BERT 的微調任務。BERT 以其在基本 Transformer 編碼器模型上的關鍵特性而聞名,通過改變這些特性,提出了它的不同版本——小型、微型、基本、大型和超大型。上下文嵌入使模型能夠根據給出每個單詞的上下文具有正確的含義——例如,單詞Cold可以有不同的兩個不同句子的含義:冷酷的殺手和寒冷的天氣。編碼器部分的層數、輸入維度、輸出嵌入維度和多頭注意力機制的數量是這些關鍵特征,如下圖所示:
圖 1.21 – BERT 的預訓練和微調程序(圖片靈感來自 J. Devlin 等人,Bert:用于語言理解的深度雙向 Transformers 的預訓練,2018)
如圖1.21 所示,預訓練階段還包括另一個稱為下一句預測的目標。眾所周知,每個文檔都是由一個個句子組成的,訓練模型掌握語言的另一個重要部分是理解句子之間的關系——換句話說,它們是否相關。為了完成這些任務,BERT 引入了[CLS]和[SEP]等特殊令牌。[CLS]標記是最初無意義的標記,用作所有任務的開始標記,它包含有關句子的所有信息。在 NSP 等序列分類任務中,在這個 token 的輸出之上的分類器(輸出位置為0) 用來。它在評估句子的意義或捕獲其語義方面也很有用——例如,在使用連體 BERT 模型時,通過余弦相似度等度量比較不同句子的這兩個[CLS]標記非常有幫助。另一方面,[SEP]用于區(qū)分兩個句子,它只用于分隔兩個句子。在預訓練之后,如果有人打算在序列分類任務上微調 BERT,例如情感分析,這是一個序列分類任務,他們將在[CLS]的輸出嵌入之上使用分類器。還值得注意的是,所有 TL 模型都可以在微調期間凍結或釋放;凍結意味著將模型中的所有權重和偏差視為常數并停止對其進行訓練。在情感分析的例子中,只會訓練分類器,如果模型被凍結,則不會訓練。
概括
至此,我們現在來到了本章的結尾。您現在應該了解 NLP 方法和方法的演變,從 BoW 到 Transformers。我們研究了如何實現基于 BoW、RNN 和 CNN 的方法,并了解 Word2vec 是什么以及它如何幫助改進使用淺層 TL 的傳統(tǒng)基于 DL 的方法。我們還研究了 Transformer 架構的基礎,以 BERT 為例。在本章結束時,我們已經了解了 TL 以及 BERT 如何使用它。
至此,我們已經了解了繼續(xù)下一章所必需的基本信息。我們了解了基于 Transformer 的架構背后的主要思想,以及如何使用這種架構來應用 TL。
在下一節(jié)中,我們將看到如何從頭開始運行一個簡單的 Transformer 示例。將給出有關安裝步驟的相關信息,并詳細研究使用數據集和基準。
總結
以上是生活随笔為你收集整理的【Transformers】第 1 章:从Bag-of-Words到Transformer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 非同质化代币(NFT)概述
- 下一篇: Eplan2.7 安装教程