讨论:如何用1024张显卡训练一个模型?

文章来源于一个知乎问题:如何判断候选人有没有千卡GPU集群的训练经验?确实对于普通开发者来说,大概率从未尝试过使用数千张GPU训练一个模型,这方面确实是一个很好的研究方向,也是成为顶尖算法工程师所必需的必经之路,因此记录下知乎的一些回答,用于学习和记录。虽然目前还没有机会能够调用数千张GPU用于模型训练,但对于目前几十张GPU进行并行训练也有帮助。

高赞回答1:如何用千卡进行训练

最近看到知乎一个回答,把千卡训练的难度吹上天了。但其实真正用过千卡就会发现也就那么几个点。于是想写一篇文章简单讲讲。

本文将包括三个部分:

  • 首先我们将讨论千卡训练的难题,以及应该在什么时候使用千卡训练;
  • 接着,我们将讨论如何在一千张卡上开始训练,如何让他达到近乎线性的性能提升;
  • 最后我们将展开讨论一些千卡训练当中仍然悬而未决(至少对于开源社区来说)的问题。

为什么千卡训练是困难的?

其实那篇回答在这部分说的没错。千卡训练和八卡训练的区别是—显卡多了一百多倍。

这意味着什么呢?

  1. 通信时间增加
  2. 故障概率增加

这俩问题都很好理解。

时间上,PyTorch 内部支持 NCCL / Gloo / MPI 三个通信后端(请务必使用 NCCL。)其中训网络最常用的 AllReduce 操作【从多个sender那里接收数据,最终combine到一个节点上】会根据具体硬件配置走 Ring AllReduce 和 Tree AllReducering allreduce和tree allreduce的具体区别是什么?。Ring 的时间复杂度是 O(pn),Tree 的时间复杂度是 O(log⁡pn)。就算是理论上 128 节点也比单节点慢至少七倍,实践当中跨节点通信要远比单节点慢得多。

故障上,一个节点出问题的概率是 p,128 个节点就是 1−(1−p128)。也就是说如果一个操作在一个训练当中的出错概率是 1%,那么在 128 节点当中的出错概率就是 72.37%。

