日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

attention seq2seq transformer bert 学习总结 _20201107

發(fā)布時間:2023/11/28 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 attention seq2seq transformer bert 学习总结 _20201107 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

https://blog.csdn.net/weixin_44388679/article/details/102575223
Seq2Seq原理詳解

一文讀懂BERT(原理篇)

2018年的10月11日,Google發(fā)布的論文《Pre-training of Deep Bidirectional Transformers for Language Understanding》,成功在 11 項 NLP 任務(wù)中取得 state of the art 的結(jié)果,贏得自然語言處理學(xué)界的一片贊譽(yù)之聲。

本文是對近期關(guān)于BERT論文、相關(guān)文章、代碼進(jìn)行學(xué)習(xí)后的知識梳理,僅為自己學(xué)習(xí)交流之用。因筆者精力有限,如果文中因引用了某些文章觀點未標(biāo)出處還望作者海涵,也希望各位一起學(xué)習(xí)的讀者對文中不恰當(dāng)?shù)牡胤竭M(jìn)行批評指正。

1)資源梳理

  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  • 論文原文:
    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  • 官方代碼和預(yù)訓(xùn)練模型
    Github: https://github.com/google-research/bert

  • Google AI Blog:
    Open Sourcing BERT: State-of-the-Art Pre-training for Natural Language Processing

  • 第三方代碼

    1. pytorch-pretrained-BERT
      Google官方推薦的PyTorch BERB版本實現(xiàn),可加載Google預(yù)訓(xùn)練的模型:PyTorch version of Google AI’s BERT model with script to load Google’s pre-trained models

    2. BERT-pytorch
      另一個Pytorch版本實現(xiàn):Google AI 2018 BERT pytorch implementation

    3. BERT-tensorflow
      Tensorflow版本:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    4. bert-chainer
      Chanier版本: Chainer implementation of “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”

    5. bert-as-service
      將不同長度的句子用BERT預(yù)訓(xùn)練模型編碼,映射到一個固定長度的向量上:Mapping a variable-length sentence to a fixed-length vector using pretrained BERT model
      進(jìn)一步是否可以做一個句子相似度計算服務(wù)?有沒有同學(xué)一試?

    6. bert_language_understanding
      BERT實戰(zhàn):Pre-training of Deep Bidirectional Transformers for Language Understanding: pre-train TextCNN

    7. sentiment_analysis_fine_grain
      BERT實戰(zhàn),多標(biāo)簽文本分類,在 AI Challenger 2018 細(xì)粒度情感分析任務(wù)上的嘗試:Multi-label Classification with BERT; Fine Grained Sentiment Analysis from AI challenger

    8. BERT-NER
      BERT實戰(zhàn),命名實體識別: Use google BERT to do CoNLL-2003 NER !

    9. BERT-keras
      Keras版: Keras implementation of BERT with pre-trained weights

    10. tbert
      PyTorch port of BERT ML model

2)NLP發(fā)展史

關(guān)于NLP發(fā)展史,特別推薦weizier大佬的NLP的巨人肩膀。學(xué)術(shù)性和文學(xué)性都很棒,縱覽NLP近幾年的重要發(fā)展,對各算法如數(shù)家珍,深入淺出,思路清晰,文不加點,一氣呵成。
現(xiàn)對NLP發(fā)展脈絡(luò)簡要梳理如下:

  • 2001 - Neural language models(神經(jīng)語言模型)
  • 2008 - Multi-task learning(多任務(wù)學(xué)習(xí))
  • 2013 - Word embeddings(詞嵌入)
  • 2013 - Neural networks for NLP(NLP神經(jīng)網(wǎng)絡(luò))
  • 2014 - Sequence-to-sequence models
  • 2015 - Attention(注意力機(jī)制)
  • 2015 - Memory-based networks(基于記憶的網(wǎng)絡(luò))
  • 2018 - Pretrained language models(預(yù)訓(xùn)練語言模型)

2001 - 神經(jīng)語言模型

第一個神經(jīng)語言模型是Bengio等人在2001年提出的前饋神經(jīng)網(wǎng)絡(luò),如圖所示:
這個模型將從表C中查找到的n個單詞作為輸入向量表征。這種向量被現(xiàn)在的學(xué)者們稱做“詞嵌入”。這些詞嵌入級聯(lián)后被輸入到一個隱藏層中,該隱藏層的輸出又被輸入到softmax層。更多關(guān)于模型的信息。

語言建模通常是應(yīng)用RNN時的第一步,是一種非監(jiān)督學(xué)習(xí)形式。盡管它很簡單,但卻是本文后面討論的許多技術(shù)發(fā)展的核心:

  • 詞嵌入:word2vec 的目標(biāo)是簡化語言建模。

  • sequence-to-sequence 模型:這種模型通過一次預(yù)測一個單詞生成一個輸出序列。

  • 預(yù)訓(xùn)練語言模型:這些方法使用來自語言模型的表述進(jìn)行遷移學(xué)習(xí)。

反過來講,這意味著近年來 NLP 的許多重要進(jìn)展都可以歸結(jié)為某些形式的語言建模。為了“真正”理解自然語言,僅僅從文本的原始形式中學(xué)習(xí)是不夠的。我們需要新的方法和模型。

2008- 多任務(wù)學(xué)習(xí)

多任務(wù)學(xué)習(xí)是在多個任務(wù)上訓(xùn)練的模型之間共享參數(shù)的一種通用方法。在神經(jīng)網(wǎng)絡(luò)中,可以通過給不同層施以不同的權(quán)重,來很容易地實現(xiàn)多任務(wù)學(xué)習(xí)。多任務(wù)學(xué)習(xí)的概念最初由Rich Caruana 在1993年提出,并被應(yīng)用于道路跟蹤和肺炎預(yù)測(Caruana,1998)。直觀地說,多任務(wù)學(xué)習(xí)鼓勵模型學(xué)習(xí)對許多任務(wù)有用的表述。這對于學(xué)習(xí)一般的、低級的表述形式、集中模型的注意力或在訓(xùn)練數(shù)據(jù)有限的環(huán)境中特別有用。詳情請看這篇文章

在2008年,Collobert 和 Weston 將多任務(wù)學(xué)習(xí)首次應(yīng)用于 NLP 的神經(jīng)網(wǎng)絡(luò)。在他們的模型中,查詢表(或單詞嵌入矩陣)在兩個接受不同任務(wù)訓(xùn)練的模型之間共享,如下面的圖所示。

2013- 詞嵌入

用稀疏向量表示文本,即所謂的詞袋模型在 NLP 有著悠久的歷史。正如上文中介紹的,早在 2001年就開始使用密集向量表示詞或詞嵌入。Mikolov等人在2013年提出的創(chuàng)新技術(shù)是通過去除隱藏層,逼近目標(biāo),進(jìn)而使這些單詞嵌入的訓(xùn)練更加高效。雖然這些技術(shù)變更本質(zhì)上很簡單,但它們與高效的word2vec配合使用,便能使大規(guī)模的詞嵌入訓(xùn)練成為可能。

Word2vec有兩種風(fēng)格,如下面的圖所示:連續(xù)字袋 CBOW 和 skip-gram。不過他們的目標(biāo)不同:一個是根據(jù)周圍的單詞預(yù)測中心單詞,而另一個則相反。
雖然這些嵌入在概念上與使用前饋神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的嵌入在概念上沒有區(qū)別,但是在一個非常大的語料庫上訓(xùn)練之后,它們就能夠捕獲諸如性別、動詞時態(tài)和國家-首都關(guān)系等單詞之間的特定關(guān)系,如下圖所示。

2013 - NLP 神經(jīng)網(wǎng)絡(luò)

2013 年和 2014 年是 NLP 問題開始引入神經(jīng)網(wǎng)絡(luò)模型的時期。使用最廣泛的三種主要的神經(jīng)網(wǎng)絡(luò)是:循環(huán)神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)和遞歸神經(jīng)網(wǎng)絡(luò)。

循環(huán)神經(jīng)網(wǎng)絡(luò)(RNNs) 循環(huán)神經(jīng)網(wǎng)絡(luò)是處理 NLP 中普遍存在的動態(tài)輸入序列的一個最佳的技術(shù)方案。Vanilla RNNs (Elman,1990)很快被經(jīng)典的長-短期記憶網(wǎng)絡(luò)(Hochreiter & Schmidhuber,1997)所取代,它被證明對消失和爆炸梯度問題更有彈性。在 2013 年之前,RNN 仍被認(rèn)為很難訓(xùn)練;Ilya Sutskever 的博士論文為改變這種現(xiàn)狀提供了一個關(guān)鍵性的例子。下面的圖對 LSTM 單元進(jìn)行了可視化顯示。雙向 LSTM(Graves等,2013)通常用于處理左右兩邊的上下文。
卷積神經(jīng)網(wǎng)絡(luò)(CNNs) 卷積神經(jīng)網(wǎng)絡(luò)本來是廣泛應(yīng)用于計算機(jī)視覺領(lǐng)域的技術(shù),現(xiàn)在也開始應(yīng)用于語言(Kalchbrenner等,2014;Kim等,2014)。文本的卷積神經(jīng)網(wǎng)絡(luò)只在兩個維度上工作,其中濾波器(卷積核)只需要沿著時間維度移動。下面的圖顯示了NLP中使用的典型 CNN。
卷積神經(jīng)網(wǎng)絡(luò)的一個優(yōu)點是它們比 RNN 更可并行化,因為其在每個時間步長的狀態(tài)只依賴于本地上下文(通過卷積運算),而不是像 RNN 那樣依賴過去所有的狀態(tài)。使用膨脹卷積,可以擴(kuò)大 CNN 的感受野,使網(wǎng)絡(luò)有能力捕獲更長的上下文(Kalchbrenner等,2016)。CNN 和 LSTM 可以組合和疊加(Wang等,2016),卷積也可以用來加速 LSTM(Bradbury等, 2017)。

遞歸神經(jīng)網(wǎng)絡(luò) RNN 和 CNN 都將語言視為一個序列。然而,從語言學(xué)的角度來看,語言本質(zhì)上是層次化的:單詞被組合成高階短語和從句,這些短語和從句本身可以根據(jù)一組生產(chǎn)規(guī)則遞歸地組合。將句子視為樹而不是序列的語言學(xué)啟發(fā)思想產(chǎn)生了遞歸神經(jīng)網(wǎng)絡(luò)(Socher 等人, 2013),如下圖所示
遞歸神經(jīng)網(wǎng)絡(luò)從下到上構(gòu)建序列的表示,這一點不同于從左到右或從右到左處理句子的 RNN。在樹的每個節(jié)點上,通過組合子節(jié)點的結(jié)果來計算新的結(jié)果。由于樹也可以被視為在 RNN 上強(qiáng)加不同的處理順序,所以 LSTM 自然地也被擴(kuò)展到樹上(Tai等,2015)。

RNN 和 LSTM 可以擴(kuò)展到使用層次結(jié)構(gòu)。單詞嵌入不僅可以在本地學(xué)習(xí),還可以在語法語境中學(xué)習(xí)(Levy & Goldberg等,2014);語言模型可以基于句法堆棧生成單詞(Dyer等,2016);圖卷積神經(jīng)網(wǎng)絡(luò)可以基于樹結(jié)構(gòu)運行(Bastings等,2017)。

2014-sequence-to-sequence 模型

2014 年,Sutskever 等人提出了 sequence-to-sequence 模型。這是一個使用神經(jīng)網(wǎng)絡(luò)將一個序列映射到另一個序列的通用框架。在該框架中,編碼器神經(jīng)網(wǎng)絡(luò)逐符號處理一個句子,并將其壓縮為一個向量表示;然后,一個解碼器神經(jīng)網(wǎng)絡(luò)根據(jù)編碼器狀態(tài)逐符號輸出預(yù)測值,并將之前預(yù)測的符號作為每一步的輸入,如下圖所示。

機(jī)器翻譯是對這個框架比較成功的應(yīng)用。2016 年,谷歌宣布將開始用神經(jīng) MT 模型取代基于單片短語的 MT 模型(Wu等,2016)。根據(jù) Jeff Dean 的說法,這意味著用 500 行神經(jīng)網(wǎng)絡(luò)模型替換 50 萬行基于短語的MT代碼。

