上一篇:基于Transformer的决策智能 第三篇 BERT模型优化
我们先看看模型的输入: 2D的状态信息 16×16的状态信息,标记了障碍物位置、当前位置、目标位置 1D的补充信息 补充信息长度为8,包含前一动作,目前只用了1位,其余7位用 - 填充
为了简便我们可以将补充信息的长度填充到16,同时在每行的末尾加入换行符。则模型的输入示例如下:
0001000000000000
0001000000000000
0+01000000000000
0001001111100000
0001000000100000
0001000000100000
0001001111100000
0001001000000000
0001001000000000
0000001000000000
0000001011111111
0000001000000000
0000001000000000
0000001000000x00
0000001000000000
0000001000000000
D---------------
这样输入就变成了17×17的2D矩阵,也可以Reshape成长度为289的1D序列。
分两条路线去优化
一、改用2D Transformer
在2D Transformer中,需要同时包含X方向和Y方向的位置编码。
关于2D Transformer的文章很多,本文不多做解释。这里说一种我想到的实现方式:
假设输入尺寸为(B, H, W),
第一步:
先Rearrange("B H W->B (H W)")
再经过TransformerEncoder Layer1
最后Rearrange("B (H W)->B H W")
输出尺寸为(B, H, W)
第二步:
先Rearrange("B H W->B (W H)")
再经过TransformerEncoder Layer2
最后Rearrange("B (W H)->B H W")
输出尺寸为(B, H, W)
上述实现方式比较简单,不需要引入2D Transformer,用2个标准TransformerEncoder层即可实现2D TransformerEncoder层的效果。
虽然这种做法可能导致模型参数、计算量增加,但我想先测试改用2D Transformer能否提升指标,效率问题放到后面再优化。
补充:我发现上面的2D Transformer实现方式有点BUG,因为对2D矩阵进行转置后,换行符的位置从行的末尾转到了列的末尾。临时修正方式如下:对2D矩阵进行转置后,还需要将最后一行的值与最后一列的值进行交换。
由于资源有限,先不做2D Transformer相关实验。
二、调参
今天进行了新的实验。
保持网络结构不变,仅做以下轻微修改:
1、将补充信息的长度填充到16
2、每行的末尾加入换行符
3、模型输入序列的长度从264改为289
最终模型可以收敛到更低的训练损失。随机生成100000条测试样本,错了213个,成功率约为99.787%。出错样本数减少了25%左右,这个提升幅度还是很大的。
初步结论:我们在将2D信息转为1D序列时,在每行的末尾加入换行符有助于模型理解2D信息。
距离我的期望(成功率99.9%以上)已经很近了。我决定尝试一些调参技巧:
1、调低学习率
2、调高clip_grad_norm_中max_norm的值
为什么要调高max_norm的值呢?我通过一些实验发现当max_norm的值太低时,模型对难样本表现变差。
调整学习率以及max_norm后接着训练,虽然训练损失没有降低,但指标有了明显的提升。随机生成100000条测试样本,错了66个,成功率约为99.934%。这个指标基本上达到了我的预期,本次实验至此告一段落。
全篇完