一个语言模型的好坏,究竟该如何衡量?

假设你训练了两个语言模型。模型A对句子"猫坐在垫子上"给出了0.01的概率,模型B给出了0.001的概率。哪个模型更好?直觉告诉我们模型A更好——它对真实存在的句子赋予了更高的概率。但如果模型A对所有句子都赋予高概率呢?包括那些毫无意义的句子组合?

这正是语言模型评估的核心困境:我们需要一个指标,既能奖励模型对真实语言赋予高概率,又能惩罚模型"浪费"概率质量在不可能出现的序列上。困惑度(Perplexity)正是为解决这一问题而生,它从信息论的土壤中生长出来,在过去五十年间成为语言模型评估的基石。

从一个简单问题说起

要理解困惑度,我们首先需要理解一个更基本的问题:如何量化"预测质量"?

假设你正在玩一个猜词游戏。你的朋友心中想了一个词,你需要通过问是/否问题来猜出它。如果词汇表只有两个词{“猫”, “狗”},你只需要一个问题:“是猫吗?“但如果词汇表有一千个等可能的词,你大约需要10个问题。

这个"需要多少个问题"的数量,正是信息论中的核心概念。

熵:度量不确定性

熵衡量的是一个概率分布的不确定性程度。对于词汇表$V$上的概率分布$P$,熵定义为:

$$H(P) = -\sum_{w \in V} P(w) \log_2 P(w)$$

公式中的$-\log_2 P(w)$被称为"惊讶度"或"信息量”——一个词出现得越罕见,观察到它时的"惊讶程度"越高。

  • 一个非常常见的词(比如$P(w) = 0.5$)的惊讶度只有1比特
  • 一个罕见的词(比如$P(w) = 0.001$)的惊讶度接近10比特
  • 一个确定会出现的词($P(w) = 1$)惊讶度为0比特——毫无惊讶

熵就是这个惊讶度的期望值:每个词的惊讶度乘以它出现的概率,然后求和。

用一个简单的例子来说明:

graph LR
    subgraph "等概率分布:熵 = 1 bit"
        A1["猫 (P=0.5)"] --> B1["惊讶度: 1 bit"]
        A2["狗 (P=0.5)"] --> B2["惊讶度: 1 bit"]
    end
    
    subgraph "不等概率分布:熵 = 0.72 bit"
        C1["猫 (P=0.8)"] --> D1["惊讶度: 0.32 bit"]
        C2["狗 (P=0.2)"] --> D2["惊讶度: 2.32 bit"]
    end
    
    subgraph "确定分布:熵 = 0 bit"
        E1["猫 (P=1.0)"] --> F1["惊讶度: 0 bit"]
    end

当两个词等概率时,熵达到最大值1比特——你需要一个问题来区分它们。当一个词占主导地位时,熵下降——结果变得更加可预测。当结果完全确定时,熵为零——不需要任何问题。

这揭示了熵的本质:熵衡量的是预测一个结果所需的平均信息量。一个优秀的语言模型应该对真实文本具有低熵——因为它能很好地预测接下来会出现什么。

交叉熵:当模型不完美时

熵告诉我们真实分布的不确定性,但我们永远无法知道语言的真实概率分布。我们只有模型的预测。这就是交叉熵登场的时刻。

交叉熵问的是:如果真实分布是$P$,但我们用模型$Q$来做预测,平均需要多少比特?

$$H(P, Q) = -\sum_{w \in V} P(w) \log_2 Q(w)$$

关键的关系是:$H(P, Q) \geq H(P)$。交叉熵永远不小于熵。这个不等式之所以成立,是因为用"错误"的分布进行编码永远不会比用真实分布更好。两者之间的差距被称为KL散度,精确地衡量模型预测与现实的偏离程度。

模型质量 熵 H(P) KL散度 交叉熵 H(P,Q)
完美模型 2.5 bits 0.0 bits 2.5 bits
好模型 2.5 bits 0.5 bits 3.0 bits
一般模型 2.5 bits 1.5 bits 4.0 bits
差模型 2.5 bits 3.0 bits 5.5 bits
随机猜测 2.5 bits 5.0 bits 7.5 bits

在实践中,我们用经验分布来近似真实分布。如果词$w$在测试语料中出现了$c(w)$次,总词数为$N$,那么:

$$\hat{P}(w) = \frac{c(w)}{N}$$

当代入交叉熵公式时,加权求和简化为一个简单的平均:

$$H(\hat{P}, Q) = -\frac{1}{N}\sum_{i=1}^{N} \log_2 Q(w_i)$$

用自然语言表述:交叉熵是模型对测试语料中每个词赋予的负对数概率的平均值。越低越好——因为这意味着模型对实际出现的词赋予了更高的概率。

困惑度:从比特到选择

交叉熵是有用的,但"2.7比特每词"这个数字并不能直观地告诉我们模型有多好。这是好还是坏?这取决于词汇表大小和文本的固有可预测性。

困惑度通过将比特转换回选择数量来解决这个问题。转换非常简单:

$$\text{PPL} = 2^{H(P, Q)}$$

为什么要用2的交叉熵次幂?因为熵衡量的是比特,每比特会使可能性数量翻倍。3比特的交叉熵意味着$2^3 = 8$个等可能的选择;10比特意味着$2^{10} = 1024$个选择。

展开这个公式:

$$\text{PPL} = 2^{-\frac{1}{N}\sum_{i=1}^{N} \log_2 Q(w_i)} = \left(\prod_{i=1}^{N} \frac{1}{Q(w_i)}\right)^{1/N}$$

困惑度是逆概率的几何平均

几何平均在这里至关重要。与算术平均不同,它对极小概率非常敏感。一个概率接近零的词会显著增加困惑度。如果任何$Q(w_i) \to 0$,那么$1/Q(w_i) \to \infty$,使得困惑度趋于无穷大。这正是我们想要的:一个好的语言模型不应该对实际出现的词赋予极小的概率。

分支因子:最直观的解释

关于困惑度最有用的洞察来自于将其视为有效分支因子

想象语言是一棵树,每个节点代表一个词,分支代表可能的下一个词。在每个步骤,模型必须选择跟随哪个分支。

如果所有分支都等可能,分支数量就是词汇表大小——可能高达数万。但语言不是均匀的。在"the"之后,“cat"和"dog"比"xylophone"或"quasar"更可能。一个好的模型利用这种结构来有效地"修剪"这棵树。

困惑度告诉你这棵树的有效宽度。如果困惑度是100,模型在每个步骤的不确定性等同于在100个等可能的词中做选择——即使词汇表可能包含50000个词。模型基于上下文已经有效地排除了99.8%的可能性。

graph TD
    subgraph "词汇表: 50,000 词"
        A["每个位置的理论选择"] --> B["困惑度 = 50,000"]
    end
    
    subgraph "优秀模型的预测"
        C["有效选择"] --> D["困惑度 = 100"]
        E["模型排除了 99.8% 的可能性"]
    end
    
    subgraph "人类水平的预测"
        F["有效选择"] --> G["困惑度 ≈ 10-20"]
        H["基于上下文的强预测能力"]
    end

这个解释揭示了困惑度为何如此有用。一个50000词的词汇表理论上可以产生50000的困惑度(均匀分布)。一个优秀的语言模型在典型文本上能达到50-200的困惑度,意味着它已经将不确定性从数万个可能性减少到几十或几百个——数量级的降低。

一个完整的计算示例

让我们用一个具体的例子来追踪困惑度的计算过程。假设我们用二元模型评估句子"the cat sat”。

假设我们的模型给出以下概率:

预测 概率 解释
P(the | <s>) 0.20 “the"是常见的句子开头
P(cat | the) 0.10 “cat"是"the"后众多词中的一个
P(sat | cat) 0.05 “sat"是一个合理但不是主导的动词
P(</s> | sat) 0.10 句子经常在简单动词后结束

整个序列的概率是各个条件概率的乘积:

$$P(\text{"the cat sat"}) = 0.20 \times 0.10 \times 0.05 \times 0.10 = 0.0001$$

这个微小的数字($10^{-4}$)难以直接解释。困惑度通过序列长度归一化,计算逆概率的几何平均。有4个token:

$$\text{PPL} = \left(\frac{1}{0.0001}\right)^{1/4} = 10$$