由于其靈活性,這個框架現(xiàn)在是自然語言生成任務(wù)的首選框架,其中不同的模型承擔(dān)了編碼器和解碼器的角色。重要的是,解碼器模型不僅可以解碼一個序列,而且可以解碼任意表征。例如,可以基于圖像生成標(biāo)題(Vinyals等,2015)(如下圖所示)、基于表生成文本(Lebret等,2016)和基于應(yīng)用程序中源代碼更改描述(Loyola等,2017)。
sequence-to-sequence 學(xué)習(xí)甚至可以應(yīng)用于 NLP 中輸出具有特定結(jié)構(gòu)的結(jié)構(gòu)化預(yù)測任務(wù)。為了簡單起見,輸出被線性化,如下面的圖所示,用于進(jìn)行選區(qū)解析。神經(jīng)網(wǎng)絡(luò)已經(jīng)證明了在有足夠數(shù)量的訓(xùn)練數(shù)據(jù)進(jìn)行選區(qū)分析(Vinyals等,2015)和命名實體識別(Gillick等, 2016)的情況下,直接學(xué)習(xí)可以產(chǎn)生這種線性化輸出的能力。

2015- 注意力機(jī)制

注意力機(jī)制(Bahdanau 等,2015)是神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯(NMT)的核心創(chuàng)新之一,也是使 NMT模型勝過經(jīng)典的基于短語的MT系統(tǒng)的關(guān)鍵思想。sequence-to-sequence模型的主要瓶頸是需要將源序列的全部內(nèi)容壓縮為一個固定大小的向量。注意力機(jī)制通過允許解碼器回頭查看源序列隱藏狀態(tài)來緩解這一問題,然后將其加權(quán)平均作為額外輸入提供給解碼器,如下面的圖所示

注意力機(jī)制有很多不同的形式(Luong等,2015)。這里有一個簡短的概述。注意力機(jī)制廣泛適用于任何需要根據(jù)輸入的特定部分做出決策的任務(wù),并且效果不錯。它已被應(yīng)用于一致性解析(Vinyals等,2015)、閱讀理解(Hermann等,2015)和一次性學(xué)習(xí)(Vinyals等,2016)等諸多領(lǐng)域。輸入甚至不需要是一個序列,即可以包含其他表示,如圖像字幕(Xu等,2015),如下圖所示。注意力機(jī)制的一個額外的功能是,它提供了一種少見的功能,我們可以通過檢查輸入的哪些部分與基于注意力權(quán)重的特定輸出相關(guān)來了解模型的內(nèi)部工作方式。

2015 - 基于記憶的網(wǎng)絡(luò)

注意力機(jī)制可以看作是模糊記憶的一種形式。記憶由模型的隱藏狀態(tài)組成,模型選擇從記憶中檢索內(nèi)容。研究者們提出了許多具有更明確記憶的模型。這些模型有不同的變體,如神經(jīng)圖靈機(jī)(Graves等,2014)、記憶網(wǎng)絡(luò)(Weston等,2015)和端到端記憶網(wǎng)絡(luò)(Sukhbaatar等,2015)、動態(tài)記憶網(wǎng)絡(luò)(Kumar等,2015)、神經(jīng)微分計算機(jī)(Graves等,2016)和循環(huán)實體網(wǎng)絡(luò)(Henaff等,2017)。

記憶的訪問通常基于與當(dāng)前狀態(tài)的相似度,類似于注意力,通常可以寫入和讀取。模型在如何實現(xiàn)和利用內(nèi)存方面有所不同。例如,端到端記憶網(wǎng)絡(luò)多次處理輸入,并更新記憶以實現(xiàn)多個推理步驟。神經(jīng)圖靈機(jī)也有一個基于位置的尋址,這允許他們學(xué)習(xí)簡單的計算機(jī)程序,如排序。基于記憶的模型通常應(yīng)用于一些特定任務(wù)中,如語言建模和閱讀理解。在這些任務(wù)中,長時間保存信息應(yīng)該很有用。記憶的概念是非常通用的:知識庫或表可以充當(dāng)記憶,而記憶也可以根據(jù)整個輸入或它的特定部分填充。

2018 - 預(yù)訓(xùn)練語言模型

預(yù)訓(xùn)練的詞嵌入與上下文無關(guān),僅用于初始化模型中的第一層。一系列監(jiān)督型任務(wù)被用于神經(jīng)網(wǎng)絡(luò)的預(yù)訓(xùn)練。相反,語言模型只需要無標(biāo)簽的文本;因此,訓(xùn)練可以擴(kuò)展到數(shù)十億個tokens, new domains, new languages。預(yù)訓(xùn)練語言模型于 2015 年被首次提出(Dai & Le,2015);直到最近,它們才被證明在各種任務(wù)中效果還是不錯的。語言模型嵌入可以作為目標(biāo)模型中的特征(Peters等,2018),或者使用語言模型對目標(biāo)任務(wù)數(shù)據(jù)進(jìn)行微調(diào)(Ramachandranden等,2017; Howard & Ruder,2018)。添加語言模型嵌入可以在許多不同的任務(wù)中提供比最先進(jìn)的技術(shù)更大的改進(jìn),如下面的圖所示。


預(yù)訓(xùn)練的語言模型已經(jīng)被證明可以用更少的數(shù)據(jù)進(jìn)行學(xué)習(xí)。由于語言模型只需要無標(biāo)記的數(shù)據(jù),因此對于標(biāo)記數(shù)據(jù)稀缺的低資源語言尤其有用。

其他里程碑事件

其他一些技術(shù)發(fā)展沒有上面提到的那樣流行,但仍然有廣泛的影響。

  • 基于字符的表示
    在字符上使用 CNN 或 LSTM 以獲得基于字符的詞表示的做法現(xiàn)在相當(dāng)普遍,特別是對于形態(tài)信息重要或有許多未知單詞的豐富的語言和任務(wù),效果更加明顯。據(jù)我所知,序列標(biāo)簽使用基于字符的表示(Lample 等人,2016;普蘭克等人,2016),可以減輕在計算成本增加的情況下必須處理固定詞匯表的需要,并支持完全基于字符的 NMT (Ling 等人, 2016;Lee 等人,2017)。

  • 對抗學(xué)習(xí)
    對抗學(xué)習(xí)方法已經(jīng)在 ML 領(lǐng)域掀起了風(fēng)暴,在 NLP 中也有不同形式的應(yīng)用。對抗性的例子越來越被廣泛使用,它不僅是作為一種工具來探究模型和理解它們的失敗案例,而且也使自身更加魯棒(Jia & Liang, 2017)。(虛擬)對抗性訓(xùn)練,即最壞情況擾動(Miyato 等人,2017)和領(lǐng)域?qū)剐該p失(Ganin 等人, 2016;Kim 等人,2017),同樣可以使模型更加魯棒。生成對抗網(wǎng)絡(luò)(GANs)對于自然語言生成還不是很有效(Semeniuta 等人, 2018),但在匹配分布時很有用(Conneau 等人, 2018)。

  • 強(qiáng)化學(xué)習(xí)
    強(qiáng)化學(xué)習(xí)已被證明對具有時間依賴性的任務(wù)有效,例如在訓(xùn)練期間選擇數(shù)據(jù)(Fang 等人, 2017;Wu 等人, 2018)和建模對話(Liu 等人, 2018)。RL 對于直接優(yōu)化不可微的末端度量(如 ROUGE 或 BLEU)也有效,反而在匯總中優(yōu)化替代損失(如交叉熵)(Paulus 等人, 2018;Celikyilmaz 等人,2018)和機(jī)器翻譯場景效果就不明顯了(Ranzato 等人,2016)。類似地,逆向強(qiáng)化學(xué)習(xí)在過于復(fù)雜而無法指定數(shù)據(jù)的情況下也很有用,比看圖說話任務(wù)(Wang 等人, 2018)。

3)BERT:一切過往, 皆為序章

Attention機(jī)制講解

attention是一種能讓模型對重要信息重點關(guān)注并充分學(xué)習(xí)吸收的技術(shù),它不算是一個完整的模型,應(yīng)當(dāng)是一種技術(shù),能夠作用于任何序列模型中。

Seq2Seq

在開始講解Attention之前,我們先簡單回顧一下Seq2Seq模型,傳統(tǒng)的機(jī)器翻譯基本都是基于Seq2Seq模型來做的,該模型分為encoder層與decoder層,并均為RNN或RNN的變體構(gòu)成,如下圖所示:

在encode階段,第一個節(jié)點輸入一個詞,之后的節(jié)點輸入的是下一個詞與前一個節(jié)點的hidden state,最終encoder會輸出一個context,這個context又作為decoder的輸入,每經(jīng)過一個decoder的節(jié)點就輸出一個翻譯后的詞,并把decoder的hidden state作為下一層的輸入。該模型對于短文本的翻譯來說效果很好,但是其也存在一定的缺點,如果文本稍長一些,就很容易丟失文本的一些信息,為了解決這個問題,Attention應(yīng)運而生。

Attention

Attention,正如其名,注意力,該模型在decode階段,會選擇最適合當(dāng)前節(jié)點的context作為輸入。Attention與傳統(tǒng)的Seq2Seq模型主要有以下兩點不同。

1)encoder提供了更多的數(shù)據(jù)給到decoder,encoder會把所有的節(jié)點的hidden state提供給decoder,而不僅僅只是encoder最后一個節(jié)點的hidden state。

2)decoder并不是直接把所有encoder提供的hidden state作為輸入,而是采取一種選擇機(jī)制,把最符合當(dāng)前位置的hidden state選出來,具體的步驟如下

  • 確定哪一個hidden state與當(dāng)前節(jié)點關(guān)系最為密切

  • 計算每一個hidden state的分?jǐn)?shù)值(具體怎么計算我們下文講解)

  • 對每個分?jǐn)?shù)值做一個softmax的計算,這能讓相關(guān)性高的hidden state的分?jǐn)?shù)值更大,相關(guān)性低的hidden state的分?jǐn)?shù)值更低

這里我們以一個具體的例子來看下其中的詳細(xì)計算步驟:

把每一個encoder節(jié)點的hidden states的值與decoder當(dāng)前節(jié)點的上一個節(jié)點的hidden state相乘,如上圖,h1、h2、h3分別與當(dāng)前節(jié)點的上一節(jié)點的hidden state進(jìn)行相乘(如果是第一個decoder節(jié)點,需要隨機(jī)初始化一個hidden state),最后會獲得三個值,這三個值就是上文提到的hidden state的分?jǐn)?shù),注意,這個數(shù)值對于每一個encoder的節(jié)點來說是不一樣的,把該分?jǐn)?shù)值進(jìn)行softmax計算,計算之后的值就是每一個encoder節(jié)點的hidden states對于當(dāng)前節(jié)點的權(quán)重,把權(quán)重與原h(huán)idden states相乘并相加,得到的結(jié)果即是當(dāng)前節(jié)點的hidden state。可以發(fā)現(xiàn),其實Atttention的關(guān)鍵就是計算這個分值。

明白每一個節(jié)點是怎么獲取hidden state之后,接下來就是decoder層的工作原理了,其具體過程如下:

第一個decoder的節(jié)點初始化一個向量,并計算當(dāng)前節(jié)點的hidden state,把該hidden state作為第一個節(jié)點的輸入,經(jīng)過RNN節(jié)點后得到一個新的hidden state與輸出值。注意,這里和Seq2Seq有一個很大的區(qū)別,Seq2Seq是直接把輸出值作為當(dāng)前節(jié)點的輸出,但是Attention會把該值與hidden state做一個連接,并把連接好的值作為context,并送入一個前饋神經(jīng)網(wǎng)絡(luò),最終當(dāng)前節(jié)點的輸出內(nèi)容由該網(wǎng)絡(luò)決定,重復(fù)以上步驟,直到所有decoder的節(jié)點都輸出相應(yīng)內(nèi)容。

