Attention 掃盲:注意力機制及其 PyTorch 應用實現

2021-03-02 計算機視覺聯盟

點上方藍字計算機視覺聯盟獲取更多乾貨

地址:https://www.zhihu.com/people/lucas_zhang

深度學習attention 機制是對人類視覺注意力機制的仿生,本質上是一種資源分配機制。生理原理就是人類視覺注意力能夠以高解析度接收於圖片上的某個區域,並且以低解析度感知其周邊區域,並且視點能夠隨著時間而改變。換而言之,就是人眼通過快速掃描全局圖像,找到需要關注的目標區域,然後對這個區域分配更多注意,目的在於獲取更多細節信息和抑制其他無用信息。提高 representation 的高效性。例如,對於下面一張圖,我的主要關注點就在於中間的 icon 和 ATTENTION 文字,對於邊框上的條紋就不太關注,而且看一眼還有點暈。

Encoder-Decoder框架==sequence to sequence 條件生成框架

Encoder-Decoder框架,也被稱為 sequence to sequence 條件生成框架[1],是一種文本處理領域的研究模式。常規的 encoder-decoder方法,第一步,將輸入句子序列 X通過神經網絡編碼為固定長度的上下文向量C,也就是文本的語義表示;第二步,由另外一個神經網絡作為解碼器根據當前已經預測出來的詞記憶編碼後的上下文向量 C,來預測目標詞序列,過程中編碼器和解碼器的 RNN 是聯合訓練的,但是監督信息只出現在解碼器 RNN 一端,梯度隨著反向傳播到編碼器 RNN 一端。使用 LSTM 進行文本建模時當前流行的有效方法[2]。
attention 機制的最典型應用是統計機器翻譯。給定任務,輸入是「Echt」, 「Dicke」 and 「Kiste」進 encoder,使用 rnn 表示文本為固定長度向量 h3。但問題就在於,當前 decoder 生成 y1 時僅僅依賴於最後一個隱層狀態h3,也就是 sentence_embedding。那麼這個 h3 必須 encode 輸入句子中的全部信息才行。可實際上,傳統Encoder-Decoder模型並不能達到這個功能。那 LSTM [3]不就是用來解決長期依賴信息問題的嘛?但事實上,長短期記憶網絡仍然存在問題。我們說,RNN在長期信息訪問當前處理單元之前,需要按順序地通過所有之前的單元。這意味著它很容易遭遇梯度消失問題。然後引入 LSTM,使用門控某種程度上解決這個問題。的確,LSTM、GRU 和其變體能學習大量的長期信息,但它們最多只能記住相對長的信息,而不是更大更長。所以,我們來總結一下傳統 encoder-decoder的一般範式及其問題:任務是翻譯中文「我/愛/賽爾」到英文。傳統 encoder-decoder 先把整句話輸入進去,編碼最後一個詞「賽爾」結束之後,使用 RNN生成一個整句話的表示-向量 C,在條件生成時,當翻譯到第 2個詞「賽爾」的時候,需要退 1 步找到已經預測出來的h_1以及上下文表示 C, 然後 decode 輸出。在傳統Encoder-Decoder 框架下:由解碼器根據當前已經預測出來的詞記憶編碼後的上下文向量 C,來預測目標詞序列。也就是說,不論生成那個詞,我們使用的句子編碼表示 C 都是一樣的。換句話說,句子中任意單詞對生成某個目標單詞P_yi來說影響力都是相同的,也就是注意力均等。很顯然這不符合直覺。直覺應該:我翻譯哪個部分,哪個部分就應該把注意力集中於我的翻譯的原文,翻譯到第一個詞,就應該多關注原文中的第一個詞是什麼意思。詳見偽代碼和下圖:

