% !TeX root = ../aml_notes.tex
% ============================================================
% 第五部分 多模态机器学习方法与模型
% 负责人：润松（整体框架 + 图像相关内容 + 章节衔接）
% 协作：语音/音频小节由陈丹补充，统一用 \todochen{...} 标记占位。
% 写作定位：正规研究生教材正文，教授口吻，语言严谨且留有余地（避免绝对化表述），少用比喻。
% 结构：按导师意见仅分三部分（5.1/5.2/5.3），不设“引言”与“本讲小结”。
% 参考文献：正文用 \cite{key} 内引，条目集中放在主文件 backmatter 的“参考资料”thebibliography 中。
% 中文引号一律使用“ ”。
% ============================================================

\chapter{多模态机器学习方法与模型}
\chapterinfo{赵润松、陈丹、刘晓倩}
\label{ch:multimodal}

\noindent 前面几章我们建立了机器学习的数学基础与优化方法、强化学习、大语言模型的预训练与微调（包括指令微调与偏好对齐），以及深度学习中的连续动力学与基于流的生成模型。这些内容大多围绕单一模态、尤其是文本数据展开。然而，真实世界的信息通常以多种模态并存：图像是定义在二维空间上的像素信号，语音与音频是随时间变化的声学信号，文本则是离散的符号序列。它们在数据结构、噪声特性与语义粒度上差异显著，却又常常指向相同的语义——同一只猫，可以是一张照片、一句描述，也可以是一段叫声（图~\ref{fig:cat-modalities}）。

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.9\linewidth]{figures/猫在不同模态中的表示.png}
  \caption{同一语义“猫”在不同模态中的具体形式：一张猫的图像、文本“猫”（cat）与猫叫声的频谱。表示学习与跨模态对齐所追求的，正是让这三者在向量空间中彼此接近。}
  \label{fig:cat-modalities}
\end{figure}

本章讨论\keyword{多模态机器学习}：研究图像、语音/音频与文本等不同模态如何被统一表示、对齐、建模与生成。全章分为三个部分，依次递进。第一部分是多模态的\keyword{表示学习与跨模态对齐}，解决不同模态如何被编码为向量并进入统一语义空间；第二部分是\keyword{多模态基础模型的结构与训练}，说明图像、语音如何接入大语言模型，形成理解与交互能力；第三部分是\keyword{条件生成建模}，把文本生成图像、图像编辑、语音合成与音频生成，统一表述为在给定条件下学习一个分布并采样的问题。

\begin{learninggoals}
  \begin{itemize}
    \item 掌握图像、语音与文本在计算机中的原始表示形式，以及将其转化为向量表示的动机与方法；
    \item 理解向量与向量空间的含义，明确“语义相近则表示相近”这一表示学习目标，并据此理解跨模态对齐；
    \item 掌握以对比学习为代表的跨模态对齐方法及其在图文场景中的实现，了解相关代表工作的发展脉络；
    \item 理解图像、语音如何接入大语言模型，构成具备多模态理解能力的基础模型；
    \item 掌握条件生成建模的统一框架，能够将文本生成图像、图像编辑、语音与音频生成，表述为条件分布 $p(x\mid c)$ 的学习与采样问题。
  \end{itemize}
\end{learninggoals}


% ============================================================
\section{多模态表示学习与跨模态对齐}
\label{sec:repr}
% ============================================================

本节讨论两个基础问题：其一，图像、语音与文本如何从原始数据转化为模型可处理的\keyword{向量表示}；其二，不同模态的表示如何在同一空间中建立\keyword{语义对应}，即跨模态对齐。这两个问题是后续多模态模型的前提。

% ----------------------------------------------------------
\subsection{单模态表示学习：从原始信号到向量}
\label{sub:encode}

\paragraph{数据在计算机中的原始形式。}讨论表示学习之前，需要先明确各模态在计算机中以何种形式存在（见图~\ref{fig:rawforms}），因为后续处理都建立在这一原始形式之上。

\emph{图像}在计算机中通常是一个数值矩阵。屏幕上的图像由许多小方格构成，每个小方格称为一个\keyword{像素}（pixel）。一幅灰度图像可表示为一个 $H\times W$ 的矩阵，其中第 $(i,j)$ 个元素是一个整数（常取 $0$ 至 $255$），表示该像素的明暗，$0$ 为黑、$255$ 为白。彩色图像一般由红、绿、蓝三个通道叠加而成，对应一个 $H\times W\times 3$ 的三维数组。于是一幅 $224\times224$ 的彩色图像，大致相当于 $224\times224\times3\approx 1.5\times10^{5}$ 个整数。

\emph{语音/音频}在计算机中通常是一串随时间排列的数值。声音是空气压强的振动，麦克风按固定的时间间隔（采样率，如每秒 $16000$ 次）测量这种振动的强弱，每次测量得到一个数值，称为一个\keyword{采样点}，其取值即\keyword{振幅}。因此一段语音可视为一个一维的长向量，长度大致正比于时长。

\emph{文本}在计算机中通常是一串编号。先准备一张\keyword{词表}（vocabulary），把可能出现的词（或子词）逐一编号；一段文本便被转写为这些编号构成的序列。例如词表中“猫”的编号为 $352$，文本中的“猫”便以整数 $352$ 进入模型。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[font=\scriptsize,>={Latex[length=2mm]}]
    % ===== 图像：像素矩阵 =====
    \node[font=\scriptsize\bfseries] at (0.9,2.2) {图像：像素矩阵};
    \draw[step=0.6cm,gray!60] (0,0) grid (1.8,1.8);
    \foreach \x/\v in {0.3/30,0.9/200,1.5/255} \node[font=\tiny] at (\x,1.5) {\v};
    \foreach \x/\v in {0.3/128,0.9/90,1.5/15} \node[font=\tiny] at (\x,0.9) {\v};
    \foreach \x/\v in {0.3/60,0.9/180,1.5/240} \node[font=\tiny] at (\x,0.3) {\v};
    \node[align=center,font=\tiny] at (0.9,-0.5) {每格为 0–255 的整数\\（$H\times W\times 3$）};
    % ===== 语音：采样点 =====
    \begin{scope}[shift={(3.2,0)}]
      \node[font=\scriptsize\bfseries] at (1.5,2.2) {语音：采样点（振幅）};
      \draw[->,gray] (-0.1,0.9)--(3.2,0.9) node[right,font=\tiny,black]{时间};
      \draw[CourseBlue,thick] plot[domain=0:2.9,samples=60] (\x,{0.9+0.6*sin(\x*150)});
      \foreach \x in {0.2,0.6,1.0,1.4,1.8,2.2,2.6} \fill[CourseGold] (\x,{0.9+0.6*sin(\x*150)}) circle(1.2pt);
      \node[align=center,font=\tiny] at (1.4,-0.5) {每点为一个振幅数值\\$\dots,\,0.2,\,0.5,\,-0.1,\,\dots$};
    \end{scope}
    % ===== 文本：词表编号 =====
    \begin{scope}[shift={(7.3,0)}]
      \node[font=\scriptsize\bfseries] at (1.1,2.2) {文本：词表编号};
      \node at (1.1,1.4) {“一只猫”};
      \node[font=\tiny] at (1.1,0.82) {$\Downarrow$ 查词表};
      \node at (1.1,0.25) {$[\,15,\ 352\,]$};
      \node[align=center,font=\tiny] at (1.1,-0.5) {每个词对应一个编号};
    \end{scope}
  \end{tikzpicture}
  \caption{三种模态在计算机中的原始形式：图像是像素整数矩阵，语音是随时间的振幅采样序列，文本是词表编号序列。}
  \label{fig:rawforms}
\end{figure}

\paragraph{为什么要用向量表示。}上述原始形式虽是数字，却不便于直接学习。一个重要原因是，原始数字之间的\emph{数值接近}并不等于\emph{语义接近}：像素值相近的两幅图像内容可能并不相干，内容相近的两幅图像像素值也可能相差很大；词表中编号相邻的两个词往往含义无关。我们希望得到的，是一种\emph{语义相近则表示也相近}的形式。

为此，机器学习常用\keyword{向量}来表示对象。一个向量是一组有序的实数 $\mathbf{x}=(x_1,x_2,\dots,x_d)$，其中每个分量 $x_k$ 可理解为对象在某个\emph{特征}上的取值。也就是说，\textbf{向量可以看作对象若干特征的集合}。例如，可设想用不同分量分别刻画一幅图像“是否有毛发”“是否四足”“是否有轮子”等语义特征；若两幅图像在这些特征上取值接近，其向量也接近。真实模型学到的特征并非人为指定，而是从数据中自动学习，但“向量作为特征集合”这一直观通常是成立的。

\paragraph{向量空间与相似度。}全体 $d$ 维向量构成一个 $d$ 维\keyword{向量空间}。在这个空间中，每个对象对应一个点，对象间的“相似程度”可用点之间的\emph{距离}或\emph{夹角}来量化。常用两种度量：欧氏距离 $\lVert \mathbf{x}-\mathbf{y}\rVert_2$ 衡量远近；余弦相似度
\begin{equation}
  \cos(\mathbf{x},\mathbf{y})=\frac{\langle \mathbf{x},\mathbf{y}\rangle}{\lVert\mathbf{x}\rVert\,\lVert\mathbf{y}\rVert}
\end{equation}
衡量方向的一致程度，取值越接近 $1$ 表示方向越一致。\keyword{表示学习}的目标，可以概括为学习一个从原始数据到向量的映射，使得\textbf{语义相近的对象在向量空间中距离较小、语义无关的对象距离较大}（图~\ref{fig:vecspace}）。这一点是理解后续内容的关键：跨模态对齐所追求的，正是让表达相同语义的不同模态对象，在同一向量空间中彼此接近。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>=Latex,scale=1.0]
    \draw[->] (0,0)--(5,0) node[right]{\small 特征维度（示意）};
    \draw[->] (0,0)--(0,3.6) node[above]{\small 特征维度（示意）};
    \fill[CourseBlue] (3.7,2.7) circle(2.2pt) node[right]{\small 猫的图像};
    \fill[CourseBlue] (3.4,3.0) circle(2.2pt) node[above]{\small 文本“猫”};
    \fill[CourseGold] (1.0,0.7) circle(2.2pt) node[right]{\small 汽车的图像};
    \draw[dashed,CourseBlue] (3.7,2.7)--(3.4,3.0);
    \node[CourseBlue,font=\scriptsize] at (4.6,2.2) {距离小（语义相近）};
    \draw[dashed,CourseGold] (3.7,2.7)--(1.0,0.7);
    \node[CourseGold,font=\scriptsize] at (2.0,1.9) {距离大（语义无关）};
  \end{tikzpicture}
  \caption{表示学习的目标：语义相近的对象（无论来自哪个模态）在向量空间中距离较小，语义无关的对象距离较大。}
  \label{fig:vecspace}
\end{figure}

\paragraph{Token：表示的基本单元。}处理图像、语音、文本时，通常不会把整个对象压成单个向量，而是先切分为若干\keyword{基本单元}，每个单元各对应一个向量，从而把对象表示为\emph{一串向量}。这种基本单元称为 \keyword{token}。文本的 token 一般是词或子词；图像的 token 常取16x16的图块（\keyword{patch}）；语音的 token 可取声学帧或声学单元。把不同模态都整理为“token 序列”的一个好处是：以自注意力为核心的序列模型（Transformer 与大语言模型）可以较为统一地处理它们，这为多模态与大语言模型的结合提供了结构上的便利。

\paragraph{图像表示：卷积与视觉 token。}如前所述，原始像素通常不适合直接作为语义表示，需要一个\keyword{编码器}把像素逐层加工为高层特征。图像编码中最经典的运算是\keyword{卷积}（convolution）。

卷积的核心是一个小的权重矩阵，称为\keyword{卷积核} $K$（例如 $3\times3$）。它在输入图像上滑动，在每个位置与所覆盖的局部区域做\emph{逐元素相乘再求和}，得到输出的一个数值；所有位置的输出组成一张\keyword{特征图}。以二维情形为例，记输入为 $I$、卷积核为 $K$，则输出特征图 $S$ 在位置 $(i,j)$ 处为
\begin{equation}
  S(i,j)=(I * K)(i,j)=\sum_{m}\sum_{n} I(i+m,\,j+n)\,K(m,n).
  \label{eq:conv}
\end{equation}
式~\eqref{eq:conv} 表明：卷积核只关注一小块\emph{局部}区域（称为\keyword{局部感受野}），用于检测该处是否出现某种局部模式，如某方向的边缘或某种纹理；同一卷积核在整幅图像上\emph{共享}使用（图~\ref{fig:conv}）。参数共享带来两点好处：一是显著减少参数量，二是带来一定的\keyword{平移不变性}——同一模式出现在不同位置时，可由同一卷积核检测到。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[scale=0.55, every node/.style={font=\scriptsize}]
    \draw[step=1,gray!60] (0,0) grid (5,5);
    \draw[CourseBlue,very thick] (0,2) rectangle (3,5);
    \node at (2.5,5.5) {输入图像 $I$};
    \node[CourseBlue] at (1.5,4.4) {局部感受野};
    \begin{scope}[xshift=8.5cm,yshift=1cm]
      \draw[step=1,gray!60] (0,0) grid (3,3);
      \draw[CourseGreen,very thick] (0,2) rectangle (1,3);
      \node at (1.5,3.5) {特征图 $S$};
    \end{scope}
    \draw[->,thick] (3.3,3.5)--(8.2,3.5);
    \node at (5.7,4.0) {卷积核 $K$};
    \node at (5.7,3.0) {逐元素相乘求和};
  \end{tikzpicture}
  \caption{卷积运算：卷积核在输入上滑动，每个局部感受野经“逐元素相乘再求和”得到特征图的一个值。}
  \label{fig:conv}
\end{figure}

以边缘检测为例：取一个用于检测竖直边缘的 $3\times3$ 卷积核（如 Sobel 核），按式~\eqref{eq:conv} 在图像上滑动，即可在灰度变化剧烈的竖直边缘处得到较大响应、在颜色平坦处得到接近 $0$ 的响应，从而“点亮”物体的竖直轮廓（图~\ref{fig:conv-edge}）；换用不同的卷积核，则可分别检测水平边缘、斜向纹理等不同局部模式。

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.80\linewidth]{figures/卷积核用于边缘检测.png}
  \caption{卷积核用于边缘检测：竖直边缘检测核（中间，Sobel 核）对左侧图像做卷积，得到右侧突出竖直轮廓的特征图。}
  \label{fig:conv-edge}
\end{figure}

