- pad_attn_mask = seq_k.data.eq(0).unsqueeze(1)
eq函数是留下seq_k等于0的坐标,seq_k是enc_inputs - feedforward层使用一维卷积,常用于自然语言处理
本来是
实现的是
class PoswiswFeedForwardNet(nn.Module):
def init(self):
super(PoswiswFeedForwardNet, self).__init__()
self.conv1 = nn.Conv1d(in_channels=d_models,out_channels=d_ff,kernel_size=1)
self.conv2 = nn.Conv1d(fin_channels=d_ff,out_channels=d_models, 1)
def forward(self, inputs):
residual = inputs
output = nn.RELU()(self.conv1(inputs.transpose(1,2)))
out = self.conv2(output).transpose(1,2)
return nn.LayerNorm(d_model)(output + residual)
#inputs : [batch_size, len_q, d_model]
为什么要对输入进行transpose
转置以后:
|E00|E10|E20|
|E01|E11|E21|
|E02|E12|E22|
每一列是一个单词的embedding情况。行数上,比如第一行,
分别是第一个单词的embeeding第一个元素,第二个单词的embedding第一个元素。
conv1d是在最后一维上进行处理的,经过conv1d之后,变成,[batch_si