众所周知attention在模型当中越来越来越重要。
那么怎么写入attention呢
首先是最简单的代码,rnn_outputs[-1]表示最后一次lstm的输出结果,具体看上一篇代码
alpha = tf.nn.softmax(rnn_outputs[-1])
r = tf.multiply(rnn_outputs[-1], alpha)
rnn_outputs = tf.tanh(r)
直接在自己代码上面插入,就可以是使用最简单的attention。
那么我想要高级的attention怎么办
我现在要self-attention的q,v,k
首先我先定义
att_Q=tf.Variable(tf.random.truncated_normal(shape=[hidden_dim*2,hidden_dim*2]),trainable=True,name='attenion_size_Q')
att_K=tf.Variable(tf.random.truncated_normal(shape=[hidden_dim*2,hidden_dim*2]),trainable=True,name='attenion_size_K')
att_V=tf.Variable(tf.random.truncated_normal(shape=[hidden_dim*2,hidden_dim*2]),trainable=True,name='attenion_size_V')
这里有一个hidden_dim
hidden_dim是代表什么呢?hidden_dim是传入代码的rnn_outputs[-1]的最后一维的一半。
然后和rnn_outputs[-1]相乘
outputs=rnn_outputs[-1]
Q=tf.matmul(outputs,att_Q,name='q')
K=tf.matmul(outputs,att_K,name='k')
V=tf.matmul(outputs,att_V,name='v')
然后计算qk
qk=tf.matmul(Q,tf.transpose(K,[0,2,1],name='t1'),name='qk')/tf.sqrt(tf.constant(hidden_dim*2,dtype=tf.float32,name='scaled_factor'),name='sqrt1')
最后计算结果
weights=tf.nn.softmax(qk)
#计算好权值之后,接下来就是计算out
out=tf.matmul(weights,V,name='weighted_V')