Attention模型并不只是盲目地將輸出的第一個單詞與輸入的第一個詞對齊。實際上,它在訓(xùn)練階段學(xué)習(xí)了如何在該語言對中對齊單詞(示例中是法語和英語)。Attention函數(shù)的本質(zhì)可以被描述為一個查詢(query)到一系列(鍵key-值value)對的映射。

在計算attention時主要分為三步,第一步是將query和每個key進(jìn)行相似度計算得到權(quán)重,常用的相似度函數(shù)有點積,拼接,感知機(jī)等;然后第二步一般是使用一個softmax函數(shù)對這些權(quán)重進(jìn)行歸一化;最后將權(quán)重和相應(yīng)的鍵值value進(jìn)行加權(quán)求和得到最后的attention。目前在NLP研究中,key和value常常都是同一個,即key=value。

Transrofmer模型講解

接下來我將介紹《Attention is all you need》這篇論文。這篇論文是google機(jī)器翻譯團(tuán)隊在2017年6月放在arXiv上,最后發(fā)表在2017年nips上,到目前為止google學(xué)術(shù)顯示引用量為2203,可見也是受到了大家廣泛關(guān)注和應(yīng)用。這篇論文主要亮點在于
1)不同于以往主流機(jī)器翻譯使用基于RNN的seq2seq模型框架,該論文用attention機(jī)制代替了RNN搭建了整個模型框架。
2)提出了多頭注意力(Multi-headed attention)機(jī)制方法,在編碼器和解碼器中大量的使用了多頭自注意力機(jī)制(Multi-headed self-attention)。
3)在WMT2014語料中的英德和英法任務(wù)上取得了先進(jìn)結(jié)果,并且訓(xùn)練速度比主流模型更快。

《Attention Is All You Need》是一篇Google提出的將Attention思想發(fā)揮到極致的論文。這篇論文中提出一個全新的模型,叫 Transformer,拋棄了以往深度學(xué)習(xí)任務(wù)里面使用到的 CNN 和 RNN ,Bert就是基于Transformer構(gòu)建的,這個模型廣泛應(yīng)用于NLP領(lǐng)域,例如機(jī)器翻譯,問答系統(tǒng),文本摘要和語音識別等等方向。關(guān)于Transrofmer模型的理解特別推薦一位國外博主文章《The Illustrated Transformer》。

Transformer總體結(jié)構(gòu)

和Attention模型一樣,Transformer模型中也采用了 encoer-decoder 架構(gòu)。但其結(jié)構(gòu)相比于Attention更加復(fù)雜,論文中encoder層由6個encoder堆疊在一起,decoder層也一樣。
每一個encoder和decoder的內(nèi)部簡版結(jié)構(gòu)如下圖

對于encoder,包含兩層,一個self-attention層和一個前饋神經(jīng)網(wǎng)絡(luò),self-attention能幫助當(dāng)前節(jié)點不僅僅只關(guān)注當(dāng)前的詞,從而能獲取到上下文的語義。decoder也包含encoder提到的兩層網(wǎng)絡(luò),但是在這兩層中間還有一層attention層,幫助當(dāng)前節(jié)點獲取到當(dāng)前需要關(guān)注的重點內(nèi)容。

現(xiàn)在我們知道了模型的主要組件,接下來我們看下模型的內(nèi)部細(xì)節(jié)。首先,模型需要對輸入的數(shù)據(jù)進(jìn)行一個embedding操作,(也可以理解為類似w2c的操作),enmbedding結(jié)束之后,輸入到encoder層,self-attention處理完數(shù)據(jù)后把數(shù)據(jù)送給前饋神經(jīng)網(wǎng)絡(luò),前饋神經(jīng)網(wǎng)絡(luò)的計算可以并行,得到的輸出會輸入到下一個encoder。

Self-Attention

接下來我們詳細(xì)看一下self-attention,其思想和attention類似,但是self-attention是Transformer用來將其他相關(guān)單詞的“理解”轉(zhuǎn)換成我們正常理解的單詞的一種思路,我們看個例子:
The animal didn't cross the street because it was too tired
這里的it到底代表的是animal還是street呢,對于我們來說能很簡單的判斷出來,但是對于機(jī)器來說,是很難判斷的,self-attention就能夠讓機(jī)器把it和animal聯(lián)系起來

接下來我們看下詳細(xì)的處理過程。

1、首先,self-attention會計算出三個新的向量,在論文中,向量的維度是512維,我們把這三個向量分別稱為Query、Key、Value,這三個向量是用embedding向量與一個矩陣相乘得到的結(jié)果,這個矩陣是隨機(jī)初始化的,維度為(64,512)注意第二個維度需要和embedding的維度一樣,其值在BP的過程中會一直進(jìn)行更新,得到的這三個向量的維度是64低于embedding維度的。


那么Query、Key、Value這三個向量又是什么呢?這三個向量對于attention來說很重要,當(dāng)你理解了下文后,你將會明白這三個向量扮演者什么的角色。

2、計算self-attention的分?jǐn)?shù)值,該分?jǐn)?shù)值決定了當(dāng)我們在某個位置encode一個詞時,對輸入句子的其他部分的關(guān)注程度。這個分?jǐn)?shù)值的計算方法是Query與Key做點乘,以下圖為例,首先我們需要針對Thinking這個詞,計算出其他詞對于該詞的一個分?jǐn)?shù)值,首先是針對于自己本身即q1·k1,然后是針對于第二個詞即q1·k2

3、接下來,把點成的結(jié)果除以一個常數(shù),這里我們除以8,這個值一般是采用上文提到的矩陣的第一個維度的開方即64的開方8,當(dāng)然也可以選擇其他的值,然后把得到的結(jié)果做一個softmax的計算。得到的結(jié)果即是每個詞對于當(dāng)前位置的詞的相關(guān)性大小,當(dāng)然,當(dāng)前位置的詞相關(guān)性肯定會會很大

4、下一步就是把Value和softmax得到的值進(jìn)行相乘,并相加,得到的結(jié)果即是self-attetion在當(dāng)前節(jié)點的值。

在實際的應(yīng)用場景,為了提高計算速度,我們采用的是矩陣的方式,直接計算出Query, Key, Value的矩陣,然后把embedding的值與三個矩陣直接相乘,把得到的新矩陣Q與K相乘,乘以一個常數(shù),做softmax操作,最后乘上V矩陣


這種通過 query 和 key 的相似性程度來確定 value 的權(quán)重分布的方法被稱為scaled dot-product attention。其實scaled dot-Product attention就是我們常用的使用點積進(jìn)行相似度計算的attention,只是多除了一個(為K的維度)起到調(diào)節(jié)作用,使得內(nèi)積不至于太大。

Multi-Headed Attention

這篇論文更厲害的地方是給self-attention加入了另外一個機(jī)制,被稱為“multi-headed” attention,該機(jī)制理解起來很簡單,就是說不僅僅只初始化一組Q、K、V的矩陣,而是初始化多組,tranformer是使用了8組,所以最后得到的結(jié)果是8個矩陣。


這給我們留下了一個小的挑戰(zhàn),前饋神經(jīng)網(wǎng)絡(luò)沒法輸入8個矩陣呀,這該怎么辦呢?所以我們需要一種方式,把8個矩陣降為1個,首先,我們把8個矩陣連在一起,這樣會得到一個大的矩陣,再隨機(jī)初始化一個矩陣和這個組合好的矩陣相乘,最后得到一個最終的矩陣。

這就是multi-headed attention的全部流程了,這里其實已經(jīng)有很多矩陣了,我們把所有的矩陣放到一張圖內(nèi)看一下總體的流程。

多頭attention(Multi-head attention)整個過程可以簡述為:Query,Key,Value首先進(jìn)過一個線性變換,然后輸入到放縮點積attention(注意這里要做h次,其實也就是所謂的多頭,每一次算一個頭,而且每次Q,K,V進(jìn)行線性變換的參數(shù)W是不一樣的),然后將h次的放縮點積attention結(jié)果進(jìn)行拼接,再進(jìn)行一次線性變換得到的值作為多頭attention的結(jié)果。可以看到,google提出來的多頭attention的不同之處在于進(jìn)行了h次計算而不僅僅算一次,論文中說到這樣的好處是可以允許模型在不同的表示子空間里學(xué)習(xí)到相關(guān)的信息,后面還會根據(jù)attention可視化來驗證。

那么在整個模型中,是如何使用attention的呢?如下圖,首先在編碼器到解碼器的地方使用了多頭attention進(jìn)行連接,K,V,Q分別是編碼器的層輸出(這里K=V)和解碼器中都頭attention的輸入。其實就和主流的機(jī)器翻譯模型中的attention一樣,利用解碼器和編碼器attention來進(jìn)行翻譯對齊。然后在編碼器和解碼器中都使用了多頭自注意力self-attention來學(xué)習(xí)文本的表示。Self-attention即K=V=Q,例如輸入一個句子,那么里面的每個詞都要和該句子中的所有詞進(jìn)行attention計算。目的是學(xué)習(xí)句子內(nèi)部的詞依賴關(guān)系,捕獲句子的內(nèi)部結(jié)構(gòu)。


對于使用自注意力機(jī)制的原因,論文中提到主要從三個方面考慮(每一層的復(fù)雜度,是否可以并行,長距離依賴學(xué)習(xí)),并給出了和RNN,CNN計算復(fù)雜度的比較。可以看到,如果輸入序列n小于表示維度d的話,每一層的時間復(fù)雜度self-attention是比較有優(yōu)勢的。當(dāng)n比較大時,作者也給出了一種解決方案self-attention(restricted)即每個詞不是和所有詞計算attention,而是只與限制的r個詞去計算attention。在并行方面,多頭attention和CNN一樣不依賴于前一時刻的計算,可以很好的并行,優(yōu)于RNN。在長距離依賴上,由于self-attention是每個詞和所有詞都要計算attention,所以不管他們中間有多長距離,最大的路徑長度也都只是1。可以捕獲長距離依賴關(guān)系。

現(xiàn)在我們已經(jīng)接觸了attention的header,讓我們重新審視我們之前的例子,看看例句中的“it”這個單詞在不同的attention header情況下會有怎樣不同的關(guān)注點(這里不同顏色代表attention不同頭的結(jié)果,顏色越深attention值越大)。

當(dāng)我們對“it”這個詞進(jìn)行編碼時,一個注意力的焦點主要集中在“animal”上,而另一個注意力集中在“tired”(兩個heads)
但是,如果我們將所有注意力添加到圖片中,可能有點難理解:

Positional Encoding

到目前為止,transformer模型中還缺少一種解釋輸入序列中單詞順序的方法。為了處理這個問題,transformer給encoder層和decoder層的輸入添加了一個額外的向量Positional Encoding,維度和embedding的維度一樣,這個向量采用了一種很獨特的方法來讓模型學(xué)習(xí)到這個值,這個向量能決定當(dāng)前詞的位置,或者說在一個句子中不同的詞之間的距離。這個位置向量的具體計算方法有很多種,論文中的計算方法如下

其中pos是指當(dāng)前詞在句子中的位置,i是指向量中每個值的index,可以看出,在偶數(shù)位置,使用正弦編碼,在奇數(shù)位置,使用余弦編碼。最后把這個Positional Encoding與embedding的值相加,作為輸入送到下一層。

為了讓模型捕捉到單詞的順序信息,我們添加位置編碼向量信息(POSITIONAL ENCODING),位置編碼向量不需要訓(xùn)練,它有一個規(guī)則的產(chǎn)生方式(上圖公式)。

如果我們的嵌入維度為4,那么實際上的位置編碼就如下圖所示:

那么生成位置向量需要遵循怎樣的規(guī)則呢?

觀察下面的圖形,每一行都代表著對一個矢量的位置編碼。因此第一行就是我們輸入序列中第一個字的嵌入向量,每行都包含512個值,每個值介于1和-1之間。我們用顏色來表示1,-1之間的值,這樣方便可視化的方式表現(xiàn)出來:

