從圖上可以看出來,decode的過程其實都是從encode的最後乙個隱層開始的,如果encode輸入過長的話,會丟失很多資訊,所以設計了attation機制。
attation機制的decode的過程和原來的最大的區別就是,它輸出的不只是基於本時刻的h,而是基於本時刻的h和c的concat矩陣。
那麼c是什麼,c就是encode的h的聯合(見最後一張圖的公式),含義非常明顯了,就是我在decode的時候,不但考慮我現在decode的隱層的情況,同時也考慮到encode的隱層的情況,那麼關鍵是encode的隱層那麼多,你該怎麼考慮了,這就是attation矩陣的計算方式。。目前的計算方式是,這個時刻decode的隱層和encode的所有隱層做個對應,最後一張圖非常明白
如果你還沒有理解,看這個公式,輸入的d『t就是我上面說的c,把這個和dt concat就是本時刻輸出的隱層
其實實現起來不複雜,就是在decode的時候,隱層和encode的隱層對應一下,然後concat一下:
下面這個**是在github上找的,兩個隱層對應的方式可能跟上面說的不一樣,但是原理都差不多,看這個**感受一下這個流程。
s =self.encoder.zero_state(self.batch_size, tf.float32)encoder_hs =
with tf.variable_scope(
"encoder"):
for t in
xrange(self.max_size):
if t >0: tf.get_variable_scope().reuse_variables()
x = tf.squeeze(source_xs[t], [1])
x = tf.matmul(x, self.s_proj_w) +self.s_proj_b
h, s =self.encoder(x, s)
encoder_hs =tf.pack(encoder_hs)
s =self.decoder.zero_state(self.batch_size, tf.float32)
logits =
probs =
with tf.variable_scope(
"decoder"):
for t in
xrange(self.max_size):
if t >0: tf.get_variable_scope().reuse_variables()
ifnot self.is_test or t ==0:
x = tf.squeeze(target_xs[t], [1])
x = tf.matmul(x, self.t_proj_w) +self.t_proj_b
h_t, s =self.decoder(x, s)
h_tld =self.attention(h_t, encoder_hs)
oemb = tf.matmul(h_tld, self.proj_w) +self.proj_b
logit = tf.matmul(oemb, self.proj_wo) +self.proj_bo
prob =tf.nn.softmax(logit)
defattention(self, h_t, encoder_hs):
#scores = [tf.matmul(tf.tanh(tf.matmul(tf.concat(1, [h_t, tf.squeeze(h_s, [0])]),
#self.w_a) + self.b_a), self.v_a)
#for h_s in tf.split(0, self.max_size, encoder_hs)]
#scores = tf.squeeze(tf.pack(scores), [2])
scores = tf.reduce_sum(tf.mul(encoder_hs, h_t), 2)
a_t =tf.nn.softmax(tf.transpose(scores))
a_t = tf.expand_dims(a_t, 2)
c_t = tf.batch_matmul(tf.transpose(encoder_hs, perm=[1,2,0]), a_t)
c_t = tf.squeeze(c_t, [2])
h_tld = tf.tanh(tf.matmul(tf.concat(1, [h_t, c_t]), self.w_c) +self.b_c)
return h_tld
NLP從Seq2Seq到ALBERT模型理解與實踐
今天來推薦一下自己開源的乙個小專案,主要包括nlp中一些經典模型的理解與相關實踐,從最初的seq2seq到目前比較流行的bert模型,以及bert模型改進 albert模型等。下面是模型實踐的基本學習路線 內年分為對應模型的 發表年份。1 seq2seq模型 2 attention機制 3 tran...
seq2seq模型詳解
在李紀為博士的畢業 中提到,基於生成的閒聊機械人中,seq2seq是一種很常見的技術。例如,在法語 英語翻譯中,的當前英語單詞不僅取決於所有前面的已翻譯的英語單詞,還取決於原始的法語輸入 另乙個例子,對話中當前的response不僅取決於以往的response,還取決於訊息的輸入。其實,seq2se...
Seq2Seq模型結構
seq2seq sequence to sequence 是乙個處理序列問題的模型,傳統的 rnn 或 lstm 只能處理 輸入及輸出是定長即 一對一或多對多的問題,而 seq2seq 則能處理一對多的問題,它也是 rnn 最重要的乙個變種 n vs m 輸入與輸出序列長度不同 編碼 解碼模型,主要...