TencentGameMate / chinese_speech_pretrain

chinese speech pretrained models
997 stars 84 forks source link

ASR finetune收敛速度问题 #11

Closed qinyuenlp closed 2 years ago

qinyuenlp commented 2 years ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

pengchengguo commented 2 years ago

你好,下图是 Aishell 数据,3 倍变速后,基于 wav2vec2.0 large 模型特征训练的 acc 和 loss 曲线。

acc

loss

qinyuenlp commented 2 years ago

请问可以分享一下您微调的参数信息吗?我最近也在开源数据+私人数据上进行finetune训练,但是模型收敛情况并不理想,希望借鉴一下您的经验,谢谢🙏

pengchengguo commented 2 years ago

你好,chinese_speech_pretrain/espnet/aishell/conf 下有我们的训练配置文件。

qinyuenlp commented 2 years ago

请问使用的是CTCLoss吗?我在用HuggingFace/transformers.wav2vec2ForCTC进行微调的时候模型出现了“无论输入是什么都输出空字符串”的问题,调研了一下发现之前很多人都遇到过CTC的所谓“预热”问题,例如: 知乎.王赟 Wav2vec2 not converging when finetuning

但是看您发的曲线似乎完全没有遇到此问题,所以想了解更多的微调细节。 我是使用单卡(24G)训练的AISHELL-1数据,梯度累积后batch_size为128,学习率2e-5~2e-2都试过。

pengchengguo commented 2 years ago

你好,我在下游任务微调的时候,用的是 ESPnet,相当于预训练模型的特征输入给了一个 joint CTC/Attention Encoder-Decoder 网络,配置文件在在仓库中有,用的不是 Fairseq 或者 HuggingFace。

qinyuenlp commented 2 years ago

好的,谢谢。

WUHU-G commented 1 year ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

qinyuenlp commented 1 year ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

你好,这个是CTC的尖峰特性导致的,训练过程中会存在一个只输出blank token的阶段。目前我在腾讯开源的这个模型上暂时还没训练到比较理想的模型,在META的xlsr-53上训练时等待了一段时间模型就正常收敛了。

理论部分可以参考知乎.王赟Why does CTC result in peaky behavior

WUHU-G commented 1 year ago

好的,感谢老哥

