【Pytorch神经网络理论篇】 20 神经网络中的注意力机制
? ? 注意力機制可以使神經網絡忽略不重要的特征向量,而重點計算有用的特征向量。在拋去無用特征對擬合結果于擾的同時,又提升了運算速度。
1 注意力機制
所謂Attention機制,便是聚焦于局部信息的機制,比如圖像中的某一個圖像區域。隨著任務的變化,注意力區域往往會發生變化。
?面對上面這樣的一張圖,如果你只是從整體來看,只看到了很多人頭,但是你拉近一個一個仔細看就了不得了,都是天才科學家。
圖中除了人臉之外的信息其實都是無用的,也做不了什么任務,Attention機制便是要找到這些最有用的信息,可以想見最簡單的場景就是從照片中檢測人臉了。
1.1 注意力機制的實現
? ? 神經網絡中的注意力機制主要是通過注意力分數來實現的。注意力分數是一個0-1的值,注意力機制作用下的所有分數和為1。每個注意力分數代表當前項被分配的注意力權重。
? ? 任意力分激常由神經網絡的權重參數在模型的訓練中學習得來,并最終使用Softmax函數進計算。這種機制可以作用在任何神經網絡模型中。
? ? (1)注意力機制可以作用在RNN模型中的每個序列上,令RNN模型對序列中的單個樣本給予不同的關注度, 這種方式常用在RNN層的輸出結果之后。
(2)注意力機制也可以作用在模型輸出的特征向量上,這種針對特征向量進行注意力計算的方式適用范圍更為廣泛。該方式不但可以應用于循環神經網絡,而且可以用于卷積神經網絡,甚至圖神經網絡。
1.2 注意力控制的兩種形式
1.2.1 軟模式
所有數據均被主注意,計算相應的權重值,不設置篩選條件。
1.2.2 硬模式
在生成注意力權重之后刪除一部分不符合條件的注意力,使其注意力權值為0,即不再注意不符合條件的部分。
1.3 注意力機制模型的原理
? ? 注意力機制模型是指完全使用注意力機制搭建起來的模型。注意力機制可以輔助其他神經網絡,本身也具有擬合能力
1.3.1 數學模型的推導
?1.3.2注意力機制模型的應用
? ? 注意力機制模型非常適合序列到序列(Sq2Sg)的擬合任務。例如,在實現文字閱讀理解任務中,可以把文章當成Q。閱讀理解的問題和答案當成K和V(形成鍵值對)。下面以個翻譯任務為例,詳細介紹其擬合過程。
1.4 多頭注意力機制
? ? 注意力機制因2017年谷歌公司發表的一篇論文Attention is All You Need而受到廣泛關注。多頭注意力機制就是這篇論文中使用的主要技術之一。多頭注意力機制是對原始注意力機制的改進。多頭注意力機制可以表示為:Y=MultiHead(Q,K,V),Y代表多頭注意力結果,其原理如圖所示。
多頭注意力機制的工作原理介紹如下。
1.5 自注意力機制
自注意力機制,又稱內部注意力機制,用于發現序列數據的內部特征。其具體做法是將Q、K、V都變成X,即計算Attention(X,X,X),這里的X代表待處理的輸入數據。
? ? 使用多頭注意力機制訓練出的自注意力特征可以用于Seq2Seq模型(輸入和輸出都是序列數據的模型)、分類模型等各種任務,并能夠得到很好的效果,即Y=MultiHead(X,X,X),Y代表多頭注意力結果。
2 擴展
2.1?使用梯度剪輯技巧優化訓練過程
2.1.1 梯度抖動的原因
梯度剪輯是一種訓練模型的技巧,用來改善模型訓練過程中抖動較大的問題:在模型使用反向傳播訓練的過程中,可能會出現梯度值劇烈抖動的情況。而某些優化器的學習率是通過策略算法在訓練過程中自學習產生的。當參數值在較為“平坦”的區域進行更新時,由于該區域梯度值比較小,學習率一般會變得較大,如果突然到達了“陡峭”的區域,梯度值陡增,再與較大的學習率相乘,參數就有很大幅度的更新,因此學習過程非常不穩定。
2.1.2?梯度剪輯的具體做法
將反向求導的梯度值控制在一定區間之內,將超過區間的梯度值按照區間邊界進行截斷,這樣,在訓練過程中,權重參數的更新幅度就不會過大,使得模型更容易收斂。
2.1.3 在PyTorch中,實現梯度剪輯的三種方式
1.簡單方式直接使用cclip_grad_value_()函數即可實現簡單的梯度剪輯。
torch.nn.utils.clip_grad_value_(parameters=network.parameters(),clip_value=1.0)該代碼可以將梯度按照[-1,1]區間進行剪輯。這種方法能設剪輯區間的上限和下限,且絕對值必須一致。如果想對區間的上限和下限設置不同的值,那么需要使用其他方法。
2.自定義方式可以使用鉤子函數,為每一個參數單獨指定剪輯區間。
for param in network.parameters():param.register_hook(lambda gradient:torch.clamp(gradient,-0.1,1.0))該代碼為實例化后的模型權重添加了鉤子函數,并在鉤子函數內部實現梯度剪輯的設置。
? ? 這種方式最為靈活。在訓練時,每當執行完反向傳播(loss.backward)之后,所計算的梯度會觸發鉤子函數進行剪輯處理。
3.使用范數的方式
直接使用clip_grad_norm_()函數即可以范數的方式對梯度進行剪輯。
torch.nn.utils.clip_grad_norm_(network.parameters(),max_norm=1,norm_type=2)函數clip_grad_norm_()會迭代模型中的所有參數,并將它們的梯度當成向量進行統的范數處理。第2個參數值1表示最大范數,第3個參數值2表示使用L2范數的計算方法。
2.2 使用JANET單元完成RNN
在GitHub網站中,搜索pytorch-janet關鍵詞,在使用時,只需要將pytorch-janet項目中的源碼復制到本地,并在代碼中導入。
在pytorch-janet項目中,JANET類的實例化參數與torch.nn.LSTM類完全一致,可以直接替換。如果要將LSTM模型替換成JANET,那么需要如下3步實現。
(1)將pytorch-janet項目中的源碼復制到本地。
(2)在代碼文件LSTMModel.py的開始處添加如下代碼,導入JANET類。
(3)將代碼文件LSTMModel.py中的torch.nn.LSTM替換成JANET。
2.3 使用indRNN單元實現RNN
在GitHub網站中,搜索indrnn-pytorch關鍵詞,該項目中實現了兩個版本的IndRNN單元。這兩個版本的IndRNN接口分別為IndRNN、IndRNNv2類,可以直接替換torch.nn.LSTM類。
總結
以上是生活随笔為你收集整理的【Pytorch神经网络理论篇】 20 神经网络中的注意力机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows 访问linux中的mon
- 下一篇: 【在虚拟环境下完美解决】1698: er