keras_attention_block package

keras_attention_block.attention module

class keras_attention_block.attention.Attention1DLayer(similarity='additive', *, mergfunc=None, dropout_rate=None, kernel_initializer='glorot_uniform', wk_kernel_initializer='glorot_uniform', wq_kernel_initializer='glorot_uniform', **kwargs)[source]

Bases: keras.engine.topology.Layer, keras_attention_block.mixins.MergfuncMixin

attention1d的特点是自己为输入的Key和Value,输出的是Query的timestep为长度,dim一致的张量

similarity

Union[Callable,str]

  • 指定使用的相似度计算函数,目前可选的有 加性相似度(additive),乘性相似度(multiplicative),点乘相似度(dot_product), 当然也可以自己写一个,只要最终输出的是一个(?,output,input_timestep)的
kernel_initializer

str

  • 权重V的初始化函数,默认glorot_uniform
wk_kernel_initializer

str

  • 权重W_k的初始化函数,默认glorot_uniform
wq_kernel_initializer

str

  • 权重W_q的初始化函数,默认glorot_uniform
additive(Source, Query)[source]

加性相似度,最经典的注意力相似度机制,如果是在self attention中则该层有3个权重矩阵形状为W_k(time_q,time_k)和W_q(time_q,time_q)以及V(dim,time_k)

\[Similarity(Source)=tanh(W_k\cdot Source+W_q\cdot Query)\cdot V\]
build(input_shape)[source]
call(inputs)[source]
compute_output_shape(input_shape)[source]
dot_product(Source, Query)[source]

点乘相似度,在google的attention is all you need 中看到的.很迷,没有要训练的矩阵,直接转置点乘

\[Similarity(Source,Query)=\frac{Source^T\cdot Query}{\sqrt{d_k}}\]
get_config()[source]
multiplicative(Source, Query)[source]

乘性相似度,其中的权重矩阵形状为[dim,dim]输出的固定为与原输入一样形状

\[Similarity(Source,Query) = Query \cdot W \cdot Source^T\]
class keras_attention_block.attention.Attention2DLayer(output_size=None, similarity='additive', *, mergfunc=None, dropout_rate=None, kernel_initializer='glorot_uniform', wk_kernel_initializer='glorot_uniform', wq_kernel_initializer='glorot_uniform', **kwargs)[source]

Bases: keras_attention_block.attention.Attention1DLayer

attention的特点是自己为输入,输出也是一个和自己一样shape的张量. 2d的attention是为2dcnn设计的,其原理就是将4维的中间两维压缩为一维,之后输出的时候再解压缩出来.

output_size

tuple[int,int]

  • 指定输出的形状,如果是加性相似度(additive), 则必须指定,且可以随意指定,如果是其他则可以不指定,那就是原样形状输出, 如果指定的话则必须积与原形状第1,2纬度的积相等
similarity

Union[Callable,str]

  • 指定使用的相似度计算函数,目前可选的有 加性相似度(additive),乘性相似度(multiplicative),点乘相似度(dot_product), 当然也可以自己写一个,只要最终输出的是一个(?,output,input_timestep)的 用于指定第一个权重的形状,各维的意义[输出的纬度,第二个权重矩阵的第一个纬度]
kernel_initializer

str

  • 第一个权重的初始化函数,默认glorot_uniform
wk_kernel_initializer

str

  • 第二个权重的初始化函数,默认glorot_uniform
wq_kernel_initializer

str

  • 权重W_q的初始化函数,默认glorot_uniform
build(input_shape)[source]
call(inputs)[source]

self-attention就是通过相似度函数计算得的相似矩阵过softmax后与自身点乘得到

\[A = Softmax(Similarity(Source))\]
\[C = A \cdot Source\]
compute_output_shape(input_shape)[source]
get_config()[source]

keras_attention_block.key_value_attention module

class keras_attention_block.key_value_attention.KeyValueAttention1DLayer(similarity='additive', *, mergfunc=None, dropout_rate=None, kernel_initializer='glorot_uniform', wk_kernel_initializer='glorot_uniform', wq_kernel_initializer='glorot_uniform', **kwargs)[source]

Bases: keras.engine.topology.Layer, keras_attention_block.mixins.MergfuncMixin

key-value-attention1d的特点是输入的Key和Value为成对的数据Query一般为外部数据,Key和Query有一致的dim,和Value有一致的timestep, 输出的是Query的timestep,Value的dim形状的张量