------------------ 原始邮件 ------------------ 发件人: "TencentGameMate/chinese_speech_pretrain" @.>; 发送时间: 2022年9月8日(星期四) 中午11:18 @.>; @.**@.>; 主题: Re: [TencentGameMate/chinese_speech_pretrain] ASR finetune收敛速度问题 (Issue #11)

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

你好,这个是CTC的尖峰特性导致的,训练过程中会存在一个只输出blank token的阶段。目前我在腾讯开源的这个模型上暂时还没训练到比较理想的模型,在META的xlsr-53上训练时等待了一段时间模型就正常收敛了。

理论部分可以参考知乎.王赟和Why does CTC result in peaky behavior

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

WUHU-G commented 1 year ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

你好,这个是CTC的尖峰特性导致的,训练过程中会存在一个只输出blank token的阶段。目前我在腾讯开源的这个模型上暂时还没训练到比较理想的模型,在META的xlsr-53上训练时等待了一段时间模型就正常收敛了。

理论部分可以参考知乎.王赟Why does CTC result in peaky behavior

老哥我调出来了,模型(别用wav2cev)用的hubert+lstm+ctc,然后学习率设置的0.01,从第9轮开始模型ctc损失到了5左右,然后就有输出了,后面的输出都很正常了。

abcdbosh commented 1 year ago

大佬你好 lstm是怎么加进去的可以分享下嘛

abcdbosh commented 1 year ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

你好,这个是CTC的尖峰特性导致的,训练过程中会存在一个只输出blank token的阶段。目前我在腾讯开源的这个模型上暂时还没训练到比较理想的模型,在META的xlsr-53上训练时等待了一段时间模型就正常收敛了。 理论部分可以参考知乎.王赟Why does CTC result in peaky behavior

老哥我调出来了,模型(别用wav2cev)用的hubert+lstm+ctc,然后学习率设置的0.01,从第9轮开始模型ctc损失到了5左右,然后就有输出了,后面的输出都很正常了。

用ctc根本收敛不了~~请问还有使用其他的策略吗

WUHU-G commented 1 year ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

你好,这个是CTC的尖峰特性导致的,训练过程中会存在一个只输出blank token的阶段。目前我在腾讯开源的这个模型上暂时还没训练到比较理想的模型,在META的xlsr-53上训练时等待了一段时间模型就正常收敛了。 理论部分可以参考知乎.王赟Why does CTC result in peaky behavior

老哥我调出来了,模型(别用wav2cev)用的hubert+lstm+ctc,然后学习率设置的0.01,从第9轮开始模型ctc损失到了5左右,然后就有输出了,后面的输出都很正常了。

用ctc根本收敛不了~~请问还有使用其他的策略吗 class hubert_Asr(nn.Module):

def __init__(self,model_path,vocab_size):
    super(hubert_Asr, self).__init__()

    self.feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(model_path)
    self.encoder_wav2 = HubertModel.from_pretrained(model_path)

    for param in self.encoder_wav2.parameters():
        param.requires_grad = False

    self.decoder_lstm = torch.nn.LSTM(
                            input_size = 768,#dimension词向量维度
                            hidden_size = 64,#表示输出的特征维度,如果没有特殊变化,相当于out
                            num_layers = 2,# 表示网络的层数
                            bidirectional = True,#双向向RNN
                            batch_first = True,
                            dropout=0.2
                            )       
    self.fc = nn.Linear(64 * 2, vocab_size)

def forward(self, inputs):

    #print(inputs.shape)
    input_values = self.feature_extractor(inputs, return_tensors="pt",sampling_rate = 16000,).input_values.squeeze()
    #print(input_values.shape)
    outputs = self.encoder_wav2(input_values)
    #last_hidden_state = outputs.last_hidden_state
    last_hidden_state = outputs[0]

    logit,_ = self.decoder_lstm(last_hidden_state)
    logit = self.fc(logit)

    outputs = nn.functional.log_softmax(logit, dim=-1)
    logit = nn.functional.softmax(logit, dim=-1)

    return outputs,logit
abcdbosh commented 1 year ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

你好,这个是CTC的尖峰特性导致的,训练过程中会存在一个只输出blank token的阶段。目前我在腾讯开源的这个模型上暂时还没训练到比较理想的模型,在META的xlsr-53上训练时等待了一段时间模型就正常收敛了。 理论部分可以参考知乎.王赟Why does CTC result in peaky behavior

老哥我调出来了,模型(别用wav2cev)用的hubert+lstm+ctc,然后学习率设置的0.01,从第9轮开始模型ctc损失到了5左右,然后就有输出了,后面的输出都很正常了。

用ctc根本收敛不了~~请问还有使用其他的策略吗 class hubert_Asr(nn.Module):

def __init__(self,model_path,vocab_size):
    super(hubert_Asr, self).__init__()

    self.feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(model_path)
    self.encoder_wav2 = HubertModel.from_pretrained(model_path)

    for param in self.encoder_wav2.parameters():
        param.requires_grad = False

    self.decoder_lstm = torch.nn.LSTM(
                            input_size = 768,#dimension词向量维度
                            hidden_size = 64,#表示输出的特征维度,如果没有特殊变化,相当于out
                            num_layers = 2,# 表示网络的层数
                            bidirectional = True,#双向向RNN
                            batch_first = True,
                            dropout=0.2
                            )       
    self.fc = nn.Linear(64 * 2, vocab_size)

def forward(self, inputs):

    #print(inputs.shape)
    input_values = self.feature_extractor(inputs, return_tensors="pt",sampling_rate = 16000,).input_values.squeeze()
    #print(input_values.shape)
    outputs = self.encoder_wav2(input_values)
    #last_hidden_state = outputs.last_hidden_state
    last_hidden_state = outputs[0]

    logit,_ = self.decoder_lstm(last_hidden_state)
    logit = self.fc(logit)

    outputs = nn.functional.log_softmax(logit, dim=-1)
    logit = nn.functional.softmax(logit, dim=-1)

    return outputs,logit

谢谢!

abcdbosh commented 1 year ago

首先非常感谢开源了中文预训练版本的wav2vec2.0!我想问一下您这边在做ASR finetune时,大概第几个epoch开始收敛呢?数据量有多大?

老哥您好,请问你解决这个问题没,损失函数和模型结构是啥,我下游微调输出全空白,,

你好,这个是CTC的尖峰特性导致的,训练过程中会存在一个只输出blank token的阶段。目前我在腾讯开源的这个模型上暂时还没训练到比较理想的模型,在META的xlsr-53上训练时等待了一段时间模型就正常收敛了。 理论部分可以参考知乎.王赟Why does CTC result in peaky behavior

老哥我调出来了,模型(别用wav2cev)用的hubert+lstm+ctc,然后学习率设置的0.01,从第9轮开始模型ctc损失到了5左右,然后就有输出了,后面的输出都很正常了。

用ctc根本收敛不了~~请问还有使用其他的策略吗 class hubert_Asr(nn.Module):

def __init__(self,model_path,vocab_size):
    super(hubert_Asr, self).__init__()

    self.feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained(model_path)
    self.encoder_wav2 = HubertModel.from_pretrained(model_path)

    for param in self.encoder_wav2.parameters():
        param.requires_grad = False

    self.decoder_lstm = torch.nn.LSTM(
                            input_size = 768,#dimension词向量维度
                            hidden_size = 64,#表示输出的特征维度,如果没有特殊变化,相当于out
                            num_layers = 2,# 表示网络的层数
                            bidirectional = True,#双向向RNN
                            batch_first = True,
                            dropout=0.2
                            )       
    self.fc = nn.Linear(64 * 2, vocab_size)

def forward(self, inputs):

    #print(inputs.shape)
    input_values = self.feature_extractor(inputs, return_tensors="pt",sampling_rate = 16000,).input_values.squeeze()
    #print(input_values.shape)
    outputs = self.encoder_wav2(input_values)
    #last_hidden_state = outputs.last_hidden_state
    last_hidden_state = outputs[0]

    logit,_ = self.decoder_lstm(last_hidden_state)
    logit = self.fc(logit)

    outputs = nn.functional.log_softmax(logit, dim=-1)
    logit = nn.functional.softmax(logit, dim=-1)

    return outputs,logit

老哥 可以分享下全部的代码嘛~~我之前用https://huggingface.co/blog/fine-tune-wav2vec2-english这个微调的 ~代码小白改了一整天 一直报错 哎