attention的一種實現方式記錄

2021-09-28 22:04:38 字數 1763 閱讀 2187

思想是當前資訊ht與前文多個資訊hs進行比對計算,得到對各個前文資訊hs應該有多少關注度,即at;利用at加權相應的hs,並累加所有加權後的前文資訊,得到綜合前文資訊ct,將其與當前資訊ht進行拼接組合進行**;

上述流程計算方式如下:

這裡的注意力其實可以認為指的是at,因此需要關注at如何計算(上述公式1),at計算主要部分是score(ht, hs),score計算常見有三種方式,如下:

def

calc_score

(self, att_query, att_keys)

:"""

calculate bahdanau score

:param att_query: b x t_q x n

:param att_keys: b x t_k x n

return b x t_q x t_k scores

"""b, t_k, n = att_keys.size(

) t_q = att_query.size(1)

# 以下進行dimension的擴充;因為這裡的query_len 不再是1,而是多個,通過擴充dimension來和keys做笛卡爾積,可以減少**量和快速計算;

att_query = att_query.unsqueeze(2)

.expand(b, t_q, t_k, n)

att_keys = att_keys.unsqueeze(1)

.expand(b, t_q, t_k, n)

# eltwiseadd_qk是乙個tensor相加的簡單操作(因其他目的做了封裝);之所以相加,是簡化了第三種score計算方式,即將上述wa省略了(注意第三種方式等價於拼接前各自乘以乙個w後再相加,如果把各自的w去掉,就是直接相加了);

sum_qk = self.eltwiseadd_qk(att_query, att_keys)

# 做一些歸一化

if self.normalize:

sum_qk = self.eltwiseadd_norm_bias(sum_qk, self.normalize_bias)

# self.linear_att 是乙個shape為[hid_dim]的tensor

tmp = self.linear_att.to(torch.float32)

linear_att = tmp / tmp.norm(

) linear_att = linear_att.to(self.normalize_scalar)

# eltwisemul_norm_scaler 乘法封裝

linear_att = self.eltwisemul_norm_scaler(linear_att, self.normalize_scalar)

else

: linear_att = self.linear_att

# self.matmul_score 乘法封裝,得到score結果

out = self.matmul_score(self.tanh(sum_qk)

, linear_att)

# a.matmul(b)

return out

p.s 僅供參考,敬請指正,侵

一種基於ccs3的timeline實現方法

該控制項的實現過程較為簡單,主要由test.html檔案和timeline.css檔案組成。具體 如下 1 標題一label class date t1span class circle span div class content 長安元年 701年 李白,字太白。其生地今一般認為是唐劍南道綿州 ...

一種分頁的實現

以下 是一種分頁的實現。分別是檔案page.php和page.css。分頁的糾結點在於分頁條中省略號的顯示。實現的基本邏輯是 1,接收瀏覽器端傳過來的想要顯示的頁碼數 page。page get p 2,根據頁碼數 page 以及固定的每頁顯示數 pagesize 從資料庫中取資料。sql sele...

windows下安裝django的一種方法

django版本是1.3.1,壓縮包。1.首先將django 1.31壓縮包解壓,使其與python2.7在同一根目錄下 2.之後進入cmd,通過命令python setup.py install進行安裝。python2.7和django 1.3.1都是存放在本地的c盤 安裝成功以後,可以通過以下命...