私は現在、自動音声認識 (ASR) について講義を受けています。最後の講義は、ベクトル量子化 (VQ) と k 最近傍点 (kNN)、および二分木とガウス混合モデル (GMM) についてでした。
講師によると、VQ は GMM の近似値を計算するだけで、GMM の評価を高速化するために使用されます。これは、GMM で最大値を持つガウス分布を見つけ、このベクトルの値を検索することによって行われます (バイナリ ツリーとして保存された、以前に構築された辞書から)。各 GMM には約 42 のガウス分布があります。exp
講師によると、e 関数 ( 、自然指数関数) の計算は計算コストがかかるため、これにより計算が高速化されるはずです。
これが(まだ)真実であるかどうかに興味があり、Pythonの実装を検索したところ、ハードウェアによって計算されることを説明するこの回答が見つかりました。exp
今日の CPU (および GPU) は複雑であり、私はそれらについて非常に限られた知識しか持っていません。exp
浮動小数点数、加算、または乗算の比較などよりもはるかにコストがかかることは、依然として真実である可能性があります。
質問
exp
float の比較、加算、乗算、および同様の基本的なコマンドと比較して、費用はどれくらいかかりますか?- VQ が ASR で行われる理由を最終的に理解できましたか?
実験的評価
実験を開始して結果を得ようとしました。しかし、私の数値が間違っていることによる他の影響 (キャッシュ、変数の検索時間、乱数ジェネレーターの時間など) を排除することは困難です。
現在、私は
#!/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)