Wire up temperature-based sampling for poet text generation

Greedy argmax decoding in RbmListener::forward always produces the
exact same character sequence and quickly falls into short repeating
loops once the 5-character lookback state revisits a prior cycle.

Add an optional temperature argument (poet f <seed> [temperature]) that
switches decoding to RnnStack::sample_one_hot, which now does proper
categorical sampling (temperature-scaled, renormalized draw) instead of
the old per-code Bernoulli approach that could leave the result as a
non-one-hot probability vector. Also seed Armadillo's RNG in main(),
since it otherwise defaults to a fixed seed and every run would sample
identically.

Add docs/RNN_ARCHITECTURE.md documenting how the RnnStack/Layer stack
implements the RNN (context chaining across layers, training/generation
data flow, and the decoding behavior above).

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 12:34:44 +02:00
co-authored by Claude Sonnet 5
parent 33a0647a51
commit 656a0252d3
4 changed files with 247 additions and 20 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ public:
arma::mat vc_to_v(const arma::mat &vc, size_t numContext) const;
arma::mat step_forward(arma::mat &state, const arma::mat &v);
void sample_one_hot(arma::mat &srcDst);
void sample_one_hot(arma::mat &srcDst, double temperature=1.0);
void clamp_one_hot(arma::mat &srcDst);
arma::mat to_next(const arma::mat &v);
arma::mat to_curr(const arma::mat &v);