我目前正在听一场关于自动语音识别 (ASR) 的讲座。上一课是关于向量量化(VQ)和k个最近邻(kNN)以及二叉树和高斯混合模型(GMM)。
据讲师介绍,VQ 用于通过计算 GMM 的近似值来加速 GMM 的评估。这是通过在 GMM 中找到具有最高值的高斯并向上查找该向量的值来完成的(来自先前构建的字典,存储为二叉树)。每个 GMM 大约有 42 个高斯。根据讲师的说法,这应该会加快计算速度,因为 e 函数(exp
自然指数函数)的计算在计算上是昂贵的。
我很好奇这是否(仍然)是真的,搜索了 Python 实现并找到了这个答案,它解释了这exp
是由硬件计算的。
今天的 CPU(和 GPU)很复杂,我对它们的了解非常有限。它仍然可能exp
比浮点数、加法或乘法的比较昂贵得多。
问题
exp
与浮点比较、加法、乘法和类似的基本命令相比,成本有多高?- 我是否最终理解了为什么在 ASR 中完成 VQ 有什么问题?
实验评估
我试图通过开始实验来获得结果。但是我很难消除使我的数字错误的其他影响(例如缓存、变量查找时间、随机数生成器的时间……)。
目前,我有
#!/usr/bin/env python
import math
import time
import random
# Experiment settings
numbers = 5000000
seed = 0
repetitions = 10
# Experiment
random.seed(seed)
values = [random.uniform(-5, 5) for _ in range(numbers)]
v2 = [random.uniform(-5, 5) for _ in range(numbers)]
# Exp
for i in range(repetitions):
t0 = time.time()
ret = [math.exp(x) for x in values]
t1 = time.time()
time_delta = t1 - t0
print("Exp time: %0.4fs (%0.4f per second)" % (time_delta, numbers/time_delta))
# Comparison
for i in range(repetitions):
t0 = time.time()
ret = [x+y for x, y in zip(values, v2)]
t1 = time.time()
time_delta = t1 - t0
print("x+y time: %0.4fs (%0.4f per second)" % (time_delta, numbers/time_delta))
但我想zip
这会失败,因为结果是:
Exp time: 1.3640s (3665573.5997 per second)
Exp time: 1.7404s (2872978.6149 per second)
Exp time: 1.5441s (3238178.6480 per second)
Exp time: 1.5161s (3297876.5227 per second)
Exp time: 1.9912s (2511009.5658 per second)
Exp time: 1.3086s (3820818.9478 per second)
Exp time: 1.4770s (3385254.5642 per second)
Exp time: 1.5179s (3294040.1828 per second)
Exp time: 1.3198s (3788392.1744 per second)
Exp time: 1.5752s (3174296.9903 per second)
x+y time: 9.1045s (549179.7651 per second)
x+y time: 2.2017s (2270981.5582 per second)
x+y time: 2.0781s (2406097.0233 per second)
x+y time: 2.1386s (2338005.6240 per second)
x+y time: 1.9963s (2504681.1570 per second)
x+y time: 2.1617s (2313042.3523 per second)
x+y time: 2.3166s (2158293.4313 per second)
x+y time: 2.2966s (2177155.9497 per second)
x+y time: 2.2939s (2179730.8867 per second)
x+y time: 2.3094s (2165055.9488 per second)