\paragraph{图像编码器的发展脉络。}把多层卷积叠加起来，可从低层的边缘、纹理逐层组合出更高层的语义，这类网络称为\keyword{卷积神经网络}（CNN）。CNN 的发展大体经历了从 AlexNet\cite{alexnet}确立深度卷积网络在图像识别上的有效性，到 VGG\cite{vgg}、ResNet\cite{resnet}通过残差连接把网络显著加深的过程。另一类做法不依赖卷积，而是把图像切成固定大小的图块（patch）：例如把 $224\times224$ 的图像切成 $14\times14$ 个 $16\times16$ 的图块，每个图块经线性映射成一个向量，即一个\keyword{视觉 token}，随后用自注意力建模这些 token 间的关系，这便是 Vision Transformer（其结构见图~\ref{fig:vit}）\cite{vit}。两类结构的训练目标类似，都是让所得视觉表示服务于具体任务（如分类），并使语义相近的图像表示彼此接近。经过编码后，图像被表示为一组视觉 token，其序列形式与文本 token 较为接近，这为二者进入同一模型创造了条件；不过二者在语义粒度上仍有差异，视觉 token 更接近局部区域特征，而文本 token 通常已对应较完整的语义单位。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
      >={Latex[length=2mm]},font=\scriptsize,
      patch/.style={draw,minimum size=0.5cm,fill=CourseBlue!14},
      tok/.style={draw,minimum size=0.52cm,fill=CourseGreen!18,font=\tiny},
      cls/.style={draw,minimum size=0.52cm,fill=CourseGold!25,font=\tiny},
      blk/.style={draw,rounded corners,align=center}]
    % 原图
    \node[align=center] (img) at (0,0) {输入图像\\$224\times224$};
    % 切图块
    \node[blk,fill=CourseGray,right=6mm of img,minimum height=0.9cm] (split) {切成图块\\（$16\times16$）};
    % 图块序列
    \node[patch,right=6mm of split] (p1) {};
    \node[patch,right=0.6mm of p1] (p2) {};
    \node[patch,right=0.6mm of p2] (p3) {};
    \node[right=0.6mm of p3,font=\tiny] (pd) {$\cdots$};
    \node[patch,right=0.6mm of pd] (pn) {};
    \node[below=1mm of p2,font=\tiny,align=center] {图块};
    % 线性投影+位置编码
    \node[blk,fill=CourseGray,right=5mm of pn,minimum height=0.9cm] (proj) {线性投影\\$+$位置编码};
    % token 序列（含 CLS）
    \node[cls,below=7mm of split] (c0) {[类别]};
    \node[tok,right=0.6mm of c0] (t1) {$z_1$};
    \node[tok,right=0.6mm of t1] (t2) {$z_2$};
    \node[right=0.6mm of t2,font=\tiny] (td) {$\cdots$};
    \node[tok,right=0.6mm of td] (tn) {$z_N$};
    % Transformer 编码器
    \node[blk,fill=CourseBlue!16,below=6mm of t2,minimum width=3.6cm,minimum height=0.7cm] (enc) {Transformer 编码器（自注意力 $\times L$）};
    % 分类头 + 类别
    \node[blk,fill=CourseGray,below=6mm of enc,minimum height=0.7cm] (head) {分类头（MLP）};
    \node[right=8mm of head,align=center] (cls) {类别\\（如“猫”）};
    % 连线
    \draw[->] (img)--(split); \draw[->] (split)--(p1.west);
    \draw[->] (pn)--(proj);
    \draw[->] (proj.south) |- (tn.east);
    \draw[->] (c0.south)--([xshift=-1.3cm]enc.north);
    \draw[->] (tn.south)--([xshift=1.3cm]enc.north);
    \draw[->] (enc)--(head);
    \draw[->] (head)--(cls);
  \end{tikzpicture}
  \caption{Vision Transformer（ViT）：图像切成固定大小的图块，每块经线性投影加位置编码成为一个视觉 token；连同一个额外的“[类别]”token 一起送入 Transformer 编码器，最后由分类头输出类别。}
  \label{fig:vit}
\end{figure}

% \paragraph{语音表示。}
% \todochen{讲清语音的原始形式（采样点与振幅，上文已先行铺垫），再讲波形、频谱图与梅尔频谱，说明语音编码器如何把连续声学信号切分为帧、编码为声学 token；与图像“图块→视觉 token”对照，并指出图像在空间上展开、语音在时间上展开这一差异。可简要梳理代表性语音编码工作的发展。}
\paragraph{语音表示：从波形到声学 token。}语音在计算机中的原始形式是一维\keyword{波形}（waveform），即按时间顺序记录的振幅采样点序列。若采样率为 $16000$ Hz，则一秒语音包含 $16000$ 个数值。波形完整保留了原始声学信号，但其数值随时间快速振荡，且会同时混合说话人音色、发音内容、语速、情绪、环境噪声等多种因素，因此通常不直接把整段波形作为高层语义表示。

一种经典处理方式是先把波形转换为\keyword{频谱图}（spectrogram）。具体而言，将连续波形切分为许多短时片段，称为\keyword{帧}（frame）；常见帧长约为 $20$--$25$ ms，相邻帧之间可有重叠。对每一帧进行短时傅里叶变换（short-time Fourier transform, STFT），即可得到该短时间内不同频率成分的强弱。若记波形为 $x[n]$、窗函数为 $w[n]$、第 $t$ 帧的频率索引为 $k$，则其复频谱可写为
\begin{equation}
X(t,k)=\sum_{n} x[n+tH]\,w[n]\,e^{-j2\pi kn/N},
\end{equation}
其中 $H$ 是帧移，$N$ 是每帧长度。通常取其模平方 $|X(t,k)|^2$ 作为能量，因此频谱图可以理解为一个“时间 $\times$ 频率”的二维矩阵：横轴表示时间，纵轴表示频率，每个位置的数值表示该时刻附近某个频率成分的能量。

人耳对不同频率的分辨能力并不均匀，低频区域更敏感，因此语音处理中还常将频谱投影到\keyword{梅尔尺度}（Mel scale）上，得到\keyword{梅尔频谱}（Mel spectrogram）。其基本做法是用一组按梅尔尺度分布的三角滤波器，对频谱能量进行加权汇总，再取对数：
\begin{equation}
M(t,m)=\log\left(\sum_k F_m(k)\,|X(t,k)|^2+\epsilon\right),
\end{equation}
其中 $F_m(k)$ 表示第 $m$ 个梅尔滤波器。梅尔频谱保留了语音中与发音内容、音高、共振峰和韵律相关的重要结构，同时压缩了不必要的频率细节，因此长期以来是语音识别、说话人识别和语音生成中的常用输入特征。波形、频谱图与梅尔频谱三种表示的对照见图~\ref{fig:speech-repr}。

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.82\linewidth]{figures/语音的波形频谱以及梅尔频谱.png}
  \caption{语音的三种常见表示：(a) 波形，按时间排列的一维振幅采样序列；(b) 频谱图，经短时傅里叶变换得到的“时间 $\times$ 频率”二维能量矩阵；(c) 梅尔频谱，按梅尔尺度对频率细节加权压缩后的结果。}
  \label{fig:speech-repr}
\end{figure}

无论输入是原始波形还是梅尔频谱，语音编码器的目标都是把每一帧或一小段连续信号映射为一个高维向量，从而得到按时间排列的\keyword{声学 token}序列。这里的声学 token 通常是连续向量，并不一定对应一个完整的音节、词或字符；其语义粒度往往比文本 token 更细，还会保留部分说话人、情绪和韵律信息。与图像中“图块 $\rightarrow$ 视觉 token”的过程类似，语音也可视为“时间帧 $\rightarrow$ 声学 token”的过程；区别在于，图像主要在二维空间上展开，而语音沿一维时间轴展开，前后 token 的顺序具有更强的因果性和动态性。同一句话在不同语速下持续时间不同，因此语音 token 序列通常也比对应文本 token 序列长得多。

\paragraph{文本表示：分词、词表与词嵌入。}文本的表示相对直接，其流程如图~\ref{fig:text-repr} 所示：先把一段文字切分为基本单元（词或子词），称为\keyword{分词}；每个单元在\keyword{词表}中对应一个编号；再通过一张可学习的\keyword{词嵌入}（word embedding）表，把编号映射为向量。于是一句话最终成为一串词向量，与图像的视觉 token、语音的声学 token 在形式上一致。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
      >={Latex[length=2mm]},
      op/.style={draw,rounded corners,fill=CourseGray,minimum height=0.72cm,align=center,font=\scriptsize},
      tk/.style={draw,fill=CourseGreen!18,minimum height=0.68cm,minimum width=0.8cm,font=\scriptsize},
      vec/.style={draw,fill=CourseBlue!12,minimum height=0.68cm,minimum width=0.95cm,font=\scriptsize}]
    \node[font=\scriptsize,align=center] (s) {文本\\“一只猫”};
    \node[op,right=5mm of s] (seg) {分词};
    \node[tk,right=6mm of seg] (t1) {一只};
    \node[tk,right=1mm of t1] (t2) {猫};
    \node[op,right=6mm of t2] (voc) {查词表};
    \node[font=\scriptsize,align=center,right=5mm of voc] (id) {编号\\$15,\ 352$};
    \node[op,right=5mm of id] (emb) {词嵌入表};
    \node[vec,right=6mm of emb] (e1) {$e_{15}$};
    \node[vec,right=1mm of e1] (e2) {$e_{352}$};
    \node[font=\scriptsize,below=1.5mm of e1] {词向量序列};
    \draw[->] (s)--(seg); \draw[->] (seg)--(t1);
    \draw[->] (t2)--(voc); \draw[->] (voc)--(id);
    \draw[->] (id)--(emb); \draw[->] (emb)--(e1);
  \end{tikzpicture}
  \caption{文本表示流程：分词得到子词 token，查词表得到编号，再由词嵌入表映射为词向量序列。}
  \label{fig:text-repr}
\end{figure}

对照图~\ref{fig:text-repr}，以“一只猫”为例：先切分为“一只”“猫”两个 token，查词表得到各自编号，再经词嵌入表取出对应向量。词嵌入的意义与前文一致——把离散编号转化为\emph{特征向量}，使语义相近的词（如“猫”与“猫咪”）向量也相近。

% ----------------------------------------------------------
\subsection{自监督学习与预训练表示}
\label{sub:ssl}

有了编码器，还需回答它如何学到有用的表示。若依赖“数据＋人工标签”的监督训练，则受限于标注的规模与成本；而图像、语音、文本的无标注数据较为丰富。\keyword{自监督学习}的基本思想，是从数据自身构造监督信号，无需人工标注，从而能够利用大规模数据进行\keyword{预训练}，得到可迁移到下游任务的通用表示。下面着重说明其在图像上的两类典型训练目标。

\paragraph{掩码重建。}随机遮挡输入的一部分，让模型根据未遮挡部分重建被遮挡的内容。在图像上，可遮挡若干图块再要求模型恢复其像素或特征；要重建得较好，模型往往需要学到图像的结构与语义规律。其训练目标是最小化重建误差，与文本中的掩码语言建模在形式上相近。这类方法的代表包括 MAE\cite{mae}与 BEiT\cite{beit}。以 MAE 为例（图~\ref{fig:mae}），它随机遮住约 $75\%$ 的图块，只把剩余可见图块送入编码器，再由一个轻量解码器重建被遮部分；要补得合理，模型必须理解物体结构与上下文（例如由半只火烈鸟推断其全貌）。训练完成后，这套编码器学到的通用表示可迁移到分类、检测等下游任务。

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.88\linewidth]{figures/MAE架构.png}
  \caption{掩码自编码器（MAE）：随机遮住大部分图块（左，input），仅将可见图块送入编码器，再由解码器重建被遮部分，训练目标是还原原图（右，target）。}
  \label{fig:mae}
\end{figure}

\paragraph{对比学习。}对同一对象施加两种不同的随机变换（如对图像做不同的裁剪与颜色扰动），得到的两个视图视为同一语义，称为\keyword{正样本对}，要求其表示接近；来自不同对象的视图为\keyword{负样本对}，要求其表示远离。其训练目标使正样本对的相似度高于负样本对，从而学到对无关变化（如位置、颜色）较不敏感、对语义较敏感的表示。代表工作包括 SimCLR\cite{simclr}与 MoCo\cite{moco}；此外 DINO\cite{dino}等自蒸馏方法也取得了较好效果。下一小节的跨模态对齐，可视为对比学习思想从“不同视图”到“不同模态”的推广。

\paragraph{语音的自监督。}
语音同样有海量的无标注录音，因此也希望用自监督的方式学到通用表示。它的核心思路与图像的掩码重建一脉相承，可以概括成一句话：\textbf{遮住一段语音，再让模型根据前后听到的内容把它“猜”回来}（图~\ref{fig:speech-ssl}）。为了猜得准，模型必须理解语音里稳定的发音规律与上下文，这正是我们想要的表示。

不过语音有一个和图像、文本都不同的特点：它是连续变化的声波，相邻的采样点几乎一模一样，信息高度冗余。如果直接要求模型逐点还原原始波形，它只要照抄邻近的点就能蒙混过关，学不到有用的东西。因此语音自监督一般不去还原波形本身，而是预测更“抽象、稳定”的目标。按预测目标的不同，有两种有代表性的做法。

第一种是\keyword{从若干候选里认出正确答案}，代表是 wav2vec~2.0\cite{wav2vec2}。它先用一个卷积网络把波形转成一串声学向量，随机遮住其中一段，再让 Transformer 根据没被遮住的上下文，为被遮位置给出预测；训练时同时准备好该位置真正的向量和若干来自别处的“干扰向量”，要求模型从中认出正确的那一个。这本质上就是上一段对比学习的思想在时间轴上的应用。

第二种是\keyword{先给语音编号，再做“完形填空”}，代表是 HuBERT\cite{hubert}。它先用聚类（例如对声学特征做 K-means）把每一帧归入某一类，得到一个类别编号，并把这些编号当作无需人工标注的“伪标签”；预训练时遮住一段语音，让模型根据上下文预测被遮位置属于哪个编号。这样，原本连续的语音就被看成一串离散“单元”，预测任务与文本的掩码语言建模非常相似，模型也因此更容易学到音素一级的结构。

两种做法的预测目标不同（认向量还是猜编号），但共享同一个骨架：\textbf{遮挡，再用上下文预测}。这也再次说明，图像、文本与语音的自监督在思想上是相通的。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>={Latex[length=2mm]},font=\scriptsize,
      fr/.style={draw,minimum size=0.62cm,fill=CourseGreen!16},
      mk/.style={draw,minimum size=0.62cm,fill=CourseGold!35},
      pr/.style={draw,minimum size=0.62cm,fill=CourseBlue!16,font=\tiny}]
    % 波形
    \draw[CourseBlue,thick] plot[domain=0.4:4.9,samples=120] (\x,{-1.65+0.22*sin(\x*280)+0.10*sin(\x*95)});
    \node[left,font=\scriptsize] at (0.35,-1.65) {波形};
    % 帧序列（中间三帧被遮）
    \foreach \i/\lab/\sty in {1/$x_1$/fr,2/遮/mk,3/遮/mk,4/遮/mk,5/$x_5$/fr,6/$x_6$/fr}{
       \node[\sty] (f\i) at (\i*0.75,0) {\lab};
       \draw[->] (\i*0.75,-1.3) -- (f\i.south);
    }
    % Transformer
    \node[draw,rounded corners,fill=CourseBlue!12,minimum width=4.7cm,minimum height=0.66cm] (tf) at (2.62,1.05) {Transformer（利用上下文）};
    \foreach \i in {1,...,6}{\draw[->] (f\i.north) -- (\i*0.75,0.72);}
    % 预测被遮位置
    \foreach \i in {2,3,4}{
       \node[pr] (p\i) at (\i*0.75,2.25) {预测};
       \draw[->] (\i*0.75,1.38) -- (p\i.south);
    }
    \node[right,align=left,font=\tiny] at (5.1,2.25) {wav2vec 2.0：认出该处的声学向量\\HuBERT：猜出该处的离散编号};
  \end{tikzpicture}
  \caption{语音自监督的共同思路：遮住一段语音，让模型根据前后未遮挡的上下文预测被遮部分。wav2vec~2.0 预测该处的声学向量，HuBERT 预测该处的离散编号。}
  \label{fig:speech-ssl}
\end{figure}

% ----------------------------------------------------------
\subsection{跨模态对齐}
\label{sub:align}

前两小节使每个模态各自得到了向量表示，但不同模态的编码器多是各自训练的，其向量分处不同空间，通常难以直接比较。\keyword{跨模态对齐}要解决的问题是：把不同模态的表示纳入\emph{同一个}向量空间，使表达相同语义的对象（如一幅猫的图像与文本“猫”）在该空间中较为接近。

实现对齐的一个常用途径，是利用天然存在的\keyword{配对数据}。例如互联网上大量“图像配文字”的样本，本身就标明了哪幅图与哪句话语义对应。据此可训练图像编码器与文本编码器，使配对样本的表示靠近、非配对样本的表示远离——这正是对比学习从“同一模态的不同视图”推广到“不同模态的配对”的结果。这一思路的代表是 CLIP\cite{clip}与几乎同期的 ALIGN\cite{align}：前者使用较高质量的图文数据，后者表明利用规模更大但噪声更多的网络图文数据同样可行。此后的工作在此基础上做了不少改进，例如 SigLIP\cite{siglip}用 sigmoid 形式的损失替代批内 softmax，以改善大批量训练下的稳定性与效率。

以 CLIP 为例，取一批 $N$ 对图文。图像编码器把 $N$ 幅图编码为向量 $\mathbf{I}_1,\dots,\mathbf{I}_N$，文本编码器把 $N$ 句话编码为向量 $\mathbf{T}_1,\dots,\mathbf{T}_N$，并归一化到同一空间。计算任意一幅图 $\mathbf{I}_i$ 与任意一句话 $\mathbf{T}_j$ 的相似度（可用内积 $\mathbf{I}_i\cdot\mathbf{T}_j$ 表示），得到一个 $N\times N$ 的相似度矩阵（图~\ref{fig:clip}）：对角线元素 $\mathbf{I}_i\cdot\mathbf{T}_i$ 为真实配对，应取较高值；非对角线元素为错误配对，应取较低值。训练即调整两个编码器，使该矩阵趋于“对角线高、其余低”。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>={Latex[length=2mm]},font=\scriptsize,
      enc/.style={draw,rounded corners,align=center,minimum height=1.0cm,minimum width=1.8cm},
      cell/.style={draw,minimum size=0.9cm,font=\tiny}]
    % N×N 内积矩阵（作为定位基准）
    \foreach \i in {1,...,4}{
      \foreach \j in {1,...,4}{
        \ifnum\i=\j
          \node[cell,fill=CourseBlue!30] at (\j+1.5,-\i-0.5) {$\mathbf{I}_{\i}\!\cdot\!\mathbf{T}_{\j}$};
        \else
          \node[cell,fill=CourseGray] at (\j+1.5,-\i-0.5) {$\mathbf{I}_{\i}\!\cdot\!\mathbf{T}_{\j}$};
        \fi
      }
    }
    % 顶部一行 T 向量
    \foreach \j in {1,...,4}{
      \node[cell,fill=CoursePurple!12] (T\j) at (\j+1.5,0) {$\mathbf{T}_{\j}$};
    }
    % 左侧一列 I 向量
    \foreach \i in {1,...,4}{
      \node[cell,fill=CourseGreen!16] (I\i) at (1.0,-\i-0.5) {$\mathbf{I}_{\i}$};
    }
    % 文本编码器：居中于 T 行上方，箭头指向该行中部
    \node[enc,fill=CoursePurple!16] (tenc) at (4.0,1.7) {文本编码器};
    \node[above=1.5mm of tenc,align=center] {文本\\“一只猫”“一只狗”“一架飞机”……};
    \draw[->] (tenc.south) -- (4.0,0.45);
    % 图像编码器：居中于 I 列左侧，箭头指向该列中部
    \node[enc,fill=CourseGreen!18] (ienc) at (-1.6,-3.0) {图像\\编码器};
    \node[above=1.5mm of ienc,align=center] {图像\\猫、狗、飞机……};
    \draw[->] (ienc.east) -- (0.55,-3.0);
    \node[font=\scriptsize,align=center] at (3.5,-5.7) {蓝色对角线为正确配对（相似度拉高），灰色其余格为错误配对（压低）};
  \end{tikzpicture}
  \caption{图文对比对齐（CLIP）：图像编码器输出 $\mathbf{I}_i$、文本编码器输出 $\mathbf{T}_j$，两两做内积得到 $N\times N$ 相似度矩阵。训练目标是使对角线元素 $\mathbf{I}_i\cdot\mathbf{T}_i$ 较高、非对角线元素较低。}
  \label{fig:clip}
\end{figure}

把这一目标写成损失函数，即对比损失（InfoNCE）。对第 $i$ 幅图，其“图到文”方向的损失为
\begin{equation}
  \ell_i^{\,\text{图}\to\text{文}}
  = -\,\log
  \frac{\exp\!\big(\cos(\mathbf{I}_i,\mathbf{T}_i)/\tau\big)}
       {\displaystyle\sum_{j=1}^{N}\exp\!\big(\cos(\mathbf{I}_i,\mathbf{T}_j)/\tau\big)} .
  \label{eq:infonce}
\end{equation}
该式可逐项理解：分子是第 $i$ 幅图与其\emph{正确}配文的相似度，分母是该图与批内\emph{全部} $N$ 句话相似度之和。整个分式是一个 softmax，表示“在这 $N$ 句话中，模型判定第 $i$ 句为正确配文的概率”；取负对数后，概率越接近 $1$、损失越小。$\tau$ 为\keyword{温度}参数，$\tau$ 越小，对“正确配对显著高于错误配对”的要求越严格。将“图到文”与对称的“文到图”两个方向的损失相加，即为完整的对齐目标。

经过对齐，文本与图像被纳入同一向量空间，于是“用文字检索图像”“判断图文是否相符”等任务，大体可归结为在该空间中计算相似度。更重要的是，对齐后的文本表示常被用作图像生成的\emph{条件}——\ref{sec:generation} 的文本生成图像，往往依赖这种图文对应关系，使文本描述能够引导图像的生成方向。

对齐后的图文空间还能直接用于分类，且无需为新类别重新训练：给定一张图片，把若干候选类别分别写成文本“一张关于某类别的照片”（如“猫”“狗”“飞机”），编码后与图像向量计算相似度，相似度最高者即预测类别。只要更换候选文本，就能识别训练时未专门标注过的新类别，这称为\keyword{零样本分类}。

\paragraph{语音、音频的对齐。}
语音和文本之间天然存在配对关系。例如，语音识别数据提供
“语音--文字转写”，语音翻译数据提供“语音--文字翻译”。
语音编码器和文本编码器分别将二者映射为向量：
\begin{equation}
  \mathbf{s}_i = f_{\mathrm{speech}}(S_i),
  \qquad
  \mathbf{u}_i = f_{\mathrm{text}}(T_i).
\end{equation}
匹配的语音--文本为正样本，不匹配的组合为负样本。训练仍采用
式~\eqref{eq:infonce} 的对比损失，使正确配对的表示相互靠近，
错误配对的表示相互远离，如图~\ref{fig:speech-text-alignment} 所示。

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.92\linewidth]
    {figures/image.png}
  \caption{语音--文本表示的对齐过程。左图为对齐前，右图为对齐后；
  圆形表示语音，三角形表示对应的文字转写。}
  \label{fig:speech-text-alignment}
\end{figure}

\noindent\textbf{句级与词级对齐。}
句级对齐将整段语音与整句话分别压缩为一个向量，适合语音检索和
语音翻译。词级对齐则进一步确定某段语音帧对应哪个文本 token。
例如，WACO\cite{waco}通过拉近语音词片段与对应文本词的表示，
提升低资源语音翻译效果。

\noindent\textbf{音频--文本对齐。}
更广义的音频还包括音乐、动物叫声、交通声和环境声等。
这类音频通常与“狗在吠叫”“雨声伴随雷声”等文字描述配对。
CLAP\cite{clap}将 CLIP 中的图像编码器替换为音频编码器，
在共享空间中对齐音频和文字描述，如图~\ref{fig:audio-text-pairs}
所示。

\begin{figure}[htbp]
  \centering
  \resizebox{\linewidth}{!}{%
  \begin{tikzpicture}[
      >=Latex,
      node distance=8mm and 14mm,
      box/.style={
        draw,
        rounded corners=2pt,
        minimum width=25mm,
        minimum height=8mm,
        align=center
      }
    ]
    \node[box] (audio) {音频\\狗叫、雨声、音乐};
    \node[box, right=of audio] (aenc) {音频编码器};
    \node[box, right=18mm of aenc] (tenc) {文本编码器};
    \node[box, right=of tenc] (text) {文字描述\\“一只狗在叫”};

    \draw[->,thick] (audio) -- (aenc);
    \draw[->,thick] (text) -- (tenc);

    \coordinate (mid) at ($(aenc)!0.5!(tenc)$);
    \node[draw,rounded corners=2pt,below=9mm of mid,
          minimum width=31mm,minimum height=8mm,align=center] (space)
          {共享表示空间};

    \draw[->,thick] (aenc) -- (space);
    \draw[->,thick] (tenc) -- (space);

    \node[below=3mm of space,font=\scriptsize]
      {匹配的音频与描述相互接近};
  \end{tikzpicture}%
  }
  \caption{音频--文本对齐的基本结构。}
  \label{fig:audio-text-pairs}
\end{figure}

\noindent\textbf{需要注意。}
文字转写主要描述语音中的“说了什么”，通常不会完整记录说话人、
情绪、音色和韵律。因此，只使用转写进行对齐时，模型更容易学习
语言内容；若要保留副语言信息，还需加入说话人、情绪或韵律相关的
训练目标。

% ============================================================
\section{多模态基础模型结构与训练方法}
\label{sec:foundation}
% ============================================================

本节讨论如何把图像、语音等非文本模态接入大语言模型，构成能够理解多模态输入、并按指令完成任务的\keyword{多模态基础模型}。需要说明的是，这类模型一般并非把图像模型、语音模型与语言模型简单并置，其关键的机器学习问题，是不同表示空间之间的\emph{映射与联合优化}。大语言模型自身的预训练、指令微调与对齐方法已在第三部分介绍，本节着重于多模态特有的结构与训练环节。

% ----------------------------------------------------------
\subsection{多模态基础模型的通用结构}
\label{sub:arch}

现有多模态基础模型大多可归入同一通用结构（图~\ref{fig:pipeline}）：\keyword{模态编码器}、\keyword{连接模块}与\keyword{大语言模型}三段相连。模态编码器（即 \ref{sec:repr} 所述的图像或语音编码器）把非文本输入编码为高层表示；大语言模型负责语义理解与文本生成；二者之间的连接模块负责把模态表示\emph{映射}到大语言模型可接受的输入空间。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
      box/.style={draw,rounded corners,minimum height=1.05cm,minimum width=2.4cm,align=center,fill=CourseGray},
      io/.style={align=center},
      >={Latex[length=2.4mm]}]
    \node[io] (in) {图像/语音\\输入};
    \node[box,right=10mm of in] (enc) {模态编码器};
    \node[box,right=9mm of enc] (conn) {连接模块};
    \node[box,right=9mm of conn] (llm) {大语言模型};
    \node[io,right=10mm of llm] (out) {文本输出};
    \node[io,below=8mm of llm] (txt) {文本指令\\输入};
    \draw[->] (in)--(enc); \draw[->] (enc)--(conn);
    \draw[->] (conn)--(llm); \draw[->] (llm)--(out);
    \draw[->] (txt)--(llm);
  \end{tikzpicture}
  \caption{多模态基础模型的通用结构：编码器负责感知，连接模块负责把模态表示映射到语言模型空间，文本指令与映射后的模态表示一并输入大语言模型，由其完成理解与表达。}
  \label{fig:pipeline}
\end{figure}

\paragraph{按融合发生的早晚看三类结构。}上述通用结构之外，还需回答一个问题：来自不同模态的信息，究竟在模型的\emph{哪一步}结合到一起？按\keyword{融合发生的早晚}，大致可分为三类（图~\ref{fig:fusion}），它们正对应连接方式由浅到深的不同选择：

\begin{itemize}
  \item \keyword{后期融合}：图像先经一个\emph{独立的}视觉编码器完整编码，再经投影与文本\emph{拼接}后接入语言模型，融合发生得较晚、较浅。各模块相对独立，最易复用现成的视觉编码器与语言模型。代表是 LLaVA\cite{llava}，其连接模块只是一个轻量投影层。上文给出的通用结构即以这类为典型。
  \item \keyword{中间层融合}：图像与文本先各自编码，再通过\keyword{交叉注意力}在编码器与语言模型\emph{之间}交互。代表是 BLIP-2\cite{blip2}：它在冻结的图像编码器与冻结的语言模型之间插入一个 Q-Former，用一组可学习查询向量、以交叉注意力从图像特征中提取出少量视觉向量，再送入语言模型；Flamingo\cite{flamingo}则在语言模型各层插入门控交叉注意力以引入视觉信息。
  \item \keyword{早期融合}：把图像编码成嵌入后，与文本嵌入\emph{交错成同一序列}，交由一个联合训练的统一模型处理；融合发生在输入端、程度最深，模型甚至可以统一地理解并生成图像与文本。代表是 Emu\cite{emu}，它把视觉嵌入与文本 token 放入同一自回归序列端到端训练。
\end{itemize}

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
     >={Latex[length=2mm]},
     io/.style={draw,rounded corners,fill=CourseGreen!16,minimum height=0.55cm,minimum width=1.0cm,font=\scriptsize},
     bx/.style={draw,rounded corners,fill=CourseBlue!14,minimum height=0.55cm,font=\scriptsize,align=center},
     ca/.style={draw,rounded corners,fill=CourseGold!22,minimum height=0.55cm,minimum width=1.5cm,font=\scriptsize,align=center},
     mrg/.style={draw,circle,fill=CourseGold!25,inner sep=1.2pt,font=\scriptsize},
     lab/.style={font=\scriptsize\bfseries,align=left},
     res/.style={font=\scriptsize}]
   % ===== 早期融合 (Emu)：输入端即融合，统一模型 =====
   \node[lab] at (-2.0,0) {早期融合\\(Emu)};
   \node[io] (ei) at (0,0.4) {图像};
   \node[io] (et) at (0,-0.4) {文本};
   \node[mrg] (em) at (1.4,0) {$\oplus$};
   \node[bx,minimum width=2.0cm] (eu) at (3.3,0) {统一模型\\（联合训练）};
   \node[res] (eo) at (5.3,0) {输出};
   \draw[->] (ei)-|(em); \draw[->] (et)-|(em); \draw[->] (em)--(eu); \draw[->] (eu)--(eo);
   % ===== 中间层融合 (BLIP-2)：各自编码后交叉注意力交互 =====
   \node[lab] at (-2.0,-2.2) {中间层融合\\(BLIP-2)};
   \node[io] (mi) at (0,-1.8) {图像};
   \node[bx,minimum width=1.3cm] (mie) at (1.5,-1.8) {编码};
   \node[io] (mt) at (0,-2.6) {文本};
   \node[bx,minimum width=1.3cm] (mte) at (1.5,-2.6) {编码};
   \node[ca] (mca) at (3.4,-2.2) {交叉注意力};
   \node[bx,minimum width=1.7cm] (mmo) at (5.3,-2.2) {语言模型};
   \node[res] (mo) at (6.9,-2.2) {输出};
   \draw[->] (mi)--(mie); \draw[->] (mt)--(mte);
   \draw[->] (mie)-|(mca); \draw[->] (mte)-|(mca); \draw[->] (mca)--(mmo); \draw[->] (mmo)--(mo);
   % ===== 后期融合 (LLaVA)：视觉先完整编码，末端才拼接 =====
   \node[lab] at (-2.0,-4.6) {后期融合\\(LLaVA)};
   \node[io] (li) at (0,-4.2) {图像};
   \node[bx,minimum width=1.7cm] (lie) at (1.7,-4.2) {视觉编码器};
   \node[bx,minimum width=1.1cm] (lproj) at (3.5,-4.2) {投影};
   \node[io] (lt) at (0,-5.0) {文本};
   \node[mrg] (lm) at (4.8,-4.6) {$\oplus$};
   \node[bx,minimum width=1.7cm] (lmo) at (6.2,-4.6) {语言模型};
   \node[res] (lo) at (7.8,-4.6) {输出};
   \draw[->] (li)--(lie); \draw[->] (lie)--(lproj);
   \draw[->] (lproj)-|(lm); \draw[->] (lt)-|(lm); \draw[->] (lm)--(lmo); \draw[->] (lmo)--(lo);
  \end{tikzpicture}
  \caption{三类融合按“融合发生的早晚”区分（$\oplus$／交叉注意力为融合点，由上到下依次后移）：早期融合（Emu）在输入端就把图文嵌入并入同一序列、统一建模；中间层融合（BLIP-2）各自编码后用交叉注意力在编码器与语言模型之间交互；后期融合（LLaVA）让视觉先经独立编码器完整编码，末端才与文本拼接接入语言模型。}
  \label{fig:fusion}
\end{figure}

三者的差别，直观上就是图~\ref{fig:fusion} 中融合点由上至下逐渐后移：越靠早融合，模态间交互越深、越依赖联合训练；越靠后融合，各模块越独立、越易复用已有的视觉编码器与语言模型。需要说明的是，这一划分并非绝对，实际模型可能兼有多种方式；连接模块的具体形式将在 \ref{sub:vlm} 展开。

\paragraph{连接模块与分阶段训练。}无论属于上述哪一类，连接模块的作用都是把模态编码器输出的向量，转换为若干与文本 token 处于同一空间的向量，相当于把图像或语音“翻译”为语言模型可读取的一段输入。训练上常采用\keyword{分阶段}策略：先冻结模态编码器与大语言模型、只训练连接模块，使两个表示空间先行对齐，这样既降低计算开销，又有助于保留语言模型已有的能力；随后再对整体做小幅微调。

\paragraph{语音的接入。}
语音和音频同样可以按照“编码器--连接模块--大语言模型”的结构接入。
首先，语音编码器将波形或梅尔频谱转换为声学表示：
\[
\mathbf{a}_1,\mathbf{a}_2,\ldots,\mathbf{a}_T .
\]
连接模块再对这些表示进行\keyword{时序压缩}和空间投影，得到较短的
语音 token 序列：
\[
\mathbf{z}_1,\mathbf{z}_2,\ldots,\mathbf{z}_K,
\qquad K \ll T .
\]
这些语音 token 与文本指令一起输入大语言模型，使其能够完成语音问答、
语音翻译和音频理解等任务，如图~\ref{fig:speech-access} 所示。

\begin{figure}[htbp]
  \centering
  \resizebox{\linewidth}{!}{%
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    node distance=6mm,
    io/.style={
      draw,
      rounded corners,
      fill=CourseGreen!16,
      minimum width=1.6cm,
      minimum height=0.7cm,
      align=center,
      font=\scriptsize
    },
    box/.style={
      draw,
      rounded corners,
      fill=CourseGray,
      minimum width=1.8cm,
      minimum height=0.7cm,
      align=center,
      font=\scriptsize
    },
    seq/.style={
      draw,
      rounded corners,
      fill=CourseGold!18,
      minimum width=2.4cm,
      minimum height=0.7cm,
      align=center,
      font=\scriptsize
    }
  ]

  \node[io] (speech) {语音/音频};
  \node[box,right=of speech] (encoder) {语音编码器};

  \node[seq,right=of encoder] (long) {
    长声学序列\\
    $a_1,a_2,\ldots,a_T$
  };

  \node[box,right=of long] (connector) {
    连接模块\\
    压缩与投影
  };

  \node[seq,right=of connector] (short) {
    短语音 token\\
    $z_1,\ldots,z_K$
  };

  \node[box,right=of short] (llm) {大语言模型};
  \node[io,right=of llm] (output) {文本输出};

  \node[io,below=7mm of llm] (text) {文本指令};

  \draw[->] (speech) -- (encoder);
  \draw[->] (encoder) -- (long);
  \draw[->] (long) -- (connector);
  \draw[->] (connector) -- (short);
  \draw[->] (short) -- (llm);
  \draw[->] (text) -- (llm);
  \draw[->] (llm) -- (output);

  \node[font=\tiny,below=2mm of long] {$T$ 较大};
  \node[font=\tiny,below=2mm of short] {$K\ll T$};

  \end{tikzpicture}%
  }

  \caption{语音接入大语言模型的基本结构。连接模块先压缩较长的声学序列，
  再将其投影为大语言模型可读取的语音 token。}
  \label{fig:speech-access}
\end{figure}

语音与图像接入的主要区别在于，语音沿时间轴连续展开，声学 token
通常数量更多。如果直接将全部声学 token 输入语言模型，不仅计算开销较大，
还可能挤占文本上下文长度。因此，连接模块常采用卷积下采样、池化、
查询向量或注意力压缩等方法，在尽量保留语义和时间顺序的同时缩短序列。

\paragraph{语音的融合。}
语音首先经过语音编码器，被转换为按时间排列的声学 token
$\mathbf{a}_1,\mathbf{a}_2,\ldots,\mathbf{a}_T$。这些 token 与文本或图像信息融合时，
同样落在前面“融合发生早晚”的框架内：可以把声学 token、图像 token 和文本 token
拼接成统一序列，再交给同一个 Transformer 处理（偏早期融合）；也可以保留独立的
语音编码器，让文本 token 通过交叉注意力读取语音特征（偏中间层融合），
如图~\ref{fig:speech-fusion} 所示。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    box/.style={
      draw,
      rounded corners,
      minimum height=0.65cm,
      minimum width=1.6cm,
      align=center,
      font=\scriptsize
    },
    tok/.style={
      draw,
      minimum width=0.45cm,
      minimum height=0.55cm,
      inner sep=1pt,
      font=\scriptsize
    },
    lab/.style={font=\scriptsize\bfseries}
  ]

  % ---------- 统一序列 ----------
  \node[lab] at (-2.3,0) {统一序列};

  \node[box] (speech1) at (-0.7,0) {语音编码器};
  \node[tok] (a1) at (1.0,0) {$a_1$};
  \node[tok] (a2) at (1.55,0) {$a_2$};
  \node at (2.05,0) {$\cdots$};
  \node[tok] (aT) at (2.55,0) {$a_T$};

  \node[tok] (i1) at (3.45,0) {$v_1$};
  \node at (3.95,0) {$\cdots$};
  \node[tok] (iK) at (4.45,0) {$v_K$};

  \node[tok] (t1) at (5.35,0) {$u_1$};
  \node at (5.85,0) {$\cdots$};
  \node[tok] (tN) at (6.35,0) {$u_N$};

  \node[box] (joint) at (8.0,0) {统一\\Transformer};

  \draw[->] (speech1) -- (a1);
  \draw[->] (tN) -- (joint);

  \node[font=\tiny] at (1.75,0.62) {声学 token};
  \node[font=\tiny] at (3.95,0.62) {图像 token};
  \node[font=\tiny] at (5.85,0.62) {文本 token};

  % ---------- 交叉注意力 ----------
  \node[lab] at (-2.3,-2.0) {交叉注意力};

  \node[box] (speech2) at (-0.7,-1.65) {语音编码器};
  \node[box] (audiofeat) at (1.45,-1.65) {声学特征\\$a_1,\ldots,a_T$};

  \node[box] (text) at (-0.7,-2.45) {文本 token};
  \node[box,minimum width=2.0cm] (cross) at (3.75,-2.05) {交叉注意力};
  \node[box] (lm) at (6.1,-2.05) {语言模型};
  \node at (7.6,-2.05) {\scriptsize 输出};

  \draw[->] (speech2) -- (audiofeat);
  \draw[->] (audiofeat) -- (cross);
  \draw[->] (text) -- (cross);
  \draw[->] (cross) -- (lm);
  \draw[->] (lm) -- (7.25,-2.05);

  \end{tikzpicture}

  \caption{语音与其他模态的两种常见融合方式。上：将声学、图像和文本
  token 拼接为统一序列；下：文本通过交叉注意力读取语音特征。}
  \label{fig:speech-fusion}
\end{figure}

与文本相比，语音 token 数量更多，并且具有明确的时间顺序。因此，
融合前通常需要通过卷积或池化进行下采样，以缩短序列；同时加入位置编码，
保留“先说什么、后说什么”的时序关系。对于语音问答、语音翻译等任务，
模型还应避免在处理当前时刻时破坏语音原有的时间结构。

% ----------------------------------------------------------
\subsection{视觉语言模型：图像理解中的多模态建模}
\label{sub:vlm}

把上述通用结构配以图像编码器，即得到\keyword{视觉语言模型}（VLM）：能够接收图像输入，并围绕图像进行描述、问答与推理。从机器学习角度看，视觉语言模型把图像表示作为\emph{条件}，使大语言模型在该条件下进行文本生成，即建模条件分布 $p(\text{文本}\mid\text{图像})$。

其工作方式如图~\ref{fig:vlm} 所示：图像经编码器与连接模块转化为若干视觉 token，置于文本提示词之前，与文本 token 共同构成大语言模型的输入；模型随后如同处理普通文本上下文那样，自回归地逐词生成回答。对模型而言，图像相当于上下文的一部分，区别在于这部分来自图像。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
      tok/.style={draw,minimum size=0.7cm,fill=CourseGray},
      vtok/.style={draw,minimum size=0.7cm,fill=CourseGreen!25},
      >={Latex[length=2.2mm]},node distance=2mm]
    \node[align=center] (img) {图像};
    \node[draw,rounded corners,right=6mm of img,align=center,fill=CourseGray,minimum height=0.9cm] (enc) {编码器+\\连接模块};
    \node[vtok,right=7mm of enc] (v1) {};
    \node[vtok,right=0mm of v1] (v2) {};
    \node[vtok,right=0mm of v2] (v3) {};
    \node[tok,right=2mm of v3] (t1) {};
    \node[tok,right=0mm of t1] (t2) {};
    \node[tok,right=0mm of t2] (t3) {};
    \node[below=1mm of v2,font=\scriptsize] {视觉 token};
    \node[below=1mm of t2,font=\scriptsize] {文本 token（提问）};
    \node[draw,rounded corners,right=6mm of t3,fill=CourseGray,minimum height=0.9cm,align=center] (llm) {大语言\\模型};
    \node[right=6mm of llm,align=center] (out) {文本回答};
    \draw[->] (img)--(enc); \draw[->] (enc)--(v1);
    \draw[->] (t3)--(llm); \draw[->] (llm)--(out);
  \end{tikzpicture}
  \caption{视觉语言模型：图像被编码为视觉 token，与文本 token 拼接后输入大语言模型，由模型在图像条件下生成回答。}
  \label{fig:vlm}
\end{figure}

\paragraph{代表工作：连接方式的对比。}不同视觉语言模型的主要差别，往往在于\keyword{连接模块}的设计，即如何把视觉编码器的输出接入大语言模型。图~\ref{fig:vlm-connect} 对比了三种有代表性的做法，三者的视觉编码器（绿色）与大语言模型（蓝色）大体相同，差异集中在中间的连接模块（黄色）。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
      rowname/.style={font=\scriptsize\bfseries,minimum width=1.2cm,align=right},
      enc/.style={draw,rounded corners,fill=CourseGreen!16,minimum height=0.8cm,minimum width=1.55cm,align=center,font=\scriptsize},
      conn/.style={draw,rounded corners,fill=CourseGold!18,minimum height=0.8cm,minimum width=2.9cm,align=center,font=\scriptsize},
      llm/.style={draw,rounded corners,fill=CourseBlue!14,minimum height=0.8cm,minimum width=1.75cm,align=center,font=\scriptsize},
      txt/.style={draw,rounded corners,fill=CoursePurple!12,minimum height=0.62cm,minimum width=1.5cm,align=center,font=\scriptsize},
      >={Latex[length=2mm]}]
    \node[rowname] (n1) {Flamingo};
    \node[enc,right=3mm of n1] (e1) {视觉编码器};
    \node[conn,right=6mm of e1] (c1) {门控交叉注意力\\（插入语言模型各层）};
    \node[llm,right=6mm of c1] (l1) {大语言模型};
    \node[txt,below=4mm of c1] (x1) {文本指令};
    \draw[->] (e1)--(c1); \draw[->] (c1)--(l1); \draw[->] (x1)-|(l1);
    \node[rowname,below=17mm of n1] (n2) {BLIP-2};
    \node[enc,right=3mm of n2] (e2) {视觉编码器};
    \node[conn,right=6mm of e2] (c2) {Q-Former\\（压成少量视觉 token）};
    \node[llm,right=6mm of c2] (l2) {大语言模型};
    \node[txt,below=4mm of c2] (x2) {文本指令};
    \draw[->] (e2)--(c2); \draw[->] (c2)--(l2); \draw[->] (x2)-|(l2);
    \node[rowname,below=17mm of n2] (n3) {LLaVA};
    \node[enc,right=3mm of n3] (e3) {视觉编码器};
    \node[conn,right=6mm of e3] (c3) {线性投影 / MLP};
    \node[llm,right=6mm of c3] (l3) {大语言模型};
    \node[txt,below=4mm of c3] (x3) {文本指令};
    \draw[->] (e3)--(c3); \draw[->] (c3)--(l3); \draw[->] (x3)-|(l3);
  \end{tikzpicture}
  \caption{三种代表性视觉语言模型的连接方式对比：视觉经编码器与连接模块（黄色）接入大语言模型，文本指令（紫色）同样输入大语言模型；三者的差异主要在于中间连接模块的形式。}
  \label{fig:vlm-connect}
