背景(可能无关):我正在使用随机特征进行稀疏核近似,然后将其用于香草贝叶斯线性回归设置中。为了优化两个超参数[gamma,var_y],我使用了重新参数化技巧并最小化了变分上限-E[log(p(y|f(x)))] + KL(q(w)||p(w))
。
问题::在优化过程中,x0参数(初始猜测)将形状从[gamma,var_y]更改为[[gamma,var_y]],从而导致最小化过程失败。这是因为解压缩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次最小化运行的目标函数评估(均因相同问题而失败)。超参数图显示了超参数值在最小化期间的变化。