如何在Python中计算非常大的整数的exp(x)?

5

我正在使用Sigmoid函数来进行人工神经网络。我将传递给该函数的值范围从10,000到300,000。我需要高精度的答案,因为这将作为我人工神经网络中节点之间连接的权重。我尝试在numpy中查找,但没有找到合适的方法。是否有一种方法可以计算e^(-x)


请查看Python中的GMPY库或long数字类型。 - sshashank124
抱歉造成困惑,我所指的是e ~ 2.71。 - Earl Bunao
3
如果输入的范围导致问题,通过缩放输入来解决问题是否更为合理? - doctorlove
我谷歌搜索了一下,看看它是否能够完成。仅仅因为它可以完成,并不意味着它应该... - Paul
我不知道将值缩小是否可行。在人工神经网络中,我认为每个数字都很重要。 - Earl Bunao
显示剩余2条评论
3个回答

4

@Paul已经回答了你的计算问题。

然而,从神经网络的角度来看,你的问题表明你正在做一些错误的事情。在需要计算这样的数字的情况下,没有合理使用神经网络的方法。你似乎忘记了以下至少一个方面:

  • 输入数据的缩放/归一化/标准化
  • 小权重边界初始化
  • 正则化项,在网络尺寸增长时保持权重较小

所有这些元素都是处理神经网络的基本和关键部分。我建议阅读Haykin的Neural Networks and Learning Machines


谢谢您的输入!我已经调整了我的初始权重从(-0.5,0.5),因为我正在训练面部表情识别器,所以我的输入层有2304 + 1个偏置节点。输入层的每个节点的值范围从0到255。话虽如此,隐藏层的1个节点仍然可以拥有非常大的数字。 - Earl Bunao
1
首先,输入值也应该被缩放,例如[0,1](或者更好的是[-1,1]),这样隐藏节点中最大的数字就变成了0.5 * 2304 = 1152,而且只有在最大初始值和完全白色图像的情况下才能达到这个界限。在hayking中也有一些经验法则,可以显示出初始化边界应该是什么。此外,如果您正在使用sigmoid函数,则可以尝试计算tanh函数(它是相同的函数,但是可以“直接”计算)。 - lejlot

4

常规的Python数学和numpy模块在exp(300000)上会溢出。

您需要使用任意精度浮点库。

先决条件:pip install mpmath

from mpmath import *
mp.dps=300
print exp(300000)
2.21090954962043147554031964344003334958746533182776533253160702399084245726328190320934903726540800347936047182773804396858994958295396516475277561815722954583856797032504775443385287094864178178111231967140927970972263439977028621274619241097429676587262948251263990280758512853239132411057394977398e+130288

see also http://code.google.com/p/mpmath/


谢谢!但是当我执行Sigmoid函数时, exp(-300000)+1,它只输出了1 - Earl Bunao
1
你需要超过130000位数字。mp.dps设置精度。看起来它可以做到...但你可能想要测试一下...并且那些150k位数字对象将需要内存。 - Paul
我正在做的是将 mp.dps 设为 130000,然后执行 print exp(-300000)+1。但输出仍然是 1 - Earl Bunao
mp.dps=300 更改为 mp.dps=150000,您将获得更多数字,以便 1+exp(-300000) 输出 1、一堆零,然后是 exp(-300000) 的数字。 - Paul
如果我使用 mp.dps=130000,我也会得到1,但这还不够。 - Paul
显示剩余2条评论

2

decimal模块是Python标准库中的一个模块,可以计算所需精度下的exp(-300000)

>>> import decimal
>>> decimal.getcontext().prec = 300
>>> decimal.Decimal(-300000).exp()
Decimal('4.52302537736869338168154543856941208987901785730658877589102779454404342316583413710153707357620016787644963947448152347606024065141665176979995260298156742722510150887341893137830615617098803353373668680329179329422367091094657806579661636984526349130940466600671093389647604708034230900336526970689E-130289')

我同意@lejlot的答案:如果你需要它,那么你的神经网络存在问题。


我找不到错误。我认为我一切都在正确的轨道上。 - Earl Bunao
1
@Larssen:如果你认为这个值不是一个错误,那么你应该想办法在使用它的上下文中计算出其近似值,并且要有一个合理(小)的精度(当x很大时,e**-x等于0,1 + e**-x等于1,你需要找到程序中e**-x != 0会产生差异的表达式)。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接