576. Bengali.AI Speech Recognition | bengaliai-speech
@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)。每次数据增强实验都非常耗时,我感到疲惫不堪。也许我应该写一些自动化的代码。facebookresearch/denoiser:分数下降约0.01CleanUNet:分数下降约0.005