這是一個20個字(行)的(512)列位置編碼示例。你會發(fā)現(xiàn)它咋中心位置被分為了2半,這是因為左半部分的值是一由一個正弦函數(shù)生成的,而右半部分是由另一個函數(shù)(余弦)生成。然后將它們連接起來形成每個位置編碼矢量。

Layer normalization

在transformer中,每一個子層(self-attetion,ffnn)之后都會接一個殘差模塊,并且有一個Layer normalization

在進(jìn)一步探索其內(nèi)部計算方式,我們可以將上面圖層可視化為下圖:

殘差模塊相信大家都很清楚了,這里不再講解,主要講解下Layer normalization。Normalization有很多種,但是它們都有一個共同的目的,那就是把輸入轉(zhuǎn)化成均值為0方差為1的數(shù)據(jù)。我們在把數(shù)據(jù)送入激活函數(shù)之前進(jìn)行normalization(歸一化),因為我們不希望輸入數(shù)據(jù)落在激活函數(shù)的飽和區(qū)。

說到 normalization,那就肯定得提到 Batch Normalization。BN的主要思想就是:在每一層的每一批數(shù)據(jù)上進(jìn)行歸一化。我們可能會對輸入數(shù)據(jù)進(jìn)行歸一化,但是經(jīng)過該網(wǎng)絡(luò)層的作用后,我們的數(shù)據(jù)已經(jīng)不再是歸一化的了。隨著這種情況的發(fā)展,數(shù)據(jù)的偏差越來越大,我的反向傳播需要考慮到這些大的偏差,這就迫使我們只能使用較小的學(xué)習(xí)率來防止梯度消失或者梯度爆炸。

BN的具體做法就是對每一小批數(shù)據(jù),在批這個方向上做歸一化。如下圖所示:

可以看到,右半邊求均值是沿著數(shù)據(jù) batch_size的方向進(jìn)行的,其計算公式如下:

那么什么是 Layer normalization 呢?它也是歸一化數(shù)據(jù)的一種方式,不過 LN 是在每一個樣本上計算均值和方差,而不是BN那種在批方向計算均值和方差!
下面看一下 LN 的公式:

到這里為止就是全部encoders的內(nèi)容了,如果把兩個encoders疊加在一起就是這樣的結(jié)構(gòu),在self-attention需要強(qiáng)調(diào)的最后一點是其采用了殘差網(wǎng)絡(luò)中的short-cut結(jié)構(gòu),目的是解決深度學(xué)習(xí)中的退化問題。

Decoder層


上圖是transformer的一個詳細(xì)結(jié)構(gòu),相比本文一開始結(jié)束的結(jié)構(gòu)圖會更詳細(xì)些,接下來,我們會按照這個結(jié)構(gòu)圖講解下decoder部分。

可以看到decoder部分其實和encoder部分大同小異,不過在最下面額外多了一個masked mutil-head attetion,這里的mask也是transformer一個很關(guān)鍵的技術(shù),我們一起來看一下。

Mask

mask 表示掩碼,它對某些值進(jìn)行掩蓋,使其在參數(shù)更新時不產(chǎn)生效果。Transformer 模型里面涉及兩種 mask,分別是 padding mask 和 sequence mask。

其中,padding mask 在所有的 scaled dot-product attention 里面都需要用到,而 sequence mask 只有在 decoder 的 self-attention 里面用到。

Padding Mask

什么是 padding mask 呢?因為每個批次輸入序列長度是不一樣的也就是說,我們要對輸入序列進(jìn)行對齊。具體來說,就是給在較短的序列后面填充 0。但是如果輸入的序列太長,則是截取左邊的內(nèi)容,把多余的直接舍棄。因為這些填充的位置,其實是沒什么意義的,所以我們的attention機(jī)制不應(yīng)該把注意力放在這些位置上,所以我們需要進(jìn)行一些處理。

具體的做法是,把這些位置的值加上一個非常大的負(fù)數(shù)(負(fù)無窮),這樣的話,經(jīng)過 softmax,這些位置的概率就會接近0!

而我們的 padding mask 實際上是一個張量,每個值都是一個Boolean,值為 false 的地方就是我們要進(jìn)行處理的地方。

Sequence mask

文章前面也提到,sequence mask 是為了使得 decoder 不能看見未來的信息。也就是對于一個序列,在 time_step 為 t 的時刻,我們的解碼輸出應(yīng)該只能依賴于 t 時刻之前的輸出,而不能依賴 t 之后的輸出。因此我們需要想一個辦法,把 t 之后的信息給隱藏起來。

那么具體怎么做呢?也很簡單:產(chǎn)生一個上三角矩陣,上三角的值全為0。把這個矩陣作用在每一個序列上,就可以達(dá)到我們的目的。

  • 對于 decoder 的 self-attention,里面使用到的 scaled dot-product attention,同時需要padding mask 和 sequence mask 作為 attn_mask,具體實現(xiàn)就是兩個mask相加作為attn_mask。
  • 其他情況,attn_mask 一律等于 padding mask。

編碼器通過處理輸入序列啟動。然后將頂部編碼器的輸出轉(zhuǎn)換為一組注意向量k和v。每個解碼器將在其“encoder-decoder attention”層中使用這些注意向量,這有助于解碼器將注意力集中在輸入序列中的適當(dāng)位置:

完成編碼階段后,我們開始解碼階段。解碼階段的每個步驟從輸出序列(本例中為英語翻譯句)輸出一個元素。
以下步驟重復(fù)此過程,一直到達(dá)到表示解碼器已完成輸出的符號。每一步的輸出在下一個時間步被送入底部解碼器,解碼器像就像我們對編碼器輸入所做操作那樣,我們將位置編碼嵌入并添加到這些解碼器輸入中,以表示每個字的位置。

輸出層

當(dāng)decoder層全部執(zhí)行完畢后,怎么把得到的向量映射為我們需要的詞呢,很簡單,只需要在結(jié)尾再添加一個全連接層和softmax層,假如我們的詞典是1w個詞,那最終softmax會輸入1w個詞的概率,概率值最大的對應(yīng)的詞就是我們最終的結(jié)果。

BERT原理詳解

從創(chuàng)新的角度來看,bert其實并沒有過多的結(jié)構(gòu)方面的創(chuàng)新點,其和GPT一樣均是采用的transformer的結(jié)構(gòu),相對于GPT來說,其是雙向結(jié)構(gòu)的,而GPT是單向的,如下圖所示

elmo:將上下文當(dāng)作特征,但是無監(jiān)督的語料和我們真實的語料還是有區(qū)別的,不一定的符合我們特定的任務(wù),是一種雙向的特征提取。

openai gpt就做了一個改進(jìn),也是通過transformer學(xué)習(xí)出來一個語言模型,不是固定的,通過任務(wù) finetuning,用transfomer代替elmo的lstm。
openai gpt其實就是缺少了encoder的transformer。當(dāng)然也沒了encoder與decoder之間的attention。

openAI gpt雖然可以進(jìn)行fine-tuning,但是有些特殊任務(wù)與pretraining輸入有出入,單個句子與兩個句子不一致的情況,很難解決,還有就是decoder只能看到前面的信息。
其次bert在多方面的nlp任務(wù)變現(xiàn)來看效果都較好,具備較強(qiáng)的泛化能力,對于特定的任務(wù)只需要添加一個輸出層來進(jìn)行fine-tuning即可。

結(jié)構(gòu)

先看下bert的內(nèi)部結(jié)構(gòu),官網(wǎng)最開始提供了兩個版本,L表示的是transformer的層數(shù),H表示輸出的維度,A表示mutil-head attention的個數(shù)

如今已經(jīng)增加了多個模型,中文是其中唯一一個非英語的模型。

從模型的層數(shù)來說其實已經(jīng)很大了,但是由于transformer的殘差(residual)模塊,層數(shù)并不會引起梯度消失等問題,但是并不代表層數(shù)越多效果越好,有論點認(rèn)為低層偏向于語法特征學(xué)習(xí),高層偏向于語義特征學(xué)習(xí)。

預(yù)訓(xùn)練模型

首先我們要了解一下什么是預(yù)訓(xùn)練模型,舉個例子,假設(shè)我們有大量的維基百科數(shù)據(jù),那么我們可以用這部分巨大的數(shù)據(jù)來訓(xùn)練一個泛化能力很強(qiáng)的模型,當(dāng)我們需要在特定場景使用時,例如做文本相似度計算,那么,只需要簡單的修改一些輸出層,再用我們自己的數(shù)據(jù)進(jìn)行一個增量訓(xùn)練,對權(quán)重進(jìn)行一個輕微的調(diào)整。

預(yù)訓(xùn)練的好處在于在特定場景使用時不需要用大量的語料來進(jìn)行訓(xùn)練,節(jié)約時間效率高效,bert就是這樣的一個泛化能力較強(qiáng)的預(yù)訓(xùn)練模型。

BERT的預(yù)訓(xùn)練過程

接下來我們看看BERT的預(yù)訓(xùn)練過程,BERT的預(yù)訓(xùn)練階段包括兩個任務(wù),一個是Masked Language Model,還有一個是Next Sentence Prediction。

Masked Language Model

MLM可以理解為完形填空,作者會隨機(jī)mask每一個句子中15%的詞,用其上下文來做預(yù)測,例如:my dog is hairy → my dog is [MASK]

此處將hairy進(jìn)行了mask處理,然后采用非監(jiān)督學(xué)習(xí)的方法預(yù)測mask位置的詞是什么,但是該方法有一個問題,因為是mask15%的詞,其數(shù)量已經(jīng)很高了,這樣就會導(dǎo)致某些詞在fine-tuning階段從未見過,為了解決這個問題,作者做了如下的處理:

  • 80%的時間是采用[mask],my dog is hairy → my dog is [MASK]

  • 10%的時間是隨機(jī)取一個詞來代替mask的詞,my dog is hairy -> my dog is apple

  • 10%的時間保持不變,my dog is hairy -> my dog is hairy

那么為啥要以一定的概率使用隨機(jī)詞呢?這是因為transformer要保持對每個輸入token分布式的表征,否則Transformer很可能會記住這個[MASK]就是"hairy"。至于使用隨機(jī)詞帶來的負(fù)面影響,文章中解釋說,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的概率,其影響是可以忽略不計的。Transformer全局的可視,又增加了信息的獲取,但是不讓模型獲取全量信息。
注意:

  • 有參數(shù)dupe_factor決定數(shù)據(jù)duplicate的次數(shù)。
  • 其中,create_instance_from_document函數(shù),是構(gòu)造了一個sentence-pair的樣本。對每一句,先生成[CLS]+A+[SEP]+B+[SEP],有長(0.9)有短(0.1),再加上mask,然后做成樣本類object。
  • create_masked_lm_predictions函數(shù)返回的tokens是已經(jīng)被遮擋詞替換之后的tokens
  • masked_lm_labels則是遮擋詞對應(yīng)位置真實的label。

Next Sentence Prediction

選擇一些句子對A與B,其中50%的數(shù)據(jù)B是A的下一條句子,剩余50%的數(shù)據(jù)B是語料庫中隨機(jī)選擇的,學(xué)習(xí)其中的相關(guān)性,添加這樣的預(yù)訓(xùn)練的目的是目前很多NLP的任務(wù)比如QA和NLI都需要理解兩個句子之間的關(guān)系,從而能讓預(yù)訓(xùn)練的模型更好的適應(yīng)這樣的任務(wù)。
個人理解:

  • Bert先是用Mask來提高視野范圍的信息獲取量,增加duplicate再隨機(jī)Mask,這樣跟RNN類方法依次訓(xùn)練預(yù)測沒什么區(qū)別了除了mask不同位置外;

  • 全局視野極大地降低了學(xué)習(xí)的難度,然后再用A+B/C來作為樣本,這樣每條樣本都有50%的概率看到一半左右的噪聲;

  • 但直接學(xué)習(xí)Mask A+B/C是沒法學(xué)習(xí)的,因為不知道哪些是噪聲,所以又加上next_sentence預(yù)測任務(wù),與MLM同時進(jìn)行訓(xùn)練,這樣用next來輔助模型對噪聲/非噪聲的辨識,用MLM來完成語義的大部分的學(xué)習(xí)。