P_y1 = F(E<start>,C),P_y2 = F((E<the>,C)P_y3 = F((E<black>,C)

傳統 Encoder-Decoder 框架下的 RNN 進行文本翻譯,一直使用同一個 c接下來觀察上下兩個圖的區別:相同的上下文表示C會替換成根據當前生成單詞而不斷變化的Ci。融合 attention 機制的RNN 模型進行文本翻譯每個時刻生成不同的 c

P_y1 = F(E<start>,C_0),P_y2 = F((E<the>,C_1)P_y3 = F((E<black>,C_2)

Encoder-Decoder框架的代碼實現[4]

class EncoderDecoder(nn.Module):    """    A standard Encoder-Decoder architecture. Base for this and many    other models.    """    def __init__(self, encoder, decoder, src_embed, tgt_embed, generator):        super(EncoderDecoder, self).__init__()        self.encoder = encoder        self.decoder = decoder        self.src_embed = src_embed        self.tgt_embed = tgt_embed        self.generator = generator            def forward(self, src, tgt, src_mask, tgt_mask):        "Take in and process masked src and target sequences."        return self.decode(self.encode(src, src_mask), src_mask,                            tgt, tgt_mask)        def encode(self, src, src_mask):        return self.encoder(self.src_embed(src), src_mask)        def decode(self, memory, src_mask, tgt, tgt_mask):        return self.decoder(self.tgt_embed(tgt), memory, src_mask, tgt_mask)

不含注意力模型的傳統encoder-decoder 可解釋差:對於編碼向量中究竟編碼了什麼信息,如何利用這些信息以及解碼器特定行為的原因是什麼我們並沒有明確的認識。包含注意力機制的結構提供了一張相對簡單的方式讓我們了解解碼器的推理過程以及模型究竟在學習什麼內容,學到那些東西。儘管是一種弱可解釋性,但是已經 make sense 了。直面 attention 的核心公式在預測目標語言的第i個詞時,源語言第j個詞的權重為  , 權重的大小可i以j 看做是一種源語言和目標語言的軟對齊信息。
使用 attention 方法實際上就在於預測一個目標詞 yi 時,自動獲取原句中不同位置的語義信息,並給每個位置信息的語義賦予的一個權重,也就是「軟」對齊信息,將這些信息整理起來計算對於當前詞 yi 的原句向量表示 c_i。

import torchimport torch.nn as nn
class BiLSTM_Attention(nn.Module): def __init__(self): super(BiLSTM_Attention, self).__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, n_hidden, bidirectional=True) self.out = nn.Linear(n_hidden * 2, num_classes)
def attention_net(self, lstm_output, final_state): hidden = final_state.view(-1, n_hidden * 2, 1) attn_weights = torch.bmm(lstm_output, hidden).squeeze(2) soft_attn_weights = F.softmax(attn_weights, 1) context = torch.bmm(lstm_output.transpose(1, 2), soft_attn_weights.unsqueeze(2)).squeeze(2) return context, soft_attn_weights.data.numpy()
def forward(self, X): input = self.embedding(X) input = input.permute(1, 0, 2)
hidden_state = Variable(torch.zeros(1*2, len(X), n_hidden)) cell_state = Variable(torch.zeros(1*2, len(X), n_hidden))
output, (final_hidden_state, final_cell_state) = self.lstm(input, (hidden_state, cell_state)) output = output.permute(1, 0, 2) attn_output, attention = self.attention_net(output, final_hidden_state)        return self.out(attn_output), attention 

https://github.com/zy1996code/nlp_basic_model/blob/master/lstm_attention.py1.《Neural Network Methods in Natural Language Processing》2.Sequence to Sequence Learning with Neural Networks https://arxiv.org/pdf/1409.3215.pdf3.LSTM 掃盲:長短期記憶網絡解讀及其 PyTorch 實現 https://zhuanlan.zhihu.com/p/868769884.The Annotated Transformer https://nlp.seas.harvard.edu/2018/04/03/attention.html這是我的私人微信,還有少量坑位,可與相關學者研究人員交流學習 目前開設有人工智慧、機器學習、計算機視覺、自動駕駛(含SLAM)、Python、求職面經、綜合交流群掃描添加CV聯盟微信拉你進群,備註:CV聯盟

博士筆記 | 周志華《機器學習》手推筆記第一章思維導圖

博士筆記 | 周志華《機器學習》手推筆記第九章

點個在看支持一下吧

相關焦點

  • 注意力機制(Attention Mechanism)在自然語言處理中的應用
    基於注意力(attention)機制的神經網絡成為了最近神經網絡研究的一個熱點,本人最近也學習了一些基於attention機制的神經網絡在自然語言處理(NLP)領域的論文,現在來對attention在NLP中的應用進行一個總結,和大家一起分享。
  • 注意力機制Attention
    注意力機制(attention mechanism)Attention實質上是一種分配機制,其核心思想是突出對象的某些重要特徵。根據Attention對象的重要程度,重新分配資源,即權重,實現核心思想是基於原有的數據找到其之間的關聯性,然後突出其某些重要特徵。注意力可以被描述為將一個查詢和一組鍵值對映射到一個輸出,其中查詢、鍵、值和輸出都是向量。
  • 資源|帶自注意力機制的生成對抗網絡,實現效果怎樣?
    在前一段時間,Han Zhang 和 Goodfellow 等研究者提出添加了自注意力機制的生成對抗網絡,這種網絡可使用全局特徵線索來生成高解析度細節。本文介紹了自注意力生成對抗網絡的 PyTorch 實現,讀者也可以嘗試這一新型生成對抗網絡。
  • 注意力機制Attention Model(mechanism) 的 套路
    相關的paper,網上相關的資料也有很多,在此只講一講自己對於attention的理解,力求做到簡潔明了。三.attention 的擴展 (多層attention,常見的是2層)基於TensorFlow的實踐詳解》完整版PDF+附書代碼《深度學習之pytorch》pdf+附書源碼PyTorch深度學習快速實戰入門《pytorch-handbook》【下載】豆瓣評分8.1,《機器學習實戰:基於Scikit-Learn和TensorFlow》《Python數據分析與挖掘實戰》PDF+完整源碼
  • RNN, Seq2Seq, Attention注意力機制完全解析
    在Tensorflow中上述過程通過以下函數實現:tf.nn.embedding_lookup而在pytorch中通過以下接口實現:torch.nn.Embedding需要注意的是:train和test階段必須使用一樣的embedding矩陣!否則輸出肯定是亂碼。
  • 深入理解圖注意力機制(Graph Attention Network)
    作為一種代表性的圖卷積網絡,Graph Attention Network (GAT) 引入了注意力機制來實現更好的鄰居聚合。通過學習鄰居的權重,GAT 可以實現對鄰居的加權聚合。因此,GAT 不僅對於噪音鄰居較為魯棒,注意力機制也賦予了模型一定的可解釋性。下圖概述了 Graph Attention Network 主要做的事情。
  • 視覺注意力機制 | 視覺注意力機制用於分類:SENet、CBAM、SKNet
    點擊上方「AI算法修煉營」,選擇加星標或「置頂」標題以下,全是乾貨前面的話上次文章中,我們主要關注了視覺應用中的Self-attention機制及其應用——Non-local網絡模塊,從最開始的了解什麼是視覺注意力機制到對自注意力機制的細節把握,再到Non-local模塊的學習。
  • 使用注意力機制來做醫學圖像分割的解釋和Pytorch實現
    從自然語言處理開始,到最近的計算機視覺任務,注意力機制一直是深度學習研究中最熱門的領域之一。在這篇文章中,我們將集中討論注意力是如何影響醫學圖像分割的最新架構的。為此,我們將描述最近兩篇論文中介紹的架構,並嘗試給出一些關於這兩篇文章中提到的方法的直覺,希望它能給你一些想法,讓你能夠將注意力機制應用到自己的問題上。
  • 【Attention】淺談Attention機制的理解
    ,很多深度學習的框架都帶上了注意力機制,而且也取得了很好的性能指標。隨後Bahdanau等人在論文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用類似attention的機制在機器翻譯任務上將翻譯和對齊同時進行,他們的工作算是第一個將attention機制應用到NLP領域中。
  • 圖深度學習入門教程(六)——注意力機制與圖注意力
    本教程主要針對的人群: 本篇文章主要介紹注意力機制模型以及注意力機制在圖神經網絡領域的應用——圖注意力模型(GAT)。1 神經網絡中的注意力機制神經網絡的注意力機制與人類處理事情時常說的「注意力」是一個意思,即,重點關注一堆信息中的部分信息,並對這部分信息進行處理分析。
  • 【CV中的Attention機制】ShuffleAttention
    摘要目前注意力機制主要可以分為兩類,空間注意力機制和通道注意力機制,兩者目標用於捕獲成對的像素級關係和通道間依賴關係的。同時使用兩種注意力機制可以達到更好的效果,但是不可避免地增加了模型的計算量。注意力機制注意力模塊已經成為網絡設計的不得不考慮的重要組成部分。注意力模塊可以有側重點的關注有用的特徵信息,抑制不重要的特徵。self-attention方法是計算一個位置和其上下文的信息作為一個權重,施加到整個圖像中。
  • 淺談Attention機制的理解
    ,很多深度學習的框架都帶上了注意力機制,而且也取得了很好的性能指標。隨後Bahdanau等人在論文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用類似attention的機制在機器翻譯任務上將翻譯和對齊同時進行,他們的工作算是第一個將attention機制應用到NLP領域中。
  • 關於attention機制的一些細節的思考
    之前看過的一些attention機制,除了self attention之外,基於rnn或者cnn的attention在處理文本問題的時候基本上是embedding之後經過了rnn或者cnn結構的映射之後得到了映射後的向量V,然後attention是針對於V進行注意力weights的計算,問題來了,能不能直接在embedding上進行score的計算?
  • 綜述|計算機視覺中的注意力機制
    設為星標,第一時間獲取更多乾貨連結:https://zhuanlan.zhihu.com/p/146130215之前在看DETR這篇論文中的self_attention,然後結合之前實驗室組會經常提起的注意力機制,所以本周時間對注意力機制進行了相關的梳理,以及相關的源碼閱讀了解其實現的機制。
  • Attention!當推薦系統遇見注意力機制
    NewBeeNLP原創出品公眾號專欄作者@上杉翔二悠閒會 · 信息檢索當注意力機制都已經變成很tasteless的手法的時候,使用或者魔改注意力機制一定要專注講好自己的故事:即『為什麼要用Attention,為什麼要魔改Attention』
  • 搞懂Transformer結構,看這篇PyTorch實現就夠了
    雖然原文寫得很清楚,但實際上大家普遍反映很難正確地實現。所以我們為此文章寫了篇註解文檔,並給出了一行行實現的Transformer的代碼。本文檔刪除了原文的一些章節並進行了重新排序,並在整個文章中加入了相應的註解。
  • Attention U-Net簡介及其在Keras中實現示例
    1.什麼是注意力(Attention)?在圖像分割中,注意力是一種只突出訓練中相關激活的方法。這減少了浪費在無關激活上的計算資源,為網絡提供了更好的泛化能力。本質上,網絡可以「關注」圖像的某些部分。b)Soft AttentionSoft attention通過給圖像的不同部分加權來實現。高相關性區域乘以較大的權重,而低相關性區域標記為較小的權重。隨著神經網絡模型的訓練,對高權重區域的關注越來越多。與hard attention不同,這些權重可以應用於圖像中的許多塊。
  • CV中的Attention機制:簡單而有效的CBAM模塊
    什麼是注意力機制?注意力機制(Attention Mechanism)是機器學習中的一種數據處理方法,廣泛應用在自然語言處理、圖像識別及語音識別等各種不同類型的機器學習任務中。通俗來講:注意力機制就是希望網絡能夠自動學出來圖片或者文字序列中的需要注意的地方。
  • 將注意力機制引入RNN,解決5大應用領域的序列預測問題
    在這篇博客中,我們將發現可以在循環神經網絡中採用注意力機制(attention mechanism)來克服這種局限性。讀完這篇博客,你會知道:編碼器-解碼器結構和固定長度內部表徵的局限性讓網絡學會針對輸出序列的每一項去注意輸入序列中對應位置的注意力機制帶有注意力機制的循環神經網絡在文本翻譯、語音識別等 5 個領域中的應用。
  • 一文讀懂Attention機制
    Attention 的本質是什麼Attention機制源自於人類視覺注意力機制:將有限的注意力集中在重點信息上,「從關注全部到關注重點」,從而節省資源,快速獲得最有效的信息。對於Attention而言,就是一種權重參數的分配機制,目標是協助模型捕捉重要信息,「帶權求和」就可以高度概括,在不同的 context 下,focusing 不同的信息。