Fix Bernoulli-only sample() applied to Gaussian visible/hidden units
Matutils::sample() always binary-thresholds (src > uniform(src)), but it was the only sampler in the codebase and was called unconditionally on h_probs/v_probs/miniBatch in several CD Gibbs-loop branches regardless of doGaussianVisible/doGaussianHidden. Binary-thresholding a Gaussian unit's continuous activation is meaningless -- it would corrupt any Gaussian-visible/hidden RBM (image-domain experiments via the GUI or TEST target); doesn't affect poet's plain BB-RBM path since both flags are false there. Add sample_gaussian() (mean + N(0,1) noise) alongside the existing Bernoulli sample() in matutils.hpp, plus Rbm::sampleVisible/sampleHidden helpers that dispatch to the right one per the RBM's configured type. Replace every visible/hidden Gibbs-step sample() call in cd_jens (the active path) and cd_hinton (compiled but currently unused, behind USE_CD_HINTON) with the appropriate dispatch helper, and fix the same issue in Rbm::train's doSampleBatch path. Behavior is unchanged for any RBM with doGaussianVisible/doGaussianHidden both false (confirmed: poet.elf f output identical before/after). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016K8Gu7Qejd11JbdiHZqYAs
This commit is contained in:
+9
-1
@@ -31,7 +31,15 @@ namespace Matutils
|
||||
arma::umat res = (src > uniform(src));
|
||||
return arma::conv_to<arma::mat>::from(res);
|
||||
}
|
||||
|
||||
|
||||
// src holds a Gaussian unit's mean; returns a stochastic sample around it.
|
||||
// Binary-thresholding a continuous Gaussian activation (via sample() above)
|
||||
// is meaningless, so Gaussian-visible/hidden units need this instead.
|
||||
inline arma::mat sample_gaussian(const arma::mat &src)
|
||||
{
|
||||
return src + arma::randn(arma::size(src));
|
||||
}
|
||||
|
||||
inline arma::mat prob(const arma::mat &src)
|
||||
{
|
||||
return 1 / (1 + (arma::exp(-src)));
|
||||
|
||||
Reference in New Issue
Block a user