輸入

bert的輸入可以是單一的一個句子或者是句子對,實際的輸入值是segment embedding與position embedding相加,具體的操作流程可參考上面的transformer講解。

BERT的輸入詞向量是三個向量之和:

Token Embedding:WordPiece tokenization subword詞向量。
Segment Embedding:表明這個詞屬于哪個句子(NSP需要兩個句子)。
Position Embedding:學(xué)習(xí)出來的embedding向量。這與Transformer不同,Transformer中是預(yù)先設(shè)定好的值。

總結(jié)


BERT的去除實驗表明,雙向LM和NSP帶了的提升最大。


另一個結(jié)論是,增加模型參數(shù)數(shù)量可以提升模型效果。


BERT預(yù)訓(xùn)練模型的輸出結(jié)果,無非就是一個或多個向量。下游任務(wù)可以通過精調(diào)(改變預(yù)訓(xùn)練模型參數(shù))或者特征抽取(不改變預(yù)訓(xùn)練模型參數(shù),只是把預(yù)訓(xùn)練模型的輸出作為特征輸入到下游任務(wù))兩種方式進(jìn)行使用。BERT原論文使用了精調(diào)方式,但也嘗試了特征抽取方式的效果,比如在NER任務(wù)上,最好的特征抽取方式只比精調(diào)差一點點。但特征抽取方式的好處可以預(yù)先計算好所需的向量,存下來就可重復(fù)使用,極大提升下游任務(wù)模型訓(xùn)練的速度。

后來也有其他人針對ELMo和BERT比較了這兩種使用方式的精度差異。下面列出基本結(jié)論:



總結(jié)下BERT的主要貢獻(xiàn):

  • 引入了Masked LM,使用雙向LM做模型預(yù)訓(xùn)練。
  • 為預(yù)訓(xùn)練引入了新目標(biāo)NSP,它可以學(xué)習(xí)句子與句子間的關(guān)系。
  • 進(jìn)一步驗證了更大的模型效果更好: 12 --> 24 層。
  • 為下游任務(wù)引入了很通用的求解框架,不再為任務(wù)做模型定制。
  • 刷新了多項NLP任務(wù)的記錄,引爆了NLP無監(jiān)督預(yù)訓(xùn)練技術(shù)。

BERT是谷歌團(tuán)隊糅合目前已有的NLP知識集大成者,刷新11條賽道彰顯了無與倫比的實力,且極容易被用于多種NLP任務(wù)。宛若一束煙花點亮在所有NLP從業(yè)者心中。更為可貴的是谷歌選擇了開源這些,讓所有從業(yè)者看到了在各行各業(yè)落地的更多可能性。

BERT優(yōu)點

  • Transformer Encoder因為有Self-attention機(jī)制,因此BERT自帶雙向功能

  • 因為雙向功能以及多層Self-attention機(jī)制的影響,使得BERT必須使用Cloze版的語言模型Masked-LM來完成token級別的預(yù)訓(xùn)練

  • 為了獲取比詞更高級別的句子級別的語義表征,BERT加入了Next Sentence Prediction來和Masked-LM一起做聯(lián)合訓(xùn)練

  • 為了適配多任務(wù)下的遷移學(xué)習(xí),BERT設(shè)計了更通用的輸入層和輸出層

  • 微調(diào)成本小

BERT缺點

  • task1的隨機(jī)遮擋策略略顯粗獷,推薦閱讀《Data Nosing As Smoothing In Neural Network Language Models》

  • [MASK]標(biāo)記在實際預(yù)測中不會出現(xiàn),訓(xùn)練時用過多[MASK]影響模型表現(xiàn);

  • 每個batch只有15%的token被預(yù)測,所以BERT收斂得比left-to-right模型要慢(它們會預(yù)測每個token)

  • BERT對硬件資源的消耗巨大(大模型需要16個tpu,歷時四天;更大的模型需要64個tpu,歷時四天。

關(guān)于BERT最新的各領(lǐng)域應(yīng)用推薦張俊林的Bert時代的創(chuàng)新(應(yīng)用篇)

思考

  • 個人并不認(rèn)為文章是模型的改進(jìn),更認(rèn)可為任務(wù)的設(shè)計改進(jìn)。

  • 論文作者只比較了有沒有task1的影響,并沒有針對task2對比試驗。提升是否來自好的預(yù)訓(xùn)練任務(wù)設(shè)計沒有明說。

  • bert對nlp領(lǐng)域目前已有知識的有效“整合”,在硬件配置足夠的情況下能提高nlp多領(lǐng)域性能

BERT適用場景

第一,如果NLP任務(wù)偏向在語言本身中就包含答案,而不特別依賴文本外的其它特征,往往應(yīng)用Bert能夠極大提升應(yīng)用效果。典型的任務(wù)比如QA和閱讀理解,正確答案更偏向?qū)φZ言的理解程度,理解能力越強(qiáng),解決得越好,不太依賴語言之外的一些判斷因素,所以效果提升就特別明顯。反過來說,對于某些任務(wù),除了文本類特征外,其它特征也很關(guān)鍵,比如搜索的用戶行為/鏈接分析/內(nèi)容質(zhì)量等也非常重要,所以Bert的優(yōu)勢可能就不太容易發(fā)揮出來。再比如,推薦系統(tǒng)也是類似的道理,Bert可能只能對于文本內(nèi)容編碼有幫助,其它的用戶行為類特征,不太容易融入Bert中。

第二,Bert特別適合解決句子或者段落的匹配類任務(wù)。就是說,Bert特別適合用來解決判斷句子關(guān)系類問題,這是相對單文本分類任務(wù)和序列標(biāo)注等其它典型NLP任務(wù)來說的,很多實驗結(jié)果表明了這一點。而其中的原因,我覺得很可能主要有兩個,一個原因是:很可能是因為Bert在預(yù)訓(xùn)練階段增加了Next Sentence Prediction任務(wù),所以能夠在預(yù)訓(xùn)練階段學(xué)會一些句間關(guān)系的知識,而如果下游任務(wù)正好涉及到句間關(guān)系判斷,就特別吻合Bert本身的長處,于是效果就特別明顯。第二個可能的原因是:因為Self Attention機(jī)制自帶句子A中單詞和句子B中任意單詞的Attention效果,而這種細(xì)粒度的匹配對于句子匹配類的任務(wù)尤其重要,所以Transformer的本質(zhì)特性也決定了它特別適合解決這類任務(wù)。

從上面這個Bert的擅長處理句間關(guān)系類任務(wù)的特性,我們可以繼續(xù)推理出以下觀點:

既然預(yù)訓(xùn)練階段增加了Next Sentence Prediction任務(wù),就能對下游類似性質(zhì)任務(wù)有較好促進(jìn)作用,那么是否可以繼續(xù)在預(yù)訓(xùn)練階段加入其它的新的輔助任務(wù)?而這個輔助任務(wù)如果具備一定通用性,可能會對一類的下游任務(wù)效果有直接促進(jìn)作用。這也是一個很有意思的探索方向,當(dāng)然,這種方向因為要動Bert的第一個預(yù)訓(xùn)練階段,所以屬于NLP屆土豪們的工作范疇,窮人們還是散退、旁觀、鼓掌、叫好為妙。

第三,Bert的適用場景,與NLP任務(wù)對深層語義特征的需求程度有關(guān)。感覺越是需要深層語義特征的任務(wù),越適合利用Bert來解決;而對有些NLP任務(wù)來說,淺層的特征即可解決問題,典型的淺層特征性任務(wù)比如分詞,POS詞性標(biāo)注,NER,文本分類等任務(wù),這種類型的任務(wù),只需要較短的上下文,以及淺層的非語義的特征,貌似就可以較好地解決問題,所以Bert能夠發(fā)揮作用的余地就不太大,有點殺雞用牛刀,有力使不出來的感覺。

這很可能是因為Transformer層深比較深,所以可以逐層捕獲不同層級不同深度的特征。于是,對于需要語義特征的問題和任務(wù),Bert這種深度捕獲各種特征的能力越容易發(fā)揮出來,而淺層的任務(wù),比如分詞/文本分類這種任務(wù),也許傳統(tǒng)方法就能解決得比較好,因為任務(wù)特性決定了,要解決好它,不太需要深層特征。

第四,Bert比較適合解決輸入長度不太長的NLP任務(wù),而輸入比較長的任務(wù),典型的比如文檔級別的任務(wù),Bert解決起來可能就不太好。主要原因在于:Transformer的self attention機(jī)制因為要對任意兩個單詞做attention計算,所以時間復(fù)雜度是n平方,n是輸入的長度。如果輸入長度比較長,Transformer的訓(xùn)練和推理速度掉得比較厲害,于是,這點約束了Bert的輸入長度不能太長。所以對于輸入長一些的文檔級別的任務(wù),Bert就不容易解決好。結(jié)論是:Bert更適合解決句子級別或者段落級別的NLP任務(wù)。

如果有小伙伴堅持看到這里的話深表感謝,本來要繼續(xù)寫源碼分析和具體的實踐了。時間關(guān)系,等下周再抽時間寫源碼分析與實踐部分吧。本文僅用于筆者自己總結(jié)自己BERT學(xué)習(xí)之路,期間引用很多專家學(xué)者的觀點思路,深表感謝。第一次駕馭這么長的技術(shù)文章,每個知識點都想寫點,感覺越寫越亂。若有讀者在閱讀本文期間有不好的閱讀體驗深表歉意。

20201107

循環(huán)神經(jīng)網(wǎng)絡(luò)RNN結(jié)構(gòu)被廣泛應(yīng)用于自然語言處理、機(jī)器翻譯、語音識別、文字識別等方向。本文主要介紹經(jīng)典的RNN結(jié)構(gòu),以及RNN的變種(包括Seq2Seq結(jié)構(gòu)和Attention機(jī)制)。希望這篇文章能夠幫助初學(xué)者更好地入門。

經(jīng)典的RNN結(jié)構(gòu)


這就是最經(jīng)典的RNN結(jié)構(gòu),它的輸入是:

輸出為:

也就是說,輸入和輸出序列必有相同的時間長度!












Embedding
還有一點細(xì)節(jié),就是如何將前一時刻輸出類別index(數(shù)值)送入下一時刻輸入(向量)進(jìn)行解碼。假設(shè)每個標(biāo)簽對應(yīng)的類別index如下:
‘’ : 0,
’ : 1,
‘good’ : 2,
‘morning’ : 3,






















【NLP】Attention Model(注意力模型)學(xué)習(xí)總結(jié)

        </h1><div class="clear"></div><div class="postBody">

  最近一直在研究深度語義匹配算法,搭建了個模型,跑起來效果并不是很理想,在分析原因的過程中,發(fā)現(xiàn)注意力模型在解決這個問題上還是很有幫助的,所以花了兩天研究了一下。

  此文大部分參考深度學(xué)習(xí)中的注意力機(jī)制(2017版)?張俊林的博客,不過添加了一些個人的思考與理解過程。在github上找到一份基于keras框架實現(xiàn)的可運行的注意模型代碼:Attention_Network_With_Keras。如有不足之處,歡迎交流指教。

  注意力模型:對目標(biāo)數(shù)據(jù)進(jìn)行加權(quán)變化。人腦的注意力模型,說到底是一種資源分配模型,在某個特定時刻,你的注意力總是集中在畫面中的某個焦點部分,而對其它部分視而不見。 ------(思考:為什么要集中在那個部分,是因為那個部分能解決問題嗎?)

