363. Bengali.AI Handwritten Grapheme Classification | bengaliai-cv19
非常感谢 Kaggle 和 Bengali.AI 主办了如此有趣的比赛。这是我第一次全身心投入的 Kaggle 比赛,毫无疑问,如果没有我们出色的团队成员 Igor, Habib, Rinat 和 Youhan,这一切都不可能实现。
在这个阶段(0.9900-0.9905),我们发现很难进一步提高 LB 分数。正如 这篇帖子 指出的那样,更高的 CV 分数不再意味着更好的 LB 分数,所以我们卡住了一段时间(很长的一段时间……)。
通过 CV 和 LB 的关系很容易看出,问题在于我们的模型无法泛化到未见过的图素(这里的图素指的是图素根、元音和辅音变音符号的三元组组合)。训练集中只有约 1290 个图素,而可能的组合有 12936 种。我们的模型可能偏向于输出见过的三元组;无论原因如何,正如 Qishen Ha 精彩的 帖子 指出的那样,我们的模型在这些图素上表现不佳。
事后看来,提高泛化能力最便捷的方法就是增加更多数据,这并不神奇。在研究图素表示时,我发现图素实际上被编码为 Unicode 字符序列。根和变音符号也有它们对应的序列。最神奇的部分是图素的 Unicode 序列是其根序列的组合。这张图片是最好的例证,其中四行分别是图素、图素根、元音和辅音。
这一观察结果适用于训练集中的所有图素(有极少数例外),使用一个非常基本的算法,我能够为训练集中的所有 1295 个图素生成正确的标签,除了 2 个。根据 Guanshuo Xu 的帖子指向 这个仓库,我们能够访问一个全面的图素组合列表。使用分解算法,我们选择了约 3000 个可以分解为给定根和变音符号的图素。我们在最后一天的 LB 提升来自于对这些图素的更好泛化,这些图素与训练集和测试集部分重叠。
有了这些图素,我们使用各种字体渲染它们,并获得了一个标记清晰的合成数据集,包含约 47K 张涵盖这些字符的图像,可以在 这里 找到,创建这个合成数据集的所有要素都是公开的。我们希望通过看到合成图像,我们的模型应该能够至少学习图素的拓扑特征(如果不是风格特征)。事实证明它们确实做到了。这是我们数据集中的一张合成图像样本。
此时距离比赛结束只有 24 小时,所以我们只是将之前的模型在添加了原始训练和验证集的合成数据上进行了微调,从而在最后一天实现了激动人心的飞跃😊
我的队友们拥有出色的流程,以下是一些被证明有用的方法: