21 - Transformer模型总结和loss_mask代码实现
文章目录1. Transformer的特点2. Transformer的使用类型3. Transformer的结构1. Transformer的特点1.1 无先验假设(例如无局部关联性假设,无有序建模)1.2 核心计算在于自注意机制,呈现平方复杂度1.3 数据量的要求与先验假设的程度成反比2. Transformer的使用类型2.1 Encoder Only : Bert , 分类任务,非流式任务
·
1. Transformer的特点
- 1.1 无先验假设(例如无局部关联性假设,无有序建模)
- 1.2 核心计算在于自注意机制,呈现平方复杂度
- 1.3 数据量的要求与先验假设的程度成反比
2. Transformer的使用类型
- 2.1 Encoder Only : Bert , 分类任务,非流式任务
- 2.2 Decoder Only : GPT系列,语言建模,自回归任务,流式任务
- 2.3 Encoder-Decoder: 机器翻译,语言识别
3. Transformer的结构
- Encoder:
(1)Position_Embedding:Transformer本质上是DNN结构,无位置信息,为了增加位置信息,我们需要进行位置编码
(2)Multi_Head_Self_Attention: 这是Transformer模型的核心,对任意两两字符进行关系建模
(3)LayerNorm&Residual
(4)FeedForward_Neural_Network:linear1(large)+linear2(model)
(5)LayerNorm&Residual - Decoder:
(1)Position_Embedding
(2)Casual_Multi_Head_Cross_Attention因果自回归,需要下三角矩阵
(3)LayerNorm&Residual
(4)Memory_Base_Multi_Head_Cross_Attetion:负责Encoder_Decoder信息融合
(5)LayerNorm&Residual
(6)FeedForward_Neural_Network:linear1(large)+linear2(model)
(7)LayerNorm&Residual
4. Transformer的loss_mask
import torch
import torch.nn as nn
import torch.nn.functional as F
# 生成一个logits矩阵
logits = torch.randn(2, 3, 4)
# batch_size=2,seqlen=3,vocab_size=4
# 生成标签
label = torch.randint(0, 4, (2, 3))
logits = logits.transpose(1, 2)
print(f"logits={logits}")
print(f"label={label}")
# 求两个的交叉熵值
loss = F.cross_entropy(logits, label, reduction='none')
print(f"loss={loss}")
tgt_len = torch.Tensor([2, 3]).to(torch.int32)
# 将存在的单词赋值为1,填充的为0
mask = torch.cat([torch.unsqueeze(F.pad(torch.ones(L),(0,max(tgt_len-L))),0) for L in tgt_len])
print(f"mask={mask}")
# 将loss中填充的部分赋值为0
mask_loss = loss*mask
print(f"mask_loss={mask_loss}")
logits=tensor([[[-0.0452, -0.9794, -0.1257],
[-0.1749, 0.8239, -0.7211],
[-0.4296, 0.9329, -0.3611],
[ 1.3901, -0.3422, -1.5745]],
[[-0.1865, 0.1169, 0.3734],
[-0.4562, 1.0939, 0.6862],
[-1.4816, -0.3995, -1.0691],
[-0.8154, -0.0264, 0.4808]]])
label=tensor([[2, 0, 1],
[3, 2, 2]])
loss=tensor([[2.2954, 2.7556, 1.5419],
[1.5731, 2.1495, 2.7554]])
mask=tensor([[1., 1., 0.],
[1., 1., 1.]])
mask_loss=tensor([[2.2954, 2.7556, 0.0000],
[1.5731, 2.1495, 2.7554]])
更多推荐


所有评论(0)