1. 什么是Attention機(jī)制?

  最近兩年,注意力模型(Attention Model)被廣泛使用在自然語言處理、圖像識別及語音識別等各種不同類型的深度學(xué)習(xí)任務(wù)中,是深度學(xué)習(xí)技術(shù)中最值得關(guān)注與深入了解的核心技術(shù)之一。

  當(dāng)我們?nèi)嗽诳匆粯訓(xùn)|西的時候,我們當(dāng)前時刻關(guān)注的一定是我們當(dāng)前正在看的這樣?xùn)|西的某一地方,換句話說,當(dāng)我們目光移到別處時,注意力隨著目光的移動也在轉(zhuǎn)移,這意味著,當(dāng)人們注意到某個目標(biāo)或某個場景時,該目標(biāo)內(nèi)部以及該場景內(nèi)每一處空間位置上的注意力分布是不一樣的。---------(思考:對于圖片,會有些特別顯眼的場景會率先吸引住注意力,那是因為腦袋中對這類東西很敏感。對于文本,我們大都是帶目的性的去讀,順序查找,順序讀,但是在理解的過程中,我們是根據(jù)我們自帶的目的去理解,去關(guān)注的。 注意力模型應(yīng)該與具體的目的(或者任務(wù))相結(jié)合。)

  從Attention的作用角度出發(fā),我們就可以從兩個角度來分類Attention種類:Spatial Attention 空間注意力Temporal Attention 時間注意力。更具實際的應(yīng)用,也可以將Attention分為Soft AttentionHard AttentionSoft Attention是所有的數(shù)據(jù)都會注意,都會計算出相應(yīng)的注意力權(quán)值,不會設(shè)置篩選條件。Hard Attention會在生成注意力權(quán)重后篩選掉一部分不符合條件的注意力,讓它的注意力權(quán)值為0,即可以理解為不再注意這些不符合條件的部分。

2. 先了解編碼-解碼框架:Encoder-Decoder框架

  目前絕大多數(shù)文獻(xiàn)中出現(xiàn)的AM模型是附著在Encoder-Decoder框架下的,當(dāng)然,其實AM模型可以看作一種通用的思想,本身并不依賴于Encoder-Decoder模型,這點需要注意。Encoder-Decoder框架可以看作是一種文本處理領(lǐng)域的研究模式,應(yīng)用場景異常廣泛,本身就值得細(xì)談。

圖1 抽象的Encoder-Decoder框架

  Encoder-Decoder框架可以這么直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型。對于句子對<X,Y>。 --------(思考:<X,Y>對很通用,X是一個問句,Y是答案;X是一個句子,Y是抽取的關(guān)系三元組;X是漢語句子,Y是漢語句子的英文翻譯。等等),我們的目標(biāo)是給定輸入句子X,期待通過Encoder-Decoder框架來生成目標(biāo)句子Y。X和Y可以是同一種語言,也可以是兩種不同的語言。而X和Y分別由各自的單詞序列構(gòu)成:

  Encoder顧名思義就是對輸入句子X進(jìn)行編碼,將輸入句子通過非線性變換轉(zhuǎn)化為中間語義表示C:

  對于解碼器Decoder來說,其任務(wù)是根據(jù)句子X的中間語義表示C和之前已經(jīng)生成的歷史信息y1,y2….yi-1來生成i時刻要生成的單詞yi :

  每個yi都依次這么產(chǎn)生,那么看起來就是整個系統(tǒng)根據(jù)輸入句子X生成了目標(biāo)句子Y。 ------(思考:其實這里的Encoder-Decoder是一個序列到序列的模型seq2seq,這個模型是對順序有依賴的。)

  Encoder-Decoder是個非常通用的計算框架,至于Encoder和Decoder具體使用什么模型都是由研究者自己定的,常見的比如 CNN / RNN / BiRNN / GRU / LSTM / Deep LSTM 等,這里的變化組合非常多。 ------(思考:人的學(xué)習(xí)過程包括輸入、輸出、外界評價。Encoder模型類似于人的輸入學(xué)習(xí)過程,Decoder模型類似于人的輸出學(xué)習(xí)過程,對輸出的內(nèi)容進(jìn)行評價就類似于損失函數(shù)。英語老師給我上了幾堂英語課,我在不斷的輸入Encoder;突然有一個隨堂測試,我得做題輸出Decoder;最后英語老師改卷子,給我一個分?jǐn)?shù),不對的地方我得反思調(diào)整我對輸入數(shù)據(jù)的加工方式。)-------(再思考:關(guān)于英語翻譯。課本上的單詞和課文是原始數(shù)據(jù)輸入,相當(dāng)于X;我在大腦里加工這些數(shù)據(jù),相當(dāng)于Encoder模型,我的腦子里有很多加工后的數(shù)據(jù),相當(dāng)于C;現(xiàn)在要讓我翻譯一個英語句子,這個任務(wù)相當(dāng)于Y,我不能翻課本,所以我只能借助我腦袋里加工的數(shù)據(jù)C去翻譯這個句子,即我得動腦子,相當(dāng)于Decoder。 學(xué)習(xí)的過程是什么都要學(xué),要分類整理,要增加線索,并不知道未來的某天能用到什么,所以Encoder-Decoder是一個泛泛學(xué)習(xí)的框架)

3. Attention Model

  以上介紹的Encoder-Decoder模型是沒有體現(xiàn)出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。為什么說它注意力不集中呢?請觀察下目標(biāo)句子Y中每個單詞的生成過程如下:

  其中f是decoder的非線性變換函數(shù)。從這里可以看出,在生成目標(biāo)句子的單詞時,不論生成哪個單詞,是y1,y2也好,還是y3也好,他們使用的句子X的語義編碼C都是一樣的,沒有任何區(qū)別。而語義編碼C是由句子X的每個單詞經(jīng)過Encoder 編碼產(chǎn)生的,這意味著不論是生成哪個單詞,y1,y2還是y3,其實句子X中任意單詞對生成某個目標(biāo)單詞yi來說影響力都是相同的,沒有任何區(qū)別(其實如果Encoder是RNN的話,理論上越是后輸入的單詞影響越大,并非等權(quán)的,估計這也是為何Google提出Sequence to Sequence模型時發(fā)現(xiàn)把輸入句子逆序輸入做翻譯效果會更好的小Trick的原因)。這就是為何說這個模型沒有體現(xiàn)出注意力的緣由。

  引入AM模型,以翻譯一個英語句子舉例:輸入X:Tom chase Jerry。 理想輸出:湯姆追逐杰瑞。

  應(yīng)該在翻譯“杰瑞”的時候,體現(xiàn)出英文單詞對于翻譯當(dāng)前中文單詞不同的影響程度,比如給出類似下面一個概率分布值:

(Tom,0.3)(Chase,0.2)(Jerry,0.5)

  每個英文單詞的概率代表了翻譯當(dāng)前單詞“杰瑞”時,注意力分配模型分配給不同英文單詞的注意力大小。這對于正確翻譯目標(biāo)語單詞肯定是有幫助的,因為引入了新的信息。同理,目標(biāo)句子中的每個單詞都應(yīng)該學(xué)會其對應(yīng)的源語句子中單詞的注意力分配概率信息。這意味著在生成每個單詞Yi的時候,原先都是相同的中間語義表示C會替換成根據(jù)當(dāng)前生成單詞而不斷變化的Ci理解AM模型的關(guān)鍵就是這里,即由固定的中間語義表示C換成了根據(jù)當(dāng)前輸出單詞來調(diào)整成加入注意力模型的變化的Ci

圖2 引入AM模型的Encoder-Decoder框架

  即生成目標(biāo)句子單詞的過程成了下面的形式:

  而每個Ci可能對應(yīng)著不同的源語句子單詞的注意力分配概率分布,比如對于上面的英漢翻譯來說,其對應(yīng)的信息可能如下:

  其中,f2函數(shù)代表Encoder對輸入英文單詞的某種變換函數(shù),比如如果Encoder是用的RNN模型的話,這個f2函數(shù)的結(jié)果往往是某個時刻輸入xi后隱層節(jié)點的狀態(tài)值;g代表Encoder根據(jù)單詞的中間表示合成整個句子中間語義表示的變換函數(shù),一般的做法中,g函數(shù)就是對構(gòu)成元素加權(quán)求和,也就是常常在論文里看到的下列公式:

  假設(shè)Ci中那個i就是上面的“湯姆”,那么Tx就是3,代表輸入句子的長度,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”),對應(yīng)的注意力模型權(quán)值分別是0.6,0.2,0.2,所以g函數(shù)就是個加權(quán)求和函數(shù)。如果形象表示的話,翻譯中文單詞“湯姆”的時候,數(shù)學(xué)公式對應(yīng)的中間語義表示Ci的形成過程類似下圖:

圖3 Ci的形成過程

  這里還有一個問題:生成目標(biāo)句子某個單詞,比如“湯姆”的時候,你怎么知道AM模型所需要的輸入句子單詞注意力分配概率分布值呢?就是說“湯姆”對應(yīng)的概率分布:

  劃重點(注意力權(quán)重獲取的過程)(Tom,0.3)(Chase,0.2)(Jerry,0.5)是如何得到的呢?

  為了便于說明,我們假設(shè)對圖1的非AM模型的Encoder-Decoder框架進(jìn)行細(xì)化,Encoder采用RNN模型,Decoder也采用RNN模型,這是比較常見的一種模型配置,則圖1的圖轉(zhuǎn)換為下圖:

圖4 RNN作為具體模型的Encoder-Decoder框架

  注意力分配概率分布值的通用計算過程:

圖5 AM注意力分配概率計算

  對于采用RNN的Decoder來說,如果要生成 yi 單詞,在時刻 i ,我們是可以知道在生成 Yi 之前的隱層節(jié)點i時刻的輸出值 Hi 的,而我們的目的是要計算生成 Yi 時的輸入句子單詞“Tom”、“Chase”、“Jerry”對 Yi 來說的注意力分配概率分布,那么可以用i時刻的隱層節(jié)點狀態(tài) Hi 去一一和輸入句子中每個單詞對應(yīng)的RNN隱層節(jié)點狀態(tài) hj 進(jìn)行對比,即通過函數(shù) F(hj,Hi) 來獲得目標(biāo)單詞 Yi 和每個輸入單詞對應(yīng)的對齊可能性,這個F函數(shù)在不同論文里可能會采取不同的方法,然后函數(shù)F的輸出經(jīng)過Softmax進(jìn)行歸一化就得到了符合概率分布取值區(qū)間的注意力分配概率分布數(shù)值(這就得到了注意力權(quán)重)。圖5顯示的是當(dāng)輸出單詞為“湯姆”時刻對應(yīng)的輸入句子單詞的對齊概率。絕大多數(shù)AM模型都是采取上述的計算框架來計算注意力分配概率分布信息區(qū)別只是在F的定義上可能有所不同

  上述內(nèi)容就是論文里面常常提到的Soft Attention Model(任何數(shù)據(jù)都會給一個權(quán)值,沒有篩選條件)的基本思想,你能在文獻(xiàn)里面看到的大多數(shù)AM模型基本就是這個模型,區(qū)別很可能只是把這個模型用來解決不同的應(yīng)用問題。那么怎么理解AM模型的物理含義呢?一般文獻(xiàn)里會把AM模型看作是單詞對齊模型,這是非常有道理的。目標(biāo)句子生成的每個單詞對應(yīng)輸入句子單詞的概率分布可以理解為輸入句子單詞和這個目標(biāo)生成單詞的對齊概率,這在機(jī)器翻譯語境下是非常直觀的:傳統(tǒng)的統(tǒng)計機(jī)器翻譯一般在做的過程中會專門有一個短語對齊的步驟而注意力模型其實起的是相同的作用。在其他應(yīng)用里面把AM模型理解成輸入句子和目標(biāo)句子單詞之間的對齊概率也是很順暢的想法。

圖6 Google 神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯系統(tǒng)結(jié)構(gòu)圖

  圖6所示即為Google于2016年部署到線上的基于神經(jīng)網(wǎng)絡(luò)的機(jī)器翻譯系統(tǒng),相對傳統(tǒng)模型翻譯效果有大幅提升,翻譯錯誤率降低了60%,其架構(gòu)就是上文所述的加上Attention機(jī)制的Encoder-Decoder框架,主要區(qū)別無非是其Encoder和Decoder使用了8層疊加的LSTM模型。

當(dāng)然,從概念上理解的話,把AM模型理解成影響力模型也是合理的,就是說生成目標(biāo)單詞的時候,輸入句子每個單詞對于生成這個單詞有多大的影響程度。這種想法也是比較好理解AM模型物理意義的一種思維方式。

  圖7是論文“A Neural Attention Model for Sentence Summarization”中,Rush用AM模型來做生成式摘要給出的一個AM的一個非常直觀的例子。