此外,随着规模的增大,许多问题都会变得难以忍受。比如数据增强要花 0.1s,一亿条数据就是 278 个小时(当然这只是胡拆的一个数字,实际有各种机制所以不会有这么大影响。

因此,钱多烧手并不是使用千卡训练的理由。闲得蛋疼可能是,但你得多蛋疼才能想出这么折磨自己的 idea?

因此,千卡训练解决的问题是大模型&大数据问题如果你的训练时间没有超过 8192 GPU 日,那么你绝对不需要一千张显卡。

看到这里,绝大多数人已经可以关掉这篇文章了。除非你的模型和数据都以 B(十亿)来作为计量单位。当然如果你正在厕所里手机没电想看点儿东西解闷儿的话(虽然我很怀疑是否会有人把他打出来……那么可以继续往下看

如何使用一千张卡训练?

如何提高计算效率?

这件事情其实是一个 case by case 的事情。因为通信、计算速度啥的受硬件影响更多。同样是 A100 集群,我全 DGX 节点,每一张 A100 都是 SXM 接口并配一块儿专属的 IB 网卡。你一个小破普惠服务器插 8 张 PCI-E A100,IB 卡一个节点只给一张。那咱俩遇到的问题就完全不是一个问题。

因此,要讨论如何提高训练效率、减少训练耗时,我们首先要了解训练耗时在哪里。那么,一个训练步的耗时在哪里呢?需要谨记,没有 profile 的优化是没有意义的。

你可能会说,forward backward sync。很好,这说明你了解 PyTorch 的基本流程。不过现实当中要复杂得多。

  1. dataset 读取数据,构建输出
  2. dataloader collate 数据,进行数据预处理
  3. 模型 forward 计算输出
  4. loss compute
  5. 模型 backward 计算梯度
  6. 模型 sync 梯度
  7. 优化器 step 更新权重
  8. 打印 log

当然这是可以无限细分下去的,但一般这些就够了。需要注意的是,除了 4-7 的耗时是真耗时,其他都需要通过异步操作来盖掉。这也是我们的优化目标。

异步执行在 PyTorch 的 dataloader、CUDA 和分布式当中都存在。前者可以通过设置 num_workers 和 prefetch_count 为 0 来关闭,后两者可以通过 cuda.synchornize 和 dist.barrier 来执行手动同步。在 profile 时,我们需要首先需要测整个 step 的时长。然后再在每次测量前执行手动同步来计算每个部分的时长。如果前者的总耗时等于后者 4-7 的耗时之和,那么通常不需要执行任何操作。但这种情况在千卡操作中几乎不可能发生。

第 6 步通信往往需要耗费大量时间。因此,我们还需要进一步优化通信。

以下内容是对PyTorch Distributed的概括,有感兴趣的同学建议通读并背诵全文。

计算-通信重叠

在 PyTorch 当中,梯度的通信和反向传播是交叠进行的。也就是说,每完成一层的梯度计算,都会立即触发当前层的同步。实现起来也很简单,每个进程在完成自己第 k 层的梯度计算后都会触发一个钩子来给计数器+1s。当计数器达到进程数时开火进行梯度通信。有很多同学在计算梯度过程中遇到过 RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. 错误,这就是因为有的模块没有参与计算 loss,导致梯度同步卡住了。需要注意,当 find_unused_parameters=True 时,PyTorch 分布式使用 nn.Module.__init__ 当中定义子模块的反向顺序来作为梯度桶的构建顺序。因此,确保模块定义和调用的顺序一致是一个良好的实践。

梯度合桶

尽管理论上来说,同步发生的越及时,重合度越高,性能越好。但实际上每次发起通信都是有上头的。因此,现实当中梯度同步并不是越多越好越快越好。为此,PyTorch 引入了梯度合桶机制,通过把多个 Tensor 装在一个桶里再通信桶来减少通信次数从而减少总耗时。合桶的 bucket_cap_mb 默认是 25MiB,这对于绝大多数模型来说都是太小的。目前已经有提升这个默认值的特性需求,但是这个还是调一下更好。

梯度累加

当你做完所有操作之后,惊喜的发现 TMD 怎么同步时间还是单节点的好几倍。这其实是正常情况……实际上超过 256 卡的训练想要把通信盖掉就是一件不可能的事情。你说老师我看 FB 论文说他们 256 卡就是线性提升啊…那这里不得不提的一个策略就是梯度累加了。梯度累加会执行 k 次 forward+backward 之后再执行优化器步进。这有很多好处,首先对于大模型 batch size 通常不能开多大,梯度累加可以提升等效 batch size。其次累加期间的 backward 不需要通信梯度,加快了训练速度。

少即是快

Python 是一种很慢的语言。当然你说 JIT trace+torch.compile 有提升我也不反对,但对于最高效率来说,只有必须要存在的代码和不存在的代码两种。

抱抱脸的 Transformers 就是一个反例。两个子模块就能写完的 TransformerLayer 他们硬是能写出来一堆…偏偏他们还信奉 Single Model File Policy……我寻思你这完全不考虑继承的封这么多层是要搞鸡毛啊?正例反而是 PyTorch……(笑死,我竟然会夸脸书代码写得好。具体来说就是 nn.functional 当中的各种实现。你会发现他们第一行往往是 handle_torch_func。熟悉 Python 装饰器的小伙汁通常要问了,为啥这里不用个装饰器统一一下?因为装饰器会引入额外的函数调用,额外的函数调用就是额外的上头。

因此,如果你想确保最高的效率,写一个简单的训练代码和模型代码非常重要。毕竟,1%的效率提升,节省的可能是数百个 GPU 日。

如何平稳训练

这一段当中中咱们只讨论你能控制的问题。

捕捉不致命的异常

故障率高的问题其实很好解决。在训练当中,大部分异常都是非致命异常,接住他们就好了。我之前写过一个装饰器,catch,它的作用就是接住异常,然后调回调函数(默认当然就是把错误打印到 log 里)。所有你需要做的只是使用它来装饰所有非 fatal 的操作。

在实际应用当中,我们遇到的最常见的问题是存 ckpt 写满了磁盘(不准笑,从商汤到上海 AI Lab,这个问题在哪儿都日常出现。咱也不知道为啥肯买那么多显卡但不肯多插点儿硬盘,咱也不敢问)。接住所有保存操作,如果你有闲心可以在回调里删一下之前的 ckpt。没闲心的话…大不了重训一次嘛(逃。)第二常见的问题,你猜对了……存 log 写满了硬盘……所以所有 logging 操作也都是要 catch 的。这就是为啥我都用 tmux 然后开很长的缓存窗口,总是能抢救一些 log 出来的。

咳咳,说点儿正经的。任何联网操作都是需要 catch 的,常见的联网操作主要包括从 ceph 读取数据和…写 log 到远程(逃。其他就没啥了吧,我见过有大哥尝试恢复 OOM 的,但效果似乎不是很好,至少我自己没用过。简单来说,唯一不应捕捉的错误是集群炸了。

那有的大兄弟就说了,集群没爆炸,但是有两张卡突然掉了咋办。这个咱第三部分再讨论。

管好模型的输出

模型训着训着发散了几乎是每个训大模型的人都会遇到的问题。输出和 loss 只要有 nan 果断丢掉。梯度先 clip by value 再 clip by norm 都是常规操作。哦对了,还有初始化……关于大模型收敛性的论文有一堆,此处不再赘述。

比更大,还更大,再更大

弹性训练

实际上当你的训练超过 2048 个 GPU 日时,在整个训练过程当中发生单个 GPU 甚至单个节点下线是再正常不过的事情了。

PyTorch 在 1.10 就引入了 torchelastic 弹性训练机制。这个东西,用过的都骂娘。等下,让我先骂一遍。呸。ok 咱们继续吧。

我印象当中在微软的最后一轮面试当中被问到了这个问题:如何设计一个弹性分布式系统。

我的回答很教科书。每 k 分钟,系统会做一次 AllGather 来统计存活进程数,然后选举出一个主进程。主进程会计算好每个进程的 rank 和 local rank 然后广播给各个进程。所有进程每次前向传播开始时向主进程发送一个心跳包来汇报状态。主进程会根据心跳包来确定这一个 step 参与同步的机器有多少。

但很可惜,2024 年了。还是没人去写。他妈的。

层次化梯度同步

我一直认为梯度同步不应该以 GPU/进程为单位。而应该分为大同步(节点间同步)和小同步(节点内同步)。小同步可以更高频的进行,大同步则可以更慢的执行。这样不仅能提高实际的梯度同步频率,降低同步总耗时,并且还能天然的去结合小 batch 和大 batch 训练的优点—节点内小 batch 关注个体,节点间大 batch 关注整体。

有没有发现所有东西都很简单?
是这样的,千卡训练是任何一个普通CS本科生花三个月就能学会的东西。没有任何复杂的地方。

延伸阅读

PyTorch DDP 设计笔记

PyTorch 微调菜谱

分析与优化使用 PyTorch 训练机器学习模型

使用 Nsight Systems 来分析 GPU 负载

DLProf

NVProf

NCCL AllReduce 设计

Spike No More

Understanding the difficulty of training deep feedforward neural networks

高赞回答2:关于千卡训练的难度分析

千卡,其实是个相对模糊的概念,对于多数人而言,这就跟你告诉你,我有1兆资产和10兆资产一样,你只知道很多很多,但是完全傻傻分不清楚,这到底是多少,能买多少东西。千卡,也是一样。按照常见的一机8卡GPU的类型来看,用过125台机器训练的,就算得上是千卡了。从这个角度上说,其实门槛也没有那么那么的高。可事实呢?真正的大模型要用多少机器训练?答案是远超千卡 —— 看看下面的GPT-4信息,这是千卡吗?比万卡还要多!!!

How much compute was used to train GPT-4?
2.15e25 floating

Some key facts about how this enormous model was trained: Used 25,000 Nvidia A100 GPUs simultaneously. Trained continuously for 90–100 days. Total compute required was 2.15e25 floating point operations.Sep 27, 2023

另外,从根本上说,千卡训练是一个复合体。很多时候,大家就知道一件事,“牛逼”,除了知道喊666之外,就少有了解到底牛逼在哪里。以至于说,觉得非常的高大上。我可以这么说一句,千卡及其以上的训练对于绝大多数人和企业而言,这就是个屠龙术 —— 除了某些个,用手指头数的出来的地方,别的地方完全没有这样的需求,也没有这样的资源来进行千卡训练。这是什么意思?意思就是。如果真有这样经验的人,流了出来,大概率很难对口的找工作,因为他在千卡集训中的训练经验和工程实践,大概率根本别的地方用不上。另一层意思是,如果你只是个一般人,那你想想就得了,就跟你可以意淫下某个自己喜欢的明星,但别真去追求,真要去了,你大概是连榜一大哥的待遇都不会有,注定了人财两空。我当然知道有人会说,那难道流出来的人,不能去那几个指头数的出来的地方吗?可以的,但是别着急,你们往后面看就知道了 —— 去还是能去的,但是如果他不是跟着大佬一起跑,到了新地方他们真不见的能继续干。

再来说说,千卡训练是个什么复合体 —— 至少是,科学,工程和人情世故。先看大模型训练中的任务怎么从“量变到质变”的 —— 任何一个小规模训练上的问题,放大几百几千倍之后,都有可能成为不可忽视的问题。比如,数据预处理,小的时候,你也许完全不在意,这到底是多少个毫秒搞定的。但是,如果你现在有上百T的数据要处理,手一抖,写个不那么高效的算法,多处理个几天,甚至几周都有可能。当然,更可怕的就不是慢,而是坏了 —— 一个小bug可以坏了整条pipeline。有的时候,你甚至都不能说是bug,但是反正不爽就是了。比如,两个人写预处理,一个人把图片弄成了BGR,一个弄成了RGB —— 又不是不能用,但是就是膈应人;又比如,数据原图太大了,要统一缩放,然后有人做的时候直接就缩成了方形,然后呢?我们之后需要的模型要正常长宽比的数据又该怎么办呢?再来一次嘛?再搞两个礼拜?你说这是个什么问题?可以看成是科学,当然也可以看成是工程的一部分,这两个就是紧密结合在一起的,单单你会调模型,在这个千卡训练的事情上,你是玩不转的。因为很多问题卡脖子的问题,根本就是,或者大概率是工程问题 —— 什么网络通信,什么磁盘空间,什么读取速度,什么数值稳定,小规模的时候,你都可以不用管,想怎么搞怎么搞,怎么搞可以怎么有。可是上了规模之后,很多东西都被限定死了,根本不是你想怎么干就能怎么干的。我说的这个话,大概很多用pytorch+cuda的朋友也不见的认同,毕竟这套组合下,没有太多技术支持的团队也干成了这样的事情。但是,这背后是因为,使用能支持这样训练的云服务本身就意味着,付了更多的钱,在已经白嫖了nvidia一波的前提下,外加meta(pytorch),外加微软(deepspeed),外加……,又变相雇佣了一个专门的支持团队。但是,这些都不改变一个事实 —— 那就是,这都是你跟着前人的脚步前进,有人替你已经把这条路上的坑,踩的差不多了。可是,如果你要做些原创性的工作呢?必然是会遇到很多前人都不会有的问题。

多说一句,也许有人会说,“我不关心别的,我就只关心pytorch+cuda下,做训练的经验”。那我告诉你,这本质上这跟你单机单卡训练就不应该有什么不一样,跟是不是pytorch,用不用cuda都没什么大关系 —— 你想想最理想情况下,这是不是就应该跟单机单卡训练一样么,无非就是现在的这个“单机”的GPU内存是所有的机器GPU内存的总和,能让你用一个更大的batch size和学习率。至于,GPU内部怎么通信,数据怎么通信,各个机器怎么通信,gradient传播怎么实现,需要你这个训模师知道吗?你在单机单卡的时候都不用知道,在单机多卡的时候不用知道,在小规模分布式训练的时候不用知道,那为什么到了千卡的时候,你就应该知道了?理想情况下,就算到了百万卡,也不用做建模的你去知道这里的各种工程实践。

那千卡训练到底难在哪里了?首先,就是难在之前提及的工程上面了 —— 简单假设一个卡在一天内不挂掉的概率是p,那么现在现在千卡同时一天内不挂掉的概率是多少?算算你就知道,对于p^1000,其实有机器挂掉才是正常的。如果是万卡呢?你可见的是,机器N越多,p^N就越小,这个事情就是越难。有人要说“我单机训练的时候,几年都遇不到问题,老黄的GPU稳定的一塌糊涂。”对此,我也只有呵呵,没人告诉你训练不下去都是GPU的问题。你大概是选择性忘记了各种自己训练中遇到的事情 —— 比如,上次实验中断,GPU进程没杀干净,还占着内存;和人共享的服务器上,有个卧龙觉得你训练的时候CPU占用率低了点,给你加了点任务;好巧不巧,默认的缓存地址没地方了,包装不上了,预训练模型下不来了…… 说这么多看似和训练无关的事情是因为,所有这些都要能自动化,因为里面有一个地方翻车了,你训练就进行不下去了。通信连不上,磁盘满了,遇上了奇葩的GPU,IO巨慢 …… 不管什么原因挂掉了,关键的是之后应该怎么办?有没有可能对这个出问题的机器进行热替换?怎么办才能最大程度不影响训练进程?怎么样才能在下次避免同样的问题。当然,实际情况可以更加复杂,GPU不见的是同批次的,模型也可以大到,哪怕在A100上也只能这个机器放一部分,那个机器放一部分……

但是也别误解,以为千卡训练,就对训模师而言,其实没什么挑战。这样的理解显然是错的。这对训模师的实操来说,肯定是一个巨大的挑战。完全是拿着卖白菜钱(想想你年薪才多少,算你年薪百万好了),操着卖白粉的心(这千卡训练要花多少钱?你年薪都不够它的一个零头)。因为这机器一开,实在是太烧金了。而且可见的是,你必然是要去debug的 —— 为什么小模型的时候,训练的挺好的,一变大就翻车了?或者说,虽然没翻车,但是为什么性能就涨了一丢丢?或者为什么前面训练挺稳定的,到了后面的loss curve就会有很大的spike?有经验的训模师能更早,更快的发现问题。也能更快和更好的解决问题。很多时候,也真不见的看log就能看出来点啥的,看数据,看gradient的大小分布,和其他模型的训练进行记录做比对,甚至做可视化,都是很有必要的。而这所有的一切,都需要你很有经验 —— 同样的log,有人就能一眼看出来问题在哪里,有人就只能对着发呆,或者机械性的说“换一组参数再试一下”。同样觉得可能哪里有问题,有人就能知道应该来验证这个猜想是对是错,有人就只能天马行空的给出一堆,谁也不知道对不对的原因。所以,一旦这条路线被摸索出来之后,其实也就没什么难度了 —— 数据,脚本,机器都在那里了,我就问你,我在服务器上run那条千卡训练命令,跟你run的能有什么不同?所以,真正的关键不是在于有没有用过千卡GPU训练过模型,而是有没有从头至尾,一路披荆斩棘的自己淌出来一条可重复的模型技术路线!!

当然,如果你要以为,这事情就只是技术,那也是太年轻了点。机器一开,要多少钱,这账真要算准从训模师的角度说是很难的,毕竟具体价格都是大公司之间协议的,属于商业机密,但是估算个大概的数目不难。按照aws的p4d算(8卡A100,见下图),便宜的算法,千卡训练一个月,需要花费 $11.57/每台小时*24小时/天*125台*30天 = $1,041,340;按照阿里云的算法,单卡年费¥170533.8,也就是¥19.47每小时,但是算上多卡的费用,这实际上比上面aws的价格更贵。当然,你也许能用更便宜的价格拿到机器,比如别找这么大的云服务平台,找个小的,但是再少还能少多少,算打5折,这都是50多万美刀,350多万人民币一个月。要知道,这可是训练一次的价格哦。一个能用的模型背后,可是5x,甚至10x更多的不能用模型哦,所以烧个几千万,真跟玩一样。

正是因为这么贵,所以也同样表明了,为什么一定要找有经验的训模师 —— 你要知道,你自己的每个实验决定,都是变相的花出去十几,几十甚至上百万的美金。早发现问题,早停下来;早解决问题,早开始;知道怎么偷懒,什么样的ablation study可以跳什么必须做,什么时候可以用小模型替代,什么时候可以用一个老的checkpoint来个jump start,什么时候直接白嫖论文上的结论就行……,所有这些都和花多少钱才能把这个事情办了,输出一个达标的模型,直接相关 。相反的,万一你要找个拉垮的训模师,前面不知道怎么计划,代码不知道怎么验证,训练起来了不懂怎么有效监控,有了异常不知道如何排除,……,最后都要靠着模型训练全完了之后做evaluation才知道行不行的那种。那么就算预算全花完了,什么都没有训练出来,我也没有什么好奇怪的。

铺垫这么多,终于可以来谈谈最后一个层面 —— 人情世故了。你看,千卡训练这个事情,有这么大的风险翻车,要花这么多的预算,那么现在问题来了,你要是部门领导,你让谁来干这个事情?哦,你想放权给下面的经理,让他来找人?又或者找个刚来的博士?找个顶校+顶会的博士?不管你怎么找,可问题是,你就这么信得过他吗?你怎么保证他,能干这个,能干好这个,不会中途跑路,不会磨洋工…… 要知道,这样大的项目和预算,如果要真干塌了,不说整个部门要一起完蛋,至少这一条线的人员必然是要担责的,哪怕是主要领导也跑不掉。所以喽,关键的关键是,你必须找自己信的过的人,还要找确实有能力可以担当重任的人 —— 真正最后来干这个千卡训练的人,不但自己技术要过硬,更是团队的中坚力量,至少也要得到一两个大头目的支持,而且还要得到小头目支持。你再牛逼,没信任没大佬支持,这事情不说完全不可能,也是基本没可能。你再牛逼,要是真的小头目给你上眼药,比如,跟上面吹风,“好像看见你在看招聘网站”,你想大头目心里会不会有阴影?所以,别给我扯什么,老子有多少顶会顶刊,老子导师是谁谁谁,这在绝大多数情况,都不好使。所以,刚毕业的,或者做实习的,或者刚工作的,如果宣称自己有这个经验,就是一眼丁真。因为上面是绝对不会找不信任的人来这样重要的工作,这跟你有没有相关的工作经验无关。这同样意味着,真正干这些事情的人也很难流出来 —— 因为对于嫡系来说,加薪升职,在干好了的前提下,那还不都是so easy吗?所以,是你,你愿意出来吗?出来了,就算你牛逼,但是获取信任,成为嫡系也要一个时间,不是吗?

Qwen2-Audio:让LLM 拥有“耳朵”

Qwen2-Audio-7B 🤖 🤗  | Qwen-Audio-7B-Instruct 🤖 🤗  | Demo 🤖 | 🤗 

论文链接https://arxiv.org/abs/2407.10759

代码链接github.com/QwenLM/Qwen2-Audio

Qwen2-Audio作为一个大规模音频语言模型,Qwen2-Audio能够接受各种音频信号输入,并根据语音指令执行音频分析或直接响应文本。我们引入两种不同的音频交互模式:

  • 语音聊天:用户可以自由地与Qwen 2-Audio进行语音交互,无需文字输入;
  • 音频分析:用户可以在交互过程中提供音频和文本指令进行分析;
  • 多语言支持:该模型支持超过8种语言和方言,例如:中文、英语、粤语、法语、意大利语、西班牙语、德语和日语。

Qwen 2-Audio是一个大规模的音频语言模型,它能够接受各种音频信号输入,并对语音指令进行音频分析或直接的文本响应。与复杂的分层标签相比,我们通过利用不同数据和任务的自然语言提示简化了预训练过程,并进一步扩大了数据量。我们提升了Qwen 2-Audio的语音追踪能力,并实现了语音聊天和音频分析两种不同的音频交互模式。在语音聊天模式下,用户可以自由地与Qwen 2-Audio进行语音交互,无需文字输入。在音频分析模式下,用户可以在交互过程中提供音频和文本指令进行分析。请注意,我们不使用任何系统提示来在语音聊天和音频分析模式之间切换。 Qwen 2-Audio能够智能地理解音频中的内容,并按照语音命令做出适当的响应。例如,在同时包含声音、多说话者对话和语音命令的音频片段中,Qwen 2-Audio可以直接理解命令并提供对音频的解释和响应。

Qwen2-Audio、Qwen-Audio 以及之前 LALM 顶级产品的性能,例如 SpeechT5 、SpeechNet、 SpeechLLaMA、SALMONN、Whisper、Pengi,和 SpeechVerse。 我们展示了 10 个数据集的测试集结果,涵盖自动语音识别 (ASR)、语音到文本翻译 (S2TT)、语音情绪识别 (SER)、声音分类 (VSC) 和指令跟踪基准。 ASR 数据集(例如 Librispeech 和 Aishell2)的结果参考 1 – WER%。 CoVoST2的结果是七个翻译方向(en-de、de-en、en-zh、zh-en、es-en、fr-en和it-en)的平均BLEU得分。 AIR-Bench 聊天基准测试的结果包含四个维度:语音、声音、音乐和混合。 每个维度的分数由 GPT-4 自动评估,值范围为 0 到 10。 Qwen2-Audio 无需任何针对特定任务的微调即可实现卓越的性能,超越了同类产品。
图2:Qwen2-Audio的三阶段训练过程概述。

介绍

音频是人类和其他生物之间互动和交流的重要媒介,承载着丰富的信息内容。 全面理解各种形式的音频信号对于实现通用人工智能 (AGI) 至关重要。Qwen2-Audio主要重点是增强其指令跟踪能力。 Qwen2-Audio 是一种大型音频语言模型 (LALM),旨在处理音频和文本输入以生成文本输出。 与之前的模型相比,Qwen2-Audio 显着扩展了训练数据集。 为了减少训练前和训练后阶段之间的差距,我们通过直接使用自然语言提示各种数据和任务来简化预训练过程,如下图所示。 遵循大语言模型(OpenAI,2023;Qwen,2023)的实践,我们进一步进行指令调优和直接偏好优化,使模型的输出与人类偏好保持一致。

Qwen2-Audio 以两种不同的模式运行:音频分析语音聊天。 这两种模式从功能上有所区别,但用户在使用过程中无需区分。 在音频分析模式下,用户可以利用Qwen2-Audio来分析多种音频类型,包括语音、声音、音乐或各种混合音频形式。 命令可以通过音频或文本发出,Qwen2-Audio 将自动识别音频中的命令片段。 相反,在语音聊天模式下,用户可以与 Qwen2-Audio 进行交互,就好像它是一个会话代理一样,进行不受限制的对话。 提供音频交互,用户可以随时切换到文本交互。 例如,如果用户输入一个音频剪辑,其中初始部分是键盘打字的声音,然后用户询问“这是什么声音?”在口语中,Qwen2-Audio 预计会直接回复“这是键盘的声音”。

方法

模型架构

Qwen2-Audio的训练过程如图2所示,其中包含音频编码器和大语言模型。 给定配对数据(𝒂,𝒙),其中𝒂和𝒙表示音频序列和文本序列,训练目标是最大化下一个文本词符的概率为:

以音频表示和先前文本序列 𝒙<t 为条件,其中 θ 和 ϕ 分别表示大语言模型和音频编码器的可训练参数。

与Qwen-Audio不同的是,Qwen2-Audio的音频编码器的初始化是基于Whisper-large-v3模型。 为了预处理音频数据,我们将其重新采样到 16kHz 的频率,并使用 25ms 的窗口大小和 10ms 的跳跃大小将原始波形转换为 128 通道梅尔频谱图。 此外,还合并了步长为 2 的池化层,以减少音频表示的长度。 因此,编码器输出的每一帧大约对应于原始音频信号的 40ms 片段。 Qwen2-Audio 仍然采用大型语言模型 Qwen-7B 作为其基础组件。 Qwen2-Audio的总参数为8.2B参数。

预训练数据集的统计(小时)。

预训练

在预训练阶段,我们用自然语言提示替换分层标签。 如图2所示。 我们发现使用语言提示可以提高更好的泛化能力和更好的指令跟随能力。

有监督微调

Qwen2-Audio的彻底预训练使模型对音频内容有了全面的理解。 在此基础上,我们采用基于指令的微调技术来提高模型与人类意图保持一致的能力,从而形成交互式聊天模型。 我们的初步研究强调了 SFT 数据的质量和复杂性对模型性能的关键影响。 因此,收集了一组精心策划的高质量 SFT 数据,并实施了严格的质量控制程序。

我们考虑两种不同的人类互动模式:

  • 音频分析:在音频分析模式下,用户可以灵活地让 Qwen2-Audio 分析各种音频。 用户指令可以通过音频或文本给出。该模式常用于音频文件的离线分析。
  • 语音聊天:在语音聊天模式下,鼓励用户与Qwen2-Audio进行语音对话,提出各种问题。 请随意将其视为您的语音聊天助手。该模式常用于与 LALM 的在线交互。

为了一致性和模型统一性,两种交互模式都经过联合训练,用户在使用过程中不会出现模式差异化,也无需使用单独的系统提示在不同模式之间切换。 两种模式在实际使用中是无缝结合的。

直接偏好优化(DPO)

我们采用 DPO (Rafailov 等人, 2024) 来进一步优化模型以遵循人类偏好。 通过获取带有三元组数据(𝒙,𝒚𝒘,𝒚𝒍)的数据集𝒟,其中𝒙是带有输入音频的输入序列,𝒚𝒘和𝒚𝒍 分别是人工注释的好响应和坏响应,我们对模型 𝒫θ 进行如下优化:

其中𝒫ref表示用𝒫θ初始化的参考模型,σ表示sigmoid函数,β是超参数。 图2说明了Qwen2-Audio的三阶段训练过程。

实验

在实践中,我们发现之前的许多测试数据集都非常有限,无法充分反映现实场景中的性能,例如一些SLU(口语理解)和SER(语音情感识别)数据集。 因此,我们主要直接在AIR-Bench上评估性能。 我们发现 AIR-Bench 的分数更符合实际的用户交互体验。 同时,为了评估Qwen2-Audio的通用理解能力,如表1所示,我们仍然进行了涵盖各种任务的综合评估,即自动语音识别(ASR)、语音识别-文本翻译(S2TT)、语音情感识别(SER)、语音分类(VSC)。 评估是在 13 个数据集上进行的。 评估数据集被严格排除在训练数据之外,以避免数据泄露。 我们比较的模型包括开源模型和可调用的 API,例如 Gemini。

表2:自动语音识别 (ASR)、语音到文本翻译 (S2TT)、语音情绪识别 (SER)、声音分类 (VSC) 和 AIR-Bench 聊天基准测试的结果。 请注意,对于 Qwen2-Audio,Fleurs 的结果是零样本,而 Common Voice 的结果不是零样本。

案例:

结论:

在本文中,我们提出了 Qwen2-Audio,它建立在 Qwen-Audio 分析各种类型音频的能力之上,同时还被赋予了语音交互能力。 在预训练阶段,我们针对不同的数据和任务利用自然语言提示,进一步扩大了数据量。 在SFT阶段,我们通过提高SFT数据的数量、质量和复杂性来增强Qwen2-Audio与人类交互的一致性,从而实现无缝的语音和文本交互。 此外,我们还通过 DPO 阶段提高了 Qwen2-Audio 的响应质量。 在不同基准上测试的客观指标证明了 Qwen2-Audio 在音频理解和对话能力方面的熟练程度。 论文中的案例也说明了Qwen2-Audio流畅灵活的语音交互能力。

补充:语音/文本嵌入融合

Qwen-audio-chat模型如何将音频特征与文本提示无缝融合,通过特征编码、位置标记和信息整合,提升模型的跨模态理解能力。

系统会提取音频的特征,然后对文本提示进行嵌入(Embedding)处理。具体来说,它通过将音频特征转换成一个三维向量(如[1,56,4096]),并将这个向量嵌入到文本提示中。例如,考虑到一个文本提示信息,其中包括标记转换为ID的过程,随后是与音频特征的结合,即在文本中通过和标签指明音频的开始与结束位置。

在融合过程中,系统通过ID定位到这些标签所代表的位置,并用音频特征向量A替换掉文本提示中的“Audio_path/audio_name.flac”相对应的向量表示。这样,音频特征就被有效地融合到文本提示中,形成了一个语言模型能够理解的向量表示。

 // A code block
     <|im_start|>system
    You are a helpful assistant.<|im_end|>
    <|im_start|>user
    Audio 1:<audio>Audio_path/audio_name.flac</audio>
    what does the person say?<|im_end|>
    <|im_start|>assistant

代码实现:

// An highlighted block
bos_pos = torch.where(input_ids == self.config.audio['audio_start_id'])
eos_pos = torch.where(input_ids == self.config.audio['audio_start_id'] + 1)
audio_pos = torch.stack((bos_pos[0], bos_pos[1], eos_pos[1]), dim=1)
if audios is not None:
	for idx, (i, a, b) in enumerate(audio_pos):
	     hidden_states[i][a : b+1] = audios[idx]
	output_shape = input_shape + (hidden_states.size(-1),)

LLaMA-Omni 开源语音交互大模型

LLaMA-Omni是基于Llama-3.1-8B-Instruct构建的低延迟、高质量的端到端语音交互模型,旨在实现GPT-4o级别的语音功能。

HF链接https://huggingface.co/ICTNLP/Llama-3.1-8B-Omni

论文链接https://arxiv.org/pdf/2409.06666

代码链接https://github.com/ictnlp/LLaMA-Omni

总的来说,LLaMa-Omni的训练方法第一阶段类似Qwen2Audio模型,都是用whisper large作为音频编码器,“输入文本-语音特征-文本”的输入,输出文本,用于训练LLM和 Speech Adaptor 。第二阶段,为了将文本输出转成语音输出,固定LLM和 Speech Adaptor, 用 LLM输出的隐藏状态作为输入,生成与语音响应对应的HUBERT离散单元序列,然后使用该序列合成语音。缺点:hubert token合成的语音生硬、缺乏声学信息,后续可以替换为WavTokenizer 或者 RVQ【encodec、soundsream】的方法合成带声学特征的语音。因为输出的是离散的hubert token,可以一边输出,一边流式合成语音。第一阶段本质上是让LLM拥有“耳朵”,第二阶段是让LLM能够”说话“。但一二阶段分离训练会不会导致第一阶段LLM学习到的都是一些语义知识,声学信息都损失掉了,这样的话即使在第二阶段替换不同的token方法也很难从LLM的输出中学习到声学信息。另外,在数据集的制作上,使用LJSpeech数据集训练了一个TTS,缺乏丰富的情感控制,后续可以考虑使用Seed-TTS /cosyvoice/SeedTTS 等情感可控的等语音合成方法来合成响应的音频。 对于LLM主干网络的选择,可以考虑使用Qwen2Qudio这样的经过音频预训练过的LLM模型和语音编码器作为主干,只需要对音频解码器进行第二步的解码器微调训练。

自从OpenAI推出了GPT-4o之后,它开启了语音交互大模型的大门。国内相继也有很多大公司和创业公司开始模仿它,计划推出自己的语音交互大模型。ChatGPT等大语言模型通常只支持基于文本的交互,而GPT4o的出现使得通过语音与LLM交互成为可能,按照极低的延迟响应用户的指令,并显著提升了用户体验。然而,开源社区在构建基于LLM的语音交互模型方面仍然缺乏探索。当前,实现与LLM的语音交互的最简单方法是通过基于自动语音识别(ASR)和文本到语音(TTS)模型的三段式级联系统,其中ASR模型将用户的语音指令转录为文本,TTS模型将LLM的响应合成为语音。然而,由于级联系统顺序输出转录文本、文本响应和语音响应,因此整个系统往往具有更高的延迟。   

为了解决这个问题,作者提出了LLaMA-Omni,这是一种新的模型架构,旨在与LLM进行低延迟和高质量的语音交互。LLaMA-Omni集成了预训练语音编码器、语音适配器、LLM和流式语音解码器。它消除了对语音转录的需要,并且可以直接从语音指令中以极低的延迟同时生成文本和语音响应。LLaMA-Omni在内容和风格上都能提供更好的响应,响应延迟低至226ms。此外,整个LLaMA-Omni模型仅需要在4个GPU上训练3天左右。

💪 基于Llama-3.1-8B-Instruct构建,确保高质量的响应。

🚀 低延迟语音交互,延迟低至226 ms。

🎧 同时生成文本和语音响应。

♻️ 仅️使用4个GPU,在不到3天的时间内完成训练。

语音交互大语言模型发展历程

SpeechGPT算法简介

  2023年,Dong Zhang, Shimin Li等人提出“SpeechGPT: Empowering large language models with intrinsic cross-modal conversational abilities”算法。本文提出了SpeechGPT,这是一种具有内在跨模态会话能力的大型语言模型,能够感知和生成多模型内容。通过离散语音表示,作者首先构建了SpeechInstruct,这是一个大规模的跨模态语音指令数据集。此外,作者采用了一种三阶段训练策略,包括模态适应预训练、跨模态教学微调和模态教学链微调。大量的实验结果表明:SpeechGPT具有令人印象深刻的能力,可以遵循多模态人类指令,并突出了用一个模型处理多种模态的潜力。

SALMONN算法简介

   2024年,Changli Tang, Wenyi Yu等人提出“SALMONN: Towards generic hearing abilities for large language models”算法。SALMONN是一个支持语音、音频事件和音乐输入的大型语言模型(LLM),由清华大学电子工程系和字节跳动共同开发。SALMONN可以感知和理解各种音频输入,从而获得多语言语音识别和翻译以及音频语音协同推理等新兴功能,而不是仅语音输入或仅音频事件输入。这可以被视为赋予了LLM“耳朵”和认知听觉能力,这使SALMONN朝着有听觉功能的通用人工智能迈出了一步。

Qwen2-audio算法简介

2024年7月,Yunfei Chu, Jin Xu等人提出“Qwen2-audio technical report”算法。作为一个大规模音频语言模型,Qwen2-Audio能够接受各种音频信号输入,并根据语音指令执行音频分析或直接响应文本。作者介绍了两种不同的音频交互模式:语音聊天 voice chat 和音频分析 audio analysis。语音聊天:用户可以自由地与 Qwen2-Audio 进行语音互动,而无需文本输入;音频分析:用户可以在互动过程中提供音频和文本指令对音频进行分析;作者已经开源了 Qwen2-Audio 系列的两个模型:Qwen2-Audio-7B和Qwen2-Audio-7B-Instruct。

LLaMA-Omni背景简介

 以ChatGPT为代表的大型语言模型(LLM)已经成为强大的通用任务求解器,它们能够通过对话交互帮助人们解决日常生活中的问题。然而,大多数LLM目前只支持基于文本的交互,这限制了它们在文本输入和输出不理想的情况下的应用场景。最近,GPT4o的出现使得通过语音与LLM交互成为可能,按照极低的延迟响应用户的指令,并显著提升了用户体验。然而,开源社区在构建基于LLM的语音交互模型方面仍然缺乏探索。因此,如何利用LLM实现低延迟和高质量的语音交互模型是一个亟待解决的重大挑战。    当前,实现与LLM的语音交互的最简单方法是通过基于自动语音识别(ASR)和文本到语音(TTS)模型的三段式级联系统,其中ASR模型将用户的语音指令转录为文本,TTS模型将LLM的响应合成为语音。然而,由于级联系统顺序输出转录文本、文本响应和语音响应,因此整个系统往往具有更高的延迟。

    相比之下,学者们相继已经提出了一些多模态语音语言模型,这些模型将语音离散化为标记,并扩展LLM的词汇表从而支持语音输入和输出。这种语音语言模型理论上可以直接从语音指令生成语音响应,而无需产生中间文本,从而实现极低的响应延迟。然而,在实践中,由于涉及复杂的映射,直接根据语音生成语音可能具有挑战性,因此通常会生成中间文本来实现更高的生成质量,然而这会牺牲一些响应延迟。

LLaMA-Omni算法简介

LLaMA-Omni由语音编码器、语音适配器、LLM和流式语音解码器组成。LLM用户的语音指令由语音编码器编码,然后由语音适配器编码,然后输入到LLM中。LLM直接从语音指令解码文本响应,而不首先将语音转录成文本。语音解码器是非自回归(NAR)流式传输Transformer,其将LLM的输出隐藏状态LLM作为输入并使用连接主义时间分类(CTC)来预测对应于语音响应的离散单元的序列。 在推理过程中,当LLM自回归生成文本响应时,语音解码器同时生成相应的离散单元。为了更好地适应语音交互场景的特点,我们通过重写现有的文本指令数据并进行语音合成来构建一个名为InstructS 2S-200 K的数据集。

 大量的实验结果表明,与之前的语音语言模型相比,LLaMA-Omni在内容和风格上都能提供更好的响应,响应延迟低至226ms。此外,整个LLaMA-Omni模型仅需要在4个GPU上训练3天左右,为未来高效开发语音语言模型铺平了道路。

图1:LLaMA-Omni可以根据语音指令同时生成文本和语音响应,响应延迟极低。

LLaMA-Omni组成和算法流程

图2:左:LLaMA-Omni的模型架构。右图:LLaMA-Omni的两阶段培训策略示意图。

如上图所示,左图展示了LLaMA-Omni的模型的整体架构。它由一个语音编码器、语音适配器、LLM和语音解码器组成。详细的步骤如下所述:

  • 首先,将用户的提问语音输入到一个Speech Encoder模块中执行语音编码操作,作者使用Whisper-large-v3的编码器作为语音编码器E;
  • 然后,将其结果送入一个Speech Adaptor模块中。为了使LLM能够理解输入语音,作者引入了一个可训练的语音适配器,它能够将语音连续特征表示映射到LLM的嵌入空间中;
  • 接着,将语言适配器的结果送入一个大语言模型中。作者使用Llama-3.1-8B-Instruct3,这是目前最先进的开源LLM。它具有很强的推理能力,与人类的偏好非常一致。
  • 最后,将大语言模型的结果经过上采样之后送入一个Speech Decoder模块中。为了在生成文本响应的同时生成语音响应,作者在LLM之后添加了一个流式语音解码器D。它由几个与LLaMA具有相同架构的标准Transformer层组成,每个层都包含一个因果自我注意模块和一个前馈网络。

右图展示了LLaMA- Omni的两阶段训练策略示意图。在第一阶段中,作者训练模型直接从语音指令中生成文本响应。具体而言,语音编码器被冻结,语音适配器和LLM使用方程中的目标Lllm进行训练。在此阶段,语音解码器不参与训练。在第二阶段,训练模型从而生成语音响应。在此阶段,语音编码器、语音适配器和LLM都被冻结,只有语音解码器使用目标Lctc进行训练。

Speech Encoder

使用Whisper-large-v3的编码器作为语音编码器 ℰ 。Whisper是一种基于大量音频数据训练的通用语音识别模型,其编码器能够从语音中提取有意义的表示。具体地,对于用户的语音指令 XS ,编码语音表示由 𝐇=ℰ⁢(XS) 给出,其中 𝐇=[𝐡1,…,𝐡N] 是长度为 N 的语音表示序列。我们在整个训练过程中保持语音编码器的参数冻结。

Speech Adaptor

为了使LLM能够理解输入语音,我们结合了一个可训练的语音适配器 𝒜 ,它将语音表示映射到LLM的嵌入空间中。我们的语音适配器首先对语音表示 𝐇 进行下采样以减小序列长度。具体地,每 k 个连续帧沿特征维度被沿着连接:

接下来, 𝐇′ 通过线性层之间具有ReLU激活的2层感知器,产生最终的语音表示 𝐒,非离散的特征 。上述过程可以形式化如下:

Large Language Model

我们使用Llama-3.1-8B-Instruct 作为LLM ℳ ,这是目前最先进的开源LLM。它具有强大的推理能力,并且与人类的偏好保持一致。提示模板 𝒫⁢(⋅) 如图3所示。将语音表示序列 𝐒 填充到对应于<speech>的位置,然后将整个序列 𝒫⁢(𝐒) 输入到LLM中。LLM最后,LLM自回归直接基于语音指令生成文本响应 YT=[y1T,…,yMT] ,并使用交叉熵损失进行训练:

Speech Decoder

对于语音响应 YS ,我们首先遵循Zhang等人将语音离散化为离散单元。具体来说,我们使用预训练的HuBERT模型来提取语音的连续表示,然后使用K均值模型将这些表示转换为离散聚类索引。随后,将连续的相同索引合并成单个单元,从而产生最终的离散单元序列 YU=[y1U,…,yLU],yiU∈{0,1,…,K−1},∀1≤i≤L ,其中 K 是簇的数目,并且 L 是离散单元序列的长度。离散单元可以用附加的基于单元的声码器 𝒱 转换成波形

为了与文本响应同时生成语音响应,我们在LLM之后添加了流式语音解码器 𝒟 。LLM它由几个标准的Transformer组成具有与LLaMA相同架构的层,每个包含因果自我注意模块和前馈网络。与Ma等人(2024 a); Zhang等人(2024 b)2024 a)类似,语音解码器以非自回归方式运行,将LLM输出的隐藏状态作为输入,生成与语音响应对应的离散单元序列LLM具体地,对应于文本响应的输出隐藏状态被表示为 𝐂=[𝐜1,…,𝐜M] ,其中

LLaMA-Omni算法实现细节

提示词模版

 上图展示了提示模板P。语音表示序列S被填充到与<speech>对应的位置,然后整个序列P(S)被输入到LLM中。最后,LLM直接基于语音指令自回归生成文本响应结果,整个过程使用交叉熵损失进行训练。

Training

如图2所示,作者采用两阶段训练策略为LLaMA-Omni。在第一阶段,作者训练模型直接从语音指令生成文本响应。具体而言,语音编码器被冻结,而语音 Adapter 和LLM使用公式(3)中的目标进行训练。在这一阶段,语音解码器不参与训练。在第二阶段,作者训练模型生成语音响应。在此阶段,语音编码器、语音 Adapter 和LLM都被冻结,只有语音解码器使用公式(5)中的目标进行训练。

Inference

在推理过程中,LLM 自动回归地生成文本响应。同时,由于作者的语音解码器使用因果注意力,一旦 LLM 生成一个文本响应前缀 ,对应的 upsampled 隐藏状态  可以被输入到语音解码器中,生成一个部分对齐 ,从而得到与生成的文本前缀对应的离散单元。

为了进一步实现语音波形的 Stream 合成,当生成的单元数量达到预定义的块大小  时,作者将这个单元段输入到 vocoder 中,合成一个语音段,然后立即播放给用户。因此,用户可以在等待完整文本响应生成完成之前开始听语音响应,确保低响应延迟,该延迟不受文本响应长度的影响。

此外,由于语音解码器使用非自回归建模,每个文本令元  对应的对齐  都在块内并行生成。因此,同时生成文本和语音的解码速度与仅生成文本的速度之间没有显著差异。

在推理过程中,LLM根据语音指令自回归生成文本响应。同时,由于其语音解码器使用因果注意力机制,一旦LLM生成文本响应前缀,相应的上采样隐藏状态就可以被馈送到语音解码器中生成部分对齐结果,这反过来又产生了与生成的文本前缀对应的离散单元。

    为了进一步实现语音波形的流式合成,当生成的单元数量达到预定义的块大小时,作者将该单元段输入到声码器中以合成语音段,然后立即向用户播放。因此,用户可以开始收听语音响应,而无需等待生成完整的文本响应,从而确保不受文本响应长度影响的低响应延迟。

INSTRUCTS2S-200K数据集构建细节

 为了训练LLaMA-Omni,作者需要利用由<语音指令、文本响应、语音响应>组成的三元组数据。然而,大多数公开的指令数据都是文本形式的。因此,作者通过以下步骤来基于现有的文本指令数据构建语音指令数据集。

步骤1–指令重写。由于语音输入与文本输入具有不同的特征,作者根据以下规则重写文本指令:1)在指令中添加适当的填充词(如“hey”、“so”、“uh”、 “um”等),来模拟自然语音模式。2) 将指令中的非文本符号(如数字)转换为相应的口语形式,从而确保TTS的正确合成。3) 修改说明,使其相对简短,不要过于冗长。作者利用Llama-3-70BInstruct4模型根据这些规则重写指令。

