mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-10 20:42:39 +02:00
Gradients for X seem to match
This commit is contained in:
parent
afba8d5c5e
commit
e12575c0c6
2 changed files with 41 additions and 10 deletions
|
|
@ -83,6 +83,35 @@ class BayesianGPLVMMiniBatch(SparseGPMiniBatch):
|
||||||
def _inner_parameters_changed(self, kern, X, Z, likelihood, Y, Y_metadata, Lm=None, dL_dKmm=None,psi0=None, psi1=None, psi2=None, **kw):
|
def _inner_parameters_changed(self, kern, X, Z, likelihood, Y, Y_metadata, Lm=None, dL_dKmm=None,psi0=None, psi1=None, psi2=None, **kw):
|
||||||
posterior, log_marginal_likelihood, grad_dict = super(BayesianGPLVMMiniBatch, self)._inner_parameters_changed(kern, X, Z, likelihood, Y, Y_metadata, Lm=Lm, dL_dKmm=dL_dKmm,
|
posterior, log_marginal_likelihood, grad_dict = super(BayesianGPLVMMiniBatch, self)._inner_parameters_changed(kern, X, Z, likelihood, Y, Y_metadata, Lm=Lm, dL_dKmm=dL_dKmm,
|
||||||
psi0=psi0, psi1=psi1, psi2=psi2, **kw)
|
psi0=psi0, psi1=psi1, psi2=psi2, **kw)
|
||||||
|
kl_fctr = self.kl_factr
|
||||||
|
if self.has_uncertain_inputs():
|
||||||
|
if self.missing_data:
|
||||||
|
d = self.output_dim
|
||||||
|
log_marginal_likelihood -= kl_fctr*self.variational_prior.KL_divergence(X)/d
|
||||||
|
else:
|
||||||
|
log_marginal_likelihood -= kl_fctr*self.variational_prior.KL_divergence(X)
|
||||||
|
|
||||||
|
X.mean.gradient[:] = 0
|
||||||
|
X.variance.gradient[:] = 0
|
||||||
|
|
||||||
|
self.variational_prior.update_gradients_KL(X)
|
||||||
|
if self.missing_data:
|
||||||
|
grad_dict['meangrad'] = kl_fctr*X.mean.gradient/d
|
||||||
|
grad_dict['vargrad'] = kl_fctr*X.variance.gradient/d
|
||||||
|
else:
|
||||||
|
grad_dict['meangrad'] = kl_fctr*X.mean.gradient
|
||||||
|
grad_dict['vargrad'] = kl_fctr*X.variance.gradient
|
||||||
|
|
||||||
|
#if subset_indices is not None:
|
||||||
|
#value_indices['meangrad'] = subset_indices['samples']
|
||||||
|
#value_indices['vargrad'] = subset_indices['samples']
|
||||||
|
|
||||||
|
#grad_dict['meangrad'] = kl_fctr*self.X.mean.gradient
|
||||||
|
#grad_dict['vargrad'] = kl_fctr*self.X.variance.gradient
|
||||||
|
#self.X.mean.gradient[:] = 0
|
||||||
|
#self.X.variance.gradient[:] = 0
|
||||||
|
#import ipdb; ipdb.set_trace() # XXX BREAKPOINT
|
||||||
|
|
||||||
return posterior, log_marginal_likelihood, grad_dict
|
return posterior, log_marginal_likelihood, grad_dict
|
||||||
|
|
||||||
def _outer_values_update(self, full_values):
|
def _outer_values_update(self, full_values):
|
||||||
|
|
@ -92,28 +121,28 @@ class BayesianGPLVMMiniBatch(SparseGPMiniBatch):
|
||||||
"""
|
"""
|
||||||
super(BayesianGPLVMMiniBatch, self)._outer_values_update(full_values)
|
super(BayesianGPLVMMiniBatch, self)._outer_values_update(full_values)
|
||||||
if self.has_uncertain_inputs():
|
if self.has_uncertain_inputs():
|
||||||
full_values['meangrad'], full_values['vargrad'] = self.kern.gradients_qX_expectations(
|
meangrad_tmp, vargrad_tmp = self.kern.gradients_qX_expectations(
|
||||||
variational_posterior=self.X,
|
variational_posterior=self.X,
|
||||||
Z=self.Z, dL_dpsi0=full_values['dL_dpsi0'],
|
Z=self.Z, dL_dpsi0=full_values['dL_dpsi0'],
|
||||||
dL_dpsi1=full_values['dL_dpsi1'],
|
dL_dpsi1=full_values['dL_dpsi1'],
|
||||||
dL_dpsi2=full_values['dL_dpsi2'],
|
dL_dpsi2=full_values['dL_dpsi2'],
|
||||||
psi0=self.psi0, psi1=self.psi1, psi2=self.psi2)
|
psi0=self.psi0, psi1=self.psi1, psi2=self.psi2)
|
||||||
|
full_values['meangrad'] += meangrad_tmp
|
||||||
|
full_values['vargrad'] += vargrad_tmp
|
||||||
else:
|
else:
|
||||||
full_values['Xgrad'] = self.kern.gradients_X(full_values['dL_dKnm'], self.X, self.Z)
|
full_values['Xgrad'] = self.kern.gradients_X(full_values['dL_dKnm'], self.X, self.Z)
|
||||||
full_values['Xgrad'] += self.kern.gradients_X_diag(full_values['dL_dKdiag'], self.X)
|
full_values['Xgrad'] += self.kern.gradients_X_diag(full_values['dL_dKdiag'], self.X)
|
||||||
|
|
||||||
kl_fctr = self.kl_factr
|
#kl_fctr = self.kl_factr
|
||||||
if self.has_uncertain_inputs():
|
#if self.has_uncertain_inputs():
|
||||||
self._log_marginal_likelihood -= kl_fctr*self.variational_prior.KL_divergence(self.X)
|
#self._log_marginal_likelihood -= kl_fctr*self.variational_prior.KL_divergence(self.X)
|
||||||
|
|
||||||
# Subsetting Variational Posterior objects, makes the gradients
|
# Subsetting Variational Posterior objects, makes the gradients
|
||||||
# empty. We need them to be 0 though:
|
# empty. We need them to be 0 though:
|
||||||
self.X.mean.gradient[:] = 0
|
#self.X.mean.gradient[:] = 0
|
||||||
self.X.variance.gradient[:] = 0
|
#self.X.variance.gradient[:] = 0
|
||||||
|
|
||||||
self.variational_prior.update_gradients_KL(self.X)
|
#self.variational_prior.update_gradients_KL(self.X)
|
||||||
full_values['meangrad'] += kl_fctr*self.X.mean.gradient
|
|
||||||
full_values['vargrad'] += kl_fctr*self.X.variance.gradient
|
|
||||||
|
|
||||||
if self.has_uncertain_inputs():
|
if self.has_uncertain_inputs():
|
||||||
self.X.mean.gradient = full_values['meangrad']
|
self.X.mean.gradient = full_values['meangrad']
|
||||||
|
|
@ -123,6 +152,8 @@ class BayesianGPLVMMiniBatch(SparseGPMiniBatch):
|
||||||
|
|
||||||
def _outer_init_full_values(self):
|
def _outer_init_full_values(self):
|
||||||
full_values = super(BayesianGPLVMMiniBatch, self)._outer_init_full_values()
|
full_values = super(BayesianGPLVMMiniBatch, self)._outer_init_full_values()
|
||||||
|
full_values['meangrad'] = np.zeros((self.X.shape[0], self.X.shape[1]))
|
||||||
|
full_values['vargrad'] = np.zeros((self.X.shape[0], self.X.shape[1]))
|
||||||
full_values['dL_dpsi0'] = np.zeros(self.X.shape[0])
|
full_values['dL_dpsi0'] = np.zeros(self.X.shape[0])
|
||||||
full_values['dL_dpsi1'] = np.zeros((self.X.shape[0], self.Z.shape[0]))
|
full_values['dL_dpsi1'] = np.zeros((self.X.shape[0], self.Z.shape[0]))
|
||||||
return full_values
|
return full_values
|
||||||
|
|
|
||||||
|
|
@ -261,7 +261,7 @@ class SparseGPMiniBatch(SparseGP):
|
||||||
psi1ni = psi1[ninan]
|
psi1ni = psi1[ninan]
|
||||||
if self.has_uncertain_inputs():
|
if self.has_uncertain_inputs():
|
||||||
psi2ni = psi2[ninan]
|
psi2ni = psi2[ninan]
|
||||||
value_indices = dict(outputs=d, samples=ninan, dL_dpsi0=ninan, dL_dpsi1=ninan)
|
value_indices = dict(outputs=d, samples=ninan, dL_dpsi0=ninan, dL_dpsi1=ninan, meangrad=ninan, vargrad=ninan)
|
||||||
else:
|
else:
|
||||||
psi2ni = None
|
psi2ni = None
|
||||||
value_indices = dict(outputs=d, samples=ninan, dL_dKdiag=ninan, dL_dKnm=ninan)
|
value_indices = dict(outputs=d, samples=ninan, dL_dKdiag=ninan, dL_dKnm=ninan)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue