背景(可能不相关):我正在使用随机特征进行稀疏内核近似,然后将其用于普通贝叶斯线性回归设置。为了优化两个超参数 [gamma, var_y],我使用了重新参数化技巧并最小化变分上限-E[log(p(y|f(x)))] + KL(q(w)||p(w))
。
问题:在优化过程中,x0 参数(初始猜测)从 [gamma, var_y] 更改为 [[gamma, var_y]] 导致最小化过程失败。这是因为当 x0 被解包时,只有一个值而不是两个。奇怪的是,每次调用最小化时都不会发生这种情况。
当 x0 改变形状时手动重塑 x0 会导致最小化函数中的错误,并且也会解决问题。
代码:
def kl_divergence(mu, cov):
n = mu.shape[0]
kl = 0.5 * (-np.log(np.linalg.det(cov)) - n + np.trace(cov) + np.dot(mu.T,mu))
return kl
def upper_bound(self, x0):
print('x0: ', x0)
############################
# Unpack error occurs here #
############################
gamma, var_y = np.exp(x0)
X = np.array([-4,-2,-1.5,0.3,1,2,3.5,4.5]).reshape(-1,1)
Y = np.array([-0.35,0.5,1.5,1.9,0.2,-2.2,-1.5,-1]).reshape(-1,1)
# Returns the MAP weights (mu), covariance matrix (S) and design matrix (phi)
mu, S, phi = bayes_regressor(X, Y, gamma, var_y)
# KL divergence between posterior and prior on the weights
kl = kl_divergence(mu, S)
# Gaussian log likelihood
N = X.shape[0]
log_p = -(N/2)*np.log(2*np.pi*var_y) - ((0.5/var_y)*(Y - phi.dot(mu))**2).mean()
# Variational upper bound
ub = -log_p + kl
return ub
运行最小化:
x0 = [0, 0]
result = scipy.optimize.minimize(upper_bound, x0)
在每次迭代中打印 x0 显示以下内容:
x0: [0. 0.]
x0: [1.49011612e-08 0.00000000e+00]
x0: [0.00000000e+00 1.49011612e-08]
...
...
x0: [-0.03153053 -5.35141768]
x0: [-0.03153053 -5.35141769]
x0: [[-0.03153053 -5.35141769]]
最后一行显示形状变化的地方。引发以下错误np.exp(x0)
:
ValueError: not enough values to unpack (expected 2, got 1)
更新:收敛图显示 4 次最小化运行的目标函数评估(均因相同问题而失败)。显示超参数值在最小化过程中如何变化的超参数图。