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\]
-
-
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
-
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\]
-
-
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
-
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)\]
-
-
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
-
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大小.