Daniel Povey:我为什么要做 K2 | CCF-GAIR AI源创专场

  • 2020 年 8 月 24 日
  • AI
深度学习》的演讲。”],[20,”\n”,”24:\”FyU9\””],[20,”\n”,”24:\”olBQ\””],[20,{“gallery”:”//uploader.shimo.im/f/sXf6v0uDrOSWH6W4.png!thumbnail”},”29:0|30:0|3:\”1618\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”1080\”|ori-width:\”1618\””],[20,”\n”,”24:\”YiNx\””],[20,”\n”,”24:\”nItV\”|7:1″],[20,”(”],[20,”Kaldi 之父、小米集团语音首席科学家, Daniel Povey”,”27:\”11\””],[20,”)”],[20,”\n”,”24:\”5ONB\”|7:1″],[20,”\n”,”24:\”MuvH\””],[20,”Daniel Povey 在演讲中,主要提及到了目前正在进行的项目 K2,即一个用加权有限状态自动机进行深度学习、主要用于自动语音识别的框架。”],[20,”\n”,”24:\”Cf6E\””],[20,”\n”,”24:\”48zP\””],[20,”K2 项目是 Daniel Povey 在Kaldi 之后,推出的一个全新的框架。也正是在他来到中国的这段时间,所思所想的结晶。在 AI源创评论 对他的专访中,Daniel 表示,K2 项目既适合学术界,又适合工业界。”],[20,”\n”,”24:\”x5S7\””],[20,”\n”,”24:\”7IaE\””],[20,”AI 研习社将 Daniel Povey 的演讲进行了不改变原意的编辑,以下为全文:”],[20,”\n”,”24:\”uYwW\””],[20,”\n”,”24:\”D5gU\””],[20,{“gallery”:”//uploader.shimo.im/f/qa7XvvW3KfCvbPcv.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”iKft\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”1cb3\””],[20,”我今天要说的是一项正在进行的工作,我们正在构建的人工智能框架。”],[20,”\n”,”24:\”qDKt\””],[20,”\n”,”24:\”wCsx\””],[20,”我真的不喜欢谈论没有完成的事情。但我对此非常兴奋。”],[20,”\n”,”24:\”bFfa\””],[20,”\n”,”24:\”oQEv\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/78GC2AjFisqcfic5.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”GokQ\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”oU3s\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”这是一个用加权有限状态自动机进行深度学习的框架。通常是序列的集合。它主要用于自动语音识别。”],[20,”\n”,”24:\”tjH4\””],[20,”\n”,”24:\”pYQS\””],[20,”项目的名称叫 K2。这是一种引用,也是一座山的名称。”],[20,”\n”,”24:\”raHr\””],[20,”\n”,”24:\”sRua\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/GgSpiY55Nsiy9k0g.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”mDXC\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”Djar\”|7:0|linespacing:\”150\””],[20,”首先,我想解释一下我们试图解决的问题。这只是自动语音识别的一般情况。一般来说,有某种语音信号。我们每秒提取一百帧,然后它通过一个神经网络,输出某种符号的概率。”],[20,”\n”,”24:\”vCRG\””],[20,”\n”,”24:\”9uuV\””],[20,”这些符号可能是手机、字母、词语”,”1:\”%23f9eda6\””],[20,”,这并不重要。从根本上说,它们都是一样的。”],[20,”我想通过解码方法来分解语音识别系统和推理方法。”,”1:\”%23f9eda6\””],[20,”\n”,”24:\”bHEQ\””],[20,”\n”,”24:\”X4uG\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/QiYc5s5PT3w8BhVy.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”CIv9\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”crqd\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”所以有两种基本类型。第一是帧同步类型,解码器一帧一帧地循环进行。比如说每秒30次。还有符号同步类型,每次一个单词。”],[20,”\n”,”24:\”IuZd\””],[20,”\n”,”24:\”ezav\””],[20,”我认为帧同步类型更合理些。我想详细介绍一下。”],[20,”\n”,”24:\”pH6g\””],[20,”\n”,”24:\”s3VL\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/7a4YUH2hNB1ggODa.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”P91y\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”K828\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”这是最简单的一种帧同步解码。例如,在CTC中,当你没有语言模型时,这种解码将从每一帧选取最好的符号输出。你只需选择具有最高值的神经网络输出。如果它是一个矢量,你就取最高值。这是最原始的方法。”],[20,”\n”,”24:\”mzIj\””],[20,”\n”,”24:\”M0ts\””],[20,”下一个更复杂的方法是解码器采用有限状态图搜索。”],[20,”\n”,”24:\”Rjag\””],[20,”\n”,”24:\”Kh85\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/yVEYK5AszY6I9x4q.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”hfOy\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”fgP9\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”所以有某种加权图,包括哪些是允许的符号序列。这是非常简单的,但它会是非常非常大的图,在语言模型中有你所有的词。”],[20,”\n”,”24:\”cO9H\””],[20,”\n”,”24:\”HYWk\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/slioJnzOvGdstZyG.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”Uuh4\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”7eHt\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”无论如何,我们实际上可以把整个操作,看作是有限状态的合成或交集。”],[20,”\n”,”24:\”moOU\””],[20,”\n”,”24:\”1dZB\””],[20,”所以其神经网络输出,我们把它看作一个具有特殊规则的有限状态受体,每个黑色都有一个输出。”],[20,”\n”,”24:\”tolH\””],[20,”\n”,”24:\”PFO1\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/mjrQW8eCl3Q9rUlp.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”U5cO\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”ATb4\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”这是下一帧。我们可以把这个和另一个摆在一起。”],[20,”\n”,”24:\”h2UC\””],[20,”\n”,”24:\”4Hgb\””],[20,”它给了我们一个格子”,”1:\”%23f9eda6\””],[20,”,最可能的输出是什么?现在,这通常将在一种解码器代码中完成。”],[20,”\n”,”24:\”iDjW\””],[20,”\n”,”24:\”qlp3\””],[20,”你通常不会在张量流中这样做,因为它不是真正支持的,或者它会非常慢。”],[20,”\n”,”24:\”bifM\””],[20,”\n”,”24:\”nKFp\””],[20,”是的,这是最常见的ASR方法,即使说端到端,也通常使用这种解码器。”],[20,”\n”,”24:\”iIlr\””],[20,”\n”,”24:\”fJM0\””],[20,”所以传统上一个CTC和LM,人们给他们不同的名字。从根本上说,这是同样的事情。”],[20,”\n”,”24:\”YmAz\””],[20,”\n”,”24:\”w1wd\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/UeyDlFFkn8DoKuW6.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”AUqi\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”YZZ0\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”有时你想采取晶格做另一种的恢复”,”1:\”%23f9eda6\””],[20,”,就像每一个当前的语言模型。”],[20,”\n”,”24:\”l3gw\””],[20,”\n”,”24:\”zGhC\””],[20,”现在,就像大多数工业界的语音识别系统一样,”],[20,”大多有某种最大的晶格产生”,”1:\”%23f9eda6\””],[20,”,然后他们用一个小时和一个 LM 来回收。”],[20,”\n”,”24:\”2g1Z\””],[20,”\n”,”24:\”S2zv\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/JmlaP3ohxH3T412z.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”LNka\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”4P57\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”这通常是在 C++ 中完成的。你不能用 Python 写这个东西,因为要快。”],[20,”\n”,”24:\”rsOR\””],[20,”\n”,”24:\”dxB0\””],[20,”它通常与张量流或其他东西分开,广泛地说,你不能真正编程。”],[20,”\n”,”24:\”qAle\””],[20,”\n”,”24:\”BpdO\””],[20,”现在,即使人们告诉你,我们在做输入和语音识别,这通常是他们在生产中实际在做的。但对于论文,他们试图掩盖他们确实在做这件事的事实。”],[20,”\n”,”24:\”ewks\””],[20,”\n”,”24:\”n0Z1\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/j9eB541QWEblJ3kO.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”OK5c\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”Vn7T\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”还有另一种类型的解码器方法。我告诉你是为了完整性,尽管我认为它不是很实用。”],[20,”\n”,”24:\”1SkB\””],[20,”\n”,”24:\”t26o\””],[20,”它是当有某种递归的网络输出时,网络的输出又回到神经网络中,但它是每个字,而不是每个帧。”],[20,”\n”,”24:\”pwEa\””],[20,”\n”,”24:\”OHrq\””],[20,”不是每个字都有帧,所以单词没有连接到框架。它们没有连接到时间步骤。”],[20,”\n”,”24:\”Ta2X\””],[20,”\n”,”24:\”J9zB\””],[20,”现在,把这样的工作放入生产系统,这是非常危险的,因为它会给你带来疯狂的结果,特别是有一个很长的输入。”],[20,”\n”,”24:\”7iCC\””],[20,”\n”,”24:\”F3H1\””],[20,”有时它会给你奇怪的重复,或者它可以解码一些完全不同于真正输入的东西。”],[20,”\n”,”24:\”xsGI\””],[20,”\n”,”24:\”4WxH\””],[20,”所以我不推荐这种类型的系统,但是,人们会使用它们。所以我告诉你,它就在那里。”],[20,”\n”,”24:\”2OQe\””],[20,”\n”,”24:\”VAuj\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/6LT2ULI92q5opH1v.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”osGX\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”QT9b\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”这些方法中的大多数,除了非常简单的贪婪搜索,”],[20,”在训练之间存在某种不匹配”,”1:\”%23f9eda6\””],[20,”。这很奇怪。”],[20,”\n”,”24:\”XWop\””],[20,”\n”,”24:\”HbIK\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/HNC5AlLv3BAdveHF.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”4Rd9\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”BMjX\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”因为你在训练中没有所有的 C++ 代码,它不会以那种方式与张量流交互,尽管它是通过训练。”],[20,”\n”,”24:\”hYQQ\””],[20,”\n”,”24:\”b6YS\””],[20,”所以这不是理想的。有时人们会使用技巧来修复不匹配。比如如果你训练一个 CTC 模型,然后你用语言模型来编码。”],[20,”\n”,”24:\”mMuW\””],[20,”\n”,”24:\”89g5\””],[20,”你必须插入一个特殊的空白,以避免得到太多的单词。”],[20,”\n”,”24:\”TILY\””],[20,”\n”,”24:\”jvru\””],[20,”现在这是我试图用 K2 框架解决的问题。”],[20,”\n”,”24:\”adc5\””],[20,”\n”,”24:\”0mi1\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/GA4mC6Bz2UhYoJ6x.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”k0ns\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”YBQ2\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”还有另一个问题。我也试图解决一个单独的问题,这些递归方法中的一些,还记得我告诉过你们的第三种类型,关于符号回到网络中的地方,但它仍然是帧级的,而不是字级的。”],[20,”\n”,”24:\”Ss2p\””],[20,”\n”,”24:\”l8ff\””],[20,”所以这些方法,神经网络知道过去的字的序列是什么,但它不能明确地比较。我喜欢这个还是这个?它不知道其他的单词序列也会要考虑。”],[20,”\n”,”24:\”4gpz\””],[20,”\n”,”24:\”WpG2\””],[20,”如果能够以某种方式,让神经网络对可能的输出,或可能的输出的整个集合进行操作,那就太好了。这里的部分目标是获得良好的置信度。我们大多数的置信度都很差。就像它们校准得很差一样。”],[20,”\n”,”24:\”XERr\””],[20,”\n”,”24:\”8f9c\””],[20,”我知道你们可能不是所有人都明白。无论如何,这就是 K2。这是这个项目的名字,也是一座山,它的一半在中国,另一半在巴基斯坦。”],[20,”\n”,”24:\”ge71\””],[20,”\n”,”24:\”rtEe\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/bfNFE9yJMRHvSKCd.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”Gl0Z\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”6SyV\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”这是 K2 项目的结构,我们现在主要在做这个。”],[20,”\n”,”24:\”QXvH\””],[20,”\n”,”24:\”tHKM\””],[20,”我们还没有完成大部分的 Python 包,它基本上是一个 C++ 后端,我们有 pybind11 的代码,使它在 Python 中可见。”],[20,”\n”,”24:\”X2Tg\””],[20,”\n”,”24:\”06eG\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/otZ3zmrxQOpQ41GP.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”aeas\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”LJ0T\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”我们的目标是有一个单独的前端,就像 PyTorch、TensorFlow 一样。”],[20,”\n”,”24:\”h8uC\””],[20,”\n”,”24:\”5x5B\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/9bcNhuzdGDlBIp1a.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”413s\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”wGU2\”|7:0|linespacing:\”150\””],[20,”是的,所以总体愿景是我们想要实现高性能的 ASR ,在那里,你不会有 Python 和 C++ 之间的这种不匹配。”],[20,”\n”,”24:\”gNhe\””],[20,”\n”,”24:\”MR1r\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/MtfrR2plyuc1tthH.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”ngSV\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”Qwoh\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”所有这些复杂的图形操作,都可以用一个漂亮、干净的 Python 接口,用一种非常通用的加权有限状态自动机的框架来完成。”],[20,”\n”,”24:\”YBal\””],[20,”\n”,”24:\”IzSz\””],[20,”它的代码库要小得多,比 Kaldi 灵活得多。我们希望人们能基于这个工具发明下一代的 ASR 算法。”],[20,”\n”,”24:\”JyJq\””],[20,”\n”,”24:\”UiY0\””],[20,”这个工具包将使我们有可能,把所有与语音相关的部分,分离到一个不同的代码库中,这个代码库叫做 lhotse。”],[20,”\n”,”24:\”d2qn\””],[20,”\n”,”24:\”2cNl\””],[20,”我希望到 9 月我们能有一个简单的演示,尽管它不会完全完成。”],[20,”\n”,”24:\”Af4u\””],[20,”\n”,”24:\”kbjO\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,{“gallery”:”//uploader.shimo.im/f/CgLStDeK5kX3fOpC.jpg!thumbnail”},”29:0|30:0|3:\”960\”|4:\”auto\”|crop:\”\”|frame:\”none\”|ori-height:\”540\”|ori-width:\”960\””],[20,”\n”,”24:\”sSg3\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”\n”,”24:\”qaJe\”|7:0|linespacing:\”150\”|text-indent:\”1\””],[20,”所以我们不只是扩展 Kaldi 的原因,是我觉得这个项目太大了。它有太多的 C++ 代码,如果再加上 Python,会变得太复杂。所以我决定做一个全新的。”],[20,”\n”,”24:\”HRmr\””],[20,”\n”,”24:\”Y2ci\””],[20,”好的,谢谢你们。”],[20,”\n”,”24:\”oivL\””]]”>

AI 研习社按:8 月 7 日 – 9 日,由中国计算机学会(CCF)主办,雷锋网、香港中文大学(深圳)承办,鹏城实验室、深圳市人工智能与机器人研究院协办的第五届 CCF-GAIR 2020 全球人工智能与机器人峰会如期落地。

8 日,峰会与 AI 研习社OpenI 启智社区联合举办“AI 源创专场”,重点讨论了新基建背景下,国内开源创新建设将催生的新势能,以及其将引发和促进的新产业机会。

会上,Kaldi 之父、小米集团语音首席科学家 Daniel Povey,做了《Deep Learning with Collections of Sequences ,序列集上的深度学习》的演讲。

(Kaldi 之父、小米集团语音首席科学家, Daniel Povey)

Daniel Povey 在演讲中,主要提及到了目前正在进行的项目 K2,即一个用加权有限状态自动机进行深度学习、主要用于自动语音识别的框架。

K2 项目是 Daniel Povey 在Kaldi 之后,推出的一个全新的框架。也正是在他来到中国的这段时间,所思所想的结晶。在 AI 源创评论对他的专访中,Daniel 表示,K2 项目既适合学术界,又适合工业界。

AI 研习社将 Daniel Povey 的演讲进行了不改变原意的编辑,以下为全文:

我今天要说的是一项正在进行的工作,我们正在构建的人工智能框架。

我真的不喜欢谈论没有完成的事情。但我对此非常兴奋。

这是一个用加权有限状态自动机进行深度学习的框架。通常是序列的集合。它主要用于自动语音识别。

项目的名称叫 K2。这是一种引用,也是一座山的名称。

首先,我想解释一下我们试图解决的问题。这只是自动语音识别的一般情况。一般来说,有某种语音信号。我们每秒提取一百帧,然后它通过一个神经网络,输出某种符号的概率。

这些符号可能是手机、字母、词语,这并不重要。从根本上说,它们都是一样的。我想通过解码方法来分解语音识别系统和推理方法。

所以有两种基本类型。第一是帧同步类型,解码器一帧一帧地循环进行。比如说每秒30次。还有符号同步类型,每次一个单词。

我认为帧同步类型更合理些。我想详细介绍一下。

这是最简单的一种帧同步解码。例如,在CTC中,当你没有语言模型时,这种解码将从每一帧选取最好的符号输出。你只需选择具有最高值的神经网络输出。如果它是一个矢量,你就取最高值。这是最原始的方法。

下一个更复杂的方法是解码器采用有限状态图搜索。

所以有某种加权图,包括哪些是允许的符号序列。这是非常简单的,但它会是非常非常大的图,在语言模型中有你所有的词。

无论如何,我们实际上可以把整个操作,看作是有限状态的合成或交集。

所以其神经网络输出,我们把它看作一个具有特殊规则的有限状态受体,每个黑色都有一个输出。

这是下一帧。我们可以把这个和另一个摆在一起。

它给了我们一个格子,最可能的输出是什么?现在,这通常将在一种解码器代码中完成。

你通常不会在张量流中这样做,因为它不是真正支持的,或者它会非常慢。

是的,这是最常见的ASR方法,即使说端到端,也通常使用这种解码器。

所以传统上一个CTC和LM,人们给他们不同的名字。从根本上说,这是同样的事情。

有时你想采取晶格做另一种的恢复,就像每一个当前的语言模型。

现在,就像大多数工业界的语音识别系统一样,大多有某种最大的晶格产生,然后他们用一个小时和一个 LM 来回收。

这通常是在 C++ 中完成的。你不能用 Python 写这个东西,因为要快。

它通常与张量流或其他东西分开,广泛地说,你不能真正编程。

现在,即使人们告诉你,我们在做输入和语音识别,这通常是他们在生产中实际在做的。但对于论文,他们试图掩盖他们确实在做这件事的事实。

还有另一种类型的解码器方法。我告诉你是为了完整性,尽管我认为它不是很实用。

它是当有某种递归的网络输出时,网络的输出又回到神经网络中,但它是每个字,而不是每个帧。

不是每个字都有帧,所以单词没有连接到框架。它们没有连接到时间步骤。

现在,把这样的工作放入生产系统,这是非常危险的,因为它会给你带来疯狂的结果,特别是有一个很长的输入。

有时它会给你奇怪的重复,或者它可以解码一些完全不同于真正输入的东西。

所以我不推荐这种类型的系统,但是,人们会使用它们。所以我告诉你,它就在那里。

这些方法中的大多数,除了非常简单的贪婪搜索,在训练之间存在某种不匹配。这很奇怪。

因为你在训练中没有所有的 C++ 代码,它不会以那种方式与张量流交互,尽管它是通过训练。

所以这不是理想的。有时人们会使用技巧来修复不匹配。比如如果你训练一个 CTC 模型,然后你用语言模型来编码。

你必须插入一个特殊的空白,以避免得到太多的单词。

现在这是我试图用 K2 框架解决的问题。

还有另一个问题。我也试图解决一个单独的问题,这些递归方法中的一些,还记得我告诉过你们的第三种类型,关于符号回到网络中的地方,但它仍然是帧级的,而不是字级的。

所以这些方法,神经网络知道过去的字的序列是什么,但它不能明确地比较。我喜欢这个还是这个?它不知道其他的单词序列也会要考虑。

如果能够以某种方式,让神经网络对可能的输出,或可能的输出的整个集合进行操作,那就太好了。这里的部分目标是获得良好的置信度。我们大多数的置信度都很差。就像它们校准得很差一样。

我知道你们可能不是所有人都明白。无论如何,这就是 K2。这是这个项目的名字,也是一座山,它的一半在中国,另一半在巴基斯坦。

这是 K2 项目的结构,我们现在主要在做这个。

我们还没有完成大部分的 Python 包,它基本上是一个 C++ 后端,我们有 pybind11 的代码,使它在 Python 中可见。

我们的目标是有一个单独的前端,就像 PyTorch、TensorFlow 一样。

是的,所以总体愿景是我们想要实现高性能的 ASR ,在那里,你不会有 Python 和 C++ 之间的这种不匹配。

所有这些复杂的图形操作,都可以用一个漂亮、干净的 Python 接口,用一种非常通用的加权有限状态自动机的框架来完成。

它的代码库要小得多,比 Kaldi 灵活得多。我们希望人们能基于这个工具发明下一代的 ASR 算法。

这个工具包将使我们有可能,把所有与语音相关的部分,分离到一个不同的代码库中,这个代码库叫做 lhotse。

我希望到 9 月我们能有一个简单的演示,尽管它不会完全完成。

所以我们不只是扩展 Kaldi 的原因,是我觉得这个项目太大了。它有太多的 C++ 代码,如果再加上 Python,会变得太复杂。所以我决定做一个全新的。

好的,谢谢你们。

推 荐 阅 读