gpt4 book ai didi

Python:处理大数

转载 作者:行者123 更新时间:2023-12-01 08:34:04 25 4
gpt4 key购买 nike

我需要计算困惑度,我尝试这样做

def get_perplexity(test_set, model):
perplexity = 1
n = 0
for word in test_set:
n += 1
perplexity = perplexity * 1 / get_prob(model, word)
perplexity = pow(perplexity, 1/float(n))
return perplexity

经过一些步骤后,我的困惑度等于无穷大。我需要获取数字并作为最后一步执行 pow(perplexity, 1/float(n))

是否可以将数字相乘并得到结果?

3.887311155784627e+243
8.311806360146177e+250
1.7707049372801292e+263
1.690802669602979e+271
3.843294667766984e+278
5.954424789834101e+290
8.859529887856071e+295
7.649470766862909e+306

最佳答案

重复的乘法会导致一些棘手的数值不稳定,因为乘法的结果需要越来越多的位来表示。我建议您将其转换为对数空间并使用求和而不是乘法:

import math

def get_perplexity(test_set, model):
log_perplexity = 0
n = 0
for word in test_set:
n += 1
log_perplexity -= math.log(get_prob(model, word))
log_perplexity /= float(n)
return math.exp(log_perplexity)

这样你的所有对数都可以用标准位数表示,并且你不会得到数值放大和精度损失。此外,您可以使用 decimal 模块引入任意精度:

import decimal

def get_perplexity(test_set, model):
with decimal.localcontext() as ctx:
ctx.prec = 100 # set as appropriate
log_perplexity = decimal.Decimal(0)
n = 0
for word in test_set:
n += 1
log_perplexity -= decimal.Decimal(get_prob(model, word))).ln()
log_perplexity /= float(n)
return log_perplexity.exp()

关于Python:处理大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53804937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com