返回列表

24th Place Solution for the Bengali.AI Speech Recognition Competition

576. Bengali.AI Speech Recognition | bengaliai-speech

开始: 2023-07-17 结束: 2023-10-17 音视频处理 数据算法赛
Bengali.AI语音识别竞赛第24名解决方案

Bengali.AI语音识别竞赛第24名解决方案

作者:Mutian Hong

队友:nisshokuitsuki

最终排名:第24名

发布时间:2023年10月18日

首先,我们要感谢组织者举办了这场精彩的比赛。这是我第一次参加Kaggle竞赛,对最终结果感到满意。感谢我的队友 @nisshokuitsuki,在这三个月的旅程中与我并肩作战。感谢所有参与讨论和分享笔记本的人,你们的工作给了我们很多启发。

模型

我们使用的模型是:

Wav2Vec2ForCTC

我们在这个模型 bengali_wav2vec2_finetuned 上进行了进一步微调。

由于比赛数据集的质量较低,我们使用了 Common Voice 13 | Bengali (Normalized) 数据集的训练集进行训练。我们使用了数据集中的20000条数据,训练了约10个epoch,并划分了约700条数据用于验证。

该数据经过归一化处理并移除了标点符号。

以下是训练参数:

training_args = TrainingArguments(
    group_by_length=False,
    weight_decay=0.01,
    num_train_epochs=10,
    fp16=True,
    learning_rate=4e-5,
    warmup_steps=600,
)

我们使用了余弦优化器。

最佳模型在本地获得了WER 0.15,并将公开排行榜分数从 0.445 提升到 0.434

然而,我的队友使用相同的数据仅训练了60步(使用不同的参数),却获得了相同的分数(在私有排行榜上甚至好0.001)。这很有趣也很令人困惑。

语言模型

我们使用 lm_no_punc 训练了一个6元语法模型。

需要指出的是,YellowKing_DLSprint_Model 提供的语言模型有一个错误:

ARPA文件中缺少终止符。因此我们需要添加一个 </s> 到文件中。

多亏了这个笔记本 Build an n-gram with KenLM | MaCro,我们才得以发现这个问题。

添加 </s> 将排行榜分数从 0.445 提升到 0.422

使用 lm_no_punc 构建6元语法模型进一步提升约 0.001

标点恢复

标点符号真的非常重要。多亏了这个讨论 Bengali.AI Speech Recognition,我们才意识到这一点。该讨论下的一个回复向我们展示了一种标点恢复的方法:

xashru/punctuation-restoration: Punctuation Restoration using Transformer Models for High-and Low-Resource Languages

首先,我们使用该仓库提供的数据集训练了一个模型。它可以恢复3种标点符号:

{1: ',', 2: '।', 3: '?'}

这将近排行榜分数从 0.422 提升到 0.400

与微调模型结合后,我们从 0.400 提升到 0.397

后来我们认为3种标点可能不够。因此我们使用 oscar · Datasets at Hugging Face 制作了一个数据集,筛选出仅包含孟加拉语单词的数据。我们选择了7种标点:

{1: ',', 2: '।', 3: '?', 4: '!', 5: '-', 6: '"', 7: ':'}

我们使用默认参数训练了6个epoch。

最终分数从 0.393 提升到 0.387

模型集成

我们简单地按以下方式集成模型:

y = model_1(x).logits * 0.7 + model_2(x).logits * 0.2 + model_3(x).logits * 0.1

等等,这真的有效吗???

是的,虽然预测结果可能未对齐,但由于三个模型都在相同数据集上训练,未对齐的问题被部分解决了。

这使我们性能提升了约 0.001

解码器参数选择

解码器主要有三个参数:

alpha: 浅层融合中语言模型的权重
beta: 评分时的长度分数调整权重
beam_width: 确定每一步保留的候选输出序列数量

为了找到最佳参数,我们使用 optuna 进行搜索。我们使用数据集中的示例数据(分布外数据)搜索参数,这带来了更好的排行榜分数。

最终的解码器参数为:

{'alpha': 0.46570704474381447, 'beta': 0.8635977171858652, 'beam_width': 768}

对我们无效的方法

  • 数据增强:我们从 pixabay.com 下载了背景噪声,并应用了音高偏移、时间拉伸等增强方法。但这导致排行榜分数下降(0.397->0.415)。每次数据增强实验都非常耗时,我感到疲惫不堪。也许我应该写一些自动化的代码。
  • 降噪模型:我们尝试了三种降噪模型:
    • UVR:笔记本运行超时
    • facebookresearch/denoiser:分数下降约0.01
    • CleanUNet:分数下降约0.005
    我们认为降噪会损害特征,使得一些短音节无法识别。
  • 使用更多数据训练更大的语言模型:我们使用15GB归一化的孟加拉语数据构建了一个kenlm模型,但分数反而下降了。我们仍未找到问题原因。
同比赛其他方案