步骤2–响应生成。在语音交互中,来自文本指令的现有响应不适合直接用作语音指令响应。这是因为,在基于文本的交互中,模型倾向于使用复杂的句子生成冗长的响应,并可能包含有序列表或括号等非语言元素。然而,在语音交互中,简洁而信息丰富的回答通常是首选。因此,作者使用Llama-3-70B-Instruct模型根据以下规则生成语音指令的响应:1)响应不应包含TTS模型无法合成的内容,如括号、有序列表等。2)响应应非常简洁明了,避免冗长的解释。

步骤3–语音合成。在获得适合语音交互的指令和响应后,作者需要使用TTS模型将其进一步转换为语音。对于指令,为了使合成的语音听起来更自然,作者利用CosyVoice-300M-SFT模型为每条指令随机选择男声或女声。对于响应,作者使用在LJSpeech数据集上训练的VITS模型将响应合成为标准语音。

LLaMA-Omni算法性能评估

实验配置

训练数据集:

作者使用第3节中提到的InstructS2S-200K数据集(包含20万条语音指令数据)。为了提取对应目标语音的离散单元,作者使用了一个预训练的K-means分箱器9,它从HuBERT特征中学习了1000个簇。预训练的高保真GAN解码器用于将离散单元合成为波形。

对于评估数据,作者从Alpaca-Eval10中选择了两个子集:_helpful_base_和_vicuna_,因为它们的问题更适合语音交互场景。作者删除了与数学和代码相关的问题,总共得到199条指令。为了获得语音版本,作者使用CosyVoice-300M-SFT模型将指令合成为语音。作者将在以下章节中将其称为InstructS2S-Eval测试集。

模型配置:

作者使用Whisper-large-v3的编码器作为语音编码器,使用LLama-3.1-8B-Instruct作为LLM。语音 Adapter 对语音表示进行5倍下采样。语音解码器由2个与LLaMA相同的Transformer层组成,具有4096个隐藏维度、32个注意力头和11008个 FFN 维度,其中包含425M参数。上采样因子λ设置为25。对于输入语音编码器的最小单位块大小Ω,作者在主要实验中设置Ω=+∞,这意味着作者等待整个单位序列生成后再将其输入到语音合成器进行语音合成。在后续实验中,作者将分析如何调整Ω的值来控制响应延迟,以及延迟和语音质量之间的权衡。

训练全功能的LLaMA-Omni遵循两阶段的训练过程。在第一阶段,作者使用32个批量的语音 Adapter (speech adapter)和语言模型(LLM),训练3个周期,每次迭代32步。作者使用余弦学习率调度器,前3%的步骤用于 Warm up ,峰值学习率设置为2e-5。在第二阶段,作者使用相同的批量大小、步骤数和调度器训练语音解码器,但峰值学习率设置为2e-4。整个训练过程大约需要65小时,在4个NVIDIA L40 GPU上运行。

Evaluation

由于LLaMA-Omni可以根据语音指令同时生成文本和语音响应,作者评估模型在两个任务上的性能:语音到文本指令遵循(S2TIF)和语音到语音指令遵循(S2SIF)。作者使用贪心搜索以确保可重复的实验结果。从以下方面对模型进行评估:

为了评估模型遵循语音指令的能力,作者使用 GPT-4o对模型的响应进行评分。对于S2TIF任务,评分基于语音指令的转录文本和模型的文本回复。对于S2SIF任务,作者首先使用 Whisper-large-v3 模型将模型的语音回复转录为文本,然后像S2TIF任务一样以相同的方式进行评分。 GPT-4o 在两个方面给出评分:内容风格。 内容评分评估模型回复是否充分解决了用户指令,而风格评分评估模型回复的风格是否适合语音交互场景。详细说明可以在附录A中找到。

语音文本对齐为了评估文本响应和语音响应之间的对齐情况,作者使用Whisper-large-v3模型将语音响应转录为文本,然后计算转录文本和文本响应之间的Word Error Rate(WER)和Character Error Rate(CER)。作者将这些指标分别称为ASR-WERASR-CER

为了评估生成的语音的质量,作者使用了名为UTMOS11的Mean Opinion Score(MOS)预测模型,该模型能够预测语音的MOS分数以评估其自然度。作者将这个指标称为UTMOS分数。

响应延迟latency是语音交互模型的一个关键指标,它指的是从输入语音指令到语音响应开始之间的时间间隔,这对用户体验有显著影响。此外,当语音响应开始时,作者还计算出已经生成的文字数量,称为**#滞后词**。

Baseline Systems

作者将以下语音语言模型作为基准系统:

SpeechGPT 是一种支持语音输入和输出的语言模型。作者使用原论文中采用的连续模态 Prompt 进行解码,根据语音指令依次输出文本指令、文本响应和语音响应。

SALMONN (+TTS) 是一种能够接受语音和音频输入并作出文本响应的LLM,使其能够执行S2TIF任务。对于S2SIF任务,作者在SALMONN之后添加了一个VITS TTS模型,以分阶段方式生成语音响应。

Qwen2-Audio (+TTS) 是一种强大的通用音频理解模型,能够执行各种与音频相关的任务,包括S2TIF任务。作者还构建了一个Qwen2-Audio和VITS ConCat 的系统,以完成S2SIF任务。

主要结果

表1展示了在InstructS2S-Eval基准测试上的主要结果。首先,对于S2TIF任务,从内容角度来看,LLaMA-Omni相较于之前的模型有显著提高。这主要是由于LLaMA-Omni是基于最新的LLaMA-3.1-8B-Instruct模型开发的,利用其强大的文本指令遵循能力。从风格角度来看,SALMONN和Qwen2-Audio的得分较低,因为他们是语音转文本模型。他们的输出风格与语音交互场景不匹配,经常产生格式化内容并包含大量冗余解释。

相比之下,SpeechGPT作为语音转语音模型,实现了更高的风格分数。同样,作者的LLaMA-Omni也获得了最高的风格分数,表明在经过作者InstructS2S-200K数据集的训练后,输出风格已经与语音交互场景很好地对齐。对于S2SIF任务,LLaMA-Omni在内容和风格得分上都优于之前的模型。这进一步证实了LLaMA-Omni能够在简洁高效的方式下,有效地处理用户的指令。

此外,在语音与文本响应的对齐方面,LLaMA-Omni实现了最低的ASR-WER和ASR-CER分数。相比之下,SpeechGPT在将语音与文本响应对齐方面表现不佳,这可能是由于其顺序生成文本和语音的缘故。

级联系统的语音-文本对齐,如SALMONN+TTS和Qwen2-Audio+TTS,也是次优的,主要原因是生成的文本响应可能包含无法合成为语音的字符。这个问题在Qwen2-Audio中尤为明显,它偶尔会输出中文字符,导致语音响应中出现错误。相比之下,LLaMA-Omni实现了最低的ASR-WER和ASR-CER分数,表明生成的语音与文本响应之间的对齐程度更高,进一步验证了同时生成文本和语音响应的优势。

Case Study

    上图展示了该模型与多个不同模型(Qwen2-Audio、SALMOON、Speech GPT)针对输入指令(“我该如何把礼物包装整齐?”)的输出结果。通过观察与分析,我们可以发现:Qwen2 Audio的响应相当长,包括换行符和括号等无法合成语音的元素。SALMONN的回应也有点长。SpeechGPT的响应风格更适合语音交互场景,但其响应中包含的信息量较少。相比之下,LLaMA Omni给出的响应更详细、更有用,同时保持了简洁的风格,在语音交互场景中优于之前的模型。

语音质量和响应延迟之间的权衡

LLaMA-Omni 可以同时生成文本响应和与语音响应对应的离散单元。如第2.6节所述,为了进一步实现流形波生成,当生成的离散单元数量达到一定块大小Ω时,该块单元被输入到语音合成器中进行合成和播放。通过调整Ω的值,作者可以控制系统的延迟,其中较小的Ω对应较低的系统延迟。当Ω=+∞时,意味着在合成语音之前等待所有单元生成。同时,Ω的值也影响生成的语音质量。较小的Ω意味着将语音分割成更多段进行合成,这可能导致段与段之间的断续,可能降低语音的整体连贯性。

为了更好地理解Ω的影响,作者研究了系统的延迟、语音与文本响应的对齐以及不同Ω设置下生成的语音质量。如表2所示,当Ω设置为10时,系统的响应延迟低至226毫秒,甚至低于GPT-4o的平均音频延迟320毫秒。此时,语音响应在开始时平均滞后1.82个词。当Ω设置为无穷大时,延迟增加到约2秒。对于ASR-WER和ASR-CER指标,作者惊讶地发现,随着块大小的增加,错误率也增加。作者认为可能有两个原因。

  • 一方面, vocoder可能比长序列更可靠地处理短单元序列,因为它通常训练在较短序列上。
  • 另一方面,作者使用的ASR模型Whisper-large-v3具有很强的鲁棒性。即使语音与较小Ω的较小连续性,对ASR识别精度影响很小。

因此,作者进一步使用UTMOS指标评估生成的语音自然度。它显示,随着Ω的增加,语音的自然度提高,因为语音的不连续性减少。总之,作者可以根据不同的场景调整Ω的值,以实现响应延迟和语音质量之间的权衡。

Decoding Time

表3列出了不同模型在S2TIF和S2SIF任务上的平均解码时间。对于S2TIF任务,SpeechGPT需要先输出文本指令,然后输出文本回复,而SALMONN和Qwen2-Audio倾向于产生冗长的回复。

相比之下,LLaMA-Omni能直接提供简洁的答案,导致解码时间显著降低,每条指令的平均解码时间仅为1.49秒。对于S2SIF任务,SpeechGPT逐条输出文本和语音回复,导致解码时间比仅生成文本回复时大约延长6倍。相比之下,LLaMA-Omni同时输出文本和语音回复,并采用非自动回归架构生成离散单元。因此,总生成时间仅增加1.28倍,证明了LLaMA-Omni在解码速度上的优势。

客观指标性能评估

上表展示了该算法与多个SOTA算法在InstructS2S评估基准上的评估结果。首先,对于S2TIF任务,从内容的角度来看,LLaMA Omni与之前的模型相比有了显著改进。这主要是因为LLaMA Omni是基于最新的LLaMA-3.1-8BInstruct模型开发的,利用了其强大的文本指令跟踪功能。

从风格角度来看,SALMONN和Qwen2 Audio的得分较低,因为它们是语音转文本模型。它们的输出风格与语音交互场景不一致,通常会产生格式化的内容,并包含大量冗余的解释。相比之下,SpeechGPT作为一种语音对语音模型,其风格得分更高。同样,LLaMA Omni获得了最高的风格得分,这表明在该算法InstructS2S-200K数据集上训练后,输出风格与语音交互场景非常一致。    对于S2SIF任务,LLaMA Omni在内容和风格得分方面也优于之前的模型。这进一步证实了LLaMA Omni能够以简洁高效的方式通过语音有效地处理用户的指令。

摘自:https://mp.weixin.qq.com/s/pjCIJaGNyfWiwGwP03zMNg

WavTokenizer-突破语音表征瓶颈

突破音频语言表征的瓶颈! 1s音频仅需40个Token,就能够高质量重建音频

  论文:Wavtokenizer: An Efficient Acoustic Discrete Codec Tokenizer For Audio Language Modeling

  论文地址:https://arxiv.org/pdf/2408.16532

  Github地址:https://github.com/jishengpeng/WavTokenizer

  HuggingFace地址:https://huggingface.co/novateur/WavTokenizer

浙江大学,联合阿里通义语音实验室和Meta研究员发表了一篇题为“Wavtokenizer: An Efficient Acoustic Discrete Codec Tokenizer For Audio Language Modeling”的论文。该论文研究了如何将多码本(RVQ)语音声学编解码器模型简化为单码本(VQ)结构,它不仅在压缩率和重构质量上超越了现有的最先进Codec模型,在UTMOS主观感知质量等指标上实现了SOTA的性能,还在语义信息建模上取得了重要进展,极致的序列压缩将有效提升下游语音大语言模型/多模态大语言模型的建模能力。

背景动机:解决音频语言建模的瓶颈,迈向更高效的音频处理

在大规模语言模型快速发展的背景下,音频处理领域依赖于离散化声学编解码器模型将音频信号转换为离散token,使其能被语言模型处理。然而,当前的技术在以下几个方面存在显著的局限性:

  1. 压缩与重构质量的权衡:大多数现有模型(如DAC、Encodec)通过多量化器层的设计来提升音频重构质量,但这也增加了计算复杂性和资源消耗。例如,DAC模型在9个量化器层的条件下,每秒需要900个token来重构一秒音频。如此高的压缩比率和计算成本,使得下游应用和模型部署变得复杂且代价高昂。
  2. 缺乏语义信息的丰富表达:当前的声学编码模型大多专注于音频的重构,而未能有效捕捉和保留语音和音频中的语义信息这是重建任务和下游生成任务本身的训练gap。一些研究通过添加独立的语义模块来增强语义内容,但这通常需要多阶段的模型架构,增加了训练复杂度,并导致难以统一建模语音、音乐和其他音频数据。
  3. 单量化器模型的探索潜力:多量化器模型的复杂性推动了研究者对单量化器模型的探索,但在极端压缩条件下保持高质量重构仍是一个挑战。单量化器模型的优势在于更简单的架构和更低的计算成本,但如何优化矢量量化(VQ)空间以增强表示能力,并设计出避免重构伪影的解码器结构,依然是未解决的问题。

基于这些挑战,我们提出了 WavTokenizer。通过创新设计扩展VQ空间、优化解码器架构、扩展上下文建模窗口和引入多尺度判别器,我们的模型实现了极致的压缩效果,同时显著提升了音频重构质量和语义信息表达能力。这一工作不仅为音频语言建模提供了新方向,也在音频生成和理解的未来应用中展现出巨大潜力。

它与SOTA声学编解码器相比,在音频领域具有以下几个优点:

1)极限压缩。通过压缩量化器的层次和离散编解码器的时间维度,24kHz采样率的一秒音频仅需要具有40或75个令牌的单个量化器。

2)提高主观质量。尽管减少了令牌的数量,但WavTokenizer仍能以出色的UTMOS得分实现最先进的重建质量,并固有地包含更丰富的语义信息。 

实现细节:WavTokenizer的核心技术设计

图1:WavTokenizer和最先进的声学编解码器模型之间的比较。纵轴UTMOS表示更接近人类听觉感知的重构质量,横轴kbps表示音频压缩水平。圆圈的大小表示每秒离散令牌的数量。

为了突破当前音频语言建模中存在的压缩和重构质量瓶颈,我们设计了一个新的离散声学编解码器模型——WavTokenizer。它在音频压缩、重构质量和语义信息表达能力上实现了前所未有的平衡。

我们的模型建立在VQ-GANs框架上,遵循与SoundStream和EnCodec相同的模式。具体来说,WavTokenizer通过三个模块传递原始音频 X ,编码器模块、量化模块、解码器模块

1) 采用音频输入并生成潜在特征表示 Z 的全卷积编码器网络;

2) 用于生成离散表示 Z的单个量化器来离散化特征Z。

3) 一种改进的解码器,用于从压缩的潜在表示 Zq 中重构音频信号 X~ 。

该模型是端到端训练的,优化了在时间和频率域上应用的重建损失,以及在不同分辨率下操作的鉴别器形式的感知损失。

考虑到WavTokenizer被设计为大型音频语言模型的离散令牌表示,重点应该放在编解码器的主观重建质量(音频保真度)和语义内容信息上。在图1中,我们可视化了比特率和UTMOS度量之间的关系。我们可以观察到WavTokenizer仅用75个令牌就实现了最先进的重建质量。此外,它还探索了极端的压缩比特率,在0.48 kbps时达到了3.6的UTMOS分数。

编码器设计

跟Encodec设计类似,编码器模型由具有C个通道的1D卷积组成,并且核大小为7,随后是B个卷积块。每个卷积块由单个残差单元组成,该残差单元之后是由步长S的两倍的核大小的步长卷积组成的下采样层。残差单元包含两个核大小为3的卷积和一个跳跃连接.每当发生下采样时,通道数量加倍。卷积块之后是用于序列建模的两层LSTM和具有7个核大小和D个输出通道的最终1D卷积层。

扩展矢量量化(VQ)空间,提高码本利用率

在传统的声学编解码器模型中,矢量量化(VQ)空间的大小通常是固定的,这限制了模型对音频信号的表达能力。我们通过将VQ空间从 1024 扩展到4096,显著提升了模型对高维音频数据的压缩和表达能力。为了确保扩展后的VQ空间得到充分利用,WavTokenizer 采用了基于K-means聚类初始化和随机唤醒策略的优化方法。这种设计能够在保证较低码率的同时,维持高质量的音频重构效果,并且能够有效减少信息损失。

图2:WavTokenizer量化码本空间的可视化分析,图(a)说明了LibriTTS测试干净集上每个码本索引(1-16384)的概率分布。图(B)检查了不同码本空间上的重构质量和码本利用率之间的关系。

最初,在不改变任何结构的情况下,我们试图在训练期间仅依赖于单个量化器来进行重构,但发现结果不是最佳的。考虑到自然语言中巨大的词汇空间,我们假设将语音作为一种独特的语言来处理可能会产生更好的结果。因此,我们首先将码本空间从 210 扩展到 214 。我们对LibriTTS进行了585小时的训练,并在LibriTTS测试-清理数据集上可视化了码本的概率分布,如图2(a)所示。 我们观察到语音词汇空间集中在 212 的左侧,表明利用更大的 212 语音词汇空间的潜力。当前的编解码器码本 210 可能没有充分利用语音空间的潜力。

此外,扩展量化码本空间可能导致较低的利用率,

我们使用K均值聚类来初始化码本向量。我们将聚类中心的数量调整为200,以与较大的码本空间对齐。在训练期间,使用衰减为0.99的指数移动平均值来更新每个输入的所选代码,并且用从当前批次中随机采样的输入向量来替换对于若干批次未分配的代码。这种强制激活策略有助于确保大码本空间的有效利用。 如图2(B)所示,我们分析了码本利用率与重构结果的关系,确认了 212 是合适的,与图2(a)的结论一致,适当扩展相应的码本空间可以减少将分层RVQ结构压缩到单个量化器所带来的信息损失。语音可以在串行化量化器结构下有效地重构,其中 212 的码本空间实现利用率和重构质量之间的有利平衡。这表明了将语音与广泛的自然语言词汇对齐的潜力,通过标记器将其作为一种独特的语言进行强有力的映射。

改进的解码器架构:逆傅里叶变换、注意力机制与扩展的上下文窗口结合

传统的编解码器模型通常使用镜像卷积上采样的方法,但这容易产生混叠伪影,影响音频重构质量。为了解决这一问题,WavTokenizer 在解码器设计中基于Vocos模型,采用了基于逆傅里叶变换(iFFT)的方法。iFFT 能在所有深度上保持一致的特征分辨率,有效减少重构伪影,同时更精确地恢复音频信号。在解码器部分中,使用短时傅立叶变换(STFT)来表示目标音频信号 X~ 

此外,WavTokenizer 在解码器中引入了注意力模块,并设计了扩展的上下文窗口来增强语义信息的建模能力。研究表明,使用更大的上下文窗口(例如 3 秒)有助于捕捉更多的语义信息,提升模型对长音频序列的重构质量。这种方法能够更好地处理音频中的静音段,提高了重构结果的连贯性和自然度。通过将注意力网络与逆傅里叶变换结合,WavTokenizer 在极低码率下实现了高质量的音频重构。

将WavTokenizer的上下文建模窗口扩展到3秒,注意力模块将进一步改善训练过程中的编解码器重建。这可能是因为一秒钟的剪辑,包括沉默,可能包含不足的语义信息。增加上下文建模窗口大小有助于编解码器模型更好地捕获上下文。我们通过详细的消融研究验证了这些发现。在我们的实验中,我们还发现在WavTokenizer中引入注意力模块只对解码器有益。

多尺度判别器与复数STFT判别器的设计

为了进一步优化生成音频的质量,WavTokenizer 引入了多尺度判别器(MSD)和复数短时傅里叶变换(STFT)判别器。这些判别器能够在不同时间尺度和频谱范围内对生成的音频进行评估。模型使用了对抗性损失(adversarial loss)和特征匹配损失(feature matching loss)进行联合优化。与现有模型相比,这种创新设计能够更好地保留音频的细节信息和语义内容,提高了音频重构的主观质量。

端到端优化策略,实现高效压缩

WavTokenizer 采用了端到端的优化策略,同时考虑时间域和频率域的重构损失。与现有的多量化器层模型相比,WavTokenizer能够在单量化器条件下实现更高效的音频压缩。在 24kHz 采样率下,每秒音频仅需 40 或 75 个离散token,这大大减少了模型的带宽需求,同时保持了高水平的音频重构质量。

这些技术创新使得WavTokenizer能够在单量化器结构下实现音频的极致压缩和高质量重构,同时提供丰富的语义信息表达能力。我们相信,这一模型将为音频语言建模的未来应用提供新的可能性。

实验验证:WavTokenizer的卓越性能

为了验证 WavTokenizer 在音频语言建模中的实际效果,我们在多个数据集上进行了广泛的实验,涵盖了语音重构、语义信息评估和消融研究。结果显示,WavTokenizer 在多个指标上均优于现有的最先进模型,展现了其卓越的压缩效率、重构质量和语义表达能力。在LibriTTS测试集上的语音重构实验中,WavTokenizer-small在0.9 kbps的压缩率下,仅使用一个量化器和75个token,就实现了4.05的UTMOS得分,显著超越了使用9个量化器和900个token的DAC模型的3.91分。这一结果表明,WavTokenizer在极低码率下依然能够保持卓越的音频重构质量,接近人类听觉感知水平。相比于需要多个量化器的复杂模型,WavTokenizer在使用单一量化器、40个token的条件下,也展现出高效的压缩率和优异的重构效果,大大降低了计算成本。同时,在PESQ等感知语音质量指标上,WavTokenizer表现与多量化器模型相当甚至更优,进一步验证了其在单量化器设置下对音频质量的强大保持能力。

在语义信息评估方面,我们使用ARCH基准评估了WavTokenizer在不同音频任务中的表现。结果显示,WavTokenizer在情感语音、歌曲(RAVDESS)和口语理解(SLURP)等多领域任务中,表现优于使用更多量化器的Encodec和DAC,展现出卓越的语义捕捉能力。这一结果说明,WavTokenizer不仅能够在极限压缩条件下保持高质量的重构,还能在语义信息表达方面提供强大支持,为下游任务带来更高的应用价值。

为了深入研究WavTokenizer中各个模块的贡献,我们还进行了消融实验,验证了VQ空间扩展、上下文窗口长度的作用。实验结果表明,扩展VQ空间能够显著提高音频重构质量,从而验证了VQ空间优化对模型性能的关键作用;增加上下文窗口长度也有助于更好地捕捉语义信息,尤其是在处理长音频序列时表现突出。

通过这些实验,WavTokenizer 展现出在极限压缩率和长序列生成任务中的强大适应性和稳定性,证明了其在音频压缩、重构质量和语义表达能力方面的全面优势。这些结果不仅为音频语言建模提供了新的可能性,也为未来多模态大模型的音频处理与生成提供了一个更高效、更有潜力的解决方案。

进一步探索

由于训练成本较大,我们将在十月之前补充WavTokenizer-medium,WavTokenizer-large版本的实验结果,以及在audio和music领域codec重建性和语义丰富性的实验。同时将进一步探索WavTokenizer模型在下游生成任务例如text-to-speech和GPT-4o范式任务上的性能,并且补充更多的消融实验结果。

总 结

在本文中,我们提出了一个新的离散声学编解码器模型——WavTokenizer,旨在解决音频语言建模中压缩效率和重构质量之间的权衡问题。与现有的多量化器模型相比,WavTokenizer通过一系列技术创新,包括扩展矢量量化(VQ)空间、改进的解码器架构(结合逆傅里叶变换和注意力机制)、扩展的上下文建模窗口、多尺度判别器和复数STFT判别器的设计,实现了在单量化器架构下的高效音频压缩和高质量音频重构。实验结果表明,WavTokenizer在LibriTTS、RAVDESS、SLURP等多个数据集上的重构质量和语义信息表达方面,均优于当前最先进的模型。

通过对模型架构的改进和优化,WavTokenizer在保持高效压缩的同时,成功减少了模型的计算复杂性和带宽需求,在24kHz采样率下每秒音频仅需40或75个离散token。这一工作不仅验证了单量化器模型的可行性,还为音频生成和语义建模的未来发展提供了新的视角和方向。未来,我们计划进一步扩展模型的应用场景,探索WavTokenizer在更多下游任务和多模态数据处理中的潜力。

Soul语音大模型重磅升级:实时端到端语音通话 AI虚拟人堪比真人!

https://www.soulapp.cn/media/news/article-2

在国内“AI+社交”这条赛道上,Soul App即将利用AI注入了新的活力!

最近,Soul官方宣布其语音大模型再次升级,上线自研端到端全双工语音通话大模型

这次升级带来最惊艳的效果是,可以让用户和虚拟人之间的语音通话就像和真人聊天一样自然流畅!

那么,Soul自研端到端语音通话大模型到底有什么特别之处呢?

根据官方描述,其最大的亮点包括:

  • 具备超低交互延迟
  • 快速自动打断
  • 超真实声音表达
  • 情绪感知理解能力等

超低交互延迟能力意味着,你说话的那一瞬间,AI 就能立刻做出反应,没有任何的延迟,瞬间就能拉近你和 AI 之间的距离。想要和它进行真实的交流,根本不需要等待,简直就像在跟真人对话一样。

Soul 的语音大模型支持快速自动打断功能。也就是说,当你和 AI 交流的时候,如果你想插话,它完全能理解你的意思,轻松打断对方,这样的互动真是太有趣了!

再加上超真实的声音表达和情绪感知理解能力,AI 不仅能听懂你的话,还能感知你的情绪,根据情绪给予适当的的回应。

结合官方展示的视频示例,如果这个功能之后全量上线,估计有一大波用户在Soul上体验的时候,可能会连真人和AI虚拟人都傻傻分不清楚。

Soul方面表示,目前其端到端语音通话大模型已应用于“异世界回响”实时通话场景(内测中),并将在后续拓展至AI苟蛋等多个AI陪伴、AI互动场景

据了解,早在2020年,Soul已经启动了AIGC技术研发,专注于智能对话、语音技术、虚拟人等关键技术的研发,并把这些AI能力深度融入到社交场景中。

在用AI升级社交的过程中,Soul特别注重实现拟人化、自然化的情感陪伴体验。

为了给用户带来更好的情绪反馈和陪伴感,Soul技术团队一直在关注情绪理解和延迟问题。

社交平台Soul App(以下简称“Soul”)语音生成大模型上线,同时自研语音大模型“伶伦”正式升级,现阶段,Soul语音大模型“伶伦”包括了语音生成大模型、语音识别大模型、语音对话大模型、音乐生成大模型等,可支持真实音色生成、语音DIY、多语言切换、多情感拟真人实时对话等能力。目前,“伶伦”已应用于Soul “AI苟蛋”、站内狼人游戏“狼人魅影”AI语音实时互动、独立新产品“异世界回响”等场景。

Soul自研的端到端语音通话大模型上线了,意味着用户可以享受到更自然的人机交互体验。

在语音探索方面,Soul基于平台沉淀丰富且多风格的高质量公域语音数据,推出自研语音大模型“伶伦”,在深度融入站内“AI苟蛋”等场景提供多模态互动体验外,还推出了系列趣味社交玩法和活动。

如Soul于2023年上线了“Soul次元歌手”活动,帮助每个人打造自己的AI歌手分身,让很多热爱音乐但不一定会唱歌的人,也能实现“唱歌自由”;“懒人KTV”活动则在音色克隆的基础上,创新性实现多人UGC“AI合唱”。基于音乐模型个性化的创作能力,平台的“AI帮你出灵魂专辑“活动,使用户自由输入任意作曲的主题关键词,即可一键完成词曲创作。

此次,新升级的“伶伦”在训练数据规模和模型架构上均实现了拓展和创新,实现了更真实自然、更多样性和更细颗粒度的控制效果以及流式超低延迟的生成。特别是上线的语音生成大模型在多风格多情感可控、超自然人声生成、多语言切换等方面表现出色。

具体来说,在多情感可控上,“伶伦”能够实现对情绪的深度理解和模拟,在语音生成和对话中表现出不同情感;在声音颗粒度上,支持包括吸气、喘气、笑声、结巴/重复、咳嗽 、叹气、哭声等一系列副语言语音合成,声音效果更真实生动。

未来,Soul 还计划进一步推动多模态端到端大模型能力的建设,让人与 AI 的互动更加有趣、沉浸感更强。

ASR语音识别—N-gram 语言模型

最近在做ASR语音识别任务,基于阿里FunASR框架,特此记录下跟语言模型(LM)相关知识。

语言模型解码

传统基于CD-phone声学建模ASR系统解码器普遍采用HCLG构建解码网络,当前方案中paraformer声学模型直接对音素或字符建模,为此我们采用TLG(Token、Lexicon、Grammar)结构构建统一解码网络,直接将音素/字符序列[ paraformer声学模型 ]、发音词典、语言模型编译形成T、L、G三个wfst子网络,再通过composition、determinization、minimization等一系列操作生成统一解码网络。

我们借鉴EESEN方案,基于openfst/kaldi构建TLG解码网络编译pipeline,支持从原始语料和发音词典到最终解码资源的全流程编译,便于用户自行定制适合自身的解码资源。如下是TLG网络编译流程图。

为什么需要语言模型?