\end{figure}

对照图~\ref{fig:vlm-connect}：第一行的 \textbf{Flamingo}\cite{flamingo} 在冻结的语言模型各层中插入\keyword{门控交叉注意力}，让文本在生成时按需“查看”视觉特征，适合处理图文交错的序列与少样本学习；第二行的 \textbf{BLIP-2}\cite{blip2} 在\emph{冻结}的图像编码器与\emph{冻结}的大语言模型之间接入一个轻量的 \keyword{Q-Former}：它带有一组\emph{可学习的查询向量}（如 $32$ 个），通过交叉注意力从图像特征中提取出\emph{固定数量}的视觉向量（数量只由查询个数决定，与图像分辨率、图块数量无关），经一个线性层投影后作为“软提示”送入语言模型；训练时只更新 Q-Former 与该投影层，并分两阶段进行——先把 Q-Former 接在图像编码器上学习图文对齐的视觉表示，再把其输出接入语言模型学习看图生成文本，因而参数高效；第三行的 \textbf{LLaVA}\cite{llava} 采用最简单的\keyword{线性投影（或 MLP）}，把视觉特征直接映射到词向量空间，充当视觉 token。可以看出，连接模块从复杂的交叉注意力逐步走向更轻量的投影，而模型效果并未因此下降——这与下面要讲的训练方式密切相关。

\paragraph{三种连接模块的具体结构。}图~\ref{fig:vlm-connect} 只标出了连接模块的名称，下面进一步说明每一种“黄色方块”内部到底是什么。\keyword{线性投影}（图~\ref{fig:conn-proj}）最简单：把视觉编码器输出的每个特征向量，用一个矩阵 $W$（或两层 MLP）映射到与词向量相同的维度，所得向量直接当作视觉 token 插入文本序列。\keyword{Q-Former}（图~\ref{fig:conn-qformer}）引入一组\emph{可学习的查询向量}，通过交叉注意力从大量图像特征中“问”出所需信息，输出固定数量的少量 token，从而把成百上千个图像特征压缩到几十个，显著缩短序列。\keyword{门控交叉注意力}（图~\ref{fig:conn-xattn}）不改动文本序列，而是在语言模型的层中插入一个交叉注意力子层，让文本隐状态去读取视觉特征；其输出先乘一个门控 $\tanh(\alpha)$ 再残差加回，$\alpha$ 初始为 $0$，使训练之初几乎不影响原语言模型，因而更稳定。可以看出，从线性投影到 Q-Former 再到门控交叉注意力，连接模块在结构复杂度和对原模型的改动程度上依次增加。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>={Latex[length=2mm]},
     b/.style={draw,rounded corners,minimum height=0.85cm,align=center,font=\scriptsize}]
    \node[b,fill=CourseGreen!16] (hv) {视觉特征\\$h_v\in\mathbb{R}^{d_v}$};
    \node[b,fill=CourseGold!20,right=11mm of hv] (W) {线性层 $W$\\（$d_v\!\times\! d$）};
    \node[b,fill=CourseBlue!14,right=11mm of W] (z) {视觉 token\\$z=Wh_v\in\mathbb{R}^{d}$};
    \draw[->] (hv)--(W); \draw[->] (W)--(z);
    \node[font=\scriptsize,below=2mm of W,align=center] {逐个特征独立映射；$d$ 为词向量维度};
  \end{tikzpicture}
  \caption{线性投影连接模块（LLaVA）：用一个矩阵 $W$（或两层 MLP）把视觉特征映射到与词向量同维的空间，直接充当视觉 token。}
  \label{fig:conn-proj}
\end{figure}

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>={Latex[length=2mm]},
     b/.style={draw,rounded corners,minimum height=0.85cm,align=center,font=\scriptsize}]
    \node[b,fill=CourseGreen!16,minimum width=3.5cm] (img) {图像特征 $h_1,\dots,h_M$（$M$ 大）};
    \node[b,fill=CoursePurple!14,minimum width=3.5cm,below=9mm of img] (q) {可学习查询 $q_1,\dots,q_K$（$K\!\ll\! M$）};
    \coordinate (rmid) at ($(img.east)!0.5!(q.east)$);
    \node[b,fill=CourseGray,anchor=west,xshift=12mm] (xa) at (rmid) {交叉注意力\\(Q=查询,\ K/V=图像特征)};
    \node[b,fill=CourseBlue!14,right=10mm of xa,align=center] (o) {$K$ 个\\视觉 token};
    \draw[->] (img)--(xa); \draw[->] (q)--(xa); \draw[->] (xa)--(o);
    \node[font=\scriptsize,below=2mm of o,align=center] {把 $M$ 个压成 $K$ 个};
  \end{tikzpicture}
  \caption{Q-Former 连接模块（BLIP-2）：一组可学习查询向量通过交叉注意力从大量图像特征中提取信息，输出固定的少量视觉 token，实现压缩。}
  \label{fig:conn-qformer}
\end{figure}

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>={Latex[length=2mm]},
     b/.style={draw,rounded corners,minimum height=0.85cm,align=center,font=\scriptsize}]
    \node[b,fill=CourseGold!18] (h) {文本隐状态 $h$};
    \node[b,fill=CourseGray,right=12mm of h] (xa) {交叉注意力\\(Q=$h$, K/V=视觉)};
    \node[b,fill=CoursePurple!14,right=9mm of xa] (g) {门控\\$\times\tanh(\alpha)$};
    \node[draw,circle,inner sep=1.5pt,font=\scriptsize,right=9mm of g] (plus) {$+$};
    \node[b,fill=CourseBlue!14,right=8mm of plus] (out) {下一层};
    \node[b,fill=CourseGreen!16,below=8mm of xa] (v) {视觉特征};
    \draw[->] (h)--(xa); \draw[->] (v)--(xa); \draw[->] (xa)--(g);
    \draw[->] (g)--(plus); \draw[->] (plus)--(out);
    \draw[->] (h) to[out=55,in=125] (plus);
    \node[font=\scriptsize,below=2mm of g,align=center] {$\alpha$ 初始为 $0$};
  \end{tikzpicture}
  \caption{门控交叉注意力连接模块（Flamingo）：在冻结的语言模型层中插入交叉注意力读取视觉特征，输出经门控 $\tanh(\alpha)$ 缩放后残差加回；$\alpha$ 初始为 $0$，初始时几乎不干扰原模型。}
  \label{fig:conn-xattn}
\end{figure}

\paragraph{训练范式的演进。}除连接结构外，训练方式也在演进。早期以图文对齐或图文生成的\emph{预训练}为主，例如 CLIP\cite{clip} 训练出的图文对齐视觉编码器，常被后续模型直接复用为视觉塔。此后\keyword{视觉指令微调}成为关键一步：LLaVA 借助较强的纯文本模型，自动构造“图像＋指令＋回答”数据对模型进行微调，使其能较好地遵循人类指令；InstructBLIP\cite{instructblip}、Qwen-VL\cite{qwenvl} 等则在指令数据与模型结构上进一步扩展。需要说明的是，这些模型在不同任务上各有优劣，且“主流”随时间变化，此处仅将其视为发展过程中的代表，而非确定的优劣排序。

\begin{importantnote}
  视觉语言模型可能出现\keyword{视觉幻觉}现象：模型有时会描述出图像中并不存在的内容。其成因之一，可能是语言先验较强——模型从大量文本中习得了“某场景通常包含某物”的统计倾向，以致在图像未提供相应证据时仍作出断言。抑制幻觉是多模态对齐训练关注的问题之一。
\end{importantnote}

举一个具体例子：给定一张“厨房餐桌上放着水果”的图片与问题“图中有几个苹果？”，模型先由视觉编码器把图像转成视觉 token，与问题文本一起输入大语言模型，再据图像内容作答“有两个苹果”；若图中并无苹果而模型仍答“有一个苹果”，便是上述视觉幻觉。

% ----------------------------------------------------------
\subsection{语音语言模型：语音理解中的序列建模}
\label{sub:slm}

与视觉语言模型相对应，\keyword{语音语言模型}把语音表示接入大语言模型，以完成语音识别、语音理解、语音问答与语音对话等任务，其结构大体遵循 \ref{sub:arch} 的通用框架。二者的主要差异在于数据结构：图像更多体现空间结构，语音更多体现时间结构，且语音中常同时包含语言内容、说话人信息、情感与噪声。因此语音语言模型的一个核心，是把连续声学信号压缩、映射为大语言模型可处理的语义序列。

\paragraph{从语音识别到语音理解。}
传统语音识别主要学习
\[
p(\text{转写文本}\mid\text{语音}),
\]
目标是准确回答“语音中说了什么”。语音语言模型则进一步结合文本指令，
学习
\[
p(\text{回答}\mid\text{语音},\text{指令}),
\]
因此输出不必是逐字转写，也可以是问题答案、翻译结果或对话回复。
二者的区别如图~\ref{fig:asr-to-slm} 所示。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    box/.style={
      draw,
      rounded corners,
      minimum height=0.72cm,
      minimum width=1.8cm,
      align=center,
      font=\scriptsize
    },
    lab/.style={font=\scriptsize\bfseries}
  ]

  % 传统 ASR
  \node[lab] (lab1) at (-2.4,0) {传统语音识别};
  \node[box,fill=CourseGreen!16] (sp1) at (-0.6,0) {语音};
  \node[box,fill=CourseGray] (asr) at (1.7,0) {语音识别模型};
  \node[box,fill=CourseBlue!14] (tr) at (4.3,0)
    {文字转写\\“下午三点开会”};

  \draw[->] (sp1)--(asr);
  \draw[->] (asr)--(tr);

  % 语音语言模型
  \node[lab] (lab2) at (-2.4,-1.8) {语音语言模型};
  \node[box,fill=CourseGreen!16] (sp2) at (-0.6,-1.5) {语音};
  \node[box,fill=CoursePurple!12] (ins) at (-0.6,-2.8)
    {指令：“几点开会？”};

  \node[box,fill=CourseGold!18] (enc) at (1.7,-1.85)
    {语音编码器\\与连接模块};

  \node[box,fill=CourseGray] (llm) at (4.1,-1.85)
    {大语言模型};

  \node[box,fill=CourseBlue!14] (ans) at (6.3,-1.85)
    {回答\\“下午三点”};

  \draw[->] (sp2)--(enc);
  \draw[->] (ins)--(enc);
  \draw[->] (enc)--(llm);
  \draw[->] (llm)--(ans);

  \end{tikzpicture}

  \caption{从语音识别到语音语言模型：传统模型主要输出逐字转写，
  语音语言模型则结合语音和指令完成问答、翻译与对话等任务。}
  \label{fig:asr-to-slm}
\end{figure}

举例来说，给定一段语音“几点开会？”，传统语音识别只输出其逐字转写“几点开会”，即建模 $p(\text{转写文本}\mid\text{语音})$；而语音语言模型可结合指令直接作答，例如根据日程回答“下午三点”，即建模 $p(\text{回答}\mid\text{语音},\text{指令})$。同一段语音，前者是“转写”，后者是“理解并回应”。

\paragraph{语音如何进入语言模型。}
常见方法有两类，如图~\ref{fig:speech-token-access} 所示。

\begin{enumerate}
  \item \keyword{连续特征接入}：语音编码器输出连续声学表示，
  再由连接模块进行压缩和投影，使其维度与文本词向量一致。
  Qwen-Audio\cite{qwenaudio}和 SALMONN\cite{salmonn}等模型主要采用
  这种结构。

  \item \keyword{离散 token 接入}：先将语音量化为有限集合中的离散单元，
  再把这些单元加入语言模型词表，使同一个模型能够统一处理文本 token
  和语音 token。SpeechGPT\cite{speechgpt}采用了这种思路。
\end{enumerate}

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    box/.style={
      draw,
      rounded corners,
      minimum height=0.68cm,
      minimum width=1.65cm,
      align=center,
      font=\scriptsize
    },
    tok/.style={
      draw,
      minimum width=0.48cm,
      minimum height=0.52cm,
      inner sep=1pt,
      font=\tiny
    },
    lab/.style={font=\scriptsize\bfseries}
  ]

  % 连续表示
  \node[lab] at (-2.4,0) {连续特征};
  \node[box,fill=CourseGreen!16] (wave1) at (-0.8,0) {语音};
  \node[box,fill=CourseGray] (enc1) at (1.15,0) {语音编码器};
  \node[box,fill=CourseGold!18] (proj) at (3.25,0)
    {压缩与投影};
  \node[tok,fill=CourseBlue!14] (z1) at (5.05,0) {$z_1$};
  \node[tok,fill=CourseBlue!14,right=0mm of z1] (z2) {$z_2$};
  \node[right=0mm of z2,font=\scriptsize] (zdots) {$\cdots$};
  \node[tok,fill=CourseBlue!14,right=0mm of zdots] (zk) {$z_K$};
  \node[box,fill=CourseGray,right=5mm of zk] (llm1) {语言模型};

  \draw[->] (wave1)--(enc1);
  \draw[->] (enc1)--(proj);
  \draw[->] (proj)--(z1);
  \draw[->] (zk)--(llm1);

  % 离散表示
  \node[lab] at (-2.4,-1.65) {离散 token};
  \node[box,fill=CourseGreen!16] (wave2) at (-0.8,-1.65) {语音};
  \node[box,fill=CourseGold!18] (quant) at (1.15,-1.65)
    {离散化};

  \node[tok,fill=CoursePurple!14] (s1) at (2.9,-1.65) {$s_{17}$};
  \node[tok,fill=CoursePurple!14,right=0mm of s1] (s2) {$s_{42}$};
  \node[right=0mm of s2,font=\scriptsize] (sdots) {$\cdots$};
  \node[tok,fill=CoursePurple!14,right=0mm of sdots] (sm) {$s_{8}$};

  \node[box,fill=CourseGray,right=6mm of sm] (llm2)
    {统一语言模型};

  \node[font=\tiny,below=1mm of llm2]
    {语音 token 与文本 token 共用序列};

  \draw[->] (wave2)--(quant);
  \draw[->] (quant)--(s1);
  \draw[->] (sm)--(llm2);

  \end{tikzpicture}

  \caption{语音 token 接入语言模型的两种方式。上：将连续声学特征
  压缩并投影到词向量空间；下：将语音离散化，与文本 token 统一建模。}
  \label{fig:speech-token-access}
\end{figure}


\paragraph{语音与文本 token 的对齐。}
连续接入方法通过连接模块，使语音表示落入语言模型能够读取的词向量空间；
离散接入方法则让语音 token 与文本 token 使用同一个自回归模型。
训练时，一段语音通常与转写、翻译或回答配对，模型根据语音和指令预测
目标文本：
\begin{equation}
  \mathcal{L}_{\mathrm{speech}}
  =
  -\sum_{l=1}^{L}
  \log p\left(
    y_l
    \mid
    y_{<l},
    \mathbf{z}_{1:K},
    \mathbf{q}
  \right),
