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:
2026-07-27 13:45:03 +02:00
co-authored by Claude Sonnet 5
parent aabf7385ce
commit eb29e33b81
3 changed files with 36 additions and 11 deletions
+9 -1
View File
@@ -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)));