Snowdar / asv-subtools

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

请教:关于训练数据egs分配min-chunk的问题。 #12

Closed CornellYu closed 3 years ago

CornellYu commented 4 years ago

您好, 感谢您百忙之中查看我的邮件。 在kaldi中,训练神经网络之前会将特征生成用于训练网络的egs特征,这个值默认为[200,400]之间的随机数。 我的理解是这个将原始训练特征,切分为随机取值的过程,是为了增强网络对不同长度音频xvector提取的鲁棒性。 在您的asv-subtools中,好像是min-chunk直接设置的固定值。也就是用于训练的egs大小固定。 请问: 1.egs的选取(包括随机取值范围,是否是固定值)对网络性能有何影响? 2.在asv-subtool中,为何采用固定的min-chunk大小?能够更新一个类似于kaldi中可变egs大小的版本? 期待您的回信。 祝好!

Snowdar commented 4 years ago

你好,

 关于训练样本长度的问题,回答如下:

(1)由于池化层的存在,训练和测试时确实存在长度上的mismatch问题 (2)训练的样本越长,越容易导致训练过拟合,越短,越容易引起训练波动,甚至欠拟合或不收敛 (3)由于batch要求样本等长,为了便于处理,torch这边统一切为200帧,而不等长的方式,实现上会复杂很多,这需要重写一个dataloader,实际上,假如你固定为400帧,然后训练过程中允许丢弃/置零一半也是可以达到类似目的的,参考specaugment (4)200和200到400的效果可以说差别不大,从过拟合角度考虑,有时候200~400的取法,效果还会更差,总的来说,长度mismatch这个问题带来的效果损失可能没有那么大,可以不作为首要问题考虑,如果非得考虑,可以参考论文 x-vector DNN refinement with full-length recordings for speaker

祝好!

On Oct 22, 2020, at 2:32 PM, CornellYu notifications@github.com wrote:

 您好, 感谢您百忙之中查看我的邮件。 在kaldi中,训练神经网络之前会将特征生成用于训练网络的egs特征,这个值默认为[200,400]之间的随机数。 我的理解是这个将原始训练特征,切分为随机取值的过程,是为了增强网络对不同长度音频xvector提取的鲁棒性。 在您的asv-subtools中,好像是min-chunk直接设置的固定值。也就是用于训练的egs大小固定。 请问: 1.egs的选取(包括随机取值范围,是否是固定值)对网络性能有何影响? 2.在asv-subtool中,为何采用固定的min-chunk大小?能够更新一个类似于kaldi中可变egs大小的版本? 期待您的回信。 祝好!

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or unsubscribe.

CornellYu commented 4 years ago

赵淼,您好! 感谢您如此迅速的回信。 从您的回信中,是不是可以理解为min-chunk(默认为200)这个参数,对整个训练过程其实是影响不大的。 那么请问: 1.假设设置为固定min-chunk=400,采用specaugment是能够掩蔽一些帧信息,从而达到随机取值(400以下)的效果,对吗? 2.min-chunk这个值根据数据集的不同,有什么调整的规律或者依据?比如您在voxceleb这种数据集上,为何默认设置为200。 PS:另外,期待您的持续更新~hhhhh 感谢您的回信。 祝好!

Snowdar commented 4 years ago

你好, 对于以上两个问题,回答如下: 1.通过specaugment加达到理论上的等价,要稍微改变下遮蔽的地方,例如头或尾多少帧,而不是随机选择遮蔽位置,同时要考虑单次遮蔽作用的单位是按batch而不是按单个样本,当然这里没有哪个效果更好的意思,只是为了理论上的等价 2.chunk的选取,避免过小可以通过少数迭代情况来判断,如果波动太大,就是取小了。避免过大可能需要实验判断,在我的voxceleb实验中,200训练就很稳定,且chunk长度再加大,效果会变差,训练上是明显的过拟合现象(仅对比200 300 400,这个值精调可能收益不大)。最后,200帧一般对应2s(窗长25ms 帧移10ms),2s是可以包含一句话的,如果再少,对于声纹来说,会丢失很多上下文信息,当然,再多的情况,则需要再从过拟合层面考虑了,因为没有约束的信息给多了,网络很容易学到很多其他实则无用的信息,导致声纹信息的学习权重降低。

祝好!

On Oct 23, 2020, at 3:45 PM, CornellYu notifications@github.com wrote:

 赵淼,您好! 感谢您如此迅速的回信。 从您的回信中,是不是可以理解为min-chunk(默认为200)这个参数,对整个训练过程其实是影响不大的。 那么请问: 1.假设设置为固定min-chunk=400,采用specaugment是能够掩蔽一些帧信息,从而达到随机取值(400以下)的效果,对吗? 2.min-chunk这个值根据数据集的不同,有什么调整的规律或者依据?比如您在voxceleb这种数据集上,为何默认设置为200。 PS:另外,期待您的持续更新~hhhhh 感谢您的回信。 祝好!

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or unsubscribe.

CornellYu commented 3 years ago

赵淼,您好! 感谢您每次如此迅速的回信。 1.根据您的指点,我的理解是chunk的精细选取可能对整个神经网络而言性能提升的收益不是特别大。另外,specaugment根据您的更新是说,这个数据增强方法的使用同样不一定能够得到更好的效果。所以下一步我将不再纠结这个chunk值的选取,准备采用您的默认值。 2.这些解释您说得很清楚,我也感到收获颇多。 非常感谢您的回信,期待能有机会更多的向您学习! 谢谢您,祝好!