day5-attention機制和Seq2Seq

內容包括:

  1. attention機制
  • 為什么需要attention
  • 簡介
  1. Seq2Seq

attention

為什么需要attention

由于之前的輸入文本無論長度,最后都變成了一個隱藏狀態(tài)輸入到decoder解碼都伪,因為encoder最后的隱藏狀態(tài)一定程度上包含了所有文本的信息,所以理論上是可以有效果的撤卢,但是實際上一旦輸入文本很長,那么指望這么一個隱藏狀態(tài)變量清楚的記錄文本的所有信息并且能夠解碼出正確的輸出是不現(xiàn)實的,也就是導致了輸出的隱藏狀態(tài)(contenxt vector)"遺忘"了一部分信息驰怎,因此我們想到是否可以給解碼器提供更多的信息钞馁,也就是編碼器每個時間步的信息虑省,attention為解碼器提供編碼器每個隱藏狀態(tài)的信息斗搞,通過這些信息,模型可以有重點的關注編碼器中需要關注的部分

簡介

總的來說慷妙,是為編碼器每個時間步分配一個權重(注意力)僻焚,利用softmax對編碼器隱藏狀態(tài)加權求和,得到context vector

步驟:

  1. 獲取每個編碼器隱藏狀態(tài)的分數(shù)

-分數(shù)(標量)是通過評分函數(shù)(alignment)獲得的膝擂,其中評分函數(shù)并不是唯一的虑啤,假設為點積函數(shù)

*decoder_hidden *= [10, 5, 10]##其中一個解碼器的隱藏狀態(tài)
*encoder_hidden  score*
---------------------
     [0, 1, 1]     15 (= 10×0 + 5×1 + 10×1, the dot product)
     [5, 0, 1]     60
     [1, 1, 0]     15
     [0, 5, 1]     35

以上就獲得了4個編碼器隱藏狀態(tài)關于一個解碼器隱藏狀態(tài)的分數(shù),其中[5, 0, 1]的注意力分數(shù)為60是最高的架馋,說明接下來翻譯出的這個詞將受到這個編碼器隱藏狀態(tài)的影響

  1. 通過softmax層狞山,歸一化
*encoder_hidden  score  score^*
-----------------------------
     [0, 1, 1]     15       0
     [5, 0, 1]     60       1
     [1, 1, 0]     15       0
     [0, 5, 1]     35       0
  1. 通過softmax獲得的權重與每個編碼器隱藏狀態(tài)相乘,也就是加權叉寂,獲得alignment向量
*encoder_hidden  score  score^  alignment*
----------------------------------------
     [0, 1, 1]     15       0  [0, 0, 0]
     [5, 0, 1]     60       1  [5, 0, 1]
     [1, 1, 0]     15       0  [0, 0, 0]
     [0, 5, 1]     35       0  [0, 0, 0]
  1. 對alignment向量求和
*encoder_hidden  score  score^  alignment*
----------------------------------------
     [0, 1, 1]     15       0  [0, 0, 0]
     [5, 0, 1]     60       1  [5, 0, 1]
     [1, 1, 0]     15       0  [0, 0, 0]
     [0, 5, 1]     35       0  [0, 0, 0]
*context *= [0+5+0+0, 0+0+0+0, 0+1+0+0] = [5, 0, 1]
  1. 將上下文向量輸入解碼器
    輸入方式取決于架構萍启,一般是和解碼器的輸入一起喂進模型
'''
1. 計算評分函數(shù)
2. 求出對應的softmax歸一化后的值
3. 用上面得到的值加權value(在這里k和v都是編碼器的隱藏狀態(tài))
'''
def SequenceMask(X, X_len,value=-1e6):
    maxlen = X.size(1)
    #print(X.size(),torch.arange((maxlen),dtype=torch.float)[None, :],'\n',X_len[:, None] )
    mask = torch.arange((maxlen),dtype=torch.float)[None, :] >= X_len[:, None]   ##這是一種reshape操作,將X_reshape為()
    #print(mask)
    X[mask]=value
    return X

def masked_softmax(X, valid_length):
  '''
  1. valid_length可能是(batch_size_1, )屏鳍,也可能是(batch_size, x)
  2. X(batch_size_1, 1,num_hidden_size)

  '''
    # X: 3-D tensor, valid_length: 1-D or 2-D tensor
    softmax = nn.Softmax(dim=-1)
    if valid_length is None:
        return softmax(X)
    else:
        shape = X.shape
        if valid_length.dim() == 1:
            try:
                valid_length = torch.FloatTensor(valid_length.numpy().repeat(shape[1], axis=0))#[2,2,3,3]
            except:
                valid_length = torch.FloatTensor(valid_length.cpu().numpy().repeat(shape[1], axis=0))#[2,2,3,3]
        else:
            valid_length = valid_length.reshape((-1,))
        # fill masked elements with a large negative, whose exp is 0
        X = SequenceMask(X.reshape((-1, shape[-1])), valid_length)
 
        return softmax(X).reshape(shape)

class DotProductAttention(nn.Module): 
  '''
  1. 計算評分
  2. 計算歸一化
  3. 計算加權
  '''
    def __init__(self, dropout, **kwargs):
        super(DotProductAttention, self).__init__(**kwargs)
        self.dropout = nn.Dropout(dropout)

    # query: (batch_size, #queries, d)
    # key: (batch_size, #kv_pairs, d)
    # value: (batch_size, #kv_pairs, dim_v)
    # valid_length: either (batch_size, ) or (batch_size, xx)
    def forward(self, query, key, value, valid_length=None):
        d = query.shape[-1]
        # set transpose_b=True to swap the last two dimensions of key
        
        scores = torch.bmm(query, key.transpose(1,2)) / math.sqrt(d)
        attention_weights = self.dropout(masked_softmax(scores, valid_length))
        print("attention_weight\n",attention_weights)
        return torch.bmm(attention_weights, value)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末勘纯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钓瞭,更是在濱河造成了極大的恐慌驳遵,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山涡,死亡現(xiàn)場離奇詭異堤结,居然都是意外死亡,警方通過查閱死者的電腦和手機鸭丛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門竞穷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鳞溉,你說我怎么就攤上這事瘾带。” “怎么了穿挨?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵月弛,是天一觀的道長。 經(jīng)常有香客問我科盛,道長帽衙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任贞绵,我火速辦了婚禮厉萝,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己谴垫,他們只是感情好章母,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翩剪,像睡著了一般乳怎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上前弯,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天蚪缀,我揣著相機與錄音,去河邊找鬼恕出。 笑死询枚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的浙巫。 我是一名探鬼主播金蜀,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼的畴!你這毒婦竟也來了渊抄?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤苗傅,失蹤者是張志新(化名)和其女友劉穎抒线,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渣慕,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年抱慌,在試婚紗的時候發(fā)現(xiàn)自己被綠了逊桦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡抑进,死狀恐怖强经,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情寺渗,我是刑警寧澤匿情,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站信殊,受9級特大地震影響炬称,放射性物質發(fā)生泄漏。R本人自食惡果不足惜涡拘,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一玲躯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦跷车、人聲如沸棘利。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善玫。三九已至,卻和暖如春密强,著一層夾襖步出監(jiān)牢的瞬間蝌焚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工誓斥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留只洒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓劳坑,卻偏偏與公主長得像毕谴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子距芬,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容