02
04
58
09
为了账号安全,请及时绑定邮箱和手机立即绑定

从文本到手语词汇翻译:用Transformer模型实现文字到Gloss的飞跃

在我的上一篇文章中(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。

我也有一份月刊(你可以在这里找到我个人的一些学习体会、见解和成果) 🧠

下回见!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

0 评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消