Snowdar / asv-subtools

An Open Source Tools for Speaker Recognition
Apache License 2.0
590 stars 135 forks source link

关于AM-SOFTMAX收敛性问题的讨论 #2

Closed louyj136 closed 2 years ago

louyj136 commented 4 years ago

赵淼您好! 感谢百忙之中抽空查看我的邮件。 最近我在用开源工具ASV-subtools做一些声纹识别的研究。其中碰到了一个小问题想请教一下。 我目前用runResnetXvector.py的脚本训练resnet网络模型。在默认的参数下模型已经训练完毕了。查看loss曲线和acc曲线都比较正常。然后我把之前的softmax损失函数替换成am-softmax损失函数,把超参数m设置为0.3,同时用退火算法,算法会慢慢从softmax损失函数过度到am-softmax损失函数。这样的改动,导致模型在训练时的acc降到了70%,损失函数出现了先下降后上升的趋势。如果把超参数m设置为0.1,从acc曲线看,模型收敛的速度会快很多。根据这种现象,我有三个疑问想请教一下: (1)从结果上看,超参数m大小似乎对模型的性能影响是很敏感的,不知道这是不是正常的现象。 (2)理论上讲,am-softmax可以使类间分得更开,从而应该比softmax损失函数有着更高的acc,但从附件上的图看,准确率变得低了很多,损失函数也在下降后又急速上升,这种现象是否是正常的? (3)有没有什么好的方法能够在am-softmax损失函数下加快模型的收敛速度? 期待您的回信。 祝好!--------------------------------------------------------------------------

楼一杰你好, 总的来说,使用AM-softmax的时候,有一些参数需要注意。首先除了打开这个loss外,要考虑一下最后一层是否保留bn和relu,以及use_step的参数区域是否要使用渐变增加margin的策略。基于此,就你的疑问,我的理解如下: (1)m作为惩罚,对模型训练是比较敏感的,太大可能导致收敛的问题,训练不好就会影响性能。另外一个是,如果你没有去掉最后一层relu,那么分类空间会小得多(非负意味着仅在第一象限),此时m更不适合取得太大。一般我们取0.2,仅供参考。 (2)关于acc的对比上,其实没有绝对的正比关系,acc更多的要考虑过拟合问题来审视。同时,应该以valid set的acc进行对比,trainset的acc对比意义会少很多。损失函数急速下降上升,可能是因为你画的trainset的loss,因为trainset的loss计算有惩罚的部分(要想获得真实loss,需要重复计算,这个一般不考虑,费时间),而惩罚在不断增加,所以这个loss是不可靠的,或许你可以看看validset。 (3)AM-softmax损失本身可以一定程度上加快训练速度,但是一般直接训练又可能会导致训练较差,所以默认选择比较鲁棒的渐变训练策略。在固定epoch的训练中,如果你发现后期AM比Softmax收敛的更差,往往这意味着你的惩罚太大,不能很好的收敛。另外,训练速度与优化器也有关系。 祝好!