百度硅谷AI实验室(SVAIL)近日宣布,百度已开源关键人工智能(AI)软件Warp-CTC,并公开了关键代码。百度硅谷实验室已向GitHub上传了Warp-CTCC代码库,鼓励开发者试用这些代码。百度表示,代码将开放给所有从业者,包括但不限于创业者。百度此次开源人工智能软件代码,让全球知识共享又迈出了一大步,知识共享领域将激发出更多创新,开发者能获取更丰富的技术学习途径,促进开发者进行技术开发,对全球人工智能行业发展有着极其重要的现实意义。 Warp-CTC是百度前期为了在最新的计算机芯片上更快速运行而专门研发的一种改良版深度学习算法。CTC(链结式时间分类算法)方法始于2006年,在瑞士AI实验室IDSIA的论文中有所描述。CTC结合了多个不同的神经网络设计,以处理不完美的数据集。百度SVAIL工程师在打造端对端语音识别系统时,在CTC基础上开发了Warp-CTC,该软件可用于解决绘制输入序列到输出序列图谱过程中的监督问题,改善培训模型的可扩展性,目前百度已经将其运用在了语音识别的改进和优化上。 在此次正式开源之前,Warp-CTC已被用于开发一款强大的深度语音识别系统DeepSpeech2。对于一些简短的句子,该系统甚至比大多数人类正确识别语音的能力强。该技术目前已帮助百度数亿用户在移动端更好的获取相应的服务。百度也表示,希望此次开源能促使端到端的深度学习变得更简单、速度更快,加快研究者的进度,进而对机器学习领域的进步做出贡献。 近几年来,包括深度学习、语音识别等在内的人工智能技术已经成为行业热点。以深度学习为例,将这项技术应用到互联网产品中之后,就可以实现各种“用脑”的学习型操作,如精致地转录语音或识别物体图像,相当于将特定字词的音频或特定物体的图像导入一个大型模拟神经网络,随着时间推移,此网络将不断“自我学习”,从而可以识别出更多的新目标。Warp-CTC技术的应用将有效改善用现有的方式应用CTC时对内存的庞大需求,提升速度数十甚至数百倍。 随着百度、谷歌、Facebook等企业全面免费开放各自的深度学习技术,研究者和开发者们很快就可以使用这些国际顶尖的基础技术平台开发机器学习系统产品,从而推动整个人工智能生态的繁荣。作为一家技术驱动的公司,百度深知,公开技术源代码将会引起业界更多的兴趣和热情,使得相关的技术发展进入良性发展的循环,为整个产业提供强大的技术驱动力。
warp-ctc
Warp-CTC是一个可以应用在CPU和GPU上高效并行的CTC代码库 (library) 介绍 CTCConnectionist Temporal Classification作为一个损失函数,用于在序列数据上进行监督式学习,不需要对齐输入数据及标签。比如,CTC可以被用来训练端对端的语音识别系统,这正是我们在百度硅谷试验室所使用的方法。 端到端 系统 语音识别
上图展示了CTC计算输出序列(“THE CAT”)概率的过程,是对可能映射成“THE CAT”的所有可能输入序列对齐的和。这一过程考虑了标签会被复制的可能性,因为标签有可能在输入数据的几个时间步(time steps)时被拉伸 (请见上图底部的声谱图)。由于涉及到了组合学,计算所有可能概率的和的成本会很高,但是CTC运用了动态规划以大幅降低计算的复杂性。作为一个可微函数,CTC可以被用于深度神经网络的标准SGD训练。 我们实验室专注于递归神经网络(RNN)的可扩展性 (scalibility), 而CTC损失函数是其中很重要的一部分。为了让我们的系统更有效率,我们并行处理了CTC算法,正如这篇文章中所描述的 。这个项目包含了我们的高性能CPU以及CUDA版本的CTC损失函数, 以及绑定的Torch. 该代码库提供了简单的C接口,易于与深度学习框架整合。 这种执行方式提高了训练的的可扩展性,超过了并行CTC的实现方式。对于以GPU为核心的训练, 我们可用所有的的网络带宽来增加数据的可并行性。 性能 相起其他的开源工具,Warp-CTC的实现方式相对高效,且代码的数值稳定性也较好。因为CTC本身对数值较为敏感,因此即使使用双精度标准计算,也会出现下溢 (underflow)的情况。 具体来说,两个数值趋近于无穷小且相近的数字相除的结果应该大约为1,却因为分母接近为0而变成无穷。 然而,如果直接取对数执行运算,CTC会在数值上较为稳定,虽然会在单精度浮点中以高成本运算为代价。 我们将Warp-CTC和Eesen (建立在Theano上的CTC)以及仅运行Stanford-CTC的Cython CPU进行了比较。为了进行比较,我们对在32位浮点数上运行的Theano进行了基准测试,并且取对数计算。 而Stanford-CTC由于本身不支持对数运算,因此需要被修改。而且它也不支持大于1的迷你批处理 (minibatches), 所以需要在真正的训练流水线上布局非常规内存(我们假设成本与迷你批处理的规模是成正线性关系)。 我们在Deep Speech 2中分别展示了英文及中文端对端模型的结果, 其中T代表输入CTC的时间步数量,L代表每个例子的标签长度,A代表字母数量。 在GPU上,Warp-CTC对64个例子迷你批处理的表现比Eesen快7倍到155倍,比Theano快46倍到68倍
GPU性能单核NVIDIA Titan X GPU基准测试 [td]T=150, L=40, A=28 | warp-ctc | Eesen | Theano | N=1 | 3.1 ms | .5 ms | 67 ms | N=16 | 3.2 ms | 6 ms | 94 ms | N=32 | 3.2 ms | 12 ms | 119 ms | N=64 | 3.3 ms | 24 ms | 153 ms | N=128 | 3.5 ms | 49 ms | 231 ms | [td]T=150, L=20, A=5000 | warp-ctc | Eesen | Theano | N=1 | 7 ms | 40 ms | 120 ms | N=16 | 9 ms | 619 ms | 385 ms | N=32 | 11 ms | 1238 ms | 665 ms | N=64 | 16 ms | 2475 ms | 1100 ms | N=128 | 23 ms | 4950 ms | 2100 ms | CPU性能在一台有两个Intel E5-2660 v3处理器的双槽机上进行基准测试。Warp-CTC用了40个线程从而最大化了对CPU资源的利用。Eesen没有提供CPU实现方式。我们注意到Theano没有在多线程上进行并行计算。同样,Stanford-CTC没有提供多线程并行计算的机制。 [td]T=150, L=40, A=28 | warp-ctc | Stanford-CTC | Theano | N=1 | 2.6 ms | 13 ms | 15 ms | N=16 | 3.4 ms | 208 ms | 180 ms | N=32 | 3.9 ms | 416 ms | 375 ms | N=64 | 6.6 ms | 832 ms | 700 ms | N=128 | 12.2 ms | 1684 ms | 1340 ms | [td]T=150, L=20, A=5000 | warp-ctc | Stanford-CTC | Theano | N=1 | 21 ms | 31 ms | 850 ms | N=16 | 37 ms | 496 ms | 10800 ms | N=32 | 54 ms | 992 ms | 22000 ms | N=64 | 101 ms | 1984 ms | 42000 ms | N=128 | 184 ms | 3968 ms | 86000 ms | 接口接口在include/ctc.h中,它支持在CPU或者GPU上执行。 如果是在CPU上运行,可以指定OpenMP并行计算; 如果是在GPU上运行,请用CUDA stream。 为避免内存分配而导致的竞争及间接成本,我们会确保代码库不会在内部进行内存分配。
|