一文理解 Transformer 的工作原理

作者 | Prateek Joshi

譯者 | Sambodhi

編輯 | Vincent

AI 前線導讀:目前,自然語言處理中,有三種特徵處理器:卷積神經網絡、遞歸神經網絡和後起之秀 Transformer。Transformer 風頭已經蓋過兩個前輩,它拋棄了傳統的卷積神經網絡和遞歸神經網絡,整個網絡結構完全是由注意力機制組成。準確地講,Transformer 僅由自注意力和前饋神經網絡組成。那麼,Transformer 在自然語言處理中,是如何工作的?且聽 Prateek Joshi 爲我們娓娓道來。

本文最初在 Analytics Vidhya 網站發表,經原作者 Prateek Joshi 授權由 InfoQ 翻譯並分享。

更多優質內容請關注微信公衆號“AI 前線”(ID:ai-front)

概  述

  • 自然語言處理中的 Transformer 模型真正改變了我們處理文本數據的方式。

  • Transformer 是最近自然語言處理髮展的幕後推手,包括 Google 的 BERT。

  • 瞭解 Transformer 的工作原理、它如何與語言建模、序列到序列建模相關,以及它如何支持 Google 的 BERT 模型。

引  言

現在,我喜歡做一名數據科學家,從事 自然語言處理(Natural Language Processing,NLP) 方面的工作。這些突破和發展正以前所未有的速度發生。從超高效的 ULMFiT 框架到 Google 的 BERT,自然語言處理真的處於一個黃金時代。

這場革命的核心是 Transformer 的概念。它改變了我們數據科學家處理文本數據的方式,你很快就會在本文中理解這一點。

想看一個 Transformer 是多麼有用的例子麼?請看下面的段落:

標註高亮的單詞指的是同一個人:Griezmann,一名受歡迎的足球運動員。對我們而言,要弄清楚文本中這些詞之間的關係並不難。但對一臺機器來說,這可就是一項相當艱鉅的任務了。

對機器理解自然語言來說,掌握句子中這些關係和單詞序列至關重要。這就是 Transformer 概念發揮主要作用之處。

  • 注:本文假設讀者對一些深度學習概念有基本的瞭解。

  • 《深度學習要領:帶注意力的序列到序列建模》(Essentials of Deep Learning – Sequence to Sequence modeling with Attention)

  • 《深度學習基礎:遞歸神經網絡導論》(Fundamentals of Deep Learning – Introduction to Recurrent Neural Networks)

  • 《Python 中使用深度學習的文本摘要綜合指南》(Comprehensive Guide to Text Summarization using Deep Learning in Python)

目  錄

  1. 序列到序列模型:背景

    1. 基於遞歸神經網絡的序列到序列模型

    2. 挑戰

  2. 自然語言處理中的 Transformer 介紹

    1. 理解模型架構

    2. 掌握自注意力

    3. 自注意力的計算

    4. Transformer 的侷限性

  3. 瞭解 Transformer-XL

    1. 使用 Transformer 進行語言建模

    2. 使用 Transformer-XL 進行語言建模

  4. 自然語言處理的新感覺:Google 的 BERT

    1. 模型架構

    2. BERT 預訓練任務

序列到序列模型:背景

自然語言處理中的 序列到序列模型(Sequence-to-sequence (seq2seq))用於將 A 型序列轉換爲 B 型序列。例如,將英語句子翻譯成德語句子就是一個序列到序列的任務。

自 2014 年推出以來,基於遞歸神經網絡的序列到序列模型 得到了很多人的關注。目前世界上的大多數數據都是以序列的形式存在的,它可以是數字序列、文本序列、視頻幀序列或音頻序列。

2015 年增加了注意力機制(Attention Mechanism),進一步提高了這些 seq2seq 模型的性能。在過去的五年裏,自然語言處理的進步如此之快,令人難以置信!

這些序列到序列模型用途非常廣泛,可用於各種自然語言處理任務,例如:

  • 機器翻譯

  • 文本摘要

  • 語音識別

  • 問答系統等等

基於遞歸神經網絡的序列到序列模型

讓我們以一個簡單的序列到序列模型爲例,請看以下如圖所示:

使用 seq2seq 進行德語到英語的翻譯。

