|
| Eigen::MatrixXd | forward (Activation act, const Eigen::MatrixXd &Z, const ActivationParameters ¶ms=ActivationParameters{}) |
| | Elementwise forward for a single activation.
|
| |
| Eigen::MatrixXd | backward (Activation act, const Eigen::MatrixXd &dA, const Eigen::MatrixXd &Z, const Eigen::MatrixXd &A, const ActivationParameters ¶ms=ActivationParameters{}) noexcept |
| | Elementwise backward for a single activation (hidden layers).
|
| |
| Eigen::MatrixXd | softmax_forward (const Eigen::MatrixXd &Z) |
| | Stable column-wise softmax forward.
|
| |
| Eigen::MatrixXd | softmax_backward_hidden (const Eigen::MatrixXd &s, const Eigen::MatrixXd &upstream) noexcept |
| | Softmax hidden backward: dZ = J * upstream per column.
|
| |
| Eigen::MatrixXd | leaky_relu_forward (const Eigen::MatrixXd &Z, double alpha=kLeakyAlpha) |
| | LeakyReLU forward: A = Z>0 ? Z : alpha*Z.
|
| |
| Eigen::MatrixXd | leaky_relu_backward (const Eigen::MatrixXd &dA, const Eigen::MatrixXd &Z, const Eigen::MatrixXd &, double alpha=kLeakyAlpha) noexcept |
| | LeakyReLU backward: dZ = dA * (Z>0 ? 1 : alpha).
|
| |
| Eigen::MatrixXd | none_forward (const Eigen::MatrixXd &Z) |
| | Identity forward: A = Z.
|
| |
| Eigen::MatrixXd | none_backward (const Eigen::MatrixXd &dA, const Eigen::MatrixXd &, const Eigen::MatrixXd &) noexcept |
| | Identity backward: dZ = dA.
|
| |
| Eigen::MatrixXd | relu_forward (const Eigen::MatrixXd &Z) |
| | ReLU forward: A = max(0, Z) elementwise.
|
| |
| Eigen::MatrixXd | relu_backward (const Eigen::MatrixXd &dA, const Eigen::MatrixXd &Z, const Eigen::MatrixXd &) noexcept |
| | ReLU backward: dZ = dA * (Z > 0).
|
| |
| Eigen::MatrixXd | sigmoid_forward (const Eigen::MatrixXd &Z) |
| | Sigmoid forward: A = 1/(1+exp(-clamp(Z))) elementwise.
|
| |
| Eigen::MatrixXd | sigmoid_backward (const Eigen::MatrixXd &dA, const Eigen::MatrixXd &, const Eigen::MatrixXd &A) noexcept |
| | Sigmoid backward: dZ = dA * A * (1 - A).
|
| |
| Eigen::MatrixXd | tanh_forward (const Eigen::MatrixXd &Z) |
| | Tanh forward: A = tanh(Z) elementwise.
|
| |
| Eigen::MatrixXd | tanh_backward (const Eigen::MatrixXd &dA, const Eigen::MatrixXd &, const Eigen::MatrixXd &A) noexcept |
| | Tanh backward: dZ = dA * (1 - A^2).
|
| |
| Eigen::MatrixXd FlexNN::Activations::detail::softmax_backward_hidden |
( |
const Eigen::MatrixXd & |
s, |
|
|
const Eigen::MatrixXd & |
upstream |
|
) |
| |
|
inlinenoexcept |
Softmax hidden backward: dZ = J * upstream per column.
Softmax hidden backward per column: dZ = J * upstream.
For hidden Softmax (disallowed in v0.1 but tested), the Jacobian is J = diag(s) - s s^T where s = softmax(Z) per column. This helper applies J to the upstream gradient column-wise. Last-layer Softmax never calls this — it uses the fused A - Y path.
- Note
- noexcept: allocates MatrixXd; bad_alloc terminates.
- Parameters
-
| s | Softmax output per column (from forward) |
| upstream | Upstream gradient (W_next^T * dZ_next) per column |
- Returns
- Gradient w.r.t. Z
For each column, s is the softmax output for that column and up is the upstream gradient column (W_next^T * dZ_next for that sample). The Jacobian is J = diag(s) - s * s^T, so J*up = s ⊙ (up - s^T up). Implemented without forming J explicitly for O(n) per column.
- Parameters
-
| s | Softmax output per column [out × batch] |
| upstream | Upstream gradient [out × batch] |
- Returns
- Gradient w.r.t. Z, same shape