`exp`的计算成本有多高?

问题描述 投票:2回答:1

我现在正在听一个关于自动语音识别(ASR)的讲座。上一次讲座讲的是向量量化(VQ)和k近邻(kNN)以及二元树和高斯混合模型(GMMs)。

据讲师介绍,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)
gpu cpu speech-recognition computer-architecture exp
1个回答
2
投票

据讲师介绍,VQ是用来加快GMM的评估速度的,只需计算出GMM的近似值即可。具体做法是,在GMM中找到会有最高值的高斯,然后查找这个向量的值(从之前建立的字典中,以二进制树的形式存储)。每个GMM大约有42个高斯数。

这是一个正确的描述。你可以在下面的论文中找到关于最优高斯计算的有趣描述。

George Saon, Daniel Povey & Geoffrey Zweig, "Anatomy of an extremely fast LVCSR decoder," Interspeech 2005.http:/www.danielpovey.comfileseurospeech05_george_decoder.pdf

似然计算部分

按照讲师的说法,这样应该可以加快计算速度,因为e函数(exp,自然指数函数)的计算是很昂贵的。

在这部分你可能误解了讲师的意思。exp不是一个很重要的问题。高斯计算昂贵还有其他原因:每一帧都有几千个高斯分,每个高斯分有几十个分量,每个分量有40个浮点数。由于你需要馈送和存储的内存量,处理所有这些数据是很昂贵的。高斯选择在这里有助于将高斯的数量减少几倍,从而加快计算速度。

使用GPU是解决这个问题的另一个方法。通过将评分转移到GPU上,你可以大大加快评分速度。然而,HMM搜索有一个问题,就是它不容易被并行化。这是解码的另一个重要部分,即使你将评分降为零,由于搜索的原因,解码仍然会很慢。

Exp时间:1.5752s(每秒3174296.9903)x+y时间:9.1045s(每秒549179.7651)。

这不是一个有意义的比较。这里有很多你忽略的东西,比如Python zip调用的成本(izip更好)。这样你就可以很容易地展示任何结果。

© www.soinside.com 2019 - 2024. All rights reserved.