attention机制的编写,怎么嵌入attention

众所周知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')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值