similarity

Union[Callable,str]

  • 指定使用的相似度计算函数,目前可选的有 加性相似度(additive),乘性相似度(multiplicative),点乘相似度(dot_product), 当然也可以自己写一个,只要最终输出的是一个(?,output,input_timestep)的
kernel_initializer

str

  • 权重V的初始化函数,默认glorot_uniform
wk_kernel_initializer
  • 权重W_k的初始化函数,默认glorot_uniform
wq_kernel_initializer
  • 权重W_q的初始化函数,默认glorot_uniform
additive(Key, Query)[source]

加性相似度,最经典的注意力相似度机制,如果是在self attention中则该层有3个权重矩阵形状为W_k(time_q,time_k)和W_q(time_q,time_q)以及V(dim,time_k)

\[Similarity(Key)=tanh(W_k\cdot Key+W_q\cdot Query)\cdot V\]
build(input_shape)[source]
call(inputs)[source]
compute_output_shape(input_shape)[source]
dot_product(Key, Query)[source]

点乘相似度,在google的attention is all you need 中看到的.很迷,没有要训练的矩阵,直接转置点乘

\[Similarity(Key,Query) = \frac{Key^T\cdot Query}{\sqrt{d_k}}\]
get_config()[source]
multiplicative(Key, Query)[source]

乘性相似度,其中的权重矩阵形状为[dim,dim]输出的固定为与原输入一样形状

\[Similarity(Key,Query) = Query \cdot W \cdot Source^T\]
class keras_attention_block.key_value_attention.KeyValueAttention2DLayer(output_size=None, similarity='additive', *, mergfunc=None, dropout_rate=None, kernel_initializer='glorot_uniform', wk_kernel_initializer='glorot_uniform', wq_kernel_initializer='glorot_uniform', **kwargs)[source]

Bases: keras_attention_block.key_value_attention.KeyValueAttention1DLayer

key-value-attention2d的特点是输入的Key和Value为成对的数据Query一般为外部数据, Key和Query有一致的dim,和Value有一致的timestep,也就是中间两个纬度, 输出的是Query的timestep,Value的dim形状的张量. 4d的attention是为cnn设计的,其原理就是将4维的中间两维压缩为一维,之后输出的时候再解压缩出来.

output_size

tuple[int,int]

  • 指定输出的形状,如果是加性相似度(additive), 则必须指定,且可以随意指定,如果是其他则可以不指定,那就是原样形状输出, 如果指定的话则必须积与原形状第1,2纬度的积相等
similarity

Union[Callable,str]

  • 指定使用的相似度计算函数,目前可选的有 加性相似度(additive),乘性相似度(multiplicative),点乘相似度(dot_product), 当然也可以自己写一个,只要最终输出的是一个(?,output,input_timestep)的 用于指定第一个权重的形状,各维的意义[输出的纬度,第二个权重矩阵的第一个纬度]
kernel_initializer

str

  • 第一个权重的初始化函数,默认glorot_uniform
wk_kernel_initializer

str

  • 第二个权重的初始化函数,默认glorot_uniform
wq_kernel_initializer

str

  • 权重W_q的初始化函数,默认glorot_uniform
build(input_shape)[source]
call(inputs)[source]

self-attention就是通过相似度函数计算得的相似矩阵过softmax后与自身点乘得到

\[A = Softmax(Similarity(Key,Query))\]
\[C = A \cdot Value\]
compute_output_shape(input_shape)[source]
get_config()[source]

keras_attention_block.self_attention module

class keras_attention_block.self_attention.SelfAttention1DLayer(similarity='additive', *, mergfunc=None, kernel_size=None, dropout_rate=None, kernel_initializer='glorot_uniform', wk_kernel_initializer='glorot_uniform', **kwargs)[source]

Bases: keras.engine.topology.Layer, keras_attention_block.mixins.MergfuncMixin

self-attention的特点是自己为输入,输出也是一个和自己一样shape的张量.

similarity

Union[Callable,str]

  • 指定使用的相似度计算函数,目前可选的有 加性相似度(additive),乘性相似度(multiplicative),点乘相似度(dot_product), 当然也可以自己写一个,只要最终输出的是一个(?,output,input_timestep)的
mergfunc

