25 template<
typename Scalar_t>
26 auto TReference<Scalar_t>::RecurrentLayerBackward(TMatrixT<Scalar_t> & state_gradients_backward,
27 TMatrixT<Scalar_t> & input_weight_gradients,
28 TMatrixT<Scalar_t> & state_weight_gradients,
29 TMatrixT<Scalar_t> & bias_gradients,
30 TMatrixT<Scalar_t> & df,
31 const TMatrixT<Scalar_t> & state,
32 const TMatrixT<Scalar_t> & weights_input,
33 const TMatrixT<Scalar_t> & weights_state,
34 const TMatrixT<Scalar_t> & input,
35 TMatrixT<Scalar_t> & input_gradient)
52 for (
size_t i = 0; i < (size_t) df.GetNrows(); i++) {
53 for (
size_t j = 0; j < (size_t) df.GetNcols(); j++) {
54 df(i,j) *= state_gradients_backward(i,j);
59 if (input_gradient.GetNoElements() > 0) {
60 input_gradient.Mult(df, weights_input);
63 if (state_gradients_backward.GetNoElements() > 0) {
64 state_gradients_backward.Mult(df, weights_state);
68 if (input_weight_gradients.GetNoElements() > 0) {
69 TMatrixT<Scalar_t> tmp(input_weight_gradients);
70 input_weight_gradients.TMult(df, input);
71 input_weight_gradients += tmp;
73 if (state_weight_gradients.GetNoElements() > 0) {
74 TMatrixT<Scalar_t> tmp(state_weight_gradients);
75 state_weight_gradients.TMult(df, state);
76 state_weight_gradients += tmp;
80 if (bias_gradients.GetNoElements() > 0) {
82 for (
size_t j = 0; j < (size_t) df.GetNcols(); j++) {
85 for (
size_t i = 0; i < (size_t) df.GetNrows(); i++) {
88 bias_gradients(j,0) += sum;
104 return input_gradient;