摘要
多模态大型语言模型被视为迈向通用人工智能 (AGI) 的关键一步,随着 ChatGPT 的出现,该模型引起了广泛关注。然而,当前的语音语言模型通常采用级联范式,阻碍了模态间知识传递。在本文中,我们提出了 SpeechGPT,这是一种具有内在跨模态对话能力的大型语言模型,能够感知和生成多模态内容。利用离散语音表示,我们首先构建 SpeechInstruct,这是一个大规模跨模态语音指令数据集。此外,我们采用了三阶段训练策略,包括模态自适应预训练、跨模态指令微调和模态链指令微调。实验结果表明,SpeechGPT 具有令人印象深刻的遵循多模态人类指令的能力,并凸显了使用一个模型处理多种模态的潜力。演示位于 https://0nutation.github.io/SpeechGPT.github.io/。
1.介绍
大型语言模型在各种自然语言处理任务上表现惊人。同时,多模态大型语言模型(如 GPT-4、PALM-E 和 LLaVA)探索了 LLM 理解多模态信息的能力。然而,当前的 LLM 与通用人工智能 (AGI) 之间存在显著差距。首先,大多数当前的 LLM 只能感知和理解多模态内容,而不能自发生成多模态内容。其次,图像和语音等连续信号无法直接适应用于接收离散 token 的 LLM。
当前的语音语言模型主要采用级联范式,即 LLM 与自动语音识别 (ASR) 模型或文本转语音 (TTS) 模型串联,或者将 LLM 用作控制中心,集成多个语音处理模型以涵盖多个音频或语音任务。一些关于生成口语语言模型的先前工作涉及将语音信号编码为离散表示并使用语言模型对其进行建模。
现有的级联方法或口语模型虽然能够感知和生成语音,但仍存在一些局限性。首先,级联模型中的 LLM 仅充当内容生成器。由于语音和文本的表示不一致,LLM 的知识无法转移到语音模态。其次,级联方法会丢失情感和韵律等副语言信号。第三,现有的口语模型仅合成语音,但无法理解其语义信息,从而无法实现真正的跨模态感知和生成。
在本文中,我们提出了 SpeechGPT,这是一种具有内在跨模态对话能力的大型语言模型,能够感知和生成多模态内容。我们使用自监督训练的语音模型进行语音离散化,以统一语音和文本之间的模态。然后将离散的语音token扩展到 LLM 的词表中,从而赋予模型感知和生成语音的内在能力。
为了使模型具备处理多模态指令的能力,我们构建了第一个语音-文本跨模态指令遵循数据集 SpeechInstruct。具体来说,我们将语音离散化为离散单元,并基于现有的 ASR 数据集构建跨模态的语音单元-文本对。同时,我们使用 GPT-4 构建了数百条针对不同任务的指令,以模拟实际用户指令,如附录 B 所示。此外,为了进一步增强模型的跨模态能力,我们设计了 Chain-of-Modality 指令数据,即模型接收语音命令,以文本形式思考该过程,然后以语音形式输出响应。
为了实现更好的跨模态迁移和高效训练,SpeechGPT 经历了三个阶段的训练过程:模态适应预训练、跨模态指令微调和模态链指令微调。第一阶段通过离散语音单元延续任务实现 SpeechGPT 的语音理解。第二阶段使用 SpeechInstruct 来提高模型的跨模态能力。第三阶段利用参数高效的 LoRA 微调进行进一步的模态对齐。
为了评估 SpeechGPT 的有效性,我们进行了广泛的人工评估和案例分析,以评估 SpeechGPT 在文本任务、语音文本跨模态任务和口语对话任务上的表现。结果表明,SpeechGPT 在单模态和跨模态指令遵循任务以及口语对话任务中表现出强大的能力。
我们的贡献包括:
- 我们构建了第一个能够感知和生成多模态内容的多模态大型语言模型。
- 我们构建并发布了第一个大规模语音文本跨模态指令遵循数据集 SpeechInstruct。
- 我们构建了第一个具有强大人类指令遵循能力和口语对话能力的口语对话LLM。
- 我们展示了通过离散表示将其他模态纳入LLM的巨大潜力。
2.相关工作
Multi-modal Large Language Model。当前的多模态 LLM 主要关注视觉领域,将通过预训练的视觉编码器获得的连续表示输入到 LLM 中,从而促进对视觉语言数据的全参数或参数高效训练。Palm-E 将 540B PaLM 和 22B Vision Transformer 集成到最大的视觉语言模型中。LLaVA 利用预训练的 CLIP 视觉编码器和 LLaMA,对 GPT4 辅助的视觉指令数据进行指令微调。X-LLM 将多模态转换为具有 X2L 接口的表示,作为大型语言模型的输入。然而,这样的结构只使 LLM 能够处理多模态输入,而不能生成多模态输出。与之前的研究不同,我们的方法强调开发以语音为中心的多模态 LLM,使其能够同时适应多模态输入和输出。
Generative Spoken Language Model。基于离散自监督表示的口语生成语言模型在大规模语音数据集训练中取得了显著进展。AudioLM 提出基于音频编解码器和语义code对语音进行建模,可以在无文本环境中合成语音。VALL-E 在音频编解码器上构建生成式口语模型,并将文本转语音视为条件生成任务。然而,这些模型是为特定任务设计的,未能从 LLM 中受益。SpeechGPT 建立在 LLM 的基础上,将 LLM 的知识转移到语音模态,从而获得更好的任务泛化和人类指令遵循能力。
Speech-Enabled LLM Interaction。ChatGPT 出现后,一些研究集中于将语音模型与 LLM 集成,以实现与 LLM 的直接语音交互。HuggingGPT 促进了 LLM 对人类指令的任务分解,并允许调用 Huggingface 中的模型来完成特定任务,涵盖了一系列自动语音识别 (ASR) 和文本转语音模型。AudioGPT 利用各种音频基础模型来处理复杂的音频信息,并将 LLM 与输入/输出接口 (ASR、TTS) 连接起来进行语音对话。然而,这些模型表现出更高的复杂性,需要大量资源,并且容易出现不可避免的错误累积问题。我们的方法可以在不依赖 ASR 或 TTS 系统的情况下实现与 LLM 的语音交互,从而避免了上述缺点。
3.SpeechInstruct Construction
由于公开的语音数据有限,且语音文本任务种类较少,我们构建了 SpeechInstruct 语音文本跨模态指令遵循数据集。该数据集由两部分组成,第一部分称为跨模态指令,第二部分称为链式模态指令。SpeechInstruct 的构建流程如图 2 所示。
3.1 Cross-modal Instruction
Data Collection。我们收集了多个大规模英文语音识别数据集来构建跨模态指令,包括 Gigaspeech、Common Voice 和 LibriSpeech。我们使用 mHuBERT 作为语音分词器,将语音数据离散化为离散单元,并去除相邻帧的重复单元以获得简化单元。最终获得 900 万个单元-文本数据对。
Task Description Generation。我们生成与语音-文本数据对兼容的 ASR 和 TTS 任务描述。与 Self-Instruct 方法不同,我们通过零样本方法生成描述。具体来说,我们将附录 A 中所示的提示直接输入到 OpenAI GPT-4 中以生成任务描述。我们的生成方法为每个任务生成 100 条指令,附录 B 中显示了一些示例。
Instruction Formatting。对于离散单元序列
U
U
U 及其相关转录文本
T
T
T,我们根据概率
p
p
p 确定是否将其用于构建 ASR 任务或 TTS 任务。随后,我们从相应的任务描述中随机选择一个描述
D
D
D。这将得到一个由任务描述、离散单元序列和转录文本组成的三元组,表示为
(
D
,
U
,
T
)
(D, U, T)
(D,U,T)。之后,使用以下模板将三元组组装成一条指令:
[Human]:
{
D
}
,
This
is
input:
{
U
}
<eoh>.[SpeechGPT]:
{
T
}
<eos>
\textbf{[Human]:}\{D\}, \textbf{This~is~input:} \{U\} \textbf{<eoh>.[SpeechGPT]:} \{T\}\textbf{<eos>}
[Human]:{D},This is input:{U}<eoh>.[SpeechGPT]:{T}<eos>。为了支持多轮对话,组装好的指令以多轮对话的形式连接起来,并遵守模型的最大输入长度。
3.2 Chain-of-Modality Instruction
Speech Instruction Generation。由于缺乏具有语音输入和语音输出的指令数据,我们训练了一个文本到单元生成器,将文本指令数据转换为语音指令数据。具体而言,文本到单元生成器采用 Transformer 编码器-解码器架构,在跨模态指令中的 LibriSpeech 单元-文本对上对其进行训练。我们从 moss-002-sft-data 数据集中选取响应长度短于 35 个字的 37,969 个样本,并通过文本到单元生成器将它们的指令和响应都转换为单元序列。结果,我们得到了由语音指令、文本指令、文本响应和语音响应组成的 37,969 个四元组,记为
(
S
p
e
e
c
h
I
,
T
e
x
t
I
,
T
e
x
t
R
,
S
p
e
e
c
h
R
)
(SpeechI, TextI, TextR, SpeechR)
(SpeechI,TextI,TextR,SpeechR)。
Instruction Formatting。利用上述四元组,我们可以为四种输入输出格式构建思路链式指令,即语音指令-语音响应、语音指令-文本响应、文本指令-语音响应和文本指令-文本响应。它们对应的模板可以在附录 C 中找到。
4.SpeechGPT
4.1 Model Structure
设计了一个统一的框架,以提供跨不同模态的架构兼容性。如图 2 所示,我们的模型由三个主要组件组成:离散单元提取器、大型语言模态和单元声码器。在此架构下,LLM 可以感知多模态输入并生成多模态输出。
Discrete Unit Extractor。离散单元提取器利用 Hidden-unit BERT (HuBERT) 模型将连续语音信号转换为离散单元序列。HuBERT 是一个自监督模型,它通过应用于模型中间表示的 k-means 聚类来预测被mask的音频片段的离散标签进行学习。它结合了 1-D 卷积层和 Transformer 编码器,将语音编码为连续的中间表示,然后使用 k-means 模型将这些表示进一步转换为聚类索引序列。随后,删除相邻的重复索引,得到一个离散单元序列,表示为
U
=
(
u
1
,
u
2
,
.
.
.
,
u
T
),
u
i
∈
0
,
1
,
.
.
.
,
K
−
1
,
∀
1
≤
i
≤
T
U =(u_1,u_2,...,u_T),u_i ∈ 0, 1, ..., K−1, ∀1 ≤i ≤T
U=(u1,u2,...,uT),ui∈0,1,...,K−1,∀1≤i≤T,其中
K
K
K 表示聚类的总数。
Large Language Mode。我们采用 Meta AI LLaMA 模型作为我们的大型语言模型。LLaMA 包含一个嵌入层、多个Transformer块和一个 LM 头层。LLaMA 中的参数总数范围为 7B 到 65B。从 1.0 万亿个 token 的广泛训练数据集中提取数据,LLaMA 在各种 NLP 基准测试中表现出与规模大得多的 175B GPT-3 相比具有竞争力的性能。
Unit Vocoder。由于 (Polyak et al., 2021) 中单扬声器单元声码器的限制,我们训练了一个多扬声器单元 HiFi-GAN 来从离散表示中解码语音信号。HiFi-GAN 架构由一个生成器
G
\textbf G
G 和多个判别器
D
\textbf D
D 组成。生成器使用查找表 (LUT) 来嵌入离散表示,嵌入序列由一系列由转置卷积和具有扩张层的残差块组成的块进行上采样。扬声器嵌入连接到上采样序列中的每一帧。判别器具有多周期判别器 (MPD) 和多尺度判别器 (MSD),它们具有与 (Polyak et al., 2021) 相同的架构。
4.2 Training
为了将语音离散表示纳入 LLM,我们首先扩展词表和相应的嵌入矩阵。我们将训练过程分为三个阶段。第一阶段是在非配对语音数据上进行 Modality-Adaptation 预训练。第二阶段是跨模态指令微调。第三阶段是链式模态指令微调。
Expanding Vocabulary。给定原始 LLM 词表
V
V
V 的大小为
∣
V
∣
|V|
∣V∣,为了将语音离散表示集成到 LLM 中,我们使用一组额外的单元token
V
′
V'
V′ 来扩展词表,大小为
∣
V
′
∣
=
K
|V'| = K
∣V′∣=K。扩展的词表
V
′
′
V''
V′′ 是原始词表
V
V
V 和新词
V
′
V'
V′ 的并集:
V
′
′
=
V
∪
V
′
(1)
V''=V∪V'\tag{1}
V′′=V∪V′(1)
我们将原始词嵌入矩阵表示为
E
∈
R
∣
V
∣
×
d
E ∈ \mathbb R^{|V|×d}
E∈R∣V∣×d,其中
d
d
d 是词嵌入的维度。为了适应扩展的词表,我们需要创建一个随机初始化的词嵌入矩阵
E
′
∈
R
∣
V
′
′
∣
×
d
E' ∈\mathbb R^{|V''|×d}
E′∈R∣V′′∣×d。我们通过将
E
E
E 的值复制到
E
′
E'
E′ 的前
∣
V
∣
|V|
∣V∣ 行来保留原始词嵌入:
E
′
[
0
:
∣
V
∣
,
:
]
=
E
(2)
E'[0:|V|,:]=E\tag{2}
E′[0:∣V∣,:]=E(2)
最后,我们用新的词表
V
′
′
V''
V′′和词嵌入矩阵
E
′
E'
E′替换原来的词表和词嵌入矩阵。
Stage 1: Modality-Adaptation Pre-training。为了使 LLM 能够处理离散单元模态,我们利用未标注的语音语料库来训练 LLM 的下一个token预测任务。这种方法与 LLM 的文本预训练目标一致。给定由语音
U
1
,
U
2
,
.
.
.
,
U
m
U_1, U_2, ..., U_m
U1,U2,...,Um 和 LLM 组成的未标注语音语料库
C
C
C(记为
L
1
L_1
L1),负对数似然损失可以表示为:
L
(
L
∣
C
)
=
−
∑
j
=
1
m
∑
i
=
1
n
j
l
o
g
P
(
u
i
,
j
∣
u
<
i
,
j
;
L
)
(3)
\mathcal L(L|C)=-\sum^m_{j=1}\sum^{n_j}_{i=1}log~P(u_{i,j}|u_{<i,j};L)\tag{3}
L(L∣C)=−j=1∑mi=1∑njlog P(ui,j∣u<i,j;L)(3)
其中
m
m
m 是数据集
C
C
C 中的语音数量,
n
j
n_j
nj 是语音
U
j
U_j
Uj 中离散单元 token 的数量,
u
i
,
j
u_{i,j}
ui,j 表示第
j
j
j 个语音中的第
i
i
i 个单元 token。
Stage 2: Cross-modal Instruction Fine-Tuning。在此阶段,我们利用配对数据对齐语音和文本模态。我们将 SpeechInstruct 中的跨模态指令与 moss-002-sft 数据集混合,以得出混合数据集
I
I
I,该数据集由样本
T
1
,
T
2
,
.
.
.
,
T
x
T_1, T_2, ..., T_x
T1,T2,...,Tx 组成。我们在
I
I
I 上微调从第一阶段获得的模型
L
L
L。
每个样本
T
j
T_j
Tj 由前缀和文本拼接而成,由
t
1
,
t
2
,
.
.
.
,
t
n
j
t_1, t_2, ..., t_{n_j}
t1,t2,...,tnj组成,训练目标是最小化负对数似然,损失计算只考虑文本部分,忽略前缀,格式如下:
L
(
L
∣
I
)
=
−
∑
j
=
1
x
∑
i
=
p
j
+
1
y
j
l
o
g
P
(
t
i
,
j
∣
t
<
i
,
j
;
L
)
(4)
\mathcal L(L|I)=-\sum^x_{j=1}\sum^{y_j}_{i=p_j+1}log~P(t_{i,j}|t_{<i,j};L)\tag{4}
L(L∣I)=−j=1∑xi=pj+1∑yjlog P(ti,j∣t<i,j;L)(4)
其中
x
x
x 是语料库
I
I
I 中的样本数,
y
j
y_j
yj 是样本
T
j
T_j
Tj 中的 token 总数,
p
j
p_j
pj 是
T
j
T_j
Tj 前缀部分的 token 数量,
t
i
,
j
t_{i,j}
ti,j 表示
T
j
T_j
Tj 中的第
i
i
i 个词。
Stage 3: Chain-of-Modality Instruction Fine-Tuning。在第 2 阶段获得模型后,我们利用参数高效的低秩自适应 (LoRA) 在 SpeechInstruct 中的 Chain-of-Modality 指令上对其进行微调。我们将 LoRA 权重(适配器)添加到注意力机制并训练新添加的 LoRA 参数。我们采用与第 2 阶段相同的损失函数。