點上方藍字計算機視覺聯盟獲取更多乾貨
地址: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]。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 模型進行文本翻譯每個時刻生成不同的 cP_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聯盟博士筆記 | 周志華《機器學習》手推筆記第一章思維導圖
博士筆記 | 周志華《機器學習》手推筆記第九章
點個在看支持一下吧