圖7 句子生成式摘要例子

  這個例子中,Encoder-Decoder框架的輸入句子X是:“russian defense minister ivanov called sunday for the creation of a joint front for combating global terrorism”。對應(yīng)圖中縱坐標(biāo)的句子。系統(tǒng)生成的摘要句子Y是:“russia calls for joint front against terrorism”,對應(yīng)圖中橫坐標(biāo)的句子。可以看出模型已經(jīng)把句子主體部分正確地抽出來了。矩陣中每一列代表生成的目標(biāo)單詞對應(yīng)輸入句子每個單詞的AM分配概率,顏色越深代表分配到的概率越大。這個例子對于直觀理解AM是很有幫助作用。

  《A Neural Attention Model for Sentence Summarization》論文提供的實驗數(shù)據(jù)集鏈接(開放可用):DUC 2004,感興趣的朋友可以下載看看。

圖8 摘要生成 開放數(shù)據(jù)集

4. Attention機(jī)制的本質(zhì)思想

  如果把Attention機(jī)制從上文講述例子中的Encoder-Decoder框架中剝離,并進(jìn)一步做抽象,可以更容易看懂Attention機(jī)制的本質(zhì)思想。

圖9 Attention機(jī)制的本質(zhì)思想

  我們可以這樣來看待Attention機(jī)制(參考圖9):將Source中的構(gòu)成元素想象成是由一系列的<Key,Value>數(shù)據(jù)對構(gòu)成,此時給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關(guān)性,得到每個Key對應(yīng)Value的權(quán)重系數(shù),然后對Value進(jìn)行加權(quán)求和,即得到了最終的Attention數(shù)值。所以本質(zhì)上Attention機(jī)制是對Source中元素的Value值進(jìn)行加權(quán)求和,而Query和Key用來計算對應(yīng)Value的權(quán)重系數(shù)。即可以將其本質(zhì)思想改寫為如下公式:

  其中,Lx=||Source||代表Source的長度,公式含義即如上所述。上文所舉的機(jī)器翻譯的例子里,因為在計算Attention的過程中,Source中的Key和Value合二為一,指向的是同一個東西,也即輸入句子中每個單詞對應(yīng)的語義編碼,所以可能不容易看出這種能夠體現(xiàn)本質(zhì)思想的結(jié)構(gòu)。

  當(dāng)然,從概念上理解,把Attention仍然理解為從大量信息中有選擇地篩選出少量重要信息并聚焦到這些重要信息上,忽略大多不重要的信息,這種思路仍然成立。聚焦的過程體現(xiàn)在權(quán)重系數(shù)的計算上,權(quán)重越大越聚焦于其對應(yīng)的Value值上,即權(quán)重代表了信息的重要性,而Value是其對應(yīng)的信息。

  從圖9可以引出另外一種理解,也可以將Attention機(jī)制看作一種軟尋址(Soft Addressing):Source可以看作存儲器內(nèi)存儲的內(nèi)容,元素由地址Key和值Value組成,當(dāng)前有個Key=Query的查詢,目的是取出存儲器中對應(yīng)的Value值,即Attention數(shù)值。通過Query和存儲器內(nèi)元素Key的地址進(jìn)行相似性比較來尋址,之所以說是軟尋址,指的不像一般尋址只從存儲內(nèi)容里面找出一條內(nèi)容,而是可能從每個Key地址都會取出內(nèi)容,取出內(nèi)容的重要性根據(jù)Query和Key的相似性來決定,之后對Value進(jìn)行加權(quán)求和,這樣就可以取出最終的Value值,也即Attention值。所以不少研究人員將Attention機(jī)制看作軟尋址的一種特例,這也是非常有道理的。

  至于Attention機(jī)制的具體計算過程,如果對目前大多數(shù)方法進(jìn)行抽象的話,可以將其歸納為兩個過程:第一個過程是根據(jù)Query和Key計算權(quán)重系數(shù),第二個過程根據(jù)權(quán)重系數(shù)對Value進(jìn)行加權(quán)求和。而第一個過程又可以細(xì)分為兩個階段:第一個階段根據(jù)Query和Key計算兩者的相似性或者相關(guān)性;第二個階段對第一階段的原始分值進(jìn)行歸一化處理;這樣,可以將Attention的計算過程抽象為如圖10展示的三個階段。

圖10 三階段計算Attention過程

?

  在第一個階段,可以引入不同的函數(shù)和計算機(jī)制,根據(jù)Query和某個 Keyi?,計算兩者的相似性或者相關(guān)性,最常見的方法包括:求兩者的向量點積、求兩者的向量Cosine相似性或者通過再引入額外的神經(jīng)網(wǎng)絡(luò)來求值,即如下方式:

  第一階段產(chǎn)生的分值根據(jù)具體產(chǎn)生的方法不同其數(shù)值取值范圍也不一樣,第二階段引入類似SoftMax的計算方式對第一階段的得分進(jìn)行數(shù)值轉(zhuǎn)換,一方面可以進(jìn)行歸一化,將原始計算分值整理成所有元素權(quán)重之和為1的概率分布;另一方面也可以通過SoftMax的內(nèi)在機(jī)制更加突出重要元素的權(quán)重。即一般采用如下公式計算:

??

  第二階段的計算結(jié)果 ai?即為 Valuei?對應(yīng)的權(quán)重系數(shù),然后進(jìn)行加權(quán)求和即可得到Attention數(shù)值:

  通過如上三個階段的計算,即可求出針對Query的Attention數(shù)值,目前絕大多數(shù)具體的注意力機(jī)制計算方法都符合上述的三階段抽象計算過程。

5. Self Attention模型

  通過上述對Attention本質(zhì)思想的梳理,我們可以更容易理解本節(jié)介紹的Self Attention模型。Self Attention也經(jīng)常被稱為intra Attention(內(nèi)部Attention),最近一年也獲得了比較廣泛的使用,比如Google最新的機(jī)器翻譯模型內(nèi)部大量采用了Self Attention模型。

  在一般任務(wù)的Encoder-Decoder框架中,輸入Source和輸出Target內(nèi)容是不一樣的,比如對于英-中機(jī)器翻譯來說,Source是英文句子,Target是對應(yīng)的翻譯出的中文句子,Attention機(jī)制發(fā)生在Target的元素和Source中的所有元素之間。而Self Attention顧名思義,指的不是Target和Source之間的Attention機(jī)制,而是Source內(nèi)部元素之間或者Target內(nèi)部元素之間發(fā)生的Attention機(jī)制,也可以理解為Target=Source這種特殊情況下的注意力計算機(jī)制。其具體計算過程是一樣的,只是計算對象發(fā)生了變化而已,所以此處不再贅述其計算過程細(xì)節(jié)。

  如果是常規(guī)的Target不等于Source情形下的注意力計算,其物理含義正如上文所講,比如對于機(jī)器翻譯來說,本質(zhì)上是目標(biāo)語單詞和源語單詞之間的一種單詞對齊機(jī)制。那么如果是Self Attention機(jī)制,一個很自然的問題是:通過Self Attention到底學(xué)到了哪些規(guī)律或者抽取出了哪些特征呢?或者說引入Self Attention有什么增益或者好處呢?我們?nèi)匀灰詸C(jī)器翻譯中的Self Attention來說明,圖11和圖12是可視化地表示Self Attention在同一個英語句子內(nèi)單詞間產(chǎn)生的聯(lián)系。

圖11 可視化Self Attention實例

圖12 可視化Self Attention實例

  從兩張圖(圖11、圖12)可以看出,Self Attention可以捕獲同一個句子中單詞之間的一些句法特征(比如圖11展示的有一定距離的短語結(jié)構(gòu))或者語義特征(比如圖12展示的its的指代對象Law)。

  很明顯,引入Self Attention后會更容易捕獲句子中長距離的相互依賴的特征因為如果是RNN或者LSTM,需要依次序序列計算,對于遠(yuǎn)距離的相互依賴的特征,要經(jīng)過若干時間步步驟的信息累積才能將兩者聯(lián)系起來,而距離越遠(yuǎn),有效捕獲的可能性越小。

  但是Self Attention在計算過程中會直接將句子中任意兩個單詞的聯(lián)系通過一個計算步驟直接聯(lián)系起來,所以遠(yuǎn)距離依賴特征之間的距離被極大縮短,有利于有效地利用這些特征。除此外,Self Attention對于增加計算的并行性也有直接幫助作用。這是為何Self Attention逐漸被廣泛使用的主要原因。

6. Attention機(jī)制的應(yīng)用

  前文有述,Attention機(jī)制在深度學(xué)習(xí)的各種應(yīng)用領(lǐng)域都有廣泛的使用場景。上文在介紹過程中我們主要以自然語言處理中的機(jī)器翻譯任務(wù)作為例子,下面分別再從圖像處理領(lǐng)域和語音識別選擇典型應(yīng)用實例來對其應(yīng)用做簡單說明。

圖13 圖片-描述任務(wù)的Encoder-Decoder框架

  圖片描述(Image-Caption)是一種典型的圖文結(jié)合的深度學(xué)習(xí)應(yīng)用,輸入一張圖片,人工智能系統(tǒng)輸出一句描述句子,語義等價地描述圖片所示內(nèi)容。很明顯這種應(yīng)用場景也可以使用Encoder-Decoder框架來解決任務(wù)目標(biāo),此時Encoder輸入部分是一張圖片,一般會用CNN來對圖片進(jìn)行特征抽取,Decoder部分使用RNN或者LSTM來輸出自然語言句子(參考圖13)。

  此時如果加入Attention機(jī)制能夠明顯改善系統(tǒng)輸出效果,Attention模型在這里起到了類似人類視覺選擇性注意的機(jī)制,在輸出某個實體單詞的時候會將注意力焦點聚焦在圖片中相應(yīng)的區(qū)域上。圖14給出了根據(jù)給定圖片生成句子“A person is standing on a beach with a surfboard.”過程時每個單詞對應(yīng)圖片中的注意力聚焦區(qū)域。

圖14 圖片生成句子中每個單詞時的注意力聚焦區(qū)域

  圖15給出了另外四個例子形象地展示了這種過程,每個例子上方左側(cè)是輸入的原圖,下方句子是人工智能系統(tǒng)自動產(chǎn)生的描述語句,上方右側(cè)圖展示了當(dāng)AI系統(tǒng)產(chǎn)生語句中劃橫線單詞的時候,對應(yīng)圖片中聚焦的位置區(qū)域。比如當(dāng)輸出單詞dog的時候,AI系統(tǒng)會將注意力更多地分配給圖片中小狗對應(yīng)的位置。

圖15 圖像描述任務(wù)中Attention機(jī)制的聚焦作用

圖16 語音識別中音頻序列和輸出字符之間的Attention

  語音識別的任務(wù)目標(biāo)是將語音流信號轉(zhuǎn)換成文字,所以也是Encoder-Decoder的典型應(yīng)用場景。Encoder部分的Source輸入是語音流信號,Decoder部分輸出語音對應(yīng)的字符串流。

  圖16可視化地展示了在Encoder-Decoder框架中加入Attention機(jī)制后,當(dāng)用戶用語音說句子 how much would a woodchuck chuck 時,輸入部分的聲音特征信號和輸出字符之間的注意力分配概率分布情況,顏色越深代表分配到的注意力概率越高。從圖中可以看出,在這個場景下,Attention機(jī)制起到了將輸出字符和輸入語音信號進(jìn)行對齊的功能。

  上述內(nèi)容僅僅選取了不同AI領(lǐng)域的幾個典型Attention機(jī)制應(yīng)用實例,Encoder-Decoder加Attention架構(gòu)由于其卓越的實際效果,目前在深度學(xué)習(xí)領(lǐng)域里得到了廣泛的使用,了解并熟練使用這一架構(gòu)對于解決實際問題會有極大幫助。

?


?

參考文章:

【1】自然語言處理中的Attention Model:是什么及為什么