为什么有些句子比其他句子更 流畅(fluent),或者说 更自然(natural)
我们为什么关心这个问题呢?
因为在很多应用中,我们很关心语言的流畅性与自然性。
例如,在语音识别中,你听到一句话,并且想将它转换成文本,所以你需要区分这段语音可能对应的不同文本,并从中选择更加流畅和自然的版本。比如下面两个句子的发音很接近:recognise speech > wreck a nice beach,从流畅和自然的角度考虑,显然,左边的句子更有可能代表了讲话者的本意。而语言模型可以帮你做到这一点,它会告诉你 “recognise speech” 是人们更倾向表达的意思。

  • 那么,我们如何衡量这种 “优度(goodness)”(或者说流畅度、自然度)呢?
    我们用 概率 来衡量它,而语言模型提供了一种很自然的方式来估计句子的概率。
  • 在此基础上,一旦你构建了一个语言模型,你还可以用它来 生成(generation) 语言。

语言模型可以用于哪些任务呢?

  • 主要用于:
    • 语音识别(Speech recognition)
    • 拼写纠错(Spelling correction)
    • 查询补全(Query completion)
    • 光学字符识别(Optical character recognition)
  • 其他生成任务:
    • 机器翻译(Machine translation)
    • 概括(Summarisation)
    • 对话系统(Dialogue systems)

N-gram 语言模型

N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关(这也是隐马尔可夫当中的假设)。整个句子出现的概率就等于各个词出现的概率乘积。各个词的概率可以通过语料中统计计算得到。通常N-Gram取自文本或语料库。

概率:从联合概率到条件概率

我们的目标是得到一个由 m 个单词组成的任意序列(即一个包含 m 个单词的句子)的概率:

P(w1,w2,…,wm)

第一步是利用链式法则(chain rule)将联合概率转换成条件概率的连乘形式:

P(w1,w2,…,wm)=P(w1)P(w2∣w1)P(w3∣w1,w2)⋯P(wm∣w1,…,wm−1)

马尔可夫假设(The Markov Assumption)

目前,这仍然是一个比较棘手的问题,因为随着上下文的不断增加,我们构建的模型中将包含越来越多的参数。所以这里,我们采用一种称为 “马尔可夫假设” 的简化假设:某个单词出现的概率不再依赖于全部上下文,而是取决于离它最近的 n 个单词。因此,我们得到: P(wi∣w1,…,wi−1)≈P(wi∣wi−n+1,…,wi−1)

对于某个很小的 n:

  • 当 n=1 时,一个 unigram 模型:P(w1,w2,…,wm)=∏i=1mP(wi)在 unigram 模型中,我们假设一个句子出现的概率等于其中每个单词单独出现的概率的乘积,这意味着每个单词出现的概率之间相互独立,即我们并不关心每个单词的上下文。
  • 当 n=2 时,一个 bigram 模型:P(w1,w2,…,wm)=∏i=1mP(wi∣wi−1)在 bigram 模型中,我们假设句子中每个单词出现的概率都和它前一个单词出现的概率有关。
  • 当 n=3 时,一个 trigram 模型:P(w1,w2,…,wm)=∏i=1mP(wi∣wi−2,wi−1)在 trigram 模型中,我们假设句子中每个单词出现的概率都和它前两个单词出现的概率有关。

最大似然估计

我们如何计算这些概率?

非常简单,我们只需要一个大的用于训练的语料库(corpus),然后我们就可以根据语料库中各个单词的计数(counts),利用最大似然估计来估计该单词出现的概率:

  • 对于 unigram 模型:

其中,C 是一个计数函数,C(wi) 表示单词 wi 在语料库中出现的次数,M 表示语料库中所有单词 tokens 的数量。

  • 对于 bigram 模型:

其中,C(wi−1,wi) 表示单词 wi−1 和单词 wi 前后相邻一起出现的次数。

  • 对于 n-gram 模型:

同理,我们计算 n-gram 出现的次数,除以 (n-1)-gram(即上下文)出现的次数。

序列的开头和结尾表示

在我们进入例子之前,我们需要用一些特殊的记号表示一个序列的开始和结束:

  • <s> 表示句子的开始
  • </s> 表示句子的结束

Trigram 例子

现在,让我们来看一个玩具例子,假设我们有一个只包含两个句子的语料库。

语料库

可以看到,每个句子开头有两个起始标记,因为我们采用的是 trigram 模型。

我们希望知道下面的句子在一个 trigram 模型下的概率是多少?

说明

  • 首先,我们对要计算的句子的概率按照 trigram 模型拆分成条件概率的连乘形式。
  • 然后,对于等式右边的每一个条件概率项,按照 trigram 模型中的条件概率计算公式,分别统计 “当前单词连同它的上下文” 以及 “单独的上下文部分” 在语料库中出现的次数,并将两者相除,得到该项的计算结果。
    例如,对于上面等式右边第一个条件概率项,我们考虑句子中第一个单词 “yes” 及其相邻的 bigram 上下文 “<s><s>”:

可以看到,子序列 “<s><s>yes” 在语料库中只出现过 1 次;而子序列 “<s><s>” 在语料库中一共出现了 2 次,所以第一个条件概率项的结果为 12。其余各条件概率项的计算方式同理,另外请注意,在计算第四个条件概率项时,bigram 上下文 “nono” 在语料库中一共出现了 5 次。

N-gram 语言模型的一些问题

  • 语言通常具有长距离效应 —— 需要设置较大的 n 值
    有些词对应的上下文可能出现在句子中距离该词很远的地方,这意味着如果我们采用固定长度的上下文(例如:trigram 模型) ,我们可能无法捕捉到足够的上下文相关信息。例如:The lecture/s that took place last week was/were on processing.在上面的句子中,假如我们要决定系动词 be 是应该用第三人称单数形式 was 还是复数形式 were,我们需要回头看句子开头的主语是 lecture 还是 lectures。可以看到,它们之间的距离比较远,如果我们采用 bigram 或者 trigram 模型,我们无法得到相关的上下文信息来告诉我们当前位置应该用 was 还是 were。这是所有有限上下文语言模型(finite context language models)的一个通病。
  • 计算出的结果的概率通常会非常小
    你会发现,一连串条件概率项连乘得到的结果往往会非常小,对于这个问题,我们可以采用取对数计算 log 概率来避免数值下溢(numerical underflow)。
  • 对于不存在于语料库中的词,无法计算其出现概率
    如果我们要计算概率的句子中包含了一些没有在语料库中出现过的单词(例如:人名),我们应该怎么办?
    一种比较简单的技巧是,我们可以用某种特殊符号(例如:<UNK>)来表示这些所谓的 OOV 单词(out-of-vocabulary,即不在词汇表中的单词),并且将语料库中一些非常低频的单词都替换为这种表示未知单词的特殊 token。
  • 出现在新的上下文(context)中的单词
    默认情况下,任何我们之前没有在语料库中见过的 n-gram 的计数都为 0,这将导致计算出的 整个句子的概率为 0。这个问题和前面的 OOV 单词的问题类似,我们的语料库中可能已经包含了这些单词,但是并没有包含该单词在新句子中对应的特定的 n-gram(即上下文信息)。这意味着该单词在新的句子中对应 n-gram 对于语言模型来说是全新的,而且因为 n-gram 的组合存在如此多的可能性,以至于语料库很难将所有的可能性都覆盖到。例如:假设我们构建了一个 five-gram 语言模型,我们的语料库中一共有 20000 个词汇,那么一共存在多少种可能的 five -gram 组合?答案是:200005。这是一个非常非常大的数字,以至于无论我们的训练语料库有多大,都不可能捕捉到所有的可能性组合。这是一个相当常见的问题,并且很重要。如果我们回顾一下链式法则,可以看到所有的条件概率都连乘在一起,所以只要其中某一项在计算子序列时 n-gram 的计数为 0,那么最终 计算出的整个句子的概率就会为 0。为此,我们需要对语言模型进行 平滑处理(smoothing)

平滑处理

  • 基本思想:给之前没有见过的事件赋予概率。
  • 必须附加一个约束条件:P(everything)=1
  • 有很多不同种类的平滑处理方法:
    • 拉普拉斯平滑(Laplacian smoothing,又称 Add-one smoothing,即 “加一” 平滑)
    • “加 k” 平滑(Add-k smoothing)
    • Jelinek-Mercer 插值(又称 线性插值平滑)
    • 卡茨回退法(Katz backoff)
    • 绝对折扣(Absolute discounting)
    • Kneser-Ney
    • ……

拉普拉斯平滑(“加一” 平滑)

简单思想:假装我们看到的每一个 n-gram 都比它们实际出现的次数多 1 次。

  • 这意味着即使是那些我们在语料库中没有见过的 n-gram,我们也将它们出现的次数记为 1 次。所以对于一个新句子中的任何东西都至少有 1 次计数。
  • 对于 unigram 模型(V= 词汇表):

在之前的模型中,我们只是简单的计算单词 wi 在语料库中出现的次数 C(wi) ,然后除以语料库中所有单词 tokens 的数量 M。

现在,对于分子而言,我们总是在它此前的基础上加上 1。然后,为了保证它仍然是一个合法的概率分布,即单词 wi 遍历词汇表中所有可能情况的的概率之和 ∑i=1|V|P(wi)=1,我们需要在此前分母 M 的基础上加上词汇表的长度 |V|(即语料库中所有单词 types 的总数)。

  • 对于 bigram 模型:

同样地,我们在之前分子的基础上加 1,在分母的基础上加 |V|。

所以现在,我们解决了之前新句子中的未知单词或者 n-gram 的计数为 0 从而导致最终计算出的概率为 0 的问题。

“加 k” 平滑

  • “加一” 往往太多了
    但是很多时候,加 1 会显得太多了,我们并不想每次都加 1,因为这会导致原本的罕见事件可能变得有点过于频繁了。并且我们丢弃了所观测的 n-gram 的太多有效计数。
  • 用 “加 k” 来代替 “加一”
    这种方式也被称为 Lidstone 平滑(Lidstone Smoothing)
  • 对于 trigram 模型,公式如下

可以看到,和 “加一” 平滑类似,只是我们将分子中的加 1 变成了加 k,并且为了满足单词 wi 遍历词汇表中所有可能情况的概率之和为 1,我们在分母中的 |V| 前面乘了一个系数 k。

  • 必须选择一个 k
    事实上,如何选择一个合适的 k 值对于模型影响非常大。k 在这里实际上是一个超参数,我们需要尝试对其进行调整以便找到一个使模型表现比较好的 k 值。

 Absolute Discounting 平滑

另外一种更好的方法是采用 绝对折扣平滑(Absolute Discounting)

  • 从每个 观测到的 n-gram 计数中 “借” 一个 固定的概率质量(a fixed probability mass) d。
  • 然后将其 重新分配(redistributes) 到 未知的 n-grams 上。

Backoff 平滑

基本上,我们会按照不断改进的顺序来介绍各种平滑处理方式的变体,由此,我们可以看到对于这些平滑方式的评估。现在,我们继续介绍另一种更好的平滑方式:Backoff 平滑

  • 在之前的 Absolute Discounting 平滑中,我们从观测到的每个 n-gram 计数中 “借来” 一个固定的概率质量,并将它们重新 平均 分配给所有的未知 n-grams。
  • Katz Backoff:概率质量的重新分配是基于一个 低阶(lower order) 模型(例如:unigram 模型)

例如,假设我们现在有一个 bigram 模型,当我们将概率质量重新分配到未知的 bi-grams 时,我们将基于上下文单词的 unigram 概率进行重新分配。因为比例很简单,如果我们看到上下文出现次数越多,我们就给它更高的权重。

对于一个 bigram 模型,它的 Katz Backoff 平滑的概率公式 如下:

我们为什么将这种方式称为 Backoff(回退) 呢?

因为我们在碰到未知的 n-grams 的时候会将原来的模型回退到一个更低阶的 (n-1)-gram 模型:对于一个 bigram 模型,我们在计算未知 bi-grams 的概率时将回退到 unigram 模型;而对于一个 trigram 模型,我们在计算未知 tri-grams 的时候将回退到 bigram 模型。所以,我们总是只回退一步。

 Kneser-Ney 平滑

现在,我们将介绍一种比 Katz Backoff 更好的平滑处理方式:Kneser-Ney 平滑

  • 概率质量分配基于当前单词 w 出现在 不同上下文 中的次数。
    对于概率质量重新分配的问题,相比 Katz Backoff 中只是简单地基于低阶模型,Kneser-Ney 平滑采用的方法是基于当前单词 w 在多少个 不同的上下文 中出现过,或者说是基于该单词的 多功能性(versatility)
    回忆前面 “glasses” 和 “Francisco” 的例子,其中 ,“Francisco” 是一个非常特殊的词,它的 versatility 非常低,因为它很可能只在上下文单词 “San” 后面出现过。因此,对于其他绝大多数的上下文单词,它们后面都不太可能出现 “Francisco” 这个词。而相比之下,“glasses” 这个词具有较高的 versatility,它可能在很多不同的上下文单词之后都出现过。
  • 这种度量被称为 多功能性(versatility) 或者 延续概率(continuation probability)

可以看到,对于观测到的 n-grams,Kneser-Ney 概率和 Katz Backoff 概率两者是相同的。而对于那些未知的 n-grams,Kneser-Ney 概率中从观测 n-grams 中 “借来” 的概率质量 α(wi−1) 与之前一样保持不变,而之前关于低阶模型 P(wi) 的部分则由我们所说的延续概率 Pcont(wi) 来替代。

在延续概率 Pcont(wi) 的计算公式中:分子部分计算的是一共有多少个 唯一 的上下文单词 wi−1 和当前单词 wi 共同出现过(co-occurrence);而分母部分就是将所有可能的单词 wi 对应的不同共现上下文单词数量(即分子部分)进行一个累加。

Interpolation

我们将介绍最后一种也是最好的一种平滑处理方式:插值(Interpolation)

  • 将不同阶数的 n-gram 模型结合起来 的更好的平滑方式。
    我们在前面提到过的 Katz Backoff 平滑:对于一个 trigram 模型,如果我们遇到了一些未知的 tri-grams,我们将回退到一个低阶模型。
    但是一种更好的做法是:将不同阶数的 n-gram 模型结合起来。
  • 逐步缩短的上下文的概率加权求和
    例如,对于一个 trigram 模型,我们计算未知 tri-grams 的平滑概率时会贯穿 trigram、bigram 和 unigram 三种阶数的模型。
  • 一个 trigram 模型下的 Interpolation 平滑概率


我们可以按照下面的步骤计算单词 wm 在上下文单词 “wm−2” 和 “wm−1” 之后出现的 Interpolation 平滑概率:

  • 首先计算 trigram 概率 P3∗,并将其乘以一个系数 λ3;
  • 然后计算 bigram 概率 P2∗,并将其乘以一个系数 λ2;
  • 然后计算 unigram 概率 P1∗,并将其乘以一个系数 λ1;
  • 最后,将三者相加得到最终结果。

并且,为了保证所得到的仍然是一个合法的概率分布,我们需要满足所有 λ 之和为 1。此外,这些 λ 的值甚至并不需要我们手动设置,而是由模型通过一些留存数据学习到的,因为我们想知道对于这些不同阶数的模型,什么样的 Interpolation 方式是最高效的。

 Interpolated Kneser-Ney 平滑

基于 Interpolation,我们得到了 Kneser-Ney 的最后一种版本:Interpolated Kneser-Ney 平滑

Interpolation 替代 back-off

这里,我们所做的唯一改变就是:将之前观测 n-grams 和未知 n-grams 两种情况加在一起,取代了之前的 back-off 操作。所以,相比之前二选一的情况,现在我们都合并在一个公式里。

另外,相比之前的固定概率质量 α(wi−1),这里我们替换为归一化常数 β(wi−1),以确保上下文 wi−1 对应的所有可能的 wi 的概率 PIKN(wi∣wi−1) 之和为 1。

这就是我们到目前为止介绍过的最有效的平滑方式,在实际应用中有很多 n-gram 语言模型都是基于 Interpolated Kneser-Ney 平滑实现的。

实践应用

  • 在实践中,我们通常采用 Kneser-Ney 语言模型并将 5-grams 作为最高阶数。
  • 对于每个 n-gram 阶数都有不同的 discount 值。
  • 当我们试图学习如何在它们之间进行 Interpolation 时,我们将从数据中学习。

生成语言

在最后一部分中,我们将介绍如何利用语言模型来 生成语言(Generating Language)

我们这里讨论的是利用语言模型生成语言的一种通用的方法,并不仅仅局限于 n-gram 语言模型。

但是我们还是会以 n-gram 语言模型作为例子:

  • 给定一个初始单词,从语言模型定义的概率分布中抽取一个词作为下一个出现的单词。
  • 在我们的 n-gram 语言模型中包含 (n−1) 个起始 tokens,用于提供生成第一个单词所需的上下文。
    • 永远不会生成起始标记 <s>,它只作为初始单词的生成条件
    • 生成 </s> 来结束一个序列

例子:Bigram 语言模型

  •  Sentence =<s>
  •  P(?∣<s>)=“a”

这里是一个很简单的例子,我们有一个 bigram 语言模型。现在有一个空句子,即只包含一个起始标记 <s>。我们试图预测在给定一个起始标记 <s> 的条件下,下一个最有可能出现的单词是什么。所以,我们会利用 bigram 语言模型来逐个检查词汇表中每个单词 w 的条件概率 P(w∣<s>),并选择其中概率最大的那个单词作为我们的预测结果。这里,我们可以看到单词 “a” 出现在一个句子开头的概率最大,我们将它添加到句子中。

  •  Sentence =<s> a
  •  P(?∣a)=“cow”

现在我们的句子有了第一个单词 “a”,我们想知道下一个最有可能出现的单词是什么。还是和之前一样,我们逐一检查词汇表中各个词在给定上下文单词 “a” 的情况下,哪个词对应的条件概率最大。可以看到,这里单词 “cow” 出现在单词 “a” 之后的概率最大,所以我们将它添加到句子中。

  •  Sentence =<s> a cow
  •  P(?∣cow)=“eats”

重复上面的步骤,我们得到了下一个最有可能的单词 “eats” 并将它添加到句子中。

  •  Sentence =<s> a cow eats
  •  P(?∣eats)=“grass”

继续,我们得到单词 “grass” 并将它添加到句子中。

  •  Sentence =<s> a cow eats grass
  •  P(?∣grass)=“</s>”

最终,我们预测单词 “grass” 后面最有可能出现的是结束标记 “</s>”,我们将它添加到句子中。

  •  Sentence =<s> a cow eats grass </s>
  • 完成

现在我们得到了一个由这个 bigram 语言模型生成的句子:a cow eats grass

如何选择下一个单词

  • Argmax:在每一轮中选择与上下文共现概率最高的那个单词。
    • 贪婪搜索(Greedy search )
      这其实是一种贪婪搜索策略,因为即使在每一步中我们都选择概率最高的那个单词,也无法保证最终生成的句子具有最优的概率。
  • Beam search decoding
    一种更好的方法是 Beam search decoding,它在机器翻译中应用非常广泛。
    • 在每轮中,我们跟踪概率最高的前 N 个单词
    • 我们总是检查这几个候选单词给出的完整句子的概率
    • 这种方法可以生成具有 近似最优(near-optimal) 概率的句子
  • 从分布中随机抽样
    另一种方法是从语言模型给出的概率分布中随机抽样,例如:temperature sampling

评估语言模型

如何评估一个语言模型的质量?

评估