\end{equation}
其中 $\mathbf{z}_{1:K}$ 为语音表示，$\mathbf{q}$ 为文本指令，
$y_l$ 为第 $l$ 个目标文本 token。模型必须从语音中提取与答案有关的内容，
才能正确预测后续文本，从而逐渐建立语音与文本语义之间的对应关系。


\paragraph{训练能力的逐步扩展。}
语音语言模型通常经过以下三个阶段：

\begin{enumerate}
  \item \keyword{语音--文本训练}：利用语音与转写或翻译数据，
  先学习语音内容与文字之间的对应关系。

  \item \keyword{语音指令微调}：加入“语音＋问题＋回答”数据，
  使模型从简单转写扩展到问答、翻译、摘要和信息提取。

  \item \keyword{语音对话训练}：使用多轮对话数据，使模型结合前文，
  持续理解用户语音并生成连贯回复。
\end{enumerate}

Whisper\cite{whisper}是大规模多语言语音识别与语音翻译的代表，
说明了大规模语音--文本训练可以显著增强跨语言和跨场景的识别能力。
在此基础上，SpeechGPT\cite{speechgpt}进一步使用离散语音表示，
使语言模型能够接收和生成语音；Qwen-Audio\cite{qwenaudio}将训练范围
扩展到语音、音乐和环境声等多种音频任务；SALMONN\cite{salmonn}
则把语音编码器、通用音频编码器与语言模型结合，用于语音识别、翻译、
音频问答和情感识别等任务。


\paragraph{现实语音中的困难。}
真实语音比书面文本更加复杂，主要体现在以下几方面：

\begin{itemize}
  \item \keyword{口语化与方言}：语音中常有重复、停顿、口头语和不完整句子，
  不同地区的口音与方言也可能在训练数据中分布不均。
  \item \keyword{噪声与混响}：交通声、音乐和远距离录音会遮盖发音内容，
  使声学表示不稳定。
  \item \keyword{多人重叠}：多人同时说话时，模型还需判断“谁说了什么”，
  往往需要结合语音分离或说话人分段。
  \item \keyword{长语音与实时性}：语音 token 序列很长，过度压缩可能丢失
  细节，而保留全部 token 又会增加计算量和回答延迟。
\end{itemize}

\begin{importantnote}
  语音理解并不完全等于“先转写，再让语言模型回答”。逐字转写主要保留
  “说了什么”，却可能丢失语气、情绪、停顿、说话人和环境声音。
  因此，语音语言模型通常仍需直接读取声学表示，而不能只依赖转写文本。
\end{importantnote}

% ----------------------------------------------------------
\subsection{多模态指令微调与对齐}
\label{sub:instruct}

模型具备图像或语音输入能力后，一般仍需通过\keyword{指令微调}学会理解用户意图并按规定格式作答，再通过\keyword{偏好对齐}使输出更符合人类偏好与安全要求。指令微调、RLHF 与 DPO 等方法本身已在第三部分讨论，本小节只说明其在多模态情形下的特殊之处。

其特殊性主要体现在两方面。其一，\keyword{指令数据须包含非文本模态}：多模态指令数据通常由“图像/语音＋指令＋目标回答”构成，如图像问答、图像描述、图文推理等；其构造成本较高，实践中常借助已有的强文本模型，依据图像的文字标注自动生成大量问答样本（LLaVA 即采用了类似做法）。其二，\keyword{对齐须兼顾模态一致性}：除一般的有用性与安全性外，多模态对齐往往还需抑制前述视觉幻觉，使模型的回答尽量忠实于实际输入的图像或语音，而非依赖语言先验作出臆测。

\paragraph{语音侧的指令数据。}
语音指令数据通常由
\[
\text{语音输入}+\text{文本指令}+\text{目标回答}
\]
组成。它不再只要求模型逐字转写语音，而是要求模型根据语音内容完成指定任务。
常见数据形式如图~\ref{fig:speech-instruction-data} 所示。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    box/.style={
      draw,
      rounded corners,
      minimum height=0.68cm,
      align=center,
      font=\scriptsize
    },
    input/.style={box,fill=CourseGreen!16,minimum width=1.8cm},
    inst/.style={box,fill=CoursePurple!12,minimum width=2.4cm},
    output/.style={box,fill=CourseBlue!14,minimum width=2.5cm},
    task/.style={font=\scriptsize\bfseries,anchor=east}
  ]

  % ASR
  \node[task] at (-3.0,0) {语音识别};
  \node[input] (a1) at (-1.6,0) {一段语音};
  \node[inst] (q1) at (0.9,0) {“请转写这段语音”};
  \node[output] (o1) at (4.0,0) {对应文字转写};
  \draw[->] (a1)--(q1);
  \draw[->] (q1)--(o1);

  % Translation
  \node[task] at (-3.0,-1.1) {语音翻译};
  \node[input] (a2) at (-1.6,-1.1) {中文语音};
  \node[inst] (q2) at (0.9,-1.1) {“请翻译成英文”};
  \node[output] (o2) at (4.0,-1.1) {英文翻译};
  \draw[->] (a2)--(q2);
  \draw[->] (q2)--(o2);

  % QA
  \node[task] at (-3.0,-2.2) {语音问答};
  \node[input] (a3) at (-1.6,-2.2) {会议录音};
  \node[inst] (q3) at (0.9,-2.2) {“会议几点开始？”};
  \node[output] (o3) at (4.0,-2.2) {“下午三点”};
  \draw[->] (a3)--(q3);
  \draw[->] (q3)--(o3);

  % Audio understanding
  \node[task] at (-3.0,-3.3) {音频理解};
  \node[input] (a4) at (-1.6,-3.3) {环境声音};
  \node[inst] (q4) at (0.9,-3.3) {“发生了什么？”};
  \node[output] (o4) at (4.0,-3.3) {“有人敲门”};
  \draw[->] (a4)--(q4);
  \draw[->] (q4)--(o4);

  \end{tikzpicture}
  \caption{语音侧指令数据的常见形式：同一模型根据不同指令，对语音完成转写、翻译、问答或音频理解。}
  \label{fig:speech-instruction-data}
\end{figure}

已有的语音识别和语音翻译数据可直接改写为指令格式。例如，将
“语音--转写”样本包装为“请转写这段语音--目标转写”，将
“语音--翻译”样本包装为“请翻译成某种语言--目标译文”。
对于语音问答和摘要，还可以先利用语音转写、场景标签或人工标注，
再由较强的文本模型生成问题与参考答案。SpeechGPT\cite{speechgpt}、
Qwen-Audio\cite{qwenaudio}和 SALMONN\cite{salmonn}等工作均通过混合多种
语音和音频任务，使模型能够根据指令选择不同的处理方式。


% ----------------------------------------------------------
\subsection{图像—语音—文本联合建模}
\label{sub:joint}

现实信息往往多模态并存：视频同时包含画面、声音与字幕；课堂同时包含板书、讲解与文字资料。\keyword{联合建模}要求模型在同一上下文中同时处理图像、语音与文本，分别对应空间结构、时间结构与符号结构，并在统一表示中完成跨模态的理解与生成。其主要挑战，在于协调这几种异质结构，尽量保持空间、时间与语义上的一致。从双模态系统推广到三模态及以上的统一系统，是近年多模态模型的一个发展方向，一些较新的模型已尝试在统一框架内原生支持多种模态的输入与输出。

\paragraph{以语音/音频为核心的联合场景。}
在视频、课堂和会议等场景中，语音或音频通常沿时间连续展开，
可作为组织其他模态的\keyword{时间轴}。模型需要把同一时刻附近的画面、
声音和字幕组合起来，才能完整理解正在发生的事件。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    box/.style={
      draw,
      rounded corners,
      minimum height=0.7cm,
      minimum width=1.8cm,
      align=center,
      font=\scriptsize
    },
    input/.style={box,fill=CourseGreen!16},
    mid/.style={box,fill=CourseGold!18,minimum width=2.2cm},
    model/.style={box,fill=CourseGray,minimum width=2.2cm},
    output/.style={box,fill=CourseBlue!14}
  ]

  \node[input] (video) at (0,0.9) {画面帧};
  \node[input] (audio) at (0,0) {语音/音频};
  \node[input] (text)  at (0,-0.9) {字幕/文字};

  \node[mid] (sync) at (3.0,0) {时间同步\\按时间片对齐};
  \node[model] (fusion) at (6.0,0) {联合模型\\跨模态融合};
  \node[output] (out) at (8.8,0) {问答、摘要\\讲解或生成};

  \draw[->] (video) -- (sync);
  \draw[->] (audio) -- (sync);
  \draw[->] (text) -- (sync);
  \draw[->] (sync) -- (fusion);
  \draw[->] (fusion) -- (out);

  \end{tikzpicture}

  \caption{以语音或音频时间轴为核心的联合建模：先对齐同一时间片内的
  画面、声音与字幕，再进行统一理解与生成。}
  \label{fig:audio-centered-joint}
\end{figure}

\noindent\textbf{视频理解。}
画面提供人物、物体和动作，语音提供说话内容，环境声音则可提示画面外
发生的事件。例如，仅凭画面可能看不出门外有人，而敲门声能够补充这一信息；
字幕还可以帮助模型理解口音较重或受噪声干扰的语音。

\noindent\textbf{看图配语音讲解。}
模型也可以同时接收图像和文本指令，再生成相应的语音讲解。例如，根据
一幅医学图像生成口头说明，或根据课件内容生成教学讲解。此时不仅要保证
语音内容与图像一致，还要控制语速、停顿和语气，使生成结果适合具体场景。

\noindent\textbf{长上下文中的时间同步。}
对于长视频、课堂录音或多人会议，模型通常先将输入切分为若干时间片，
形成
\[
  (V_1,A_1,T_1),\,
  (V_2,A_2,T_2),\,
  \ldots,\,
  (V_L,A_L,T_L),
\]
其中 $V_l$、$A_l$ 和 $T_l$ 分别表示第 $l$ 个时间片内的画面、音频和文字。
模型需要保留这些时间片的先后顺序，并正确判断一句话、一个动作和一种声音
是否发生在同一时刻。若时间对齐错误，就可能把后面的声音解释为前面的画面，
从而产生错误的事件描述。


% ============================================================
\section{条件生成建模与多模态内容生成}
\label{sec:generation}
% ============================================================

本节讨论多模态内容的生成。文本生成图像、图像编辑、语音合成、文本生成音频等任务表面各异，但大体可统一表述为同一个数学问题：在给定条件 $c$ 下，学习目标内容 $x$ 的条件分布并从中采样，
\begin{equation}
  \text{学习 } p(x\mid c)\ \text{并从中采样得到新的 } x .
  \label{eq:cond}
\end{equation}
其中条件 $c$ 可为文本、图像、语音或指令，目标 $x$ 可为图像、语音或音频。本节先建立条件生成的基本概念，再依次讨论文本生成图像、图像编辑、语音生成、音频生成与跨模态交互生成。阅读每一种任务时，建议对照式~\eqref{eq:cond}，明确其中的 $c$ 与 $x$ 各指什么。

% ----------------------------------------------------------
\subsection{条件生成模型基础}
\label{sub:genbasic}

\paragraph{概率分布与采样。}理解生成模型，先要明确两个基本概念。\keyword{概率分布}是对一个随机对象所有可能取值给出概率（离散情形）或概率密度（连续情形）的描述。以图像为例，可设想在“所有可能图像”构成的高维空间上存在一个分布 $p(x)$：真实、自然的图像所在区域概率较高，杂乱无意义的像素组合概率较低。\keyword{采样}则是按某分布抽取一个具体取值。需要强调，机器学习中所说的“生成”，大体上可以理解为\emph{从一个分布中采样}。

这一概念对文本与图像是相通的。语言模型在生成时，每一步给出“下一个词”在词表上的概率分布，再据此抽取一个词，逐步连成句子——这就是\keyword{采样文字}。图像生成则是在图像分布上抽取一个高维向量（即一幅图像）——这就是\keyword{采样向量}。无论目标是离散的词还是连续的图像向量，生成大体都遵循“先有分布、再采样”的模式。

\paragraph{判别模型与生成模型。}据此可区分两类模型。\keyword{判别模型}学习的是条件 $p(y\mid x)$，即由输入预测标签，关注类别之间的分界；先前多数任务属此类。\keyword{生成模型}学习的是数据本身的分布 $p(x)$，学成之后即可采样出新的、训练集中未必出现过的样本。\keyword{条件生成模型}进一步引入条件 $c$，学习 $p(x\mid c)$，从而能按指定条件采样，例如要求“生成一只猫”而非任意图像。在多模态生成中，条件 $c$ 正是连接不同模态的纽带：文本可作为图像生成的条件，原图与指令可作为图像编辑的条件。

\paragraph{常见生成建模方法。}如何建模并从复杂分布中采样，历史上发展出若干方法（表~\ref{tab:genfamily}）：生成对抗网络\cite{gan}、变分自编码器\cite{vae}、扩散模型\cite{ddpm}，以及第四部分已讨论的基于流的生成模型。本节将以扩散模型为主线，因其近年在图像、语音、音频生成中应用较广。各方法的数学细节不在此展开；它们的共同点在于都要回答同一个问题：如何建模数据分布并从中采样。

\begin{longtable}{p{0.20\linewidth}p{0.46\linewidth}p{0.22\linewidth}}
  \caption{常见生成建模方法（仅列核心思想）}\label{tab:genfamily}\\
  \toprule
  方法 & 核心思想 & 代表 \\
  \midrule
  \endfirsthead
  \toprule
  方法 & 核心思想 & 代表 \\
  \midrule
  \endhead
  自回归 & 按顺序逐元素建模 $p(x)=\prod_t p(x_t\mid x_{<t})$，逐步采样 & 语言模型、图像自回归 \\
  变分自编码器 & 引入隐变量，优化重建与分布约束的折中 & VAE \\
  生成对抗网络 & 生成器与判别器对抗，提升样本逼真度 & GAN \\
  扩散模型 & 正向逐步加噪、反向逐步去噪并采样 & DDPM \\
  基于流的模型 & 以可逆变换在简单分布与数据分布间建立映射 & Normalizing Flow \\
  \bottomrule
\end{longtable}

% ----------------------------------------------------------
\subsection{文本生成图像}
\label{sub:t2i}

\keyword{文本生成图像}建模的是 $p(\text{图像}\mid\text{文本})$：给定一段文字描述，采样出与之语义较为一致的图像。这一方向经历了较明显的方法演变：早期曾用生成对抗网络直接由文本生成图像；DALL·E\cite{dalle}将图像离散为 token 后以自回归方式生成；此后扩散模型逐渐成为较主流的一类方法，GLIDE\cite{glide}、DALL·E 2\cite{dalle2}、Imagen\cite{imagen}在开放域文本生成图像上取得了较好效果，而潜在扩散模型\cite{ldm}（即 Stable Diffusion 的基础）通过在低维潜在空间中做扩散，显著降低了计算成本。下面以扩散模型为例，较完整地说明其训练与采样过程，并解释它如何实现式~\eqref{eq:cond} 所要求的“建模分布并采样”。