Union[Callable,str]

  • 与similarity类似,目前可选的有: 矩阵乘法(batch_dot_merg),逐项相乘(batch_mul_merg),逐项相加(batch_add_merg)
kernel_size

tuple[int,int]

  • 指定使用加性相似度(additive)时才能指定, 用于指定第一个权重的形状,各维的意义[输出的纬度,第二个权重矩阵的第一个纬度]
kernel_initializer

str

  • 第一个权重的初始化函数,默认glorot_uniform
wk_kernel_initializer

str

  • 第二个权重的初始化函数,默认glorot_uniform
additive(Source)[source]

加性相似度,最经典的注意力相似度机制,如果是在self attention中则该层有两个权重矩阵形状为(r,d_a)和(d_a,dim)

\[Similarity(Source) = V \cdot tanh(W_k\cdot Source^T)\]
build(input_shape)[source]
call(inputs)[source]
compute_output_shape(input_shape)[source]
dot_product(Source)[source]

点乘相似度,在google的attention is all you need 中看到的.很迷,没有要训练的矩阵,直接转置点乘,输出的固定为与原输入一样形状

\[Similarity(Source) = \frac{Source^T\cdot Source}{\sqrt{d_k}}\]
get_config()[source]
linear(Source)[source]
multiplicative(Source)[source]

乘性相似度,其中的权重矩阵形状为[dim,dim]输出的固定为与原输入一样形状

\[Similarity(Source) = Source\cdot W \cdot Source^T\]
class keras_attention_block.self_attention.SelfAttention2DLayer(output_size=None, similarity='additive', *, mergfunc=None, d_a=None, dropout_rate=None, kernel_initializer='glorot_uniform', wk_kernel_initializer='glorot_uniform', **kwargs)[source]

Bases: keras_attention_block.self_attention.SelfAttention1DLayer

self-attention的特点是自己为输入,输出也是一个和自己一样shape的张量. 2d的self-attention是为2dcnn设计的,其原理就是将4维的中间两维压缩为一维,之后输出的时候再解压缩出来.

output_size

tuple[int,int]

  • 指定输出的形状,如果是加性相似度(additive), 则必须指定,且可以随意指定,如果是其他则可以不指定,那就是原样形状输出, 如果指定的话则必须积与原形状第1,2纬度的积相等
similarity

Union[Callable,str]

  • 指定使用的相似度计算函数,目前可选的有 加性相似度(additive),乘性相似度(multiplicative),点乘相似度(dot_product), 当然也可以自己写一个,只要最终输出的是一个(?,output,input_timestep)的 用于指定第一个权重的形状,各维的意义[输出的纬度,第二个权重矩阵的第一个纬度]
d_a

int

  • 使用加性相似度(additive)时才要指定,超参,用于指定第二个权重的第一维
kernel_initializer

str

  • 第一个权重的初始化函数,默认glorot_uniform
wk_kernel_initializer

str

  • 第二个权重的初始化函数,默认glorot_uniform
build(input_shape)[source]
call(inputs)[source]

self-attention就是通过相似度函数计算得的相似矩阵过softmax后与自身点乘得到

\[A = Softmax(Similarity(Source))\]
\[C = A \cdot Source\]
compute_output_shape(input_shape)[source]
get_config()[source]

keras_attention_block.mulithead_attention module

class keras_attention_block.mulithead_attention.MulitheadAttention(heads=5, input_linear_kwargs={'units': 60, 'activation': 'relu'}, output_linear_kwargs={'activation': 'relu'}, attention=<class 'keras_attention_block.self_attention.SelfAttention1DLayer'>, attention_kwargs={'similarity': 'dot_product'})[source]

Bases: object

多头注意力机制(MulitheadAttention).是我在google的all you need is attention中看到的注意力机制. 其核心思想是将dim一层拆分后各自单独进入attention中,以适用于多GPU并行计算,有点map-reduce的意思在里面. 在实现上,我使用的是如下顺序进行处理: 1. input_linear_layer一层线性层将输入的dim扩展到相同的某个数, 2. split_layer一层用于将输入的tensor基于dim分割为多份 3. attention_layer一层用于将分割好的tensor各自进入attention 4. concatenate_layer一层用于将这些结果按顺序再次基于dim组合在一起 5. output_linear_layer一层用于将组合起来的输入通过一层全连接层再组合为最初输入的dim大小.