[深度應用]·Keras實現Self-Attention文本分類(機器如何讀懂人心)
配合閱讀:
筆者在[深度概念]·Attention機制概念學習筆記博文中,講解了Attention機制的概念與技術細節,本篇內容配合講解,使用Keras實現Self-Attention文本分類,來讓大家更加深入理解Attention機制。
作為對比,可以訪問[TensorFlow深度學習深入]實戰三·分別使用DNN,CNN與RNN(LSTM)做文本情感分析,查看不同網絡區別與聯系。
一、Self-Attention概念詳解
了解了模型大致原理,我們可以詳細的看一下究竟Self-Attention結構是怎樣的。其基本結構如下
對於self-attention來講,Q(Query), K(Key), V(Value)三個矩陣均來自同一輸入,首先我們要計算Q與K之間的點乘,然后為了防止其結果過大,會除以一個尺度標度
這里可能比較抽象,我們來看一個具體的例子(圖片來源於https://jalammar.github.io/illustrated-transformer/,該博客講解的極其清晰,強烈推薦),假如我們要翻譯一個詞組Thinking Machines,其中Thinking的輸入的embedding vector用
當我們處理Thinking這個詞時,我們需要計算句子中所有詞與它的Attention Score,這就像將當前詞作為搜索的query,去和句子中所有詞(包含該詞本身)的key去匹配,看看相關度有多高。我們用
顯然,當前單詞與其自身的attention score一般最大,其他單詞根據與當前單詞重要程度有相應的score。然后我們在用這些attention score與value vector相乘,得到加權的向量。
如果將輸入的所有向量合並為矩陣形式,則所有query, key, value向量也可以合並為矩陣形式表示
其中
二、Self_Attention模型搭建
筆者使用Keras來實現對於Self_Attention模型的搭建,由於網絡中間參數量比較多,這里采用自定義網絡層的方法構建Self_Attention,關於如何自定義Keras可以參看這里:編寫你自己的 Keras 層
Keras實現自定義網絡層。需要實現以下三個方法:(注意input_shape是包含batch_size項的
)
build(input_shape)
: 這是你定義權重的地方。這個方法必須設self.built = True
,可以通過調用super([Layer], self).build()
完成。call(x)
: 這里是編寫層的功能邏輯的地方。你只需要關注傳入call
的第一個參數:輸入張量,除非你希望你的層支持masking。compute_output_shape(input_shape)
: 如果你的層更改了輸入張量的形狀,你應該在這里定義形狀變化的邏輯,這讓Keras能夠自動推斷各層的形狀。
實現代碼如下:
這里可以對照一中的概念講解來理解代碼
如果將輸入的所有向量合並為矩陣形式,則所有query, key, value向量也可以合並為矩陣形式表示
上述內容對應
其中
上述內容對應(為什么使用batch_dot呢?這是由於input_shape是包含batch_size項的
)
這里 QK = QK / (64**0.5) 是除以一個歸一化系數,(64**0.5)是筆者自己定義的,其他文章可能會采用不同的方法。
三、訓練網絡
項目完整代碼如下,這里使用的是Keras自帶的imdb影評數據集
四、結果輸出