复现Transformer模型

Embedding + Positional Embedding

在transformer中,embedding主要是为每个词提供一个向量,然后position embedding主要是提供位置信息,这里着重讲解一下一个句子进来,它是如何进行嵌入和位置相加的。

假设vocab_size = 10000,embed_dim = 128,max_seq_length = 5000

首先先初始化一层embedding层(vocab_size,embed_dim), 然后我们开始准备position encoding。首先,我们初始化一个index,这个index是从0到max_seq_length,最后升维度—> [5000,1]。接着按照transformer论文里面的公式进行一个计算。position_emb_fill这个维度就是 [5000,64],接着初始化一个[max_seq_length,embed_dim]大小的矩阵,准备把position_emb_fill填充进去。偶数位置 用 sin 奇数用cos

examples: 假如进来一句话,首先这里面有15个token,第一步经过embedding层,每一个词都是128维度的向量**[15,128],**接着为这个embedding提供position encoding。那么position encoding的大小是[5000,128]在这个例子里面,我们只需要为15个词提供,所以只需要取到15前面。假如是21这个token,被嵌入成了128维的向量,position encoding为这个向量提供了填充,奇数位置是xx偶数位置是xxx,每个词都有。

tensor([ 2, 21, 85, 257, 31, 87, 22, 94, 7, 16, 112, 7910, 3209, 4, 3])

position_emb_fill = position_idx * torch.exp(-torch.arange(0,embedding_size,2)*math.log(10000)/embedding_size)

 Encoder给KV给Decoder的Q

上三角和pad的掩码代码: torch.triu() 是 PyTorch 中的一个函数,用于生成一个上三角矩阵(或者说是上三角部分被填充为1的矩阵)。该函数的第一个参数是输入的矩阵,第二个参数 diagonal 是一个可选参数,用于控制对角线的偏移量。

# 生成掩码
first_attn_mask = (dec_x_batch==PAD_IDX).unsqueeze(1).expand(dec_x_batch.size()[0],dec_x_batch.size()[1],dec_x_batch.size()[1])
first_attn_mask=first_attn_mask | torch.triu(torch.ones(dec_x_batch.size()[1],dec_x_batch.size()[1]),diagonal=1).bool().unsqueeze(0).expand(dec_x_batch.size()[0],-1,-1) # &目标序列的向后看掩码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值