今天加载了一下对应的nezha模型的权重内容,发现对应的权重名称之中,出现了如下的一些权重名称
‘bert/encoder/layer_3/attention/output/dense/bias/lamb_v’
‘bert/encoder/layer_1/attention/output/LayerNorm/beta/lamb_m’
‘bert/pooler/dense/bias/lamb_v’
‘bert/embeddings/word_embeddings/lamb_v’
等内容,阅读transformer的加载源码之中,有这样的一段注释:
for name, array in zip(names, arrays):
name = name.split("/")
# adam_v and adam_m are variables used in AdamWeightDecayOptimizer to calculated m and v
# which are not required for using pretrained model
if any(
n in ["adam_v", "adam_m", "lamb_m", "lamb_v", "AdamWeightDecayOptimizer", "AdamWeightDecayOptimizer_1",
"global_step", "good_steps", "loss_scale", 'bad_steps']
for n in name
):
logger.info("Skipping {}".format("/".join(name)))
continue
可以看出注释的意思是在加载出对应的权重内容之后,如果权重之中带有"adam_v",“adam_m”,“lamb_m”,"lamb_v"的后缀内容的时候,就不需要加载对应的权重值,这里的原因我们通过举adam优化器的例子为例,来说明这些权重的作用
adam优化器的对应公式:
可以看出公式中有对应的
m
t
m_{t}
mt和
v
t
v_{t}
vt,而这些正是后缀为\adam_v,\adam_w的权重的作用,通过前一轮的权重内容去计算后一轮的权重内容。