\paragraph{基本思想：加噪与去噪。}第四章已从连续时间随机微分方程的角度介绍了扩散模型的正向扰动与反向生成过程；本节沿用一致的记号（以 $\mathbf{x}$ 记图像数据、$p_{\text{data}}$ 记数据分布、$\mathcal{N}(\mathbf{0},\mathbf{I})$ 记先验分布），并从条件生成的角度，说明文本如何作为条件引导反向过程生成图像。为便于直观理解，这里采用离散时间步的表述，其思想与第四章的连续时间视角一致。扩散模型包含两个方向相反的过程（图~\ref{fig:diffusion}）。\keyword{正向过程}对一幅真实图像 $\mathbf{x}_0\sim p_{\text{data}}$ 逐步加入高斯噪声，经过 $T$ 步后得到接近纯噪声的 $\mathbf{x}_T$；这一过程是预先设定的，无需学习。\keyword{反向过程}则需要学习：训练一个神经网络，使其能从带噪图像中估计所含噪声，从而每步去除一部分噪声。学会“去噪”之后，生成时便从先验分布 $\mathcal{N}(\mathbf{0},\mathbf{I})$ 采样出发，反复去噪，逐步还原出一幅图像。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>={Latex[length=2.4mm]},every node/.style={font=\small}]
    \node (xt) {$\mathbf{x}_T$（纯噪声）};
    \node[right=16mm of xt] (xm) {$\cdots$};
    \node[right=16mm of xm] (x1) {$\mathbf{x}_1$};
    \node[right=16mm of x1] (x0) {$\mathbf{x}_0$（清晰图像）};
    \draw[->] (xt)--(xm) node[midway,above]{\scriptsize 去噪};
    \draw[->] (xm)--(x1) node[midway,above]{\scriptsize 去噪};
    \draw[->] (x1)--(x0) node[midway,above]{\scriptsize 去噪};
    \draw[->,dashed,CourseGold] (x0) to[bend right=26] node[midway,below]{\scriptsize 正向加噪（预设，无需学习）} (xt);
  \end{tikzpicture}
  \caption{扩散模型：正向逐步加噪（虚线），反向逐步去噪并采样（实线）。生成从纯噪声开始，沿反向链得到图像。}
  \label{fig:diffusion}
\end{figure}

\paragraph{训练目标。}正向过程加噪到第 $t$ 步，可一次写出
\begin{equation}
  \mathbf{x}_t=\sqrt{\bar\alpha_t}\,\mathbf{x}_0+\sqrt{1-\bar\alpha_t}\,\boldsymbol{\epsilon},\qquad \boldsymbol{\epsilon}\sim\mathcal{N}(\mathbf{0},\mathbf{I}),
\end{equation}
其中系数 $\bar\alpha_t$ 随 $t$ 增大而减小，表示越靠后原图成分越少、噪声成分越多。训练一个网络 $\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t,\mathbf{c})$，令其根据带噪图 $\mathbf{x}_t$、步数 $t$ 与条件 $\mathbf{c}$ 估计所加噪声 $\boldsymbol{\epsilon}$，目标是估计得尽量准确：
\begin{equation}
  \mathcal{L}_{\text{diff}}=\mathbb{E}_{\mathbf{x}_0,\boldsymbol{\epsilon},t}\big\lVert\,\boldsymbol{\epsilon}-\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t,\mathbf{c})\,\big\rVert_2^2 .
\end{equation}
此处的条件 $\mathbf{c}$ 即文本：文字经文本编码器（常用 \ref{sub:align} 中与图像对齐过的文本表示）转为向量后注入网络，使每一步去噪都依赖于文本，从而引导生成朝符合描述的方向进行。

\paragraph{如何采样：从噪声到图像。}训练完成后，可按如下方式采样，对应式~\eqref{eq:cond} 的“从 $p(\mathbf{x}\mid\mathbf{c})$ 采样”。先从先验分布采样初值 $\mathbf{x}_T\sim\mathcal{N}(\mathbf{0},\mathbf{I})$；随后令 $t$ 从 $T$ 递减到 $1$，反复执行
\begin{equation}
  \mathbf{x}_{t-1}=\frac{1}{\sqrt{\alpha_t}}\Big(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\,\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t,\mathbf{c})\Big)+\sigma_t\,\mathbf{z},\qquad \mathbf{z}\sim\mathcal{N}(\mathbf{0},\mathbf{I}),
  \label{eq:ddpm-sample}
\end{equation}
即每一步先用网络估计并去除一部分噪声，再注入少量随机噪声 $\sigma_t\mathbf{z}$ 以维持采样的随机性；迭代至 $t=1$ 得到的 $\mathbf{x}_0$ 即为生成的图像。可以看出，这条反向链条实际上\emph{定义}了一个以 $\mathbf{c}$ 为条件、可从中采样的分布 $p_\theta(\mathbf{x}_0\mid\mathbf{c})$，它对应我们要建模的 $p(\mathbf{x}\mid\mathbf{c})$。由于每次采样的初值不同，同一段文字往往可生成多样的结果。

直观地看，这条采样链条就是让图像“从噪声中逐步显影”：起初画面几乎全是噪点，随着式~\eqref{eq:ddpm-sample} 的去噪步骤反复推进，轮廓、颜色与细节逐渐浮现，最终得到清晰图像。

\paragraph{增强文本一致性：无分类器引导。}为加强生成对文本的服从程度，实践中常采用\keyword{无分类器引导}\cite{cfg}：在每一步同时计算“给定条件”与“不给条件”两种噪声估计，并放大二者之差，
\begin{equation}
  \tilde{\boldsymbol{\epsilon}}_\theta(\mathbf{x}_t,\mathbf{c})=\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,\varnothing)+w\,\big(\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,\mathbf{c})-\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,\varnothing)\big),
  \label{eq:cfg}
\end{equation}
其中 $\varnothing$ 表示不提供条件，引导强度 $w>1$。括号内是“顾及文本”相对“不顾文本”所多出的方向，乘以 $w$ 即放大对文本的服从。一般而言，$w$ 越大，结果越贴合文本，但样本多样性可能下降，需要权衡。

举一个完整的例子：给定文本提示词“一只戴着红色帽子的柯基犬坐在草地上，阳光明媚”，模型从纯噪声出发、在该文本条件下逐步去噪，生成与描述语义一致的图像；改变提示词中的属性（如帽子颜色、背景、画风），生成结果会相应变化；而提高无分类器引导强度 $w$，结果会更贴合文字，但多样性随之下降。

% ----------------------------------------------------------
\subsection{图像编辑：约束条件下的生成}
\label{sub:edit}

文本生成图像是从噪声生成全新图像，\keyword{图像编辑}则要在一幅\emph{已有图像}上做修改，因而多出一项关键约束：在引入目标改动的同时，尽量保持原图的主体、结构或风格不变。其建模形式可写为
\begin{equation}
  p(\text{编辑后图像}\mid \text{原图},\ \text{编辑指令},\ \text{掩码或结构条件}).
\end{equation}
例如把背景替换为雪山时，模型需改变背景，同时尽量保持人物的面部、姿态与主体结构。图像编辑的一个核心，正是在“目标改动”与“原图保持”之间取得平衡。其一般形式如图~\ref{fig:edit} 所示：以原图和某种\keyword{编辑条件}为输入，交由生成模型（多为扩散模型）产生结果。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[>={Latex[length=2mm]},
     box/.style={draw,rounded corners,minimum height=0.85cm,align=center,font=\scriptsize}]
    \node[box,fill=CourseGreen!16,minimum width=1.5cm] (orig) {原图};
    \node[box,fill=CourseGold!18,below=16mm of orig,minimum width=3.4cm,align=center] (cond) {编辑条件\\（文本指令 / 掩码 / 结构图 / 参考图）};
    \coordinate (mid) at ($(orig)!0.5!(cond)$);
    \node[box,fill=CourseGray,right=26mm of mid,minimum width=2.0cm,align=center] (model) {生成模型\\（扩散）};
    \node[box,fill=CourseBlue!14,right=12mm of model,minimum width=1.9cm] (out) {编辑后图};
    \draw[->] (orig) -| (model);
    \draw[->] (cond) -| (model);
    \draw[->] (model)--(out);
    \node[font=\scriptsize,align=center,below=1.5mm of out] {保持原图其余部分，\\仅按条件改动};
  \end{tikzpicture}
  \caption{图像编辑的一般形式：以原图与编辑条件为输入，生成在保持原图其余部分的同时按条件改动的结果。不同代表工作的差异，主要在于“编辑条件”的形式。}
  \label{fig:edit}
\end{figure}

对照图~\ref{fig:edit}，代表工作的区别主要在于图中“编辑条件”取何种形式，据此可分为以下几类：

\begin{itemize}
  \item \keyword{图像修复与扩展}：在指定的缺失或外延区域生成内容，由掩码约束“仅在此处生成”。
  \item \keyword{文本引导编辑}：以自然语言描述目标，在尽量保留原图的前提下实现该描述，如 SDEdit\cite{sdedit}与 Prompt-to-Prompt\cite{p2p}。
  \item \keyword{指令式编辑}：直接给出编辑命令（如“将天空改为黄昏”），模型据此修改，如 InstructPix2Pix\cite{ip2p}。
  \item \keyword{结构控制与身份保持}：以边缘图、深度图、人体姿态等作为额外约束以固定构图，如 ControlNet\cite{controlnet}；或借助少量参考图保持特定对象的身份，如 DreamBooth\cite{dreambooth}。
\end{itemize}

以结构控制为例：当希望生成图像严格遵循某种构图时，可提供一张\keyword{结构条件图}——例如人体姿态骨架、线稿或深度图——与文本提示一起输入模型，模型便在保持该结构的前提下按文本生成内容。给定同一姿态骨架，配以不同文本（“穿红裙的女孩”“穿盔甲的战士”），即可得到姿态一致而外观不同的图像。

\begin{importantnote}
  评价图像编辑一般不能只看新内容是否真实，还需考察三点：是否较准确地实现了目标改动；不应改动之处是否得到保持；局部修改是否与整体较为协调。这三者之间的平衡，是图像编辑较之纯生成更为困难之处。
\end{importantnote}

再以指令式编辑为例：给定一张“人物站在城市街道前”的原图与编辑指令“把背景换成雪山”，模型在保持人物面部、姿态与主体结构不变的前提下，仅改动背景区域；若把指令改为“将白天改为黄昏”，则整体光照随之改变，而主体保持一致。

% ----------------------------------------------------------
\subsection{语音生成：连续信号的条件生成}
\label{sub:tts}

将式~\eqref{eq:cond} 中的目标 $x$ 取为语音、条件 $c$ 取为文本及说话人、情感等，即得到\keyword{语音合成}：
\begin{equation}
  p(\text{语音}\mid \text{文本},\ \text{说话人},\ \text{风格},\ \text{情感}).
\end{equation}
它与图像生成的一个根本差异在于：图像多为空间结构的一次性生成，语音则是随时间展开的连续序列生成。较好的语音合成不仅要准确传达文本内容，通常还需生成较自然的音色、韵律、语速与停顿。

\paragraph{文本到语音的基本流程。}
典型语音合成系统包含三个部分，如图~\ref{fig:tts-pipeline} 所示。
首先，\keyword{文本前端}将文字规范化，并转换为字符、音素等语言单元；
随后，\keyword{声学模型}根据文本预测梅尔频谱或声学 token；
最后，\keyword{声码器}将这些中间表示还原为可播放的语音波形。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    node distance=4.5mm,
    box/.style={
      draw,
      rounded corners,
      minimum height=0.72cm,
      minimum width=1.55cm,
      align=center,
      font=\scriptsize
    }
  ]

  \node[box,fill=CoursePurple!12] (text) {输入文本};
  \node[box,fill=CourseGray,right=of text] (front)
    {文本前端\\字符/音素};
  \node[box,fill=CourseGold!18,right=of front] (acoustic)
    {声学模型};
  \node[box,fill=CourseGreen!16,right=of acoustic] (mel)
    {梅尔频谱\\或声学 token};
  \node[box,fill=CourseGray,right=of mel] (vocoder)
    {声码器};
  \node[box,fill=CourseBlue!14,right=of vocoder] (wave)
    {语音波形};

  \node[box,fill=CoursePurple!12,above=7mm of acoustic,
        minimum width=3.0cm] (condition)
    {说话人、风格、情感\\或参考语音};

  \draw[->] (text)--(front);
  \draw[->] (front)--(acoustic);
  \draw[->] (acoustic)--(mel);
  \draw[->] (mel)--(vocoder);
  \draw[->] (vocoder)--(wave);
  \draw[->] (condition)--(acoustic);

  \end{tikzpicture}

  \caption{文本到语音的基本流程。声学模型根据文本和说话人、风格等条件
  生成声学表示，再由声码器转换为连续语音波形。}
  \label{fig:tts-pipeline}
\end{figure}

举例来说，给定文本“欢迎来到多模态课程”与一段参考语音（指定音色），模型先由文本前端与声学模型生成梅尔频谱，再由声码器还原为语音波形，输出以参考说话人的音色朗读该文本；此时改变情感标签（如“高兴/平静”）或参考语音，便可在内容不变的前提下改变语气与音色，这正体现了语音生成的“一对多”特性。

\noindent\textbf{音色与韵律控制。}
同一句文本可以对应多种正确读法，因此语音生成是一种
“\keyword{一对多}”任务。说话人条件决定声音像谁，音高、时长和能量
共同影响语速、重音、停顿和语气；情感标签则可控制高兴、悲伤或平静等
表达方式。模型需要同时满足三项基本要求：内容\emph{可懂}、声音
\emph{自然}，并符合指定的说话人和表达风格。

\noindent\textbf{零样本合成与声音克隆。}
多说话人模型可以从一段参考语音中提取说话人的音色和风格，再使用该声音
朗读新的文本。若模型能够为训练中未出现的说话人直接生成语音，而不需要
重新训练，便称为\keyword{零样本语音合成}。参考语音提供“用谁的声音说”，
输入文本提供“说什么”，二者应尽量相互独立。

\noindent\textbf{连续时间信号的特点。}
图像生成主要组织二维空间中的像素或图像 token，而语音生成必须沿时间轴
保持顺序。一个字或音素通常对应若干连续声学帧，因此模型还需学习文本与
语音之间近似单调的时间对应关系。对齐错误可能造成漏词、重复、异常停顿
或语速不稳定；生成时间越长，还越难保持音色和韵律的一致。

\paragraph{代表工作。}
Tacotron~2\cite{tacotron2}采用“文本到梅尔频谱，再由 WaveNet 声码器生成
波形”的两阶段结构；FastSpeech~2\cite{fastspeech2}使用非自回归生成，并
显式建模时长、音高和能量，提高了速度与可控性。VITS\cite{vits}通过变分
推断、流模型和对抗训练，将声学建模与波形生成进行端到端联合训练。
VALL-E\cite{valle}则将语音表示为离散神经音频编码 token，像语言模型预测
文本 token 一样预测语音 token，并可根据较短的参考语音进行零样本合成。

\begin{importantnote}
  \textbf{声音克隆的安全与伦理。}
  声音具有明显的个人身份属性，未经许可复制他人声音，可能被用于冒充、
  虚假信息和诈骗。因此，实际系统应确认声音授权，明确标识合成内容，
  限制高风险人物或场景的克隆，并结合音频水印、来源记录和伪造语音检测
  等措施降低滥用风险\cite{nist-synthetic}。
\end{importantnote}

% ----------------------------------------------------------
\subsection{音频生成：声音事件与声景的条件生成}
\label{sub:t2a}

除语音外，还有更广泛的声音：环境声、音乐片段、声音事件与复杂声景。令模型据文字描述生成此类声音，即一般\keyword{音频生成}，建模 $p(\text{音频}\mid\text{文本描述})$。它与语音合成都需生成连续声音信号，但语音有较明确的语言内容与发音规则，一般音频则更强调声音事件、环境层次与时间上的变化，且常有多个声源叠加，建模难度往往更高。

\paragraph{文本到音频的基本流程。}
文本到音频生成不是朗读文字，而是根据文字描述还原相应的声音。例如，
输入“雨夜的街道上有汽车经过”，模型需要生成雨声、车辆声及相应的空间环境。
其基本流程如图~\ref{fig:t2a-pipeline} 所示：文字描述先被编码为条件表示，
生成模型据此产生频谱、潜在表示或离散音频 token，最后再还原为音频波形。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    box/.style={
      draw,
      rounded corners,
      minimum height=0.72cm,
      minimum width=1.8cm,
      align=center,
      font=\scriptsize
    }
  ]

  % 文本到音频
  \node[box,fill=CoursePurple!12] (text) at (0,0)
    {文字描述};
  \node[box,fill=CourseGold!18] (gen) at (2.7,0)
    {音频生成模型\\自回归或扩散};
  \node[box,fill=CourseGreen!16] (repr) at (5.5,0)
    {频谱或\\音频 token};
  \node[box,fill=CourseBlue!14] (wave) at (8.1,0)
    {生成音频};

  \draw[->] (text)--(gen);
  \draw[->] (gen)--(repr);
  \draw[->] (repr)--(wave);

  % 音频编辑
  \node[box,fill=CourseGreen!16] (source) at (0,-1.8)
    {原始音频};
  \node[box,fill=CoursePurple!12] (inst) at (2.4,-2.5)
    {编辑指令\\“加入鸟叫声”};
  \node[box,fill=CourseGold!18] (edit) at (5.1,-1.8)
    {音频编辑模型};
  \node[box,fill=CourseBlue!14] (edited) at (8.1,-1.8)
    {编辑后音频};

  \draw[->] (source)--(edit);
  \draw[->] (inst)--(edit);
  \draw[->] (edit)--(edited);

  \node[font=\scriptsize\bfseries] at (-1.6,0) {生成};
  \node[font=\scriptsize\bfseries] at (-1.6,-1.8) {编辑};

  \end{tikzpicture}

  \caption{文本引导的音频生成与编辑。生成模型从文字描述产生新的音频；
  编辑模型则根据文字指令修改已有音频。}
  \label{fig:t2a-pipeline}
\end{figure}

\paragraph{声音事件与声景生成。}
较简单的目标是生成单个\keyword{声音事件}，如狗叫、玻璃破碎或汽车鸣笛；
更复杂的\keyword{声景}则包含多个同时或依次出现的声源。例如，“雨声中，
远处有汽车驶过，随后传来雷声”同时规定了声音种类、背景环境和发生顺序。
模型不仅要生成每种声音，还要确定它们何时开始、持续多久以及如何相互叠加：先是持续的雨声，中间叠入由远及近的车声，最后才出现雷声。与语音合成不同，这里并没有文字发音，重点在于声音事件的种类、层次与时间结构。

因此，音频生成通常需要满足三个要求：声音内容与文字描述一致，音质具有
较强的真实感，并且多个事件在时间上的顺序正确。同一段文字也可能对应许多
合理声音，因此模型学习的不是唯一答案，而是符合描述的声音分布。

\paragraph{音频上的扩散建模。}
扩散模型训练时逐步向真实音频表示加入噪声，生成时则从随机噪声出发，
在文字条件的引导下反复去噪：
\begin{equation}
  \mathbf{z}_{T}
  \longrightarrow
  \mathbf{z}_{T-1}
  \longrightarrow \cdots \longrightarrow
  \mathbf{z}_{0}
  \longrightarrow
  \text{音频}.
\end{equation}
为降低计算量，模型通常不直接在高采样率波形上扩散，而是先将音频压缩为
频谱或低维潜在表示，在潜在空间完成去噪，再通过解码器和声码器恢复波形。
文字表示在每一步去噪中提供条件，使最终声音逐渐接近描述中的事件和环境。

\paragraph{文本引导的音频编辑。}
音频生成还可扩展为对已有声音的修改。模型同时接收原始音频和编辑指令，
完成“加入雨声”“删除狗叫”“将钢琴替换为吉他”或“修复缺失片段”等操作。
编辑时既要改变指定内容，又应尽量保留无关部分，避免整段音频的音色、背景
或节奏发生不必要的变化。

\paragraph{代表工作。}
AudioGen\cite{audiogen}将音频量化为离散 token，再使用自回归模型根据文本
逐步预测声音；AudioLDM\cite{audioldm}和
Make-An-Audio\cite{makeanaudio}则将扩散模型应用于压缩后的音频表示，
提高生成效率与音质。Make-An-Audio~2\cite{makeanaudio2}进一步强调声音事件
的先后顺序和长音频中的时间一致性。AUDIT\cite{audit}则使用
“原始音频＋编辑指令＋目标音频”数据训练潜在扩散模型，可执行声音添加、
删除、替换和片段修复等编辑任务。

总体而言，音频生成是上一小节语音合成从“人类说话声”向一般声音的推广。
语音合成重点保证文字发音和说话人特征正确，而一般音频生成还需组织多个
声源、背景环境与时间变化，生成具有完整声景结构的连续声音。

% ----------------------------------------------------------
\subsection{跨模态交互生成}
\label{sub:anytoany}

前述任务多为单一条件、单向生成。更接近实际应用的，是\keyword{多条件、多模态、多轮}的交互生成：
\begin{equation}
  p(\text{目标模态}\mid \text{文本},\ \text{图像},\ \text{语音},\ \text{历史上下文},\ \text{用户指令}).
\end{equation}
例如：依据图像生成语音讲解；依据语音指令修改图像；依据图像与文本共同生成配套音效；或在多轮对话中不断修订生成结果。其主要难点在于不同模态的结构不一致——图像较重空间、语音/音频较重时间、文本较重逻辑——模型需在生成过程中尽量同时保持语义对应、空间一致、时间同步与用户意图一致。这与本讲前两节相呼应：往往需先具备跨模态对齐与多模态理解能力，才能实现较为可控的多模态生成。近年也出现了一些尝试在统一框架内支持“任意模态到任意模态”生成的工作，如 CoDi\cite{codi}。

\paragraph{以语音/音频为目标或条件的交互生成。}
语音和音频既可以作为模型需要生成的\keyword{目标}，也可以作为理解用户意图的
\keyword{条件}，如图~\ref{fig:audio-interactive-generation} 所示。

\begin{figure}[htbp]
  \centering
  \begin{tikzpicture}[
    >={Latex[length=2mm]},
    box/.style={
      draw,
      rounded corners,
      minimum height=0.7cm,
      minimum width=1.8cm,
      align=center,
      font=\scriptsize
    },
    lab/.style={font=\scriptsize\bfseries}
  ]

  % 音频作为目标
  \node[lab] at (-2.3,0) {音频作为目标};
  \node[box,fill=CourseGreen!16] (img1) at (-0.5,0.35) {图像/视频};
  \node[box,fill=CoursePurple!12] (txt1) at (-0.5,-0.45) {文本指令};
  \node[box,fill=CourseGold!18] (model1) at (2.2,0) {多模态模型};
  \node[box,fill=CourseBlue!14] (audio1) at (4.8,0)
    {语音讲解\\配音或音效};

  \draw[->] (img1)--(model1);
  \draw[->] (txt1)--(model1);
  \draw[->] (model1)--(audio1);

  % 音频作为条件
  \node[lab] at (-2.3,-1.8) {音频作为条件};
  \node[box,fill=CourseGreen!16] (audio2) at (-0.5,-1.8)
    {语音指令\\或参考音频};
  \node[box,fill=CourseGold!18] (model2) at (2.2,-1.8) {多模态模型};
  \node[box,fill=CourseBlue!14] (out2) at (4.8,-1.8)
    {修改图像\\生成视频或音频};

  \draw[->] (audio2)--(model2);
  \draw[->] (model2)--(out2);

  \end{tikzpicture}

  \caption{语音和音频参与交互生成的两种形式：上，依据图像、视频和文字
  生成语音或音效；下，将语音指令或参考音频作为条件控制其他模态的生成。}
  \label{fig:audio-interactive-generation}
\end{figure}

\noindent\textbf{视频配音与看图讲解。}
模型可以根据画面内容和文本要求生成语音讲解。例如，输入一段教学视频，
模型需要说明画面中的步骤；输入人物视频时，则可生成与人物动作和场景匹配的
配音。此时不仅要保证“说的内容”与画面一致，还要使停顿、语速和音效出现的
时间与视频同步。

\noindent\textbf{语音驱动的修改。}
用户也可以直接用语音提出修改要求，如“把背景音乐调小一点”、
“在开门时加入脚步声”或“用更平静的语气重新讲一遍”。模型需要结合当前
生成结果和历史指令，只修改用户指定的部分，并尽量保留其他内容。

多轮交互可写为
\begin{equation}
  Y_t
  \sim
  p\!\left(
    Y_t
    \mid
    I,\,
    A,\,
    Q_{\leq t},\,
    Y_{<t}
  \right),
\end{equation}
其中 $I$ 表示图像或视频，$A$ 表示参考语音或音频，$Q_{\leq t}$ 表示截至
当前轮的用户指令，$Y_{<t}$ 表示此前生成结果。模型每一轮都需根据新指令
修订结果，而不是完全重新生成。

\noindent\textbf{一致性与可控性。}
这类系统通常需要同时考察以下几方面：

\begin{itemize}
  \item \keyword{语义一致性}：生成的语音或音效是否与图像、视频和文字描述相符；
  \item \keyword{时间同步}：声音事件、动作与字幕是否在正确时间出现；
  \item \keyword{指令遵循}：模型是否只修改用户指定的内容；
  \item \keyword{声音质量}：语音是否自然、可懂，音频是否真实且无明显杂音；
  \item \keyword{跨轮保持}：多轮修改后，人物、音色、场景和未编辑内容是否保持一致。
\end{itemize}

CoDi\cite{codi}等统一多模态生成模型尝试将文本、图像、视频和音频纳入
同一框架，使一个模态或多个模态的组合能够控制另一模态的生成。这类模型的
关键不只是“能够生成多种模态”，还在于不同输出之间应描述同一事件，并在
空间、时间和语义上保持协调。

\begin{importantnote}
  本节讨论的是较为通用的条件生成能力。要在真实场景中落地，通常还需应对噪声、实时性、安全性与可靠性等更严苛的要求。
\end{importantnote}


% ============================================================
\section{本章小结}
% ============================================================

本章围绕图像、语音/音频与文本的统一处理，按三个层次构建了多模态机器学习的认知框架。在\keyword{表示与对齐}层面，我们说明了各模态在计算机中的原始形式，以及将其编码为向量的动机——用向量空间中的距离刻画语义相似度，使语义相近的对象表示相近；在此基础上，通过自监督预训练获得通用表示，并以对比学习为代表，把不同模态纳入同一空间实现跨模态对齐。

在\keyword{结构与理解}层面，我们给出了“模态编码器—连接模块—大语言模型”的通用结构，说明图像、语音如何借此接入大语言模型，构成视觉语言模型与语音语言模型，并通过多模态指令微调与对齐获得按指令处理多模态输入的能力。

在\keyword{条件生成}层面，我们把文本生成图像、图像编辑、语音合成与音频生成统一表述为条件分布 $p(\mathbf{x}\mid\mathbf{c})$ 的学习与采样问题，并以扩散模型为例，说明了如何训练去噪网络、如何从先验噪声逐步采样出图像，以及文本条件如何引导生成。

\begin{exercisebox}
  \begin{enumerate}
    \item 用一句话说明表示学习所追求的目标，并解释为什么希望做到“语义相近的对象，其向量表示也相近”。
    \item 一张 $224\times224$ 的 RGB 图像，按 $16\times16$ 的图块（patch）不重叠地切分，可得到多少个视觉 token？
    \item 判断下列说法是否正确并简要说明理由：“视觉语言模型与文本生成图像建模的是同一个条件分布。”
    \item 以 CLIP 为例，简述跨模态对齐用什么样的训练目标，把图像与文本纳入同一个向量空间。
    \item 某单声道语音的采样率为 $16\,\mathrm{kHz}$、时长为 $2$ 秒，问其波形包含多少个采样点？
    \item 在基于扩散模型的文本生成图像中，无分类器引导的强度 $w$ 增大，会对生成结果的“文本一致性”和“多样性”分别产生什么影响？
    \item 扩散正向过程为 $\mathbf{x}_t=\sqrt{\bar\alpha_t}\,\mathbf{x}_0+\sqrt{1-\bar\alpha_t}\,\boldsymbol{\epsilon}$。若 $\bar\alpha_t=0.64$，求原图 $\mathbf{x}_0$ 与噪声 $\boldsymbol{\epsilon}$ 前的系数各为多少。
    \item 视觉语言模型与语音语言模型在整体结构上有何共同点？二者所处理数据的主要差异又是什么？
  \end{enumerate}
\end{exercisebox}

% 参考答案（供教师使用，排版时可保持注释）
% 1. 表示学习的目标是学习从原始数据到向量的映射，使语义相近的对象在向量空间中距离小、语义无关的对象距离大；这样“距离”才能作为语义相似度的度量，检索、对齐、分类等才能在向量空间中进行。
% 2. (224/16)^2 = 14^2 = 196 个视觉 token。
% 3. 错误。视觉语言模型建模 p(文本|图像)（已知图像生成文本），文本生成图像建模 p(图像|文本)（已知文本生成图像），二者条件与目标相反，是互为对偶的两个条件分布。
% 4. CLIP 用对比学习（InfoNCE）：对一批图文，使配对样本的相似度高于非配对样本，从而把图像编码器与文本编码器映射到同一共享语义空间。
% 5. 16000 × 2 = 32000 个采样点。
% 6. w 增大：文本一致性提高（更贴合提示词），但多样性下降（生成结果趋于单一），需要在二者间权衡。
% 7. 系数分别为 sqrt(0.64)=0.8（原图）与 sqrt(1-0.64)=sqrt(0.36)=0.6（噪声）。
% 8. 共同点：都采用“模态编码器→连接模块→大语言模型”的结构，把非文本模态编码后接入语言模型。差异：图像主要是二维空间结构、一次性呈现；语音是随时间展开的一维连续时序信号，且混有说话人、情感、噪声等信息。
