在我的上一篇文章中(https://medium.com/@santosjoaopedro/exploring-word-level-sign-language-recognition-with-lstms-6c6e60711968 ),我讲解了如何训练一个AI通过视频识别阿根廷的手语中的四个单词。这次,我想展示手语翻译的另一面。
你看,手语在语法上比普通语言要简单得多。介词几乎不存在,而且动词的变化也不需要不同的手势表示。因此,比如说,如果你用美国手语 (ASL) 表达“今天是星期五”,你会打出“NOW”,“DAY” 和 “FRIDAY” 这几个手势。这句话“NOW DAY FRIDAY”被称为手势语音译,也就是手语的书面表达方式。
以下是一些英语句子及其翻译成术语的例子。来源链接
因此,注释在文字与手语翻译之间可以发挥非常重要的作用。视具体情况而定,可以将翻译过程分解为两个步骤:文字到注释(T2G)和注释到手语(G2S),反之亦然。顺便说一下,我之前制作的识别手势的AI系统更像是一个S2G而非S2T的翻译工具,因为它并没有对手势序列进行意义解释。
简单来说,这篇文章讲的是我如何制作了一个T2G翻译器,它可以识别英文文本并将其转换成美国手语(ASL)的书面表达。这是我参考并复制的论文,以此来实现它。
巧的是,我正好是周五写的这篇文章!Generated with Google’s ImageFX.
保持一致:在我们开始之前,让我们确保一些概念已经清晰。
首先,是数据集 ASLG-PC12。这个数据集包含超过87,000个数据点,就像下面这个数据点一样。
{
"gloss": "书面陈述及口头质询的提出请参阅议事录",
"text": "书面陈述和口头质询请参阅会议记录"
}
如你所见,这比之前我展示的语料库的注解要简单得多。但这只是2012年发布的初始版本——目前,它已经包含了超过2400万对句子,并且翻译的复杂度也更高了。考虑到Kaggle提供了慷慨的免费GPU资源,这个版本在质量和训练时间之间找到了很好的平衡——在这个案例中,训练时间仅为6.5小时。
其次,架构:
来自原文
如果你还不太了解Transformer也没关系,不需要太纠结细节。这样的简化版本对我们来说已经足够好了。
在这个例子中,解码器循环被展开。句子“今天是星期五”首先由编码器编码,这意味着它被转换成只有模型能理解的包含丰富语境的数字。然后,解码器通过查看编码器的输出和表示句子开始的<bos>标记,开始解码过程。接着,它会输出另一个标记并将其连接到bos标记后,再将结果作为输入反馈给解码器。这个过程会一直重复,直到产生表示句子结尾的<eos>标记。这时,整个过程就完成了!
从这两个插图之间的差异可以看出,这其实都被大大简化了。请不要认为这就是全部。我只是一个普通的ML学生而已。
建这个东西代码太多,我就不详细写了,只说说我是怎么做的。
首先,我们要加载数据集并预处理文本,包括删除标点符号和多余的空格,并确保所有文本都转为小写,术语全部大写。
然后,我们将数据进行分词处理。在更复杂的项目中,分词可能涉及将一个词拆分为更原子的部分(例如,‘breaking’可以被拆分为‘break’和‘ing’)。但对于这个简单的数据集,直接将整个词作为分词单位即可。然后给每个词分配一个编号。
注意,分词词汇向量总是以2和3这两个数字结尾。这两个分别是我们在前面提到过的<bos>和<eos>!
我们将数据分为训练集、验证集和测试集。模型通过训练集来学习,通过验证集来检验其准确性,最后我们会用测试集来衡量其得分。
输出
训练集的数量:82710
验证集的数量:4000
测试集的数量:1000
这些需要准备好用于输入模型,为每个数据集创建一个数据加载器,并为其分配一个批量大小——每次给模型的样本数量。我选择了32作为批量大小。
下一步是定义一些超参数——例如,“嵌入大小”是指每个词被转换成的数字串的长度。记得编码器和解码器将标记视为数字了吗?嵌入大小是指代表每个标记的向量的长度。它们在高维空间中作为坐标起作用,这些坐标的方向可以代表不同的意义。比如,对于向量 [8, -3, 0],8 可能表示这个词是否与黄色有关,-3 可能表示这个词是否有毒,0 可能表示这个词是否有大小的含义。所以,我们找的是黄色但无毒且不大不小的东西。因此,这个词可能是香蕉!
用ImageFX生成的
这段视频里用可视化的方式很好地详细解释了这些内容。
下面是一些超参:
EMBEDDING_DIM = 1024 # 设置嵌入维度为1024
NHEAD = 8 # 设置头数为8
NUM_ENCODER_LAYERS = 2 # 设置编码器层数为2
NUM_DECODER_LAYERS = 2 # 设置解码器层数为2
DROPOUT = 0.1 # 设置dropout率为0.1
MAX_LEN = 100 # 设置最大长度为100
有了完成这些设置(如位置编码、优化器、学习率调度器等)之后,是时候让它训练120个周期了。以下是训练结果的曲线图:
模型的得分情况如下:
BLEU得分:0.9721
ROUGE得分:如下:
rouge1: 0.9916
rouge2: 0.9860
rougeL: 0.9916
这些结果的得分差不多接近原论文的96.89 BLEU和98.78 ROUGE这两个指标的成绩!
好吧……但这真的有啥用?是的!有了这个模型,我做了一个非常基本的HTML页面,能够实时将语音转换为口译。经过更完善的版本训练(基于更好的数据集),这种版本可以供口译员使用,这使得口译员可以将注意力更多地放在手势上,而不需要过多关注语音,从而使实时翻译更容易进行。
那个想法来自于一个真实的情况,当时我在学校做了一场关于AI和手语的演讲,有一个手语翻译跟不上我说话的速度。后来,那位手语翻译告诉我,如果事先有讲稿,他们更容易跟上,甚至可以查他们不知道的手语手势——因为我用了很多特定的科技术语,这种情况经常发生。
《事后分析》总体来说,项目进行得非常顺利。数据集很容易操作和使用,模型架构在原论文中有清晰的说明,最终我取得了稍微更好的结果(嘿嘿)。
然而,我最初的想法是将这个项目的术语输出连接到一个ASL视频的数据集上,从而将其变成一个语音到手语的翻译器。不过,我发现没有足够大的数据集来涵盖手语术语的词汇量。因此为了使这个项目更贴近现实,我决定暂时把这个部分空着。谁知道呢,也许有人正在计划做一个术语到手语的生成器?(我可不敢保证)
说到词汇,这确实是这个项目的一个局限。当模型看到一个不认识的英文单词时,它会给出最佳的翻译猜测,但有时这会导致例如将“coordinate”翻译成“DEFECT”的情况。
关于我的计划,包括有建立一个可以从手语视频中识别出完整英语句子的模型,请大家继续关注!
谢谢你读到这里!从这次经历中学到很多,我感到非常高兴。我非常期待下一个挑战。
欢迎在评论中留下您的见解和建议,我非常感激。如果您想直接联系我,可以在我自己的LinkedIn个人主页上联系,或直接邮件我santosjoaopedroms@gmail.com。
我也有一份月刊(你可以在这里找到我个人的一些学习体会、见解和成果) 🧠
下回见!
共同学习,写下你的评论
暂无评论
作者其他优质文章