返回列表

2nd place solution - Test & Compare ASR algorithms

570. Google - American Sign Language Fingerspelling Recognition | asl-fingerspelling

开始: 2023-05-10 结束: 2023-08-24 计算机视觉 数据算法赛

第二名解决方案:测试与比较ASR算法

作者: hoyso48(Kaggle MASTER级用户)
发布时间: 2023年8月25日
投票数: 77票

再次感谢Kaggle、Google和其他主办方举办这场激动人心的比赛。我认为这场比赛和上一场比赛都组织得很好,让我们能够尝试各种想法并从彼此身上学到很多。希望Kaggle能举办更多此类比赛。:)

摘要

我的整体解决方案与上一场比赛几乎相同,主要是基于上一届冠军模型采用了ASR(自动语音识别)算法(联合CTC + Attention)。模型、预处理和训练的细节与上一场比赛大体相似,因此有关模型/训练/增强等方面的更多详细信息,请参考上一届比赛解决方案

ASR算法

我对ASR有浓厚的兴趣,在认识到它与比赛的关联后,我研究并试验了各种算法。虽然我在众多ASR算法中未找到明显优于广泛使用的普通CTC的方法,但通过大量实验学到了很多,在此主要分享这些见解。

在研究比赛用的ASR时,我从论文中发现当前神经网络ASR算法主要包括CTC、基于Attention和Transducer三种。我实现了全部三种(尽管还有更多样化的算法)。总之,从基线性能角度来看,这三种算法表现相当,各有利弊。以下是我实现每种算法的见解:

  • CTC:
    • 在贪心解码期间,预测步骤 = O(1)。因此,使用单个模型时,GreedyCTC效率最高(这可能是许多解决方案使用大型单模型配合CTC的原因)。
    • 使用束搜索时,预测步骤 = O(L)(L = 编码器输出长度)。根据算法效率,计算开销并不大,因此引入束搜索的开销并不显著。然而,使用束搜索带来的性能提升极小(+0.003),相比Attention而言并不太吸引人(因为其tflite转换实现并不简单)。
    • 如前所述,模型预测时间步之间没有对齐保证,因此无法应用简单的平均集成。
  • 基于Attention:
    • 采用自回归方法,因此即使使用贪心解码,预测步骤 = O(N)(N = 解码器输出长度)。
    • 如果解码器是RNN或Transformer,可以使用状态推理(即使用Transformer时缓存先前的键和值)来降低复杂度。在实际的Transformer实现中,CPU推理时间减少了约20~30%。
    • 可以使用束搜索,但与CTC不同,它需要引入适当的启发式方法来惩罚输出长度。尽管进行了多次尝试,但均未奏效。
    • Attention更容易应用集成。只需在每个预测步骤对每个模型取平均值即可很好地工作(集成三个模型带来+0.009提升)。
    • 比CTC有更多的分数提升空间(例如更多带增强的解码器层)。
  • Transducer:

    预测步骤 = O(L)(L = 编码器输出长度)。由于大多数预测步骤以贪心方式进行,效率不高。我没有进一步考虑,因为优化更困难且性能略低于CTC或Attention。但如果编码器是因果的,它具有实时流模式识别的优势(这与本次比赛无关)。

在Kaggle内核上测试数据集上的粗略单模型推理时间如下:

CTC贪心(~40分钟) < Attention贪心=CTC束搜索(~1小时20分钟) <= CTCAttention联合贪心(~1小时30分钟)

CTC-Attention联合训练与解码

由于CTC和Attention表现出相似的性能,我尝试寻找利用两种技术的方法。我主要参考了以下两篇论文:

基于多任务学习的联合CTC-Attention端到端语音识别,Kim等,2017。
https://arxiv.org/pdf/1609.06773.pdf
端到端语音识别的联合CTC/Attention解码,Hori等,2017。
https://aclanthology.org/P17-1048.pdf

联合CTC-Attention训练,正如其名称所示,是在一个编码器上为多任务学习添加CTC解码器(单个GRU层)和Attention解码器(单个Transformer解码器层)。损失权重设置为CTC=0.25和Attention=0.75。但联合训练本身并未带来明显的性能提升。

通过使用CTC前缀分数,可以计算任意输出假设"h"的概率,而不依赖于CTC输出的输出时间步。换句话说,实现CTC前缀分数计算允许不仅在CTC模型之间,而且在CTC和Attention模型之间集成输出。CTC-Attention联合解码在CTC权重=0.3时显示性能提升了+0.007~8,对推理时间影响不大。对我而言,准确、高效地实现它并确保与tflite兼容尤其具有挑战性。

预处理

与上一届比赛解决方案类似,但更简单。使用并标准化所有地标和xyz坐标。翻转左撇子 signer(而非增强)。使用MAX_LEN=768。任何手工特征都不显著,可能是由于帧之间运动缺乏复杂关系。

模型

编码器与上一届比赛相同(堆叠Conv1DBlock + TransformerBlock),但尺寸(Conv1DBlock中扩展比例2→4)和深度(8层→17层)增加。单模型约有650万参数。我应用了padding='same'(而非'causal')和output stride=2(需要更多处理掩码的逻辑)。在我的情况下,混合Transformer块不如上一届比赛有效。也许全局特征在这场比赛中不那么关键。此外,我在Conv1DBlock输入处添加了一个BN层以提高训练稳定性(特别是使用awp + 更多轮次时)。

CTC解码器使用单个GRU层后接一个FC层。Attention解码器使用单层Transformer解码器。在解码器输入上引入增强并添加最多4个解码器层可提高attention解码器的性能(最多+0.004)。然而,考虑到参数数量和推理速度,我认为这效率不高,因此使用了单层解码器。

增强

  • 随机重采样(原始长度的0.5x~1.5x)
  • 随机仿射变换
  • 随机遮挡
  • 解码器输入上的随机token替换(概率=0.2)

这次我忽略的一点是:在较短轮次中显示无性能提升甚至性能下降的增强,在较长轮次中实际上可能有助于提升性能。我在上一届比赛中也经历过类似现象,但这场比赛似乎更加明显。仅根据60轮实验的结果选择增强,我认为当在最后一周测试400轮训练时,我错过了许多潜在有益的增强。

训练

轮次 = 400
批大小 = 16 * num_replicas = 128
学习率 = 5e-4 * num_replicas = 4e-3
AWP = 0.2 从0.1 * 轮次开始
调度 = 带预热比例0.1的余弦衰减
优化器 = AdamW(略优于RAdam with Lookahead)
损失 = CTC(权重=0.25) + 带标签平滑=0.1~0.25的CCE(权重=0.75)

使用Colab TPUv2-8训练大约需要14小时(由于Colab TPU运行时间最近减少到3~4小时,需要连续进行4次会话才能完成训练)。
更长的轮次总是能获得更好的CV(按id的5折分割)和LB,但没有时间尝试超过400轮。

LB历史

公开LB 私有LB
上一届单模型 + CTC (或 Attention) 0.76 0.74
+ 更深更宽模型,添加姿态 0.79 0.78
+ 3个种子集成(Attention) 0.80 0.79
+ CTC attention联合解码 0.81 0.80
+ 使用所有地标,更长轮次 0.82 0.81

查看其他Kaggler的解决方案,不仅是顶级解决方案,还有公开的笔记本总是令人鼓舞。再次感谢始终分享见解和想法的Kaggler们。热烈祝贺@christofhenkel@darraghdog 赢得这场竞争激烈的比赛!

同比赛其他方案