【踩了torch.nn.Transformer一个大坑】

踩了torch.nn.Transformer一个大坑

介绍

为了学习,没有使用预训练模型而是使用了torch.nn.Transformer。
随机生成50个词的句子进行翻译。 使用torch.nn.Transformer实现。
字典共39个词,[0-9][a-z]每个字符当成一个词。
翻译规则为小写转大写,新数字=9-数字。顺序左右颠倒。译文每0个字符重复。
模型使用方法,输入源语句和译文句子开始标志,预测完整的译文句子。

遇到大坑

如果创建nn.Transformer不传入custom_encoder,custom_decoder,训练不能收敛。
Transformer init()额外创建encoder_norm

 if custom_encoder is not None:
   ....
 else:
   encoder_norm = LayerNorm(d_model, eps=layer_norm_eps, **factory_kwargs)
   self.encoder = TransformerEncoder(encoder_layer, num_encoder_layers, encoder_norm)

TransformerEncoder在最后返回结果再做再一次LayerNorm,训练就不能收敛

        if self.norm is not None:
            output = self.norm(output)

        return output

TransformerDecoder同样问题。最后做了一次正规化就无法完成训练。

修改过的可以完成训练并且经常准确率达100%的写法。

   encoderlayer = nn.TransformerEncoderLayer(word_embeding_dim, number_of_heads, batch_first=True, norm_first=True)
   encoder = nn.TransformerEncoder(encoderlayer, num_layers=num_encode_decode_layers)

   decoderlayer = nn.TransformerDecoderLayer(word_embeding_dim, number_of_heads, batch_first=True, norm_first=True)
   decoder = nn.TransformerDecoder(decoderlayer, num_layers=num_encode_decode_layers)

   #批优先,先正规,encoder,decoder事先建好再转入
    self.tranmodel = nn.Transformer(d_model=word_embeding_dim, nhead=number_of_heads,
                                 batch_first=True, norm_first=True, custom_encoder=encoder,
                                 custom_decoder=decoder)

#程序简介
生成训练样本,随机生成源句子和翻译后的句子。进行词向量编码和位置编码。
使用torch.nn.Transformer生成预测,再转为词,交叉熵为损失函数。

不能理解为什么做了正规化训练就不能收敛。

安装

python 3.10

使用说明

程序源码
python源码
train()训练
evalmodel()测试

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值