【2】深度學(xué)習(xí)中的注意力機(jī)制(2017版)

【3】Attention注意力機(jī)制--原理與應(yīng)用

【4】Attention_Network_With_Keras

【5】《A Self-Attention Setentence Embedding》閱讀筆記及實踐

作者:郭耀華
出處:http://www.guoyaohua.com
微信:guoyaohua167
郵箱:guo.yaohua@foxmail.com
本文版權(quán)歸作者和博客園所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請標(biāo)明出處。
【如果你覺得本文還不錯,對你的學(xué)習(xí)帶來了些許幫助,請幫忙點擊右下角的推薦】
分類: 機(jī)器學(xué)習(xí), 深度學(xué)習(xí)
<div id="blog_post_info">
好文要頂 關(guān)注我 收藏該文
  1. The Decoder

    Encoder 與 Decoder 的交互方式可以理解為:

    Decoder 也是N層堆疊的結(jié)構(gòu)。被分為3個 SubLayer,可以看出 Encoder 與 Decoder 三大主要的不同:

Diff_1:Decoder SubLayer-1 使用的是 “masked” Multi-Headed Attention 機(jī)制,防止為了模型看到要預(yù)測的數(shù)據(jù),防止泄露。
Diff_2:SubLayer-2 是一個 encoder-decoder multi-head attention。
Diff_3:LinearLayer 和 SoftmaxLayer 作用于 SubLayer-3 的輸出后面,來預(yù)測對應(yīng)的 word 的 probabilities 。
3.1 Diff_1 : “masked” Multi-Headed Attention
mask 的目標(biāo)在于防止 decoder “seeing the future”,就像防止考生偷看考試答案一樣。mask包含1和0:


Attention 中使用 mask 的代碼中:


引用作者的話說, “We […] modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.”

3.2 Diff_2 : encoder-decoder multi-head attention
Annotated Transformer 中的 DecoderLayer 的實現(xiàn)為


重點在于 x = self.sublayer1 self.src_attn 是 MultiHeadedAttention 的一個實例。query = x,key = m, value = m, mask = src_mask,這里x來自上一個 DecoderLayer,m來自 Encoder的輸出。

到這里 Transformer 中三種不同的 Attention 都已經(jīng)集齊了:


3.3 Diff_3 : Linear and Softmax to Produce Output Probabilities
最后的 linear layer 將 decoder 的輸出擴(kuò)展到與 vocabulary size 一樣的維度上。經(jīng)過 softmax 后,選擇概率最高的一個 word 作為預(yù)測結(jié)果。

假設(shè)我們有一個已經(jīng)訓(xùn)練好的網(wǎng)絡(luò),在做預(yù)測時,步驟如下:

給 decoder 輸入 encoder 對整個句子 embedding 的結(jié)果 和一個特殊的開始符號 。decoder 將產(chǎn)生預(yù)測,在我們的例子中應(yīng)該是 ”I”。
給 decoder 輸入 encoder 的 embedding 結(jié)果和 “I”,在這一步 decoder 應(yīng)該產(chǎn)生預(yù)測 “Love”。
給 decoder 輸入 encoder 的 embedding 結(jié)果和 “I Love”,在這一步 decoder 應(yīng)該產(chǎn)生預(yù)測 “China”。
給 decoder 輸入 encoder 的 embedding 結(jié)果和 “I Love China”, decoder應(yīng)該生成句子結(jié)尾的標(biāo)記,decoder 應(yīng)該輸出 ””。
然后 decoder 生成了 ,翻譯完成。
但是在訓(xùn)練過程中,decoder 沒那么好時,預(yù)測產(chǎn)生的詞很可能不是我們想要的。這個時候如果再把錯誤的數(shù)據(jù)再輸給 decoder,就會越跑越偏:

這里在訓(xùn)練過程中要使用到 “teacher forcing”。利用我們知道他實際應(yīng)該預(yù)測的 word 是什么,在這個時候喂給他一個正確的結(jié)果作為輸入。

相對于選擇最高的詞 (greedy search),還有其他選擇是比如 “beam search”,可以保留多個預(yù)測的 word。 Beam Search 方法不再是只得到一個輸出放到下一步去訓(xùn)練了,我們可以設(shè)定一個值,拿多個值放到下一步去訓(xùn)練,這條路徑的概率等于每一步輸出的概率的乘積,具體可以參考李宏毅老師的課程:



或者 “Scheduled Sampling”:一開始我們只用真實的句子序列進(jìn)行訓(xùn)練,而隨著訓(xùn)練過程的進(jìn)行,我們開始慢慢加入模型的輸出作為訓(xùn)練的輸入這一過程。


這部分對應(yīng) Annotated Transformer 中的實現(xiàn)為:


對著圖,再回顧一下 Encoder 與 Decoder 的結(jié)構(gòu)吧。

https://zhuanlan.zhihu.com/p/88689200
https://glassboxmedicine.com/2019/08/15/the-transformer-attention-is-all-you-need/

https://www.bilibili.com/video/BV1d4411R72S?from=search&seid=2900706756303009859

RNN:翻譯 原句子和目標(biāo)句子 長度對齊 實際翻譯的時候出現(xiàn)不一樣的概率很大
對話系統(tǒng) 原句子和目標(biāo)句子 長度也不一樣
seq2seq:原句子所有字符先用RNN處理成一個向量之后再編碼(語義編碼)
解碼也用RNN 結(jié)構(gòu) 也可以用RNN 變形 LSTM,gru等
seq2seq:解決給出一個句子生成另一個句子的問題 翻譯 問答
全連接:當(dāng)前層每個神經(jīng)元都連接下一層的每個神經(jīng)元
tanh:零中心 取值有正有負(fù) 梯度更新的時候收斂速度比較快
計算過程 中有通過one hot 查詢 embedding 矩陣 得到詞向量表示的過程


20201127

input_ids.append(0)
input_mask.append(0)
segment_ids.append(0)

這里的ids都是0,1的形式

lstm
遺忘一些信息
選擇一些信息留存
輸出門相當(dāng)于殘差網(wǎng)絡(luò)避免丟失信息
但相比transformer 模型整體參數(shù)容納能力不足
激活函數(shù)值在[0,1]之間的,可以起到篩選的作用
而tanh 值在【-1,1】之間,不丟失信息
GRU
線性變換:維度變換 維度變高 能容納信息更多
解碼:句子開頭標(biāo)記GO,句子結(jié)尾標(biāo)記EOS
每次輸出每個詞的時候都有softmax過程 c(源句子向量表示)+上一步預(yù)測的詞+上一步的隱藏層
每句預(yù)測只和當(dāng)前句子的原句子相關(guān) 貌似和其他句子無關(guān)?因為每句有開始和
結(jié)束標(biāo)記 但embedding的時候貌似和其他句子有關(guān)
預(yù)測輸出的時候做了embedding 就是用onehot 乘以隨機(jī)初始化embedding矩陣獲取單詞
對應(yīng)的向量表示
需要注意的是:train和test階段必須使用一樣的embedding矩陣!否則輸出肯定是亂碼。

當(dāng)然,還可以使用word2vec/glove/elmo/bert等更加“精致”的嵌入方法,也可以在訓(xùn)練過程中 迭代更新embedding。這些內(nèi)容超出本文范圍,不再詳述。embedding入門請參考:

結(jié)果有大有小并且沒有歸一化就需要用MAXOUT:就是取一個集合中的最大值 兩邊的維度可能不一樣 維度減小

attention的作用
在encode階段,第一個節(jié)點輸入一個詞,之后的節(jié)點輸入的是下一個詞與前一個節(jié)點的hidden state,最終encoder會輸出一個context,這個context又作為decoder的輸入,每經(jīng)過一個decoder的節(jié)點就輸出一個翻譯后的詞,并把decoder的hidden state作為下一層的輸入。該模型對于短文本的翻譯來說效果很好,但是其也存在一定的缺點,如果文本稍長一些,就很容易丟失文本的一些信息,為了解決這個問題,Attention應(yīng)運而生。

softmax:
對每個分?jǐn)?shù)值做一個softmax的計算,這能讓相關(guān)性高的hidden state的分?jǐn)?shù)值更大,相關(guān)性低的hidden state的分?jǐn)?shù)值更低

接下來,把點成的結(jié)果除以一個常數(shù),這里我們除以8,這個值一般是采用上文提到的矩陣的第一個維度的開方即64的開方8,當(dāng)然也可以選擇其他的值,然后把得到的結(jié)果做一個softmax的計算。
為了把值縮放到一定的范圍

https://towardsdatascience.com/intuitive-understanding-of-attention-mechanism-in-deep-learning-6c9482aecf4f
https://zhuanlan.zhihu.com/p/35955689
https://www.cnblogs.com/guoyaohua/p/9429924.html

20210429
tf中,如果把texta 和textb 合在一起比如其中一個置空就是普通的分類
而把二者分開既可以看成是下一句預(yù)測

總結(jié)

以上是生活随笔為你收集整理的attention seq2seq transformer bert 学习总结 _20201107的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情亚洲天堂 | 懂爱av| 草草影院av| 亚洲熟妇丰满大屁股熟妇 | 日本午夜大片 | 免费黄网在线看 | 国产一区精品在线 | 九九热在线精品 | 美女视频久久久 | 日本亚洲色大成网站www久久 | 欧美日韩国产成人 | 九九亚洲视频 | 日韩成人av一区 | 最新中文字幕在线观看 | 国产xx在线观看 | 四虎一国产精品一区二区影院 | 亚洲怡红院av| 少妇av片 | 久久狠狠高潮亚洲精品 | 在线免费观看成年人视频 | 青青视频一区二区 | 一区二区三区在线免费视频 | 欧美国产精品一区二区 | 日韩亚洲一区二区三区 | 美女隐私无遮挡网站 | 久久av资源 | 误杀1电影免费观看高清完整版 | www.youjizz.com亚洲| 国内自拍网站 | 后入内射无码人妻一区 | 黄色录像a级片 | 可以在线观看的av网站 | 欧美精品乱码久久久久久 | 夜夜操操 | 在线免费观看av不卡 | 调教亲女小嫩苞h文小说 | 日韩色区 | 色欧美综合 | 国产精品久草 | 毛片一级在线观看 | 中文字幕精品久久久 | 污到下面流水的视频 | 老司机深夜福利视频 | 国产成人精品一区二区在线小狼 | 一区二区不卡视频 | 又色又爽又黄无遮挡的免费视频 | 人妻少妇偷人精品视频 | 91免费进入| 黑人黄色片 | 成人毛片在线精品国产 | 香蕉视频在线免费播放 | xxxxxxxx黄色片 | 欧美色图中文字幕 | 99热偷拍| 今天高清视频在线观看视频 | 亚洲福利天堂 | 日韩三级在线播放 | 天狂传说之巴啦啦小魔仙 | 护士人妻hd中文字幕 | 奇米狠狠去啦 | av一片| 中文字幕在线观看亚洲 | 国产小视频在线观看免费 | 午夜激情视频网 | 西西4444www大胆无视频 | 浓精h攵女乱爱av | 91av国产视频| 一区二区三区四区五区av | 久久国产精品久久久久 | 国产精品日韩专区 | 青青操在线视频 | 少妇熟女视频一区二区三区 | 激情久久网 | 一区二区三区www污污污网站 | 国产精品电影院 | 又嫩又硬又黄又爽的视频 | 99re在线视频 | 麻豆免费在线 | 成人免费精品视频 | 91偷拍精品一区二区三区 | 国产九九九| 偷拍久久久 | 香蕉久久夜色精品国产使用方法 | 美女扒开腿让人桶爽原神 | 欧美一区二区区 | 少妇99| av网站免费大全 | 先锋影音中文字幕 | 欧美国产成人在线 | 国产高清成人久久 | 一级免费毛片 | 女女h百合无遮羞羞漫画软件 | 国产寡妇亲子伦一区二区三区四区 | 性综合网 | 雪白的扔子视频大全在线观看 | 久艹在线视频 | 色婷婷精品国产一区二区三区 | 欧美成人福利视频 | 欧美另类在线观看 |