语言模型的评估通常有两种范式:

  • 外部的(Extrinsic)
    这种评估范式常见于下游应用中,我们根据其反馈来评估语言模型的表现。比如对于机器翻译中的某些任务,我们可以比较不同语言模型在完成该任务上的表现。
    • 例如:拼写纠错、机器翻译
  • 内部的(Intrinsic)
    在这种评估范式下,我们不依赖任何下游应用,而是观察我们的语言模型在保留测试集上的 Perplexity
    • 在保留测试集(held-out test set)上的 Perplexity
    • Perplexity(困惑) 衡量的是我们对于模型在测试数据上给出的预测的置信度。置信度越高,对应的 Perplexity 就越低,代表我们的模型越好。

 Perplexity

  • 整个测试集的逆概率(Inverse probability)
    • 通过单词 tokens(包括结束标记 </s>)的数量实现归一化(Normalization)
  • 假设我们保留的测试集语料库是一个由 m 个单词 w1,w2,…,wm 组成的序列,我们用 PP 表示 Perplexity。从下面的公式可以看到,它是通过对整个测试集的概率 P(w1,w2,…,wm) 取倒数,然后再开 m 次方得到的:
  • 如果我们遇到未知单词(OOV),我们通常是直接忽略掉,因为我们没有办法表示它们。
  • Perplexity 越低,模型表现越好。
    假如我们模型的 Perplexity 只有 1,那么这是最好的情况。因为当我们的测试集语料库上的概率 P(w1,w2,…,wm)=1 时,PP(w1,w2,…,wm)=1。而对于一个非常差的语言模型,可能在测试集上的概率 P(w1,w2,…,wm)=0,此时模型的 Perplexity 将趋近 ∞。所以,最理想的情况是 Perplexity 等于 1,当然,我们永远不可能达到这个值。

总结

  • N-gram 模型在捕捉语言的可预测性方面是一种简单且高效的方法。
    模型的构建很容易:我们只需要一个大的语料库,并且对单词和上下文进行计数即可。
  • 信息可以通过无监督的方式推导得出,可以扩展到大型语料库。
  • 由于稀疏性的存在,需要进行平滑处理才能保证有效性。
    我们需要一些工程上的技巧处理稀疏性问题,例如:smoothing、back-off、interpolation 等。

虽然 n-gram 模型非常简单,但是它在实践中的效果非常好。所以,在构建语言模型时,我们通常会选择将 n-gram 模型作为 baseline,尽管目前有很多模型都采用了深度学习。

思考

思考: Interpolation、Interpolated Kneser-Ney 和 Kneser-Ney 之间有什么区别?我们应当如何判断应该采用哪种方法?

首先,我们应该明确一点:Interpolated(插值)、Smoothing(平滑)和 Backoff(回退)都是用来解决数据稀疏问题(sparsity)的方法。我们在这节课中讨论的前 3 种平滑方法(拉普拉斯、“加 k” 和 Lidstone)都是在 和原先的 N-gram 模型相同的阶数 内重新分配概率,将概率质量从常见情况向罕见情况进行偏移。

Interpolation 和 Backoff 都是通过 结合不同阶数的 N-gram 模型 来解决这个问题。对于 Backoff 而言,如果高阶 higher-gram 的计数为 0,那么它将完全落回低阶 lower-gram;而 Interpolation 则是通过将我们所有的 N-gram 模型加权求和来将它们结合起来。

现在,当我们采用低阶模型时又会带来一个新的问题。例如,对于单词 “Old” 和 “Zealand”,很可能它们的 bi-gram “Old Zealand” 计数为 0,所以我们需要依赖 unigram 模型提供的概率。想象一下,如果单词 “Zealand” 具有一个非常高的 unigram 概率,那么对于这两个词的 bi-gram,我们还是可以得到一个相对较高的共现概率,而这不是我们希望看到的。

Kneser-Ney Smoothing 中引入了所谓 延续计数(continuation count) 的概念。因为在大多数情况下,单词 “Zealand” 只出现在上下文单词 “New” 的后面,所以对于单词 “Zealand” 出现在上下文单词 “Old” 后面这种情况(即 bi-gram “Old Zealand”)的延续计数会非常低。到这里,我们通过 在不同上下文中的频率计数 解决了上述例子中的问题。

回到原问题中提到的哪种方法更好,我们可以在 Backoff 或者 Interpolation 二者中选择一种来使用 Kneser-Ney Smoothing。通常来说,Interpolation 可能更合适,因为这种方式更灵活(因为我们考虑了所有阶数的 N-gram 模型)。

ASR语音识别—Fst热词模型

有限加权【热词】状态转换机(Weighted Finite State Transducers, WFST)

最近在做ASR语音识别任务,基于阿里FunASR框架,特此记录下跟热词模型相关知识。

wfst热词增强

热词构图,我们采用AC自动机结构进行热词网络构图,解决热词前缀重叠场景下难以有效激励的问题。例如热词列表包含“阳光保险”与“保定”两个热词,实际语音内容为“阳光保定”,在匹配到“定”时匹配失败则会根据AC自动机回退机制回退至“保定”热词路径,确保仍可继续匹配的最大子串路径可正常激励。

如下是热词网络实例图。

热词发现与匹配我们采用对主解码网络弧上ilabel音素/字符序列信息进行热词发现及匹配,而非在网络搜索出词时再对整词匹配,该方式优势是能够更早实现对尚未出词热词路径激励,避免热词路径被过早误裁减,其次也可避免由于热词分词结构不一致而导致匹配失败。

热词激励方式,我们采用过程渐进激励和整词激励相结合的方式,而非热词首字或尾字激励。采用仅首字激励方式可能存在部分case在热词后续字的解码过程中路径仍被裁剪掉的情况,而仅在尾字出词时施加激励则可能激励过晚。

过程渐进激励(incremental bias)对过程中每匹配成功一步即进行等量激励,如在后续扩展过程匹配失败则通过回退弧跳转进行激励减除。

整词激励(word bias)支持用户针对不同的热词做差异化的激励分配置,在热词整词出词时进一步施加对应的补偿或惩罚,进而提高热词综合效果。

FST热词是一种基于 有限状态转换器(Finite State Transducer)的关键词识别技术,它具有较高的准确率和实时性,适用于对大量文本进行快速匹配的场景。 但是,FST热词需要提前构建好词典和规则库,且不支持多语种和变体。

FST目前在语音识别和自然语言搜索、处理等方向被广泛应用。例如,在自然语言处理中,经常会遇到一些针对某些内容法则做出修改的操作,比如:如果c的后面紧接x的话,则把c变为b,FST则是基于这些规则上的数学操作,来把若干个规则整合成一个单程的大型规则,以有效提高基于规则的系统(rule-based system)的效率。其功能类似于字典的功能,但其查找是O(1)的,仅仅等于所查找的key长度。目前Lucene4.0在查找Term时就用到了该算法来确定此Term在字典中的位置。FST 可以表示成FST<Key, Value>的形式,我们可以用O(length(key))的复杂度,找到key所对应的值。除此之外,FST 还支持用Value来查找key以及查找Value最优的key等功能。在查找最优的Value时,会用到求最短路径的Dijikstra算法,但建图过程与此无关。

FST是一种用于映射输入符号序列到输出符号序列的有向图结构。它由一组状态组成,状态之间通过带有权重的转换(transitions)相连。每个转换关联输入符号、输出符号和权重(或代价),用于表示从一个状态转移到另一个状态时的条件。

FST与热词的结合

  • 提高权重或优先级FST可以通过增加热词的优先级或降低其识别权重,使得在解码过程中,热词的路径更容易被选择。
  • 热词优先通路:可以通过引入热词的专有路径(transition paths),使得这些词比其他普通词汇更容易通过FST的状态转换。
  • 增强精度通过调整FST中热词的权重或映射路径,系统在遇到热词时会优先选择包含热词的路径,从而提高识别或转换的准确率。

实现方法

  • 构建基础FST: 首先,需要基于词典或语言模型构建一个基础FST。这个FST将输入符号(如字母、音素或单词)映射到输出符号。在语音识别中,FST通常将输入的音素序列映射为单词。
  • 加入热词权重
    • 修改权重对热词的转换路径赋予更低的权重,降低其状态转换代价,使得解码器(decoder)在搜索时更倾向于选择这些路径。例如,使用一个加权的FST,可以将普通词的转换权重设为较大值,而将热词的权重设为较小值。
    • 插入额外路径将热词的路径单独插入到FST中,创建直接通路,以便系统在解码过程中直接选择这些热词而不需要复杂的转移。
  • 组合语言模型和热词FST在实际应用中,通常会将热词FST与其他语言模型(如N-gram或神经网络语言模型)结合起来。例如:
    • 使用热词FST作为一个小型的子图插入到更大规模的语言模型FST中。
    • 热词FST可以作为一个前端过滤器,预处理输入序列以优先选择热词的路径。
  • 动态插入热词: 热词列表可能会根据应用场景动态变化。例如,在语音助手中,用户可能会要求系统识别特定的品牌名称。在这种情况下,FST需要支持动态更新,即在运行时动态插入或删除热词路径。这可以通过以下几种方式实现:
    • On-the-fly 插入:根据实时需求,将新的热词添加到现有FST结构中,可能使用备用状态机或其他支持增量更新的FST实现。
    • 重构FST:当热词发生较大变化时,重新构建FST,以反映新的热词权重。

InternVL家族:通过开源组件缩小与商业多模态模型的差距 —— GPT-4o的开源替代方案

InternVL家族:用开源组件缩小与商业多模态模型的差距——一个开创性的开源替代方案,旨在平替GPT-4o

https://github.com/OpenGVLab/InternVL/

[🆕 博客] [🚀 InternVL2 博客] [🗨️ 对话Demo] [🤗 HF Demo] [📖 文档] [🌐 API] [🚀 快速开始]

[📜 InternVL 1.0 论文] [📜 InternVL 1.5 报告] [📖 1.0 中文解读] [📖 1.5 中文解读] [📖 2.0 中文解读]

我们的 InternVL2-Llama3-76B 在 OpenCompass 多模态排行榜上取得了比 GPT-4o 更高的分数。尽管这让我们感到兴奋,但我们必须指出,这个分数仅捕捉了模型性能的一部分,特别是在与视觉相关的任务方面。我们认识到,在指令跟随、用户体验、纯文本处理能力和整体理解能力等方面,我们的模型与 GPT-4 之间仍存在显著差距。我们致力于不断改进我们的模型,以更好地满足现实世界的应用需求。

书生·万象多模态大模型。万象,代表对多模态大模型的愿景,即理解真实世界一切事物和景象,实现全模态全任务的通用智能。它涵盖图像,视频,文字,语音、三维点云等5种模态,首创渐进式对齐训练,实现了首个与大语言模型对齐的视觉基础模型,通过模型”从小到大”、数据”从粗到精”的渐进式的训练策略,以1/5成本完成了大模型的训练。它在有限资源下展现出卓越的性能表现,横扫国内外开源大模型,媲美国际顶尖商业模型,同时也是国内首个在MMMU(多学科问答)上突破60的模型它在数学、图表分析、OCR等任务中表现优异,具备处理复杂多模态任务、真实世界感知方面的强大能力,是当之无愧的最强多模态开源大模型。

书生万象具有千亿规模参数,支持图像,视频,文字,语音、三维点云等模态。为了使模型能够支持丰富的输出格式,书生万象首次使用了向量链接技术,链接各领域专用解码器,打通梯度传输链路,实现通专融合,支持检测、分割、图像生成、视觉问答等百种细分任务,性能媲美各领域的专家模型。为了训练书生万象模型,我们从各类来源构建了最大图文交错数据集OmniCorpus,包含约160亿图像,3万亿文本词元,相比现有开源图文数据集 ,图像数量扩大了三倍,文本数量扩大了十倍。

传统的预训练范式直接使用大模型+大数据进行一步到位训练,需要大量的算力资源。为了提高训练效率,研究团队首创了渐进式训练策略,先利用小模型在海量带噪数据上进行高效预训练,然后再使用大模型在较少高质量精选数据上进行高效对齐,模型”从小到大”,数据”从粗到精”,仅需20%的算力资源即可取得同等效果。 采用这种训练策略,我们实现了首个与大模型对齐的视觉基础模型,同时,我们的多模态大模型,展现出卓越的性能,在MathVista(数学)、AI2D(科学图表)、MMBench(通用视觉问答)、MM-NIAH(多模态长文档)等评测上可比肩GPT-4o、Gemini 1.5 Pro等闭源商用大模型。

InternVL2系列基于以下设计构建:

1、渐进式与大型语言模型:我们引入了渐进式对齐训练策略,从而使第一个视觉基础模型与大型语言模型原生对齐。通过采用渐进式训练策略,即模型从小到大,而数据从粗到细,我们以相对较低的成本完成了大型模型的训练。这一方法在有限的资源下表现出了出色的性能。

2、多模式输入:通过一组参数,我们的模型支持多种输入模式,包括文本、图像、视频和医疗数据。

3、多任务输出:由我们最近的工作VisionLLMv 2提供支持,我们的模型支持各种输出格式,如图像,边界框和蒙版,展示了广泛的通用性。通过将MLLM与多个下游任务解码器连接,InternVL 2可以推广到数百个视觉语言任务,同时实现与专家模型相当的性能。

训练策略

性能:

InternVL2在处理复杂的多模态数据方面表现出强大的能力,在数学、科学图表、通用图表、文档、信息图表和OCR等任务中表现出色。例如,在MathVista基准测试中,InternVL2的准确率达到66.3%,大大超过了其他闭源商业模型和开源模型。此外,InternVL2在广泛的基准测试中实现了最先进的性能,包括通用图表基准测试ChartQA,文档基准测试DocVQA,信息图表基准测试InfographicVQA和通用视觉问答基准测试MMBench。

nameMMMU
(val)
MathVista
(testmini)
AI2D
(test)
ChartQA
(test)
DocVQA
(test)
InfoVQA
(test)
OCRBenchMMB-EN
(test)
MMB-CN
(test)
OpenCompass
(avg score)
GPT-4V*
(20240409)
63.1 / 61.758.189.478.187.267881.080.263.5
Gemini Pro 1.5*58.5 / 60.657.780.381.386.572.775473.973.864.4
Claude3.5-Sonnet*68.3 / 65.967.794.790.895.278879.780.767.9
GPT-4o*
(20240513)
69.1 / 69.263.894.285.792.873683.482.169.9
Cambrian-149.7 / 50.453.279.775.675.560081.458.3
LLaVA-NeXT Qwen1.550.149.080.479.785.780.5
InternVL2-Pro58.9 / 62.066.387.3 / 96.087.195.183.383787.887.271.8
nameMMMU
(val)
MathVista
(testmini)
AI2D
(test)
ChartQA
(test)
DocVQA
(test)
InfoVQA
(test)
OCRBenchMMB-EN
(test)
MMB-CN
(test)
OpenCompass
(avg score)
InternVL2-1B35.4 / 36.737.764.172.981.750.975465.460.748.3
InternVL2-2B34.3 / 36.346.374.176.286.958.978473.270.954.0
InternVL2-4B47.0 / 48.358.678.981.589.267.078878.673.960.6
InternVL2-8B49.3 / 51.258.383.883.391.674.879481.781.264.1
InternVL2-26B48.3 / 50.759.484.584.992.975.982583.482.066.4
InternVL2-40B53.9 / 55.263.787.186.293.978.783786.886.569.7
InternVL2-Llama3-76B55.2 / 58.265.587.688.494.182.083986.586.371.0
InternVL2-Pro58.9 / 62.066.387.3 / 96.087.195.183.383787.887.271.8

实例:

多模态大模型VITA : GPT-4o的简易平替

Abs:https://arxiv.org/pdf/2408.05211
Demo:https://vita-home.github.io/
Code:https://github.com/VITA-MLLM/VITA

原文:https://zhuanlan.zhihu.com/p/714031459

腾讯优图开源多模态大模型

总览

传统的音频交互需要预定义的唤醒词,例如每次提问时都需要说“Hi! Siri∼”,或者需要按下按钮来控制输入的音频问题(限制1)。此外,当模型生成输出时,不能支持新的查询,因为以前的系统只能依次响应输入的查询(限制2)。VITA克服了这两个limitations。

GPT-4o 的卓越多模态能力和用户交互体验在实际应用中非常重要,但没有开源模型在这两个领域同时表现出色。本文介绍了 VITA,这是首个能够同时处理和分析视频、图像、文本和音频模态的开源多模态大语言模型(MLLM),并且具备先进的多模态交互体验。我们在以下三个关键特性,与现有的开源 MLLM 有所区分:

  • 全方位多模态理解能力VITA 展示了强大的多语言、视觉和音频理解基础能力,并在多种单模态和多模态基准测试中表现优异。
  • 非唤醒交互VITA 可以在不需要唤醒词或按钮的情况下被激活,并对环境中的用户音频问题做出响应。
  • 音频打断交互:VITA 能够实时跟踪和筛选外部查询,允许用户随时以新问题打断模型的生成,VITA 将根据新的查询做出相应的响应。

VITA 模型的详细介绍

VITA 的整体训练流程如上图所示,由三个阶段组成:LLM指令微调、多模态对齐和多模态指令微调

LLM 指令微调

我们选择 Mixtral 8x7B 作为基础语言模型,它是具有稀疏专家混合(SMoE)架构的代表性 LLM,性能在开源 LLM 中名列前茅,是我们工作的理想起点。然而,我们观察到官方的 Mixtral 模型在理解中文方面表现有限。为此,我们扩展了基础模型的中文词汇量,将词汇量从 32,000 增加到 51,747。这一扩展不仅增强了双语(中英文)理解能力,还减少了相同文本下的词元数量,从而提高了推理效率在扩展词汇后,我们使用 500 万条合成的双语语料库进行纯文本指令微调。

补充:Mixtral 8x7B 是一种具有开放权重的稀疏专家混合模型 (SMoE),在大多数基准测试中都优于 Llama 2 70B 和 GPT-3.5。Mixtral 可以在小批量大小下实现更快的推理速度,并在大批量大小下实现更高的吞吐量。Mixtral 8x7B 是一种仅包含解码器的模型,每层由 8 个前馈块(即专家)组成。对于每个 token,在每一层,路由器网络都会选择两名专家来处理当前状态并组合他们的输出。尽管每个 token 只看到两个专家,但所选的专家在每个时间步上都可能不同。因此,每个 token 可以访问 47B 参数,但在推理过程中仅使用 13B 激活参数。Mixtral 8x7B 并不是大家认为的有 8 个 Mistral 7B 模型,名字中的 8 代表 8 个专家。

多模态对齐

在这一阶段,我们旨在弥合文本与其他模态之间的表示差距,为多模态理解奠定基础。

视觉模态

视觉编码器:我们使用 InternViT-300M-448px 作为视觉编码器,该编码器接收 448×448 的图像作为输入,通过一个简单的两层 MLP 视觉连接器生成 256 个词元。对于高分辨率图像输入,我们实现了动态补丁策略来捕捉局部细节。视频被视为图像的特殊情况进行处理。如果视频长度小于 4 秒,我们均匀采样 4 帧;如果视频长度在 4 到 16 秒之间,我们每秒采样一帧;对于超过 16 秒的视频,我们均匀采样 16 帧。为了防止引入过多的视觉词元,我们不对视频的单个帧执行动态补丁。

