思想是當前資訊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盤 安裝成功以後,可以通過以下命...