上圖中的 seq2seq 模型將德語短語轉換爲英語短語。讓我們把它分解一下:

  • 編碼器解碼器 都是遞歸神經網絡。

  • 在編碼器中的每個時間步驟,遞歸神經網絡從輸入序列獲取詞向量(xi),從前一個時間步驟中獲取一個隱狀態(Hi)。

  • 隱狀態在每個時間步驟中更新。

  • 最後一個單元的隱狀態稱爲 語境矢量(context vector)。它包含有關輸入序列的信息。

  • 然後將該語境矢量傳遞給解碼器,然後使用它生成目標序列(英文短語)。

  • 如果我們使用 注意力機制,則隱狀態的加權和將作爲語境矢量傳遞給解碼器。

挑戰

儘管 seq2seq 模型非常出色,但也存在一定的侷限性:

  • 處理長期依賴仍然是一個挑戰。

  • 模型架構的順序特性阻止了並行化。這些挑戰是通過 Google Brain 的 Transformer 概念得到解決的。

Transformer 簡介

自然語言處理中的 Transformer 是一種新穎的架構,旨在解決序列到序列的任務,同時輕鬆處理長期依賴(long-range dependencies)問題。Transformer 首次由論文 《注意力機制就是你所需要的》(Attention Is All You Need)。對自然語言處理感興趣的人都可以閱讀這篇論文。

以下是論文引用:

“Transformer 是第一個完全依賴自注意力(self-attention)來計算輸入和輸出的表示,而不使用序列對齊的遞歸神經網絡或卷積神經網絡的轉換模型。”

這裏說的“轉換”(transduction)是指將輸入序列轉換成輸出序列。Transformer 背後的思想是使用注意力機制處理輸入和輸出之間的依賴關係,並且要完全遞歸。

讓我們來看看 Transformer 的架構,它可能看上去令人生畏,但請別擔心,我們會將其分解,一塊一塊地來理解它。

理解 Transformer 的模型架構

