wenyu332 / daguan_bert_ner

30 stars 13 forks source link

wenyu332你好。正则优化方式是在BertAdam类中调吗? #14

Open lizhzh8 opened 5 years ago

lizhzh8 commented 5 years ago

看源码发现,是不是 max_grad_norm这一项?一般该设置为多少呢?我用你的代码训练时发现 预测数值大的epoch_xx_xxxx模型,在public submit提交时反而分数低。我怀疑是不是过拟合了??如果要设置正则优化方式是不是就是这个参数?谢啦

class BertAdam(Optimizer):
    """Implements BERT version of Adam algorithm with weight decay fix.
    Params:
        lr: learning rate
        warmup: portion of t_total for the warmup, -1  means no warmup. Default: -1
        t_total: total number of training steps for the learning
            rate schedule, -1  means constant learning rate. Default: -1
        schedule: schedule to use for the warmup (see above). Default: 'warmup_linear'
        b1: Adams b1. Default: 0.9
        b2: Adams b2. Default: 0.999
        e: Adams epsilon. Default: 1e-6
        weight_decay: Weight decay. Default: 0.01
        **max_grad_norm**: Maximum norm for the gradients (-1 means no clipping). Default: 1.0
    """
wenyu332 commented 5 years ago

不好意思,最近开始实习,周内没时间回答问题。。。 max_grad_norm 对应的应该是你的最大梯度值,这样可以避免梯度爆炸。这个源码当中的说明已经很清晰了,你也可以在看看。 这个值设置为-1即为不裁剪,我一般设置为1,3,5. 可能是目前做的任务比较简单,对这个参数设置还没有太多心得,你可以去官方的github下面咨询大佬。

wenyu332 commented 5 years ago

你说的正则化指的是l1和l2正则吧,这个是weight_decay这个参数,你可以大概浏览一下pytorch的教程,里面有讲到。当然,这个参数是增加的l2正则项,如果要做l1正则,需要手动添加,这个也很简单,你按照定义把你希望正则的参数遍历,按照l1的定义,把损失加到训练损失里面即可。你可以百度一下,可以搜到相应的代码。

你训练过程中是保留的在验证集上的结果,这个跟最后提交的样本分布之间差异几乎可以忽略。 一般来说,你在验证集上的分数越高,提交分数也会越高。 出现你这种情况,一般看来是因为你两次之间的验证集分数相差不大,这个时候会有一些随机因素使的性能反而下降了,但两者之间的差异应该在千分位之后了,如果要继续提高分数,还需要在预训练上做文章,这个时候调参的作用已经意义不大了。