thu-spmi / CAT

A CRF-based ASR Toolkit
Apache License 2.0
324 stars 74 forks source link

aishell recipe 训练中log的含义 #53

Closed Sundy1219 closed 1 year ago

Sundy1219 commented 2 years ago

你好,我用你们v2的版本,跑通aishell recipe.看了训练过程中打印出的log,有点不太懂每一列的含义, 1)为啥loss还能负值呢,还有括号里的值含义是啥?Loss_real的含义还有括号里的含义,希望可以详细解释下,比如:

Epoch: [1][ 940/11260] Time 1.033 ( 0.931) Data 0.023 ( 0.031) Loss -2.0485e+01 (-1.2205e+00) Loss_real 6.3320e+01 (7.0811e+01)

谢谢

Sundy1219 commented 2 years ago

还有我想从某个checkpoint恢复,继续训练,你们这参数在哪设置?谢谢

maxwellzh commented 2 years ago

你好,我用你们v2的版本,跑通aishell recipe.看了训练过程中打印出的log,有点不太懂每一列的含义, 1)为啥loss还能负值呢,还有括号里的值含义是啥?Loss_real的含义还有括号里的含义,希望可以详细解释下,比如:

Epoch: [1][ 940/11260] Time 1.033 ( 0.931) Data 0.023 ( 0.031) Loss -2.0485e+01 (-1.2205e+00) Loss_real 6.3320e+01 (7.0811e+01)

谢谢

你好,

  1. 关于log中各项的含义:time表示训练当前step花费的时间(秒);data表示其中数据加载的时间;loss为CTC-CRF LOSS中没有加path weight的loss;loss_real是加上path weight的真正loss。括号内数值为当前epoch到目前为止的平均值
loss_real=loss+path_weight

path_weight是与模型更新无关的一个参数(通过den-lm计算得到),因此loss_real.backward()等价于loss.backward()

  1. loss是负数的原因参考1,其符号没有特别的含义,相对的,loss_real必然是正值(不考虑实际计算中一些可能的数值计算误差)
  2. 从checkpoint中恢复训练,在train.py中使用--resume=/path/to/checkpoint选项即可
Sundy1219 commented 2 years ago

好的,谢谢,现在在解码时,遇到了如下报错信息, 2022-03-14 13-19-38屏幕截图

Sundy1219 commented 2 years ago

从这看貌似是restore不进去,可我在训练时,restore重新训练,没问题.因为conformer需要的显存过大,我的改动是将conformer的层数还有隐藏层节点改小了.解码参数,将nj改成了1.采用一个GPU解码,其它的没改动过了

2022-03-14 13-25-49屏幕截图

maxwellzh commented 2 years ago

你好,我检查了一下,看起来是因为我们最近合并一个分支的时候的修改造成了这个问题,请尝试将以下几行代码删除

  1. 96-99行 https://github.com/thu-spmi/CAT/blob/a89faa39cd8e63fe31def993816257e0c5cf090f/scripts/ctc-crf/calculate_logits.py#L96-L99
  2. 135-139行 https://github.com/thu-spmi/CAT/blob/a89faa39cd8e63fe31def993816257e0c5cf090f/scripts/ctc-crf/calculate_logits.py#L135-L139

然后重新运行解码

Sundy1219 commented 2 years ago

很感谢您的及时回复,目前解码正常.下图这里--world-size不知道是不是应该改成--world_size,这在CAT/scripts/ctc-crf/calculate_logits.py脚本中,因为我没看到args.world-size,只看到了args.world_size 2022-03-14 14-18-12屏幕截图

maxwellzh commented 2 years ago

这个不影响,python的argparse模块中,会自动将变量名中的-替换为_,所以变量名会是args.world_size

Sundy1219 commented 2 years ago

好的,明白了,Mono-phone + CTC-CRF比单纯的Mono-phone + CTC提升很明显吗?有测试过串词的指标吗?就是明明是指令A,却识别成指令B

maxwellzh commented 2 years ago

比较系统的CTC/CTC-CRF性能对比可以参考我们此前的工作 CRF-BASED SINGLE-STAGE ACOUSTIC MODELING WITH CTC TOPOLOGY

你说的“串词”是否是指我们常统计CER/WER中的替换错误?在我的实验(数据集规模100-1000 hours)中,CTC-CRF的表现是一致的优于CTC的

Sundy1219 commented 2 years ago

可能和替换的概念不大一样,我也跑了aishell 基于ctc和ctc-crf的对比实验,实验结果,确实ctc-crf要好些.你们有没有考虑过在此基础上再加个CE Loss,那就和kaldi的chain模型比较接近了