Transformer 模型架構(來源:https://arxiv.org/abs/1706.03762)

上圖是 Transformer 架構的精湛圖例。首先,讓我們只關注 編碼器解碼器 的部分。

現在,讓我們觀察下圖。編碼器塊有一層 多頭注意力(Multi-Head Attention),然後是另一層 前饋神經網絡( Feed Forward Neural Network)。另一方面,解碼器有一個額外的 掩模多頭注意力(Masked Multi-Head Attention)。

編碼器和解碼器塊實際上是相互堆疊在一起的多個相同的編碼器和解碼器。 編碼器堆棧和解碼器堆棧都具有相同數量的單元。

編碼器和解碼器單元的數量是一個超參數。在本文中,我們使用了 6 個編碼器和解碼器。

讓我們看看編碼器和解碼器堆棧的設置是如何工作的:

  • 將輸入序列的詞嵌入(word embeddings)傳遞給第一個編碼器。

  • 然後將它們進行轉換並傳播到下一個編碼器。

  • 編碼器堆棧中最後一個編碼器的輸出將傳遞給解碼器堆棧中所有的解碼器,如下圖所示:

這裏需要注意的一點是,除了自注意力和前饋層外,解碼器還有一層解碼器 - 解碼器注意力層。這有助於解碼器將注意力集中在輸入序列的適當部分上。

你可能會想,這個“自注意力”層在 Transformer 中到底做了什麼呢?問得好!這可以說是整個設置中最關鍵的部分,所以讓我們來理解這個概念。

掌握自注意力的技巧

根據這篇論文所述:

“自注意力,有時也稱爲內部注意力(intra-attention),是一種注意力機制,它將一個序列的不同位置聯繫起來,以計算出序列的表示形式。”

請看上圖。你能弄明白這句話中的“it”是指什麼嗎?

它指的是 street 還是 animal?這對我們來說是一個簡單的問題,但對算法來說可不是這樣的。當模型處理到“it”這個單詞時,自注意力試圖將“it”與同一句話中的“animal”聯繫起來。

自注意力允許模型查看輸入序列中的其他單詞,以便更好地理解序列中的某個單詞。現在,讓我們看看如何計算自注意力。

自注意力的計算

爲便於理解,我將這一部分分爲不同的步驟。

  1. 首先,我們需要從每個編碼器的輸入向量中創建三個向量:

  • 查詢向量

  • 鍵向量

  • 值向量

在訓練過程中對這些向量進行訓練和更新。完成本節之後,我們將進一步瞭解它們的角色。

  1. 接下來,我們將計算輸入序列中每個單詞的自注意力。

  2. 來看看這句話:“Action gets results”。爲了計算第一個單詞“Action”的自注意力,我們將計算短語中與“Action”相關的所有單詞的得分。當我們在輸入序列中編碼某個單詞時,該得分確定其他單詞的重要性。

通過將查詢向量(q1)的與所有單詞的鍵向量(k1,k2,k3) 的點積來計算第一個單詞的得分:

然後,將這些得分除以 8,也就是鍵向量維數的平方根:

接下來,使用 softmax 激活函數對這些得分進行歸一化:

然後將這些經過歸一化的得分乘以值向量(v1,v2,v3),並將得到的向量求和,得到最終向量(z1)。這是自注意力層的輸出。然後將其作爲輸入傳遞給前饋網絡:

因此,z1 是輸入序列“Action gets results”的第一個單詞的自注意力向量。我們可以用同樣的方式得到輸入序列中其餘單詞的向量:

在 Transformer 的架構中,自注意力並不是計算一次,而是進行多次計算,並且是並行且獨立進行的。因此,它被稱爲 多頭注意力。輸出經過串聯並進行線性轉換,如下圖所示。

根據論文 Attention Is All You Need:

“多頭注意力允許模型共同注意來自不同位置的不同表示子空間的信息。”

你可以查閱實現 Transformer 的代碼:

https://paperswithcode.com/paper/attention-is-all-you-need

Transformer 的侷限性

Transformer 無疑是對基於遞歸神經網絡的 seq2seq 模型的巨大改進。但它也有自身的侷限性:

  • 注意力只能處理固定長度的文本字符串。在輸入系統之前,文本必須被分割成一定數量的段或塊。

  • 這種文本塊會導致 上下文碎片化。例如,如果一個句子從中間分隔,那麼大量的上下文就會丟失。換言之,在不考慮句子或任何其他語義邊界的情況下對文本進行分隔。

那麼,我們如何處理這些非常重要的問題呢?這就是使用過 Transformer 的人們提出的問題。由此催生了 Transformer-XL。

理解 Transformer-XL

Transformer 架構可以學習長期依賴。但是,由於使用固定長度的上下文(輸入文本段),它們無法擴展到特定的級別。爲了克服這一缺點,這篇論文提出了一種新的架構:《Transformer-XL:超出固定長度上下文的注意力語言模型》(Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context)

在這種架構中,在先前段中獲得的隱狀態被重用爲當前段的信息員。它支持對長期依賴建模,因爲信息可以從一個段流向下一個段。

使用 Transformer 進行語言建模

“將語言建模看作是一個過程,在給定前面單詞的情況下,估計下一個單詞的概率。”

Al-Rfou 等人在 2018 年提出了 將 Transformer 模型應用於語言建模 的想法。根據這篇論文的觀點,整個語料庫可以被分割成規模可控的固定長度的段。然後,我們對 Transformer 模型進行分段獨立訓練,忽略了來自先前段的所有上下文信息:

段長度爲 4 的 Transformer 模型。(來源:Source: https://arxiv.org/abs/1901.02860)

這種架構不存在梯度消失的問題。但上下文的碎片化限制了它的長期依賴學習。在評估階段,該段僅向右移動一個位置。新段必須完全從頭開始處理。然而不行的是,這種評估方法非常耗費計算量。

使用 Transformer-XL 進行語言建模

在 Transformer-XL 的訓練階段,爲前一個狀態計算的隱狀態被用作當前段的附加上下文。Transformer-XL 的這種遞歸機制解決了使用固定長度上下文的侷限性。

具有段長度的 Transformer-XL 模型。

在評估階段,可以重複使用來自先前段的表示,而不是從頭開始計算(就像 Transformer 模型的情況一樣)。當然,這也會增加計算速度。

你可以查看實現 Transformer-XL 的代碼:

https://paperswithcode.com/paper/transformer-xl-attentive-language-models

自然語言處理的新玩家:Google 的 BERT

BERT,是來自來自 Transformer 的雙向編碼器表示(Bidirectional Encoder Representations from Transformers)的縮寫。

我們都知道遷移學習在計算機視覺領域的重要性有多高。例如,深度學習預訓練模型可以針對 ImageNet 數據集上的新任務進行微調,並且在相對較小的標記數據集上提供不錯的結果。

類似地,預訓練語言模型對於改進許多自然語言處理任務非常有效:

  • 《用無監督學習提高語言理解能力》(Improving LanguageUnderstanding withUnsupervised Learning)

  • 《Transformer-XL:超出固定長度上下文的注意力語言模型》(Universal Language Model Fine-tuning for Text Classification)

BERT 框架是 Google AI 的一個新的語言表示模型,它使用預訓練和微調來爲各種任務創建最先進的模型。這些任務包括問答系統、情感分析和語言推理等。

BERT 的模型架構

BERT 使用多層雙向 Transformer 編碼器。它的自注意力層在兩個方向上都執行自注意力。Google 發佈了該模型的兩種變體:

  1. BERT Base: Transformers 層數 = 12, 總參數 = 110M

  2. BERT Large: Transformers 層數 = 24, 總參數 = 340M

BERT 使用使用雙向性,通過對幾個任務的預訓練,掩碼語言模型(Masked Language Model)和 下一句的預測。讓我們詳細討論這兩個任務。

BERT 預訓練任務

BERT 使用以下兩個無監督預測任務對 BERT 進行預訓練。

1. 掩碼語言建模(Masked Language Modeling,MLM)

根據這篇 論文:

“掩碼語言建模從輸入中隨機掩蓋一些標記,其目標是僅基於上下文預測被掩蓋的單詞的原始詞彙 id。與從左到右的語言模型預訓練不同,MLM 目標允許表示融合左和右上下文,這允許我們預訓練深度雙向 Transformer。”

Google AI 研究人員隨機掩蓋了每個序列中 15% 的單詞。這個任務是什麼?就是預測那些被掩蓋的單詞。此處需要注意的是,掩碼單詞並不總是被掩蓋的標記 [MASK] [MASK] 標記在微調過程中永遠不會出現。

因此,研究人員使用了以下技術:

  • 有 80% 的單詞被掩碼標記 [MASK] 替換。

  • 有 10% 的單詞被隨機單詞替換。

  • 有 10% 的單詞保持不變。

2. 下一句的預測

一般來說,語言模型並不能捕捉連續句子之間的關係。BERT 也接受過這項任務的預訓練。

對於語言模型的預訓練,BERT 使用成對的句子作爲訓練數據。每對句子的選擇非常有趣。讓我們試着通過一個例子來理解它。

假設我們有一個包含 100000 條句子的文本數據集,我們想使用這個數據集來預訓練 BERT 語言模型。因此,將有 50000 個訓練樣本或句子對作爲訓練數據。

  • 對於 50% 的句子對來說,第二條句子實際上是第一條句子的下一條句子。

  • 對於其餘 50% 的句子對,第二條句子將是語料庫中的一條隨機句子。

  • 對於第一種情況,標籤是“IsNext”,第二種情況標籤是“NotNext”。

像 BERT 這樣的架構表明了,無監督學習(預訓練和微調)將成爲許多語言理解系統中的關鍵元素。資源較少的任務尤其可以從這些深度雙向架構中獲得巨大的好處。

如下圖所示,是一些自然語言處理任務的快照,在這些任務重,BERT 扮演着重要角色:

(來源:Source: https://arxiv.org/abs/1810.04805)

結 語

我們真的應該爲自己感到幸運。因爲自然語言處理技術以如此快的速度取得了最先進的進展。像 Transformer 和 BERT 這樣的架構,正在爲未來幾年更先進的突破鋪平了道路。

 作者介紹

Prateek Joshi,數據科學家,就職於 Analytics Vidhya。在 BFSI 領域擁有多學科的學術背景和經驗。

原文鏈接:

https://www.analyticsvidhya.com/blog/2019/06/understanding-transformers-nlp-state-of-the-art-models/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章