Python Tensorflow';s AdditiveAttention实现没有权重
我试图了解新(自定义)层是如何在Python Tensorflow';s AdditiveAttention实现没有权重,python,tensorflow,keras,keras-layer,attention-model,Python,Tensorflow,Keras,Keras Layer,Attention Model,我试图了解新(自定义)层是如何在Tensorflow/Keras中实现的。 Bahdanau的额外关注似乎相当直截了当。该机制的一部分是: 这是。但是,查看代码,我似乎找不到应在tanh函数中使用的权重。这让我觉得我对在Tensorflow中构建层了解不够。另一个结论是tensorflow没有实现此处的权重。这似乎不太可能 我想解释一下Tensorflow是如何将此机制作为自定义层实现的 Tensorflow的AdditiveAttention子类如下: def __init__(self,
Tensorflow
/Keras
中实现的。
Bahdanau的额外关注似乎相当直截了当。该机制的一部分是:
这是。但是,查看代码,我似乎找不到应在tanh
函数中使用的权重。这让我觉得我对在Tensorflow
中构建层了解不够。另一个结论是tensorflow
没有实现此处的权重。这似乎不太可能
我想解释一下Tensorflow
是如何将此机制作为自定义层实现的
Tensorflow的AdditiveAttention子类如下:
def __init__(self, use_scale=True, **kwargs):
super(AdditiveAttention, self).__init__(**kwargs)
self.use_scale = use_scale
def build(self, input_shape):
v_shape = tensor_shape.TensorShape(input_shape[1])
dim = v_shape[-1]
if isinstance(dim, tensor_shape.Dimension):
dim = dim.value
if self.use_scale:
self.scale = self.add_weight(
name='scale',
shape=[dim],
initializer=init_ops.glorot_uniform_initializer(),
dtype=self.dtype,
trainable=True)
else:
self.scale = None
super(AdditiveAttention, self).build(input_shape)
唯一的重量是self.scale
。稍后,这将在\u calculate\u scores(查询,键)
中使用tanh
功能:
math_ops.reduce_sum(scale * math_ops.tanh(q_reshaped + k_reshaped), axis=-1)
可训练权重应乘以查询(q_整形
)和键(k_整形
),如Bahdanau分数方程所示
查看q_整形
和k_整形
后,将其传递到call()
函数中,如下所示:
def call(self, inputs, mask=None, training=None):
self._validate_call_args(inputs=inputs, mask=mask)
q = inputs[0]
v = inputs[1]
k = inputs[2] if len(inputs) > 2 else v
q_mask = mask[0] if mask else None
v_mask = mask[1] if mask else None
scores = self._calculate_scores(query=q, key=k)
...
应在调用调用()
后创建权重。(call(),calls build())。所以在我看来,查询和键并没有加权