1. 数据
1.1 词化tokenization
将离散输入的句子进行一个个分词处理,变成一个个token,也叫分词
1.2 词的序列化 token2index
把每个token在字典上的位置找到
1.3 增加前缀和后缀 add SOS& EOS
1.4 collate-fn
pad-sequence:
每句话不一样,所以需要将聚泽填充到同一长度:rnn.pad.sequencelabel=target[:,1:]:
从第1个位置开始,因为第0个位置为SOS
(Start Of Sentence)decoder_input=target[:,:-1]:
不包含最后一个,因为最后一个为EOS
(End Of Sentence)
2. 模型
2.1 Encoder
Encoder有的模型可以一次性传入,如RNN/CNN/MLP/Transformer_Encoder
2.2 Attention
2.2.1 计算Score范围
content_based
: 需要考虑encoder_state
,即编码器的状态也纳入计算encoder中;decoder_state score:
需要考虑当前解码器的状态和编码器的输出状态的关联性location_based:
仅需考虑decoder_state
和previous_location
,不需要考虑encoder_state
hybrid:
混合式,既考虑内容,又考虑位置
2.2.2 计算score方式
dot_product:
解码器的状态与编码器的状态进行点乘additive:
加性计算multiplicative:
乘性
2.2.3 计算context
F.softmax(score)–>归一化处理–> context上下文信息
2.3 Decoder
单步计算解码器
RNN CELL/Transformer:
单步计算解码器,一步步进行计算,即当前的decoder_state和decoder_state进行对齐teacher_force_training:
解码器的训练是teacher-force,解码器的输入是解码器当前目标的上时刻的真实值autoregressive_inference:
解码器的推理是自回归的没有teachermasked_sequence_loss:
因为序列在一个批次中是不一样的长的,所以计算loss损失的过程中需要将不参与计算的位置进行标记Mask出来;
3. pytorch训练编码技巧
3.1 自定义dataset
__init__
/__len__
/__getitem__
- getitem尽量值从内存度,避免读磁盘
- 若数据太大,可以位置一个固定大小的内存池,偶尔从磁盘中读
3.2 DataLoader
num_work > 0:
表示可以进行并行计算,pin_memory
与non_blocking
结合,有时可以进行加速
3.3 Cudnn
开启cudnn bench mark
加速器,可以自动的选择高速的卷积,进行神经网络的训练;torch.backends.cudnn.benchmark=True
表示可以进行加速卷积搜索
4. 爱因斯坦标示
文章出处登录后可见!
已经登录?立即刷新