陌路茶色/

torch.nn.modules.activation.py

目前尝试在选几个领域详细深入一下,工具方面因为pytorch比起TensorFlow来更简单方便,就选择阅读pytorch的代码,当前的本意是能够很灵活的将pytorch用起来,因此切入点是pytorch有哪些供使用的函数,后期有需要会进行更深入的了解。

函数

Threshold(Module)

屏幕快照 2020-05-02 下午6.42.45.png
大于的被保留,不大于的用value替换,forward中直接调用了F.threshold函数。简单实践如下所示:
屏幕快照 2020-05-02 下午6.43.57.png

ReLU(Module)

同上,$ReLU(x)=max(0,x)$

RReLU(Module)

屏幕快照 2020-05-02 下午8.34.19.png

Hardtanh(Module)

屏幕快照 2020-05-02 下午8.36.31.png

ReLU6(Hardtanh)

继承Hardtanh,初始化传入

def __init__(self, inplace=False):
    super(ReLU6, self).__init__(0., 6., inplace)

屏幕快照 2020-05-02 下午8.38.10.png

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

屏幕快照 2020-05-02 下午9.50.51.png

CELU

屏幕快照 2020-05-02 下午9.56.18.png

GLU

指定维度,并从该维度平分tensor为a和b,进行如下计算:
屏幕快照 2020-05-02 下午10.09.51.png
屏幕快照 2020-05-02 下午10.10.50.png

Hardshrink

屏幕快照 2020-05-02 下午10.11.56.png

LeakyReLU

屏幕快照 2020-05-02 下午10.12.59.png

LogSigmoid

就是在sigmoid外加一层log
屏幕快照 2020-05-02 下午10.16.47.png

Softplus

屏幕快照 2020-05-02 下午10.22.01.png

Softshrink

屏幕快照 2020-05-02 下午10.24.44.png
屏幕快照 2020-05-02 下午10.24.55.png

PReLU

屏幕快照 2020-05-02 下午10.26.33.png

Softsign

屏幕快照 2020-05-02 下午10.28.18.png

Tanhshrink

屏幕快照 2020-05-02 下午10.30.29.png
屏幕快照 2020-05-02 下午10.30.52.png

Softmax/Softmin

屏幕快照 2020-05-02 下午10.32.50.png
屏幕快照 2020-05-02 下午10.33.33.png

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模块

屏幕快照 2020-05-02 下午7.01.50.png
在functional文件中的threshold函数里面,使用VF模块,追到VF函数中并不能找到:
屏幕快照 2020-05-02 下午7.04.24.png

Module模块

关于Module的使用及内部实现

为什么顺着torch.sigmoid在torch目录下找不到sigmoid的实现

???

关于如何使用不同的激活函数

Relu->Lecky Relu/Elu>tanh>sigmoid

References

activation.py
pytorch documentation

留下一条评论

暂无评论