视觉对齐:在视觉对齐阶段,我们仅训练视觉连接器。表 1 总结了使用的训练数据(不包括纯文本SFT部分)。此外,在此阶段我们不使用音频问题。

  • 对于一般图像描述任务,我们引入了来自 ShareGPT4V 的 GPT-4V 生成部分,以确保数据质量。我们还引入了 Allava-Caption 和 ShareGTP4o-Image,并补充了一些由现有 MLLM 生成的中文图像描述。
  • 对于一般图像问答(QA)任务,我们初步收集了三个数据集:LLaVA-Mixture-sample、Lvis-Instruct 和 ScienceQA。我们使用现有的 MLLM 生成了额外的 21.8K 中文 QA 数据。此外,我们从 LLaVA-150K 数据集中移除了标题子集,并将其余部分翻译为中文。
  • 对于 OCR 和图表任务,我们引入了 Anyword-3M、ICDAR2019-LSVT、ICDAR2017-RCTW、Open-Chart(包括 ChartQA、DVQA、InfoVQA、Pew 和 OpenCQA),以及一些由现有 MLLM 从其他开源数据中生成的合成数据。
  • 对于一般视频描述任务,我们使用 ShareGemini 数据集。
  • 对于一般视频 QA 任务,我们使用现有的 MLLM 重新标注了 Video-ChatGPT 和 VideoChat2 的开源数据。
不同的文本数据直接拼接到 6K 词元。图像首先被划分为局部补丁,然后将不同的图像-文本对进行拼接。视频数据则直接逐帧采样作为输入,无需进行拼接。通过这种方式,我们能够统一不同训练批次中的数据长度,从而提高训练效率。

数据拼接:对于纯文本数据和图像数据,我们的目标是将上下文长度拼接到 6K 词元,如上图所示。视频数据则不进行拼接。拼接不同的数据带来了两个好处:一是支持更长的上下文长度,使得从单一到多图像-问题交互成为可能,从而实现更灵活的输入形式和延长的上下文;二是提高了计算效率,因为视频帧通常包含大量视觉词元。通过拼接图像-问题对,我们在训练批次中保持了词元数量的平衡,从而提高了计算效率。此外,我们发现使用拼接数据训练的模型在性能上与未拼接数据的模型表现相当。

音频模态

音频编码器:输入音频首先通过 Mel 频率滤波器块处理,该块将音频信号分解为 Mel 频率尺度上的各个频带,模拟人类对声音的非线性感知。随后,我们使用 4 层 CNN 下采样层和 24 层的变换器,共计 341M 参数,处理输入特征。我们采用简单的两层 MLP 作为音频-文本模态连接器。最终,每 2 秒的音频输入被编码为 25 个词元。

音频对齐:在对齐任务中,我们选择了自动语音识别(ASR)。我们的数据集包括 Wenetspeech,该数据集涵盖了超过 10,000 小时的多领域语音识别数据,主要集中在中文任务上。同样,Gigaspeech 也包含 10,000 小时的高质量音频数据,大部分数据用于英语语音识别任务。另一个任务是音频字幕生成,依赖于 Wavcaps 的 AudioSet SL 子集,该数据集包含 400K 个音频片段及其对应的音频字幕。在对齐过程中,音频编码器和连接器都进行了训练。

多模态指令微调

在这一阶段,我们对模型进行指令微调,以增强其遵循指令的能力(文本 & 音频指令)。

训练数据

数据构建:指令微调阶段的数据来源与对齐阶段相同(见表1),并进行了如下改进:

  •  音频问题替换:我们使用 TTS 技术(如 GPT-SoVITS6)将大约一半的问题随机替换为其音频版本,以提升模型对音频查询的理解能力和指令跟随能力。音频问题和文本问题的数量见表1。
  •  系统提示设置:设置不同的系统提示,以避免不同类型数据之间的冲突(见下表)。例如,有些问题可以基于视觉信息或模型自身知识进行回答,这可能会导致冲突。此外,由于图像数据的补丁类似于视频数据的多个帧,可能会使模型感到困惑。系统提示明确区分不同的数据类型,使其更易于理解。

噪声音频构建:在人机交互过程中,并非所有的音频输入都需要响应,这些被称为噪声音频。一个具有良好交互能力的系统应能主动识别音频类型,并有选择性地执行后续输出。为此,我们需要构建各种噪声音频样本以供模型识别。具体而言,我们从现有的多模态和单模态 QA 数据中随机抽取 474K 个句子。这些负样本文本集中在不需要用户响应的非查询相关内容上,其长度分布与正向问题的长度分布一致。然后,我们使用 TTS 工具将这些句子转换为音频。噪声音频样本的构建使模型能够识别不需要响应的音频输入,这有助于实现非唤醒交互。具体的训练策略将在以下部分详细说明。

训练过程

根据上述构建的 QA 对,模型需要区分三种类型的查询:

  • 查询音频:问题由音频发起。
  • 噪声音频:输入为音频,但不包含问题。
  • 查询文本:问题由文本发起。

基于这些查询类型,我们设计了三种状态标记 <1>、<2> 和 <3>。在训练阶段,我们在答案的开头插入对应的状态标记,使模型能够灵活处理不同的交互行为。具体如下:

  • 状态标记 <1> 表示问题输入为查询音频。在这种情况下,模型的输出需要以文本或通过 TTS 工具转换的语音形式呈现给用户。
  • • 状态标记 <2> 表示问题输入为噪声音频。模型应输出 EOS 标记作为终止符。然而,我们发现训练过程中突然终止输出可能会显著降低性能。因此,我们将噪声音频对应的文本发送给 LLM,并使用其输出文本作为训练目标。在推理过程中,<2> 作为另一种特殊的 EOS 标记。
  • 状态标记 <3> 表示问题为纯文本,用于区分训练集中的前两种查询。

在训练过程中,视觉和音频编码器保持冻结状态,而连接器与 Mixtral 8×7B 一起进行训练。

模型部署:双工策略

在这一部分,我们主要讨论如何实现两种交互功能:非唤醒交互和音频中断交互。

非唤醒交互

非唤醒交互意味着模型可以在不需要唤醒词或按钮的情况下被激活,并对环境中的用户音频问题做出回应。部署过程必须满足以下要求:

  • • 实时跟踪环境声音:这涉及确定音频内容是否属于人类语言。
  • • 过滤噪声音频:模型应仅对有效的用户查询音频作出响应。

对于第一个要求,现有的语音活动检测(VAD)可以提供帮助。VITA 使用 SileroVAD ,该系统经过大规模语料库训练,涵盖超过 6,000 种语言,并且能够在各种背景噪声下表现良好。对于第二个要求,我们利用第 3.3.2 节中描述的状态标记 <2>。这使模型能够自动区分输入音频是否为有效查询。如果输入为非查询类型,模型将直接终止推理,从而仅对查询类型的输入作出响应。

音频中断交互

音频中断交互允许用户随时用新问题打断模型的生成过程。为实现这一点,部署环境必须满足以下要求:

  •  实时跟踪和过滤外部查询:在生成响应的同时,系统必须实时跟踪和过滤外部查询。
  •  回答新问题:当出现新问题时,系统必须停止当前生成,整合历史上下文,并对当前查询作出回应。

为实现这一目标,我们提出了双工部署框架。如上图所示,两个 VITA 模型同时部署。在典型条件下,生成模型负责回答用户查询。同时,监控模型在生成过程中检测环境声音。它忽略非查询用户声音(即噪声音频),但在检测到查询音频时会停止生成模型的进度。监控模型随后整合历史上下文,并对最新的用户查询做出回应。这时,生成模型和监控模型的身份会发生转变。

评估

语言表现:

为了验证我们训练过程对语言模型的有效性,我们将训练后的模型“Mixtral 8x7B Ours”与官方版本“Mixtral 8x7B Instruct”进行对比,评估使用了四个数据集:C-EVAL、AGIEVAL、MMLU 和 GSM8K。这些数据集涵盖了包括普通多项选择题、多学科问答,以及数学和逻辑推理任务的各种场景,涉及中文和英文上下文。结果如上表所示,我们的训练显著提升了模型在中文评估集(C-EVAL 和 AGIEVAL)上的能力,同时保持了在英文相关基准(MMLU)上的原有性能,并在数学推理任务(GSM8K)中显示出显著的改进。

音频表现:

为了验证我们模型所学的语音表示的鲁棒性,我们在 Wenetspeech 和 Librispeech数据集上进行了测试。Wenetspeech 具有两个评估拆分:test_net 和 test_meeting。前者的数据源与训练数据更为接近,较容易;后者则具有更大的挑战性。作为我们模型的留出数据集,Librispeech 评估了模型在未见数据集上的泛化能力。它有四个评估拆分:“dev” 开头的是验证集,“test” 开头的是测试集。“Clean” 指较不具挑战性的集合,而 “other” 指较具挑战性的集合。我们可以看到,VITA 在 ASR 基准上取得了可观的结果。

多模态表现:

为了评估 VITA 的多模态能力,我们在四个代表性基准上进行评估,包括 MME 、OCRBench、HallusionBench 和 Video-MME 。如上图所示,在图像理解方面,VITA 超越了图像专用的开源模型 LLaVA-Next,接近于闭源模型 Gemini 1.5 Pro。在视频理解方面,VITA 超过了视频专用的开源模型 Video-CCAM。尽管 VITA 与视频专用的 LLaVA-Next-Video 之间存在差距,但鉴于 VITA 支持更广泛的模态并优先考虑交互,这种差距是可以接受的。然而,值得注意的是,当前开源模型与专有模型在视频理解能力方面仍存在较大差距。

结论与未来工作

在本文中,我们介绍了 VITA,一个强大的开源多模态大语言模型,它将视频、图像、文本和音频理解整合到一个统一的框架中,并提供了先进的交互体验。除了强大的多模态基础能力,VITA 还在开源社区中开创了新的多模态交互方式,包括非唤醒交互和音频中断交互。然而,当前版本仍面临以下限制:

  • 基础能力的提升:虽然 VITA 在单模态和多模态任务中相较于领先的开源模型表现出色,但与专有模型相比仍存在显著差距。
  • 噪声音频构建的优化:使用现有数据的非查询响应作为噪声音频样本是一种简单而有效的方法。然而,VITA 有时会将噪声音频误分类为查询音频,这突显了需要更细致的构建方法。
  • 与 LLM 联合构建端到端 TTS我们目前使用额外的 TTS 工具将 LLM 生成的文本转换为语音,这一过程比较耗时。如果能够将 TTS 与 LLM 结合,实现端到端的语音输出,可能会大大提升实时交互性能。

未来的工作将集中在解决这些限制,并探索以下方向:

  • 提升多模态基础能力:引入更多数据并改进模型架构,以缩小与专有模型的性能差距。
  • 优化噪声音频识别:开发更复杂的噪声音频识别算法,以提高模型过滤无关音频的能力。
  • 实现端到端 TTS:研究如何将 TTS 功能直接集成到 LLM 中,以实现更高效的语音生成和实时交互。

我们期待在未来版本的 VITA 中克服这些挑战,并继续推动开源多模态模型的发展。

Seed-ASR基于大型语言模型(LLM)的语音识别模型

https://arxiv.org/abs/2407.04675

https://bytedancespeech.github.io/seedasr_tech_report/

字节推出Seed-ASR,支持复杂场景、语种、多方言超精准识别

Seed-ASR是一种基于大型语言模型(LLM)的语音识别模型。Seed-ASR是在音频条件大语言模型(AcLLM)框架上开发的,利用了大型语言模型的强大能力,将连续的语音表示和上下文信息输入到语言模型中。通过分阶段的大规模训练以及语言模型中上下文感知能力的引入,Seed-ASR 在综合评估集上(涵盖多个领域、口音/方言和语言)比传统的端到端模型有了显著提升。

摘要

ASR模型需要在各种应用场景中准确地转录给定特定上下文信息的各种语音信号(来自不同领域、语言、口音等)。融合了额外语言模型的经典端到端模型表现良好,但主要应用在数据匹配场景中,并且逐渐接近瓶颈。Seed-ASR基于大语言模型(LLM)的语音识别模型。Seed-ASR是基于audio conditioned LLM(AcLLM)的框架开发的,通过将连续语音表示与上下文信息一起输入到LLM中来利用LLMs的功能。 通过阶段式大规模训练和LLM中的上下文感知能力的启发,Seed-ASR在综合评估集(包括多个域,口音/方言和语言)上展示了端到端模型的显着改进。此外,Seed-ASR可以进一步部署,以支持各种场景中的特定需求,而无需额外的语言模型。与最近发布的大型ASR模型相比,Seed-ASR在中文和英文公共测试集上的单词(对于中文字符)错误率降低了10%-40%,进一步证明了其强大的性能。

Introduction

Seed-ASR,一个基于LLM的大规模ASR模型。为了成为一个“更智能”的语音识别模型,通过将连续语音表示与指令和上下文信息一起输入到LLM中,利用LLMs的能力。Seed-ASR具有五大特点:

Seed-ASR 具有高识别率、大模型容量、多语言支持、上下文感知和分阶段训练五大特点。通过2000万小时语音和90万小时ASR数据训练,Seed-ASR(CN)和Seed-ASR(ML)在多个数据集上表现优异。其采用了包含20亿参数的音频编码器和数百亿参数的MoE大语言模型,支持普通话、13种方言以及多种语言,并计划扩展至40多种语言。通过整合包括历史对话、视频编辑历史和会议参与详细信息,来捕获与语音内容相关的重要指标。这种集成大大提高了各种场景中ASR评估集中的关键词召回率。【关键字召回率可以定义为 ASR 系统成功识别出的关键字的数量占所有实际出现的关键字数量的比例】,增强了多场景下的表现。Seed-ASR的开发经历了一个简单而有效的训练方案:音频编码器的自监督学习(SSL) → 监督微调(SFT) → 上下文SFT → 强化学习(RL)。每个阶段都有不同的作用,确保Seed-ASR的性能逐步提高。

数据集测评:

我们建立了一个高质量评估集的系列,包括广泛的语音输入,作为不同的主题,口音/方言,语言和语音持续时间。这些集合还包括一个ASR系统在不同应用场景下的定制能力评估例如,对话场景下的关键词识别准确性和一致性)。在Seed-ASR设计中,我们选择了大规模训练的路径,利用了大模型容量和扩展训练数据以增强泛化性。 我们考虑到提供给 AcLLM 框架的上下文,通过训练模型以来详细说明其定制化能力,从而形成一个适用于不同场景的统一且紧凑的模型结构。在我们的多维评估集上,与经典的端到端模型相比,Seed-ASR展示了更全面、更强大的模型能力。Seed-ASR的性能优势在公共测试集和我们的主观理解评估中得到了进一步证明。

Motivation

ASR模型的升级可以从LLM的技术进步中得到启发,主要可以归结为三个方面:

·统一模型框架。LLM采用基于下一个令牌预测的仅解码器框架。它对输入输出文本进行排序,依靠自注意机制建立序列中标记之间的依赖关系,从而统一文本理解和文本生成;

·缩放定律的力量。大规模模型参数为LLM提供了从不同数据源学习知识的关键能力。例如,从GPT-2 到GPT-3 ,参数数量从15亿增加到1750亿,使GPT-3表现出更好的泛化和涌现能力。

·全面的训练pipline,ChatGPT经历三个阶段:预训练,监督微调(SFT)和带有人类反馈的强化学习(RLHF)。在预训练阶段,LLM是在大量的文本数据上训练的,这使得它存储了大量的知识。在SFT阶段,LLM进一步针对更高质量的面向任务的数据进行微调,增强其根据上下文进行推理和理解任务指令的能力。最后,在RLHF阶段,训练目标转变为在强化学习的帮助下使LLM的行为与人类偏好保持一致;

由于ASR的任务是将语音转换为文本,因此其文本生成过程与LLMs一致。存储在LLMs中的广泛的文本知识和上下文推理能力使它们成为向ASR提供语义指导的潜在成分。剩下的核心挑战是如何使LLMs更好地“理解”语音,这是一种不同于文本的模态。

方法

Framework and Training Recipe

基于上述动机,我们提出了Seed-ASR,一个大规模的语音识别模型建立在音频条件LLM(AcLLM)的框架。通过将编码的连续语音表示与任务指令和相关上下文一起输入到预先训练的LLM中,Seed-ASR可以利用LLM的丰富文本知识和推理能力来生成语音的相应文本转录。总体框架如图2所示。

音频是与文本不同的模态。为了使LLMs更好地理解不同的语音输入,我们在LLMs中采用了大规模预训练的概念。具体来说,我们构建了一个具有近20亿个参数的音频编码器,并对数千万小时的数据进行了自监督学习(SSL)。预训练的音频编码器获得了强大的语音表示能力,这有助于在监督微调(SFT)期间快速收敛。在大规模SSL阶段之后,我们在AcLLM框架内实现了一个简单有效的阶段式训练方法(如图3所示)。在SFT阶段,我们通过对大量的语音-文本对进行训练,建立语音和文本之间的映射关系。在上下文SFT阶段,我们使用相对少量的上下文-语音-文本三元组来引出LLM从上下文中捕获语音相关线索的能力。 这些三重数据可以根据具体场景进行定制。在强化学习阶段,我们应用MWER的训练标准[传统Attention-based Sequence-to-Sequence model使用cross-entropy作为损失函数,不是直接对WER指标进行优化,而真正的目标是直接或间接地最小化WER => MWER Training]和一些改进来进一步加强我们模型的能力。在下面的小节中,我们将更详细地介绍这些方法。

语音编码器的自监督预训练

大规模SSL使音频编码器能够从语音中捕获丰富的信息。受基于BERT的语音SSL框架的启发,我们开发了我们的音频编码器,这是一种conformer-based的模型[Conformer 是 Google 在 2020 年提出的语音识别模型,主要结合了 CNN 和 Transformer 的优点,其中 CNN 能高效获取局部特征,而 Transformer 在提取长序列依赖的时候更有效。 Conformer 则是将卷积应用于 Transformer 的 Encoder 层,用卷积加强Transformer 在 ASR 领域的效果。],可以捕获存储在音频信号中的全局和局部结构。在这项工作中,我们主要关注语音信号。由于它是在大规模无监督数据上训练的,因此我们将训练后的音频编码器称为LUISE,它代表L规模无监督迭代SpeechEncoder

LUISE秉承BERT的概念,采用掩蔽语言预测的学习范式。训练过程如图4所示。具体地,首先将从波形提取的梅尔滤波器组特征的序列输入到 tokenizer模块以获得每个帧的离散标签。然后,使用交叉熵准则进行LUISE的训练,仅针对被掩蔽的帧计算损失函数。训练后,softmax层被移除,LUISE的编码器部分用于后续的监督微调。

我们利用一个迭代的固定 tokenizer的方法来获得相应的离散标签的每一帧。在第一次迭代中,我们应用随机projection层将语音特征投影到随机初始化的码本中,并通过找到码本中最近的向量将它们映射到离散标签。在第二次迭代中,我们对先前训练的编码器的中间层的表示执行K均值聚类以获得新的码本。然后通过在新码本中找到与来自相同中间层的表示最接近的向量来获得离散标签。在中间层的选择过程中,我们冻结了第一次迭代中训练的编码器参数,并为每个中间层添加了映射层和连接主义时间分类(CTC)损失,以进行监督微调。 图5显示了通过对每个中间层的表示进行监督微调获得的字错误率(WER)。对于具有20亿个参数的LUISE,第25层(32层中)的输出展示了最佳的语义表示,并用于在后续迭代中生成离散标签。

有监督微调SFT

