transformers理論解釋

2021-10-09 05:19:26 字數 4755 閱讀 2568

transformer 是谷歌大腦在 2017 年底發表的** attention is all you need 中所提出的 seq2seq 模型。現在已經取得了大範圍的應用和擴充套件,而 bert 就是從 transformer 中衍生出來的預訓練語言模型

這篇文章分為以下幾個部分

transformer 直觀認識

positional encoding

self attention mechanism

殘差連線和 layer normalization

transformer encoder 整體結構

transformer decoder 整體結構

總結參考文章

transformer 和 lstm 的最大區別,就是 lstm 的訓練是迭代的、序列的,必須要等當前字處理完,才可以處理下乙個字。而 transformer 的訓練時並行的,即所有是同時訓練的,這樣就大大增加了計算效率。transformer 使用了位置嵌入 (positional encoding) 來理解語言的順序,使用自注意力機制(self attention mechanism)和全連線層進行計算,這些後面會講到

transformer 模型主要分為兩大部分,分別是encoderdecoderencoder負責把輸入(語言序列)隱射成隱藏層(下圖中第 2 步用九宮格代表的部分),然後解碼器再把隱藏層對映為自然語言序列。例如下圖機器翻譯的例子

本篇文章大部分內容在於解釋encoder部分,即把自然語言序列對映為隱藏層的數學表達的過程。理解了 encoder 的結構,再理解 decoder 就很簡單了

上圖為 transformer encoder block 結構圖,注意:下面的內容標題編號分別對應著圖中 1,2,3,4 個方框的序號

由於 transformer 模型沒有迴圈神經網路的迭代操作, 所以我們必須提供每個字的位置資訊給 transformer,這樣它才能識別出語言中的順序關係

現在定義乙個位置嵌入的概念,也就是 positional encoding,位置嵌入的維度為[max_sequence_length, embedding_dimension], 位置嵌入的維度與詞向量的維度是相同的,都是embedding_dimensionmax_sequence_length屬於超引數,指的是限定每個句子最長由多少個詞構成

注意,我們一般以為單位訓練 transformer 模型。首先初始化字編碼的大小為[vocab_size, embedding_dimension]vocab_size為字型檔中所有字的數量,embedding_dimension為字向量的維度,對應到 pytorch 中,其實就是nn.embedding(vocab_size, embedding_dimension)

**中使用了 sin 和 cos 函式的線性變換來提供給模型位置資訊:pe

(pos

,2i)

=sin

(pos

/100002i

/dmodel)p

e(po

s,2i

+1)=

cos(

pos/

100002i

/dmodel

) 序號增大,位置嵌入函式的週期變化越來越平緩

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

import math

defget_positional_encoding

(max_seq_len, embed_dim):

# 初始化乙個positional encoding

# embed_dim: 字嵌入的維度

# max_seq_len: 最大的序列長度

positional_encoding = np.array([

[pos / np.power(10000, 2 * i / embed_dim) for i in range(embed_dim)]

if pos != 0

else np.zeros(embed_dim) for pos in range(max_seq_len)])

positional_encoding[1:, 0::2] = np.sin(positional_encoding[1:, 0::2])  # dim 2i 偶數

positional_encoding[1:, 1::2] = np.cos(positional_encoding[1:, 1::2]) # dim 2i+1 奇數

對於輸入的句子 x

為 decoder 中 masked self-attention 的輸出

到此為止,transformer 中 95% 的內容已經介紹完了,我們用一張圖展示其完整結構。不得不說,transformer 設計的十分巧奪天工

下面有幾個問題,是我從網上找的,感覺看完之後能對 transformer 有乙個更深的理解

transformer 為什麼需要進行 multi-head attention?

原**中說到進行 multi-head attention 的原因是將模型分為多個頭,形成多個子空間,可以讓模型去關注不同方面的資訊,最後再將各個方面的資訊綜合起來。其實直觀上也可以想到,如果自己設計這樣的乙個模型,必然也不會只做一次 attention,多次 attention 綜合的結果至少能夠起到增強模型的作用,也可以模擬 cnn 中同時使用多個卷積核的作用,直觀上講,多頭的注意力有助於網路捕捉到更豐富的特徵 / 資訊

transformer 相比於 rnn/lstm,有什麼優勢?為什麼?

rnn 系列的模型,無法平行計算,因為 t 時刻的計算依賴 t-1 時刻的隱層計算結果,而 t-1 時刻的計算依賴 t-2 時刻的隱層計算結果

transformer 的特徵抽取能力比 rnn 系列的模型要好

為什麼說 transformer 可以代替 seq2seq?

這裡用代替這個詞略顯不妥當,seq2seq 雖已老,但始終還是有其用武之地,seq2seq 最大的問題在於將 encoder 端的所有資訊壓縮到乙個固定長度的向量中,並將其作為 decoder 端首個隱藏狀態的輸入,來** decoder 端第乙個單詞 (token) 的隱藏狀態。在輸入序列比較長的時候,這樣做顯然會損失 encoder 端的很多資訊,而且這樣一股腦的把該固定向量送入 decoder 端,decoder 端不能夠關注到其想要關注的資訊。transformer 不但對 seq2seq 模型這兩點缺點有了實質性的改進 (多頭互動式 attention 模組),而且還引入了 self-attention 模組,讓源序列和目標序列首先「自關聯」 起來,這樣的話,源序列和目標序列自身的 embedding 表示所蘊含的資訊更加豐富,而且後續的 ffn 層也增強了模型的表達能力,並且 transformer 平行計算的能力遠遠超過了 seq2seq 系列模型

返回文章列表

打賞

Transformers 詞彙表 二

作者 huggingface 編譯 vk github 詞彙表每種模型都不同,但與其他模型相似。因此,大多數模型使用相同的輸入,此處將在用法示例中進行詳細說明。輸入id通常是傳遞給模型作為輸入的唯一必需引數。它們是標記索引,標記的數字表示構建將被模型用作輸入的序列。每個tokenizer的工作方式不...

Transformers 多語言模型 十一

作者 huggingface 編譯 vk github 該庫中可用的大多數模型都是單語言模型 英語,中文和德語 有一些多語言模型可用,並且與單語言模型具有不同的機制。本頁詳細介紹了這些模型的用法。當前支援多種語言的兩個模型是bert和xlm。xlm共有10個不同的checkpoints,其中只有乙個...

第一章 Transformers各種API的綜述

pipeline 是對於給定任務使用預訓練模型最簡單的方法。pipeline 支援很多常見任務 文字 影象 音訊 在本文中,以情感分析任務為例,演示pipeline 的使用 首先,引入pipeline 以及指定將要完成的任務 from transformers import pipeline cla...