目前尝试在选几个领域详细深入一下,工具方面因为pytorch比起TensorFlow来更简单方便,就选择阅读pytorch的代码,当前的本意是能够很灵活的将pytorch用起来,因此切入点是pytorch有哪些供使用的函数,后期有需要会进行更深入的了解。
函数
Threshold(Module)
大于的被保留,不大于的用value替换,forward中直接调用了F.threshold函数。简单实践如下所示:
ReLU(Module)
同上,$ReLU(x)=max(0,x)$
RReLU(Module)
Hardtanh(Module)
ReLU6(Hardtanh)
继承Hardtanh,初始化传入
def __init__(self, inplace=False):
super(ReLU6, self).__init__(0., 6., inplace)
Hardsigmoid
$$ \text{Hardsigmoid}(x) = \begin{cases} 0 & \text{if}\,\, x \le -3, \\ 1 & \text{if}\,\, x \ge +3, \\ x / 6 & \text{otherwise} \end{cases} $$
ELU
CELU
GLU
指定维度,并从该维度平分tensor为a和b,进行如下计算:
Hardshrink
LeakyReLU
LogSigmoid
就是在sigmoid外加一层log
Softplus
Softshrink
PReLU
Softsign
Tanhshrink
Softmax/Softmin
MultiheadAttention
细读了一下F. multi_head_attention_forward部分,最终的q,k,v有两种方式得到,对应着use_separate_proj_weight参数,MultiheadAttention传入的use_separate_proj_weight为true,即不进行分割,q,k,v通过如下方式得到:
if in_proj_bias is not None:
q = linear(query, q_proj_weight_non_opt, in_proj_bias[0:embed_dim])
k = linear(key, k_proj_weight_non_opt, in_proj_bias[embed_dim:(embed_dim * 2)])
v = linear(value, v_proj_weight_non_opt, in_proj_bias[(embed_dim * 2):])
else:
q = linear(query, q_proj_weight_non_opt, in_proj_bias)
k = linear(key, k_proj_weight_non_opt, in_proj_bias)
v = linear(value, v_proj_weight_non_opt, in_proj_bias)
其中q_proj_weight_non_opt和in_proj_bias是在MultiheadAttention__init__()中通过Parameter定义并初始化的。
embed_dim必须能被num_heads整除,q会乘以scaling参数,scaling = float(head_dim) ** -0.5
。有两个mask参数,key_padding_mask和attn_mask,key_padding_mask对应的是encoder,attn_mask对应的是decoder,其它细节很简单,不再阐述。下面给出核心代码:
q = q.contiguous().view(tgt_len, bsz * num_heads, head_dim).transpose(0, 1)
if k is not None:
k = k.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1)
if v is not None:
v = v.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1)
attn_output_weights = torch.bmm(q, k.transpose(1, 2))
attn_output_weights = softmax(attn_output_weights, dim=-1)
attn_output_weights = dropout(attn_output_weights, p=dropout_p, training=training)
attn_output = torch.bmm(attn_output_weights, v)
疑问
关于pytorch中的inplace的理解,以及VF模块
在functional文件中的threshold函数里面,使用VF模块,追到VF函数中并不能找到:
Module模块
关于Module的使用及内部实现
为什么顺着torch.sigmoid在torch目录下找不到sigmoid的实现
???
关于如何使用不同的激活函数
Relu->Lecky Relu/Elu>tanh>sigmoid
暂无评论