rnn

std.nn.rnn · Level L2

Run an Elman recurrent network over a sequence of inputs; returns every hidden state. A Scan of rnn_cell, differentiable end to end.

hₜ = tanh(W·hₜ₋₁ + U·xₜ + b)

Signature

rnn(h0: f64[k], X: f64[n, m], W: f64[k, k], U: f64[k, m], b: f64[k]) → f64[n, k]

Structure

The function as NOVA stores it: one box per input, operation and output, and arrows that carry values. A double border marks another library function this one runs — called once, or by Scan once per element; select it to open that function.

h0f64[k]Xf64[n, m]Wf64[k, k]Uf64[k, m]bf64[k]Scan·rnn_cellHHf64[n, k]
  • input
  • operation
  • constant
  • call
  • output

Verification

  • Signature proven by NOVA’s shape solver, for every size.
  • Agrees with the reference h = h0; for each x in X: h = np.tanh(W @ h + U @ x + b) to 80 digits (100-digit arithmetic), on all 40 test cases.
  • All 618 float64 results inside the running error bound; the closest uses 10% of it.
  • Interpreter and NumPy backend return bit-identical results.
Accuracy in detail
correctly rounded (the float64 nearest the exact value)
77%
bit-equal to the NumPy formula in float64
100%
largest error, in units in the last place
1.9e+3

Large ulp counts appear only where cancellation drives a result toward zero; the absolute error is still inside the bound.

Identity

Calls
Called by
—
sha256:a6d078c36678c99c773bddd11dc46ccd38d9c481ae49502d7062b9016e8be7b1

The semantic hash of the graph. It changes when the program changes, and never when only its documentation does.