经过对大规模纯语音数据的训练,LUISE已经开发出强大的语音表示能力。它以40ms/帧速率输出包含丰富语音和语义信息的连续表示。为了使AcLLM更好地理解语音中相应的文本内容,我们需要将编码表示的语义信息映射到LLM的语义空间中。LLM为了实现这一点,我们使用以下两种方法:

  1. 在模型结构中,我们引入了一个转换器模块来连接我们的音频编码器(LUISE)和LLM(如图2所示)。转换器包括下采样模块和线性投影层。我们发现不同的下采样方法同样有效,因此我们使用最简洁的方法:帧拼接。具体来说,我们在特征维度上拼接4个连续的语音表示帧,然后输入到线性层中。因此,输入到LLM中的语音表示帧率为160毫秒;
  2. 在训练方法上,我们采用“可学习音频编码器+可学习转换器+固定LLM“的策略,在保持LLM参数不变的情况下,最大限度地保留了LLM丰富的语义知识和推理能力。可学习的音频编码器和转换器参数确保语音表示中包含的语义信息与LLM的语义空间对齐。LLM在训练过程中,使用交叉熵损失函数,只有生成转录文本的标记位置参与交叉熵计算;

上下文SFT

在大规模语音-文本对数据上进行训练后,我们的SFT模型在覆盖多个领域的测试集上表现出色。然而,SFT模型的训练方式决定了它缺乏在给定上下文信息(上下文)的情况下识别模糊语音内容的能力这些问题在涉及口音(语音歧义)和同音异义词或稀有词(语义歧义)的情况下更加明显。因此,我们引入了上下文感知训练和联合波束搜索的方法,以增强模型有效利用上下文的能力(图6中给出了一个示例)。

  • 上下文感知训练:首先,我们使用我们的内部大型语言模型来生成与语音转录相关的上下文。在我们的实验中,它比使用长段语音中的开头和结尾的转录文本作为上下文表现得更好。使用生成的自然语言上下文还可以提供更完整的语义,从而除了从上下文复制相关转录内容之外还能够学习推理。然后,我们构建了一个<context,speech,text>三元组的数据集,并将其与一定比例的一般ASR数据(语音-文本对数据)混合用于上下文感知训练。如图2所示,在上下文感知训练期间,我们将上下文和语音表示输入到LLM中。LLM这种训练的目标是增强模型从上下文中捕获语音内容相关线索的能力。
  • 联合波束搜索:我们发现,直接使用本地波束搜索存在严重的幻觉问题。为了解决这个问题,我们提出了一种联合波束搜索的解码策略来缓解这个问题。具体地,我们使用联合波束搜索来找到最佳得分 Pjoint⁢(𝒚|𝒙,𝒄) ,其中 𝒚 表示预测的假设, 𝒙 是语音信息,并且 𝒄 是给定的上下文信息。超参数 α 用于在解码期间平衡语音信息和上下文信息的重要性:

同时,我们引入了一种修剪策略,首先使用上下文无关的得分 P⁢(𝒚|𝒙) 过滤出声学上不可信的候选令牌,然后对剩余的候选令牌应用联合波束搜索。修剪策略在缓解幻觉中起着重要作用。

强化学习

由于SFT和上下文SFT阶段中的训练基于交叉熵目标函数,因此与推断期间使用的评估度量(例如WER)不匹配。随着强化学习(RL)的发展,它可以在序列建模任务中学习相对最优的决策策略。因此,我们通过构建基于ASR度量的奖励函数来引入RL阶段。

单词错误率(WER)通常被认为是评估ASR模型性能的核心指标,但句子中的某些内容(例如关键字)在理解整个句子中起着更关键的作用。因此,我们还引入加权WER(WWER)作为额外的奖励函数,强调关键字错误的重要性具体来说,我们应用最小字错误率(MWER)作为另一个训练目标,在我们的RL阶段中使用交叉熵目标 ℒCE 进行插值:

    在传统的 MLE 训练中,损失函数通常是基于每个时间步的交叉熵损失。这意味着模型优化的目标是每个时间步的预测概率分布,这可能导致最终的序列输出与实际参考输出在词级别上不匹配。MWER 训练则直接优化序列的 WER,这是更接近于最终应用的评价标准,尤其是在语音识别和自然语言处理任务中。

MWER 训练的实现方法:
候选序列生成:在 MWER 训练过程中,模型会先使用其当前参数生成多个候选的输出序列(通常使用采样或束搜索策略)。这些候选序列代表了模型对给定输入的不同潜在输出。

损失计算:计算每个候选序列的词错误率(WER),然后通过比较这些候选序列与参考序列之间的WER来评估损失。具体来说,损失函数会惩罚那些与参考序列WER较高的候选序列,同时奖励那些WER较低的候选序列。

最小化损失:使用反向传播算法更新模型参数,以最小化平均 WER 损失。由于损失函数直接反映了序列级别的错误率,这种方法能够更有效地训练模型来生成更准确的输出。

为了提高强化学习的训练效率,我们部署了一个远程服务来生成假设,并在更新当前服务器上的模型参数的同时计算MWER损失。在强化学习训练过程中:1)我们使用前一阶段训练的上下文SFT模型初始化模型参数; 2)我们利用高质量的数据进行强化学习训练,数据规模为数千小时。3)为了保持初始化模型的上下文感知能力,我们的训练数据还包括一定比例的上下文、语音、文本三元组。在完成RL训练之后,我们获得了我们的Seed-ASR模型。

表1:RL阶段的消融研究。作为奖励函数的加权WER在所有三个评估集上显示出比WER更好的性能(这些集的详细信息在第4.1节中介绍)。在强化学习阶段使用的上下文、语音、文本三元组的训练数据保证了上下文感知能力的不下降。Seed-ASR使用最后一行中的策略。WER或加权WER的度量计算中文、日文和韩文的字符错误,以及英文和其他语言的单词错误。

Observations

在改进Seed-ASR性能的过程中,我们也得到了一些观察:

Scaling Law

在LLM领域,可以观察到,较大的模型可以通过在更多数据上进行训练来不断降低损失值。据我们所知,在基于LLM的框架下,没有关于音频编码器的缩放律的相关研究。在SSL阶段,我们进行实验,以探讨不同的模型大小的LUISE的性能。具体来说,我们选择了五组型号尺寸:75 M、0.2B、0.6B、2B和5B。训练数据包括770万小时的无监督语音数据,覆盖多个领域,确保模型容量的充分利用。不同大小的模型在大多数训练配置中保持一致性,只是随着模型大小的增加,我们会按比例扩大模型的宽度和深度,适当增加批量大小和权重衰减,并降低学习率。

图7:(a)描绘了我们的音频编码器(LUISE)的预训练损失与模型参数大小的以2为底的对数之间的相关性。(b)描述了SFT之后的贪婪WER与模型参数大小的以2为底的对数之间的相关性。(c)描述了SFT之后的贪婪WER与LUISE的预训练损失之间的相关性。

我们首先关注验证集上的交叉熵预训练损失值与模型大小之间的相关性。如图7所示,我们观察到两者之间几乎呈线性相关。此外,我们比较了基于训练的LUISE的小规模SFT数据训练后的性能。使用贪婪搜索进行推理。如图7所示,多域评估集上的WER度量也与LUISE的模型大小呈现出近乎线性的相关性。此外,这揭示了SFT之后测试集上的WER度量与图7中SSL阶段中的损失函数值之间的正相关性。这些关于缩放律的发现为我们的编码器选择(考虑性能和效率的平衡)和后续优化提供了指导。

Long-form Ability

我们的Seed-ASR是在AcLLM的框架下建模的,它自然地利用LLM的语义知识和长上下文建模能力。因此,我们还探索了直接将整个长格式语音输入LLM进行识别的选项。该方法有效地避免了与对多个独立推断的长形式语音进行分割相关联的两个问题:1)分割过程可能导致边界处的信息丢失,从而降低识别准确性; 2)分割过程破坏了长形式语音中的强全局上下文信息,从而影响识别的准确性和一致性。

具体来说,我们构建了一系列长格式视频测试集,包括来自不同来源的5个数据集。在训练过程中,整个长格式数据被输入到模型中,而没有任何分割处理。测试集的持续时间分布与训练集的持续时间分布相当。如表2所示,使用长形式数据进行训练和测试,与短形式训练相比,相对WER降低了近8.8%,短形式训练采用域自适应VAD将长形式语音分割成几个部分进行训练和测试。长格式视频测试集的最大持续时间为5分钟,并具有显著长度延长的调度器。

模型与评价

目前,我们专注于在多样化场景下全面提升中文和多语种(不含中文)语音识别性能。因此,我们提出了两个具有相同模型结构和训练配方的Seed-ASR模型:汉语多方言模型,称为Seed-ASR(CN),和多语言模型,称为Seed-ASR(ML)。虽然我们也有同时支持中文和多语言的模型,但本报告将特别详细介绍两种分别专注于中文和多语言(不包括中文)的Seed-ASR模型。

Seed-ASR(CN)不仅可以用单个模型对普通话和13种汉语方言进行转录,而且在多领域、多方言、多口音和公共集等多维评估集上,与其他已发布的大型模型相比,性能有了显著的提高。此外,在上下文SFT阶段的训练赋予种子ASR(CN)有效的上下文感知能力,如在对话上下文评估集上所示。同样,Seed-ASR(ML)在8种多语言公共集(包括英语)和多领域评估集上取得了与其他已发布模型相比具有竞争力的结果,并且正在扩展到40多种语言。在下面的部分中,字错误率(WER)的度量被用作主要的客观度量。除非另有说明,否则WER的度量计算中文、日语、韩语的字符错误,并计算英语和其他语言的单词错误。

Seed-ASR (CN)

Seed-ASR(CN)遵循图3所示的完整训练管道。在SSL阶段,我们使用了具有近2B参数的LUISE编码器,并对来自各个领域的近800万小时的普通话和汉语方言语音数据进行了训练。在SFT阶段,我们使用经过训练的LUISE和具有超过百亿个参数的LLM进行模型初始化。训练数据包括包含多个域的普通话数据和方言数据的混合。SSL和SFT阶段的详细数据分布见附录A.3。在上下文SFT阶段,我们使用一定比例的SFT阶段数据与一些上下文、语音、文本三元数据混合进行训练。在RL阶段,我们使用训练好的上下文SFT模型进行初始化,并构建高质量的训练数据进行训练。在这个全面的训练过程之后,我们获得了Seed-ASR(CN)

为了全面评估Seed-ASR(CN)模型的ASR能力,我们在公开数据集上将其与其他已发布的模型进行了比较,并构建了一系列评估集,包括多领域集、多源视频集、硬案例集、多方言集、多口音集、上下文感知集和主观可懂度评估。

最后的结果是上述6个测试集的WER(中文字符)的平均值。我们用于比较的基线包括Paraformer-Large、Qwen-Audio和最近发布的基于LLM的ASR模型,其结构为Hubert+ Baichuan 2。他们的研究结果来自他们各自的论文。如表3所示。Seed-ASR(CN)表现出比其他模型更显著的性能优势,在这些公共数据集上获得了最先进的结果。对于6套的平均WER,Seed-ASR(CN)比其他已发布模型实现了超过24%-40%的WER降低。

对多域多源视频集的评估:

我们还对多领域评估集进行了全面的性能比较,该评估集包含来自视频,直播,语音搜索,会议,智能助手等各种场景的高质量评估数据,并将多领域集合中总共7个集合的加权平均WER作为最终指标。我们选择基于传感器的端到端模型[20],其具有MoE编码器和超过300 M的参数作为基线之一。此外,我们还在多域评估集上运行Paraformer-large(离线解码)的结果作为另一个基线。从表4中的结果来看,Seed-ASR(CN)显示出显著的性能优势,与我们强大的端到端模型相比,WER指标相对降低了47%以上。在覆盖7个不同子集的视频评估集上,Seed-ASR(CN)也获得了相当大的性能改善。 这些结果证明了Seed-ASR(CN)强大的基础能力。

此外,我们通过引入10个硬案例测试集来评估高级ASR能力,这些测试集覆盖了包括书名、汽车名称、成语、药品名称、电影名称、古诗、产品名称、音乐名称等在内的话语。这些测试集旨在评估模型识别包含专有名词的语音内容的能力,这些专有名词具有很强的专业性和领域特异性,反映了ASR模型的知识储备和识别准确率。硬案例集的评估指标是每个句子中给定关键字的F1分数。如表4所示,与端到端模型基线相比,Seed-ASR(CN)模型实现了F1值3. 3%的绝对增长,证明了AcLLM模型框架在利用LLM常识知识和语义推理能力方面的有效性。

多方言集和多口音集的评估:

由于我们的Seed-ASR(CN)模型支持普通话和13种汉语方言的识别,我们还引入了方言评估集。这套共包括13种方言(广东话、西南话、吴语、吉鲁话、中原话、闽语等)。并使用汉字的相同或相似发音对文本进行人工标注。我们的方言评估集的具体演示可在我们的网站2上获得。我们使用WER作为这个方言评估集的客观度量。

我们使用微调的Whisper Medium-v2,769 M参数作为我们的基线。为了进行公平的比较,我们使用相同的方言训练集训练Whisper Medium-v2和Seed-ASR(CN)。Seed-ASR(CN)需要在保持普通话综合能力的同时提高方言上的ASR性能,因此它使用来自多个领域的更大比例的普通话数据进行训练。相比之下,Whisper Medium-v2在多域集等综合评估集上显示出较差的结果。尽管如此,具有更大建模能力的Seed-ASR(CN)模型在13种方言集上仍然显示出优于基线的性能优势,13种方言的平均WER从21.68下降到19.2(相对WER降低11.4%),并且在单个方言测试集上相对WER降低超过21%。

为了进一步验证Seed-ASR(CN)对不同语音的识别性能,我们引入了一系列口音评估集,包括来自安徽、福建、甘肃、广东、贵州、湖南、江西、辽宁、陕西、山西和云南的11个中国口音。具体的口音语音样本也可在我们的网站2.如表6所示,与从头开始训练的强E2 E模型相比,Seed-ASR(CN)在口音测试集上表现出显着的改进。我们还通过在训练过程中移除重音SFT数据来进行消融研究,但Seed-ASR(CN)仍然在重音集上实现了强大的性能。在多方言、多口音评价集上的实验结果表明,该算法对不同地区的汉语语音识别具有较强的鲁棒性。

对对话上下文集的评估:

在语境感知的评估中,我们构建了一个高质量的对话语境集,其中对话历史被用作语境信息。如图8所示,我们提供了两个对话示例。每个测试用例包括对应的对话历史文本和当前识别的语音内容。我们将对话语境评估分为严格和宽松两个子集。严格子集包含对历史对话有很强依赖性的样本,以准确识别语音内容,例如人名。松散子集的历史对话和演讲内容之间的依赖性较弱,如专有名词。我们使用关键字召回作为评估指标。

总结:

在包括SFT → context SFT → RL的逐步训练配方之后,我们的Seed-ASR(CN)模型产生了。在上述综合评估集上,我们观察到我们的Seed-ASR(CN)模型的某些能力在不同的训练阶段得到了增强。在这里,我们对每个阶段的效果进行了详细的消融研究,结果如表9所示。首先,RL阶段的引入带来了对大多数评估集的改进,例如多域,多源视频,多方言,硬案例和代码切换。重音测试集中的轻微降级可能是由于训练数据比率。此外,上下文SFT阶段的训练对大多数测试集产生了积极的影响,特别是在上下文严格测试集上的召回度量方面带来了显着的改善。这进一步证明了我们的上下文感知训练和解码策略在上下文SFT阶段的有效性。

Seed-ASR (ML)

如上所述,Seed-ASR(CN)在识别普通话和汉语方言方面表现出很强的性能。为了将这些优势扩展到其他国家用户使用的语言,我们还将Seed-ASR方法应用于多语言场景,从而形成了我们的多语言模型:Seed-ASR(ML)。Seed-ASR(ML)的训练与Seed-ASR(CN)的主要区别在于训练数据。Seed-ASR(CN)专注于普通话和中国方言,而Seed-ASR(ML)则是在各种多语言数据集上进行训练的。在SSL阶段,Seed-ASR(ML)的音频编码器也使用了具有2B参数的LUISE,并使用来自多域源的数千万小时无监督多语言数据进行训练。在随后的阶段中,我们从我们的多语言ASR训练集中选择训练数据,这些训练数据总计数十万小时,涵盖9种语言:英语,中文,阿拉伯语,西班牙语,法语,印度尼西亚语,日语,韩语和葡萄牙语。 SSL和SFT阶段的详细数据分布见附录A.3。我们对多个评估集和公共数据集进行性能比较。

Evaluation on Multi-domain and Multi-accent Sets:

在多域评估集上,覆盖的域与第4.1.2节中介绍的种子ASR(CN)上的多域评估集相同。硬盒测试集涵盖了医疗健康、食品和饮料、体育、技术、服装、游戏、娱乐和美容等领域。我们还建立了对不同口音的英语的评估,包括来自英国,美国,澳大利亚,加拿大,中国,印度,新加坡,新西兰和南非的发言者。对于多语言评估,我们报告了7种非英语语言的平均WER性能:阿拉伯语(AR),西班牙语(ES),法语(FR),印度尼西亚语(ID),日语(JA),韩语(KO)和葡萄牙语(PT)。如表10所示,用于比较的基线包括Google USM [50](API call 3)、Whisper Large v3 [39](离线解码)和Universal-1 [41](API调用4)。由于Universal-1在我们的多语言多域评估集中仅支持3种语言,因此其相应结果未包含在此处。我们将这些模型在多语言多域评估集上的语言性能比较附在附录A.1中。从表10中的结果来看,与最强的基线相比,Seed-ASR(ML)在英语和多语言多领域评估集上分别表现出相对超过42%和40%。在英语多重音和硬格评估集上也观察到类似的显着改进。

除了内部多域评估集之外,我们还将Seed-ASR(ML)与英语和其他语言的公共测试集上的其他模型进行了比较,包括Librispeech[36] test clean/other,MLS[38],Tedo 3[24],Callhome,Switchboard[19],AMI[30]和Fleurs[13]。测试集的详细信息见附录A.2。结果如表11所示。请注意,基线模型的所有结果都是由基线模型的相应论文或技术报告的WER(Whisper Large-v3结果来自Universal-1的技术报告[41])。 如表11所示,Seed-ASR(ML)在不同语言的大多数测试集上都实现了最佳性能,提高了10%到40%,这表明Seed-ASR(ML)对训练期间看不到的领域具有泛化能力。

与Seed-ASR(CN)类似,Seed-ASR(ML)在广泛的评估集上表现出与多个强基线相比的卓越性能。该模型在识别具有不同声学环境、语义上下文和多种语言口音的语音方面表现出色,强调了该模型的泛化能力及其在训练过程中处理来自各种看不见的领域的语音的有效性。总体而言,上述中文和多语言环境下的评估集的结果证明了Seed-ASR在涵盖多语言,多方言,多口音,多领域和多定制需求的多种应用场景中的泛化能力和强大的基础能力。

总结

通过包括SFT、上下文SFT和RL在内的逐阶段训练的Seed-ASR模型,与最近发布的强大端到端模型相比,在不同声学和语义领域、口音/方言/语言和长距离语音持续时间的各种评估集上展示了上级能力。大规模的LUISE预训练和连接LUISE和LLMSFT赋予Seed-ASR理解不同语音内容的能力。上下文SFT阶段的引入显著提高了模型对相关上下文的关键词的召回率,展示了模型在利用LLMs的上下文感知能力方面的强大定制能力。RL阶段进一步巩固了Seed-ASR的文本生成行为与准确转录的要求之间的一致性,特别是语义重要部分的转录。 总体而言,结果肯定了Seed-ASR作为涉及多种语言,方言,口音,域和定制需求的各种应用程序的最佳ASR模型的地位。未来,我们将专注于扩展Seed-ASR在单个模型中处理多个任务的能力,进一步增强长格式能力并增加支持的语言数量。