1. 程式人生 > >seq2seq聊天模型(三)—— attention 模型

seq2seq聊天模型(三)—— attention 模型

num 同仁 gif 技術 .com lstm 一起 coder 一個

註意力seq2seq模型

大部分的seq2seq模型,對所有的輸入,一視同仁,同等處理。

但實際上,輸出是由輸入的各個重點部分產生的。

比如:
技術分享圖片

(舉例使用,實際比重不是這樣)
對於輸出“晚上”,

各個輸入所占比重: 今天-50%,晚上-50%,吃-100%,什麽-0%

對於輸出“吃”,

各個輸入所占比重: 今天-0%,晚上-0%,吃-100%,什麽-0%

特別是在seq2seq的看圖說話應用情景中

技術分享圖片

睡覺還握著筆的baby

這裏的重點就是baby,筆!通過這些重點,生成描述。

下面這個圖,就是attention的關鍵原理

技術分享圖片

tensorlfow 代碼

encoder 和常規的seq2seq中的encoder一樣,只是在attention模型中,不再需要encoder累計的state狀態,需要的是各個各個分詞的outputs輸出。

在訓練的時候,將這個outputs與一個權重值一起擬合逼進目標值。

這個權重值,就是各個輸入對目標值的貢獻占比,也就是註意力機制!

dec_cell = self.cell(self.hidden_size)

attn_mech = tf.contrib.seq2seq.LuongAttention(
    num_units=self.attn_size,  # 註意機制權重的size
    memory=self.enc_outputs,  # 主體的記憶,就是decoder輸出outputs
    memory_sequence_length=self.enc_sequence_length,
    #   normalize=False,
    name=‘LuongAttention‘)

dec_cell = tf.contrib.seq2seq.AttentionWrapper(
    cell=dec_cell,
    attention_mechanism=attn_mech,
    attention_layer_size=self.attn_size,
    #  attention_history=False, # (in ver 1.2)
    name=‘Attention_Wrapper‘)
initial_state = dec_cell.zero_state(dtype=tf.float32, batch_size=batch_size)

# output projection (replacing `OutputProjectionWrapper`)
output_layer = Dense(dec_vocab_size + 2, name=‘output_projection‘)


 # lstm的隱藏層size和attention 註意機制權重的size要相同

seq2seq聊天模型(三)—— attention 模型