4

我正在尝试使用 Theano 对几何布朗运动进行最大似然估计 (MLE)。我知道,Theano 主要是一个 ML 库,但它应该可以工作......(当然,我只是在尝试 Theano,我的最终目标是为稍微复杂一点的模型做 MLE......)

在 SO 上写数学是个婊子,所以请查看 GBM,例如这里

这是 Theano 代码,它是根据 Theano 教程中的逻辑回归示例稍微修改的:

training_steps = 1000
dt = 1/390
NT = len(Xdata)
rng = np.random
rate = 0.001

# Declare Theano symbolic variables
X = T.vector("X")
dX = T.vector("dX")
mu = theano.shared(rng.randn(), name="mu")
sigma2 = theano.shared(rng.random(), name="sigma2")

print("Initial model:")
print(mu.get_value())
print(sigma2.get_value())

# Construct Theano expression graph

eps = (dX - mu*dt*X)/X
summand1 = eps**2
loghood = summand1.sum()/sigma2/dt + NT*T.log(sigma2)
gmu, gsigma2 =  T.grad(loghood, [mu, sigma2])

# Compile
train = theano.function(
          inputs=[X,dX],
          outputs=[loghood],
          updates=((mu, mu - rate * gmu), (sigma2, sigma2 - rate * gsigma2)))

# Train
costlist = []
mulist = []
siglist = []
for i in range(training_steps):
    cost = train(Xdata, dXdata)
    costlist.append(cost[0])
    mulist.append(mu.get_value())
    siglist.append(sigma2.get_value())

print("Final model:")
print(mu.get_value())
print(sigma2.get_value())

plot(costlist)
  • loghood 是对数似然性,应该最小化 wrt mu 和 sigma2
  • Xdata 是从 GBM 模拟出来的,dXdata[n] = Xdata[n+1] - Xdata[n]
  • 自分化应该可以正常工作,我也尝试过手动放置渐变
  • 为调试目的添加了 costlist、mulist、siglist

所以我得到的是,train 函数对初始 mu sigma2 评估为 OK,但是在第 2 步,mu sigma2 根据梯度更新,train 函数似乎通过给出疯狂的数字或 nan:s 适得其反...

我将结果与精确的 MLE 以及 scipy.optimize.minimize 的最小化进行了比较,它们都工作得很好。我认为问题出在上面的“loghood”中,但我就是想不通......

那么任何人都可以找出代码出错的地方吗?

4

0 回答 0