Transformer
前言
Transformer应用范围非常广泛,涵盖了自然语言处理、时间序列数据预测、图像处理等领域。由于笔者之前都是应用,但是对于原理并没有深刻理解导致想要进行进一步的调试难度比较大,所以学习Transformer的原理以便更加好地运用Transformer。Transformer-vit-tutorial-baseline这一篇文章写的非常好,非常清晰地展示了用代码实现Transformer的具体编程步骤以及原理解释,另外Transformer From Scratch和Build Transformer With Pytorch展示了用Pytorch复现Transformer代码的全过程。
网络架构
数据处理
词嵌入向量
将单词转化成嵌入向量能够更加好地捕捉单词之间的语法和语义关系,比如在自然语言处理中经常设置512这个超参数的数值,表示可以最多提取出512个表征特征用于做模型训练。
class Embedding(nn.Module):
def __init__(self, vocab_size, embed_dim):
"""
Args:
vocab_size: size of vocabulary
embed_dim: dimension of embeddings
"""
super(Embedding, self).__init__()
self.embed = nn.Embedding(vocab_size, embed_dim)
def forward(self, x):
"""
Args:
x: input vector
Returns:
out: embedding vector
"""
out = self.embed(x)
return out
位置编码
由于一次性是将所有的单词输入,模型并不知道单词之间的先后关系,然而对于自然语言来说语义顺序很重要,比如“我是你爸爸”顺序不对就变成了“你是我爸爸”。
class PositionalEmbedding(nn.Module):
def __init__(self,max_seq_len,embed_model_dim):
"""
Args:
seq_len: length of input sequence
embed_model_dim: demension of embedding
"""
super(PositionalEmbedding, self).__init__()
self.embed_dim = embed_model_dim
pe = torch.zeros(max_seq_len,self.embed_dim)
for pos in range(max_seq_len):
for i in range(0,self.embed_dim,2):
pe[pos, i] = math.sin(pos / (10000 ** ((2 * i)/self.</