模型在每个步骤面临平均10个等可能的选择。这与我们表格中的直觉一致:有些转换更可预测(如"the"开始句子,概率0.2,相当于从5个选项中选择),有些更不确定(如预测"cat"后的"sat”,概率0.05,相当于从20个选项中选择)。几何平均将它们平衡到10。

概率 P 逆概率 1/P 贡献
“the” 0.20 5 相对可预测
“cat” 0.10 10 中等不确定
“sat” 0.05 20 最不确定
“</s>” 0.10 10 中等不确定
几何平均 - 10.0 = 困惑度

历史的回响:从语音识别到大模型

困惑度的故事始于1977年,由IBM研究院的Frederick Jelinek、Robert Mercer、Lalit Bahl和James Baker在语音识别研究中首次提出。他们当时面临的问题是:如何评估语音识别系统中的语言模型质量?

Jelinek团队发现,传统的评估方法——如词汇表大小或静态分支因子——都无法准确反映语音识别任务的实际难度。他们需要一个能综合考虑语言模型预测能力和任务复杂性的指标。困惑度应运而生。

但困惑度的理论根基可以追溯到更早。1948年,Claude Shannon发表了开创性的论文《通信的数学理论》,奠定了信息论的基础。1951年,Shannon发表了另一篇重要论文《印刷英语的预测与熵》,他通过让人类受试者猜测文本中的下一个字母,估计英语的熵在0.6到1.3比特每字符之间。

这个估计对应的人类水平困惑度是多少?

$$\text{PPL}_{\text{human}} = 2^{0.6 \text{ to } 1.3} \approx 1.5 \text{ to } 2.5 \text{ per character}$$

如果假设平均词长为5个字符(包括空格),人类对英语的词级困惑度大约在10-50之间。

困惑度的时代演进

在过去的五十年里,随着语言模型技术的演进,困惑度见证了AI对语言理解能力的飞跃:

graph LR
    subgraph "1990年代:N-gram时代"
        A["Kneser-Ney平滑"] --> B["PTB困惑度: ~150"]
    end
    
    subgraph "2010年代:神经语言模型"
        C["神经网络LM"] --> D["PTB困惑度: ~90"]
        E["LSTM"] --> F["PTB困惑度: ~60"]
    end
    
    subgraph "2017年至今:Transformer时代"
        G["Transformer"] --> H["PTB困惑度: ~40"]
        I["GPT-2"] --> J["PTB困惑度: ~25"]
        K["GPT-3"] --> L["PTB困惑度: ~20"]
    end
时代 架构 Penn Treebank困惑度 改进幅度
1990年代 N-gram (Kneser-Ney) ~150 基线
2010年 神经语言模型 ~90 40%降低
2015年 LSTM ~60 33%降低
2017年 Transformer ~40 33%降低
2019年 GPT-2 ~25 38%降低
2020年 GPT-3 ~20 20%降低

这些数字揭示了语言模型发展的一个关键模式:困惑度的改进变得越来越难。从150降到100节省的比特数,与从100降到75相同。但后者通常更难实现——这就是边际收益递减定律在语言模型训练中的体现。

实际计算:从理论到工程

理解了困惑度的数学原理后,让我们看看它在实践中是如何计算的。

基本计算流程

对于因果语言模型(如GPT系列),困惑度的计算步骤如下:

flowchart TD
    A["输入测试语料"] --> B["分词处理"]
    B --> C["获取token序列 w1, w2, ..., wN"]
    C --> D["遍历每个位置 i"]
    D --> E["计算条件概率 P(wi | w<i)"]
    E --> F["累加负对数概率"]
    F --> G{"是否遍历完所有token?"}
    G -->|否| D
    G -->|是| H["计算平均负对数概率"]
    H --> I["取指数得到困惑度"]
    I --> J["输出 PPL = exp(平均损失)"]
  1. 对测试语料进行分词,得到token序列$w_1, w_2, ..., w_N$
  2. 对每个位置$i$,计算模型对该token的预测概率$P(w_i | w_{
  3. 计算负对数概率的和:$-\sum_{i=1}^{N} \log P(w_i | w_{
  4. 除以token数量得到平均负对数概率
  5. 取指数得到困惑度

在实际实现中,我们总是使用对数空间计算,以避免数值下溢。当许多小于1的概率相乘时,结果会趋近于零,导致浮点精度丢失。对数空间将乘法转换为加法:

$$\text{PPL} = \exp\left(-\frac{1}{N}\sum_{i=1}^{N} \log P(w_i | w_{分词器的影响:苹果与橙子的比较

困惑度计算中一个容易被忽视的陷阱是分词器的差异。

假设模型A使用50000合并操作的BPE分词,模型B使用30000词的WordPiece分词。它们的困惑度能直接比较吗?

不能。

词汇表越大的模型,每个位置的选择越多,困惑度自然更高。这并不意味着它是一个更差的模型——它只是在解决一个更难的问题。

graph TD
    subgraph "相同文本,不同分词"
        A["文本: the cat sat"] --> B["分词器A: 3个token"]
        A --> C["分词器B: 4个token"]
    end
    
    B --> D["困惑度基于3个预测"]
    C --> E["困惑度基于4个预测"]
    
    D --> F["不可直接比较!"]
    E --> F

更微妙的是,不同的分词策略会将相同的文本切割成不同数量的token。BPE可能将"unbelievable"分成一个token,而基于字符的分词会分成13个token。即使模型的预测能力完全相同,后者的困惑度看起来也会更低——因为它在预测更容易的字符级别问题。

要公平比较不同模型的困惑度,必须确保:

  • 相同的词汇表
  • 相同的测试集
  • 一致的分词方式

长序列评估:滑动窗口策略

对于固定上下文长度的模型(如早期的GPT),评估长文档的困惑度需要特殊处理。简单地将文档分成不重叠的块并独立计算会丢失重要的上下文信息。

更好的方法是使用滑动窗口策略:不断移动上下文窗口,让模型始终能看到之前的文本。在每个位置,模型基于完整的可用上下文预测下一个token。

graph LR
    subgraph "滑动窗口策略"
        A["位置1: 预测token1"] --> B["位置2: 预测token2"]
        B --> C["位置3: 预测token3"]
        C --> D["..."]
    end
    
    subgraph "每个位置的上下文"
        E["使用之前所有token作为上下文"]
        F["直到模型的最大长度限制"]
    end

这种方法确保每个token的预测都基于尽可能多的上下文,提供更准确的困惑度估计。

局限性:困惑度不是万能的

尽管困惑度在过去五十年间一直是语言模型评估的标准指标,但它有重要的局限性。理解这些局限对于正确使用和解释困惑度至关重要。

与下游任务的脱节

困惑度衡量模型预测文本的能力,但这并不总是能转化为下游任务上的更好表现。

对于直接涉及文本预测的任务,困惑度与任务表现有良好的相关性:

  • 语音识别:困惑度更低的语言模型产生更好的转录
  • 机器翻译:语言模型困惑度与翻译流畅度相关
  • 文本生成:困惑度更低的模型生成更连贯的文本

但对于其他任务,困惑度可能是一个糟糕的预测指标:

  • 情感分析:模型可能有优秀的困惑度但糟糕的情感预测
  • 问答系统:预测下一个词的能力不意味着理解内容
  • 命名实体识别:局部词汇预测不能捕捉实体边界
任务类型 与困惑度的相关性 相关强度
语音识别 0.9
机器翻译 0.85
文本生成 0.8
摘要生成 0.6 中等
问答系统 0.4
情感分析 0.3

为什么会这样?困惑度评估的是内禀能力——模型预测下一个token的基本能力。但实际应用往往需要外显能力——在特定任务上的表现。两者之间没有简单的线性关系。

长上下文的困境

2024年的研究揭示了一个更深层的问题:对于长上下文语言模型,传统的困惑度评估可能会产生误导性的结论。

研究者发现,困惑度通过对所有token取平均,忽略了那些对长上下文理解至关重要的"关键token”。在自然文本中,大部分token是"长上下文无关"的——即使短上下文模型也能很好地预测它们。只有少数token真正需要长上下文信息才能正确预测。

一个具体例子:在长文档问答任务中,像"答案是”、“在第X行"这样的格式化输出token很容易预测,不需要长上下文。只有包含实际答案内容的token才需要长上下文理解。但由于这些格式化token数量众多,它们在困惑度计算中占主导地位,掩盖了模型在真正重要的token上的表现。

这项研究提出了LongPPL(长上下文困惑度)的概念,只关注那些从长上下文中获益的"关键token”。实验表明,LongPPL与长上下文基准测试得分的相关性达到-0.96,而传统困惑度几乎没有相关性。

域外数据问题

一个在新闻文本上训练的模型,在社交媒体文本上会有高困惑度——即使两者都是"英语”。这种域外(Out-of-Domain)问题使得跨域困惑度比较变得困难。

更棘手的是,困惑度本身无法区分"模型在域外数据上表现差"和"域外数据本身更难预测"。一篇充满专业术语的医学论文对任何模型都会有高困惑度,但这并不意味着模型无能。

词汇表大小的陷阱

困惑度对词汇表大小极其敏感。一个10000词词汇表的模型几乎总是比50000词词汇表的模型有更低的困惑度,即使后者可能是更好的模型。

这使得不同规模词汇表的模型之间的公平比较变得困难。一些研究者提出了归一化方法来缓解这个问题,但没有一种方法被普遍接受。

困惑度陷阱

最危险的误解是:更低困惑度 = 更好模型

单纯优化困惑度可能导致模型擅长预测常见模式,但在处理罕见但重要的案例时表现糟糕。一个总是预测"the"的模型可能有较低的困惑度(因为"the"是英语中最常见的词),但对任何实际应用都是无用的。

更微妙的问题是,现代大语言模型的训练数据可能包含了测试集。如果模型在训练中"见过"测试文本,它会给出人为低的困惑度,但这不反映泛化能力。这种数据污染问题在近年来引起了越来越多的关注。

现代视角:困惑度的演进与替代

在GPT-3之后的时代,困惑度作为唯一评估指标的地位正在被重新审视。研究者们提出了多种改进和替代方案。

归一化困惑度

为了使不同词汇表大小的模型可比,研究者提出了归一化困惑度:

$$\text{NormPPL} = \frac{\text{PPL}}{|V|}$$

其中$|V|$是词汇表大小。这种方法假设困惑度与词汇表大小呈线性关系,但这只是一种粗略的近似。

比特每字符(BPC)

在字符级别模型中,困惑度通常转换为比特每字符(BPC):

$$\text{BPC} = \frac{H(P,Q)}{\text{平均字符数每token}}$$

BPC提供了一个更通用的比较框架,因为它不依赖于特定的分词方式。Shannon估计英语的BPC在0.6-1.3之间,这为模型性能提供了人类水平的参考点。

端到端评估

越来越多的研究者主张使用端到端任务评估代替或补充困惑度。这种方法直接在目标任务上测试模型,绕过困惑度的间接性。

但端到端评估也有自己的问题:成本高、难以标准化、可能受到提示工程的影响。理想的方法可能是结合困惑度(作为训练监控和模型选择的快速指标)和端到端评估(作为最终性能验证)。

实践指南:正确使用困惑度

尽管有诸多局限,困惑度仍然是语言模型评估的重要工具。以下是正确使用困惑度的一些指导原则。

公平比较的前提

使用困惑度比较不同模型时,必须确保:

  • 相同的词汇表:不同分词器的模型不能直接比较
  • 相同的测试集:不同数据集的困惑度不可比较
  • 相同的上下文长度:评估配置必须一致
  • 未见过的测试数据:确保测试集不在训练数据中

训练监控

困惑度在训练监控中极其有用:

  • 困惑度下降表明模型在学习
  • 困惑度稳定可能意味着收敛
  • 困惑度上升是过拟合或训练不稳定的信号

困惑度的变化趋势比绝对值更有意义。一个模型的困惑度从100降到50,可能比另一个模型从30降到28更重要——即使后者最终值更低。

领域适应评估

困惑度是检测领域适应问题的敏感工具。在目标领域数据上计算困惑度,可以快速评估模型在新领域上的泛化能力,而无需运行完整的端到端评估。

超参数调优

困惑度为超参数调优提供了快速反馈。在比较不同的学习率、批量大小或正则化策略时,困惑度变化可以快速指示哪种配置更有效。

数学之美:为什么困惑度有效

从数学角度看,困惑度之所以有效,是因为它抓住了语言建模的核心目标:最小化预测误差

从最大似然到困惑度

语言模型训练的标准目标是最大化训练数据的似然:

$$\max_\theta \prod_{i=1}^{N} P_\theta(w_i | w_{取负对数后,这等价于最小化交叉熵损失:

$$\min_\theta -\sum_{i=1}^{N} \log P_\theta(w_i | w_{困惑度就是这个目标函数的指数变换:

$$\text{PPL} = \exp\left(\frac{1}{N}\text{Loss}\right)$$

因此,最小化困惑度与最大化似然是完全等价的。困惑度只是将损失函数转换到了一个更直观的尺度上。

信息论视角

从信息论角度看,困惑度衡量的是模型对语言"压缩"效率。

如果模型能很好地预测下一个词,就可以用更少的比特来编码文本。一个困惑度为100的模型,平均每个词需要$\log_2 100 \approx 6.6$比特来编码。困惑度降到50,只需要约5.6比特。

这个视角揭示了困惑度与压缩率的直接关系。实际上,评估语言模型的一种方法就是测量它对测试文本的压缩率。

概率链与上下文建模

困惑度公式中的条件概率链:

$$P(w_1, ..., w_N) = \prod_{i=1}^{N} P(w_i | w_{体现了语言建模的核心洞察:每个词的概率依赖于它之前的上下文。好的语言模型不是孤立地预测每个词,而是利用上下文来缩小可能性空间。

困惑度通过几何平均聚合这些条件概率,保留了概率乘法的语义——整个序列的概率是各个条件概率的乘积。

展望:困惑度的未来

随着语言模型从简单的下一个词预测器演变为复杂的推理系统,困惑度的角色也在发生变化。

从预测到理解

传统的困惑度衡量预测能力,但现代大语言模型的能力远超预测——它们能推理、规划和解决问题。这些能力难以用困惑度捕捉。

未来的评估可能需要分层:困惑度作为底层预测能力的指标,配合更高层次的推理和任务评估。

多模态挑战

随着多模态模型的兴起,困惑度面临新的挑战。如何定义图像-文本对的困惑度?如何衡量模型对视觉信息的理解?

扩展困惑度到多模态场景是一个活跃的研究领域,但尚无统一的解决方案。

安全与对齐

困惑度在安全评估中可能有新的应用。异常低的困惑度可能表明模型在输出训练数据而非真正生成;特定类型文本上的困惑度变化可能指示偏见或毒性倾向。

这些应用将困惑度从性能指标扩展为诊断工具。

结语

困惑度从信息论的土壤中生长,在语音识别的实践中成熟,在大语言模型时代继续演进。它的核心思想——将模型预测能力转换为一个直观的数字——经受住了五十年的考验。

困惑度不是完美的指标,但它是一个有用的指标。它简洁、可计算、有理论根基。正确理解其局限,它仍然是语言模型开发者工具箱中不可或缺的工具。

从1977年IBM的研究员们寻找语音识别的评估标准,到2025年研究者们探索长上下文评估的新方法,困惑度的故事反映了整个人工智能领域的发展轨迹:从简单问题的优雅解决方案开始,随着问题复杂度的增加,不断审视、质疑和改进。

下一次当你看到"模型X在数据集Y上达到了Z的困惑度"这样的声明时,希望你能理解这个数字背后的丰富含义——从信息论的数学根基,到分支因子的直觉解释,再到它与实际任务性能的复杂关系。

困惑度衡量的是模型对语言的"困惑程度"。而理解困惑度本身,恰恰是摆脱困惑的第一步。


参考文献

  1. Jelinek, F., Mercer, R. L., Bahl, L. R., & Baker, J. K. (1977). Perplexity—a measure of the difficulty of speech recognition tasks. Journal of the Acoustical Society of America, 62(S1), S63.

  2. Shannon, C. E. (1951). Prediction and entropy of printed English. Bell System Technical Journal, 30(1), 50-64.

  3. Jurafsky, D., & Martin, J. H. (2024). Speech and Language Processing (3rd ed.). Stanford University.

  4. Brown, T. B., et al. (2020). Language Models are Few-Shot Learners. Advances in Neural Information Processing Systems, 33.

  5. Radford, A., et al. (2019). Language Models are Unsupervised Multitask Learners. OpenAI.

  6. Hu, J., et al. (2024). What is Wrong with Perplexity for Long-context Language Modeling? arXiv preprint arXiv:2410.23771.

  7. Brown, P. F., et al. (1992). An Estimate of an Upper Bound for the Entropy of English. Computational Linguistics, 18(1), 31-40.

  8. Kneser, R., & Ney, H. (1995). Improved backing-off for m-gram language modeling. IEEE International Conference on Acoustics, Speech, and Signal Processing.