26 template<
typename AFloat>
27 auto TCpu<AFloat>::RecurrentLayerBackward(TCpuMatrix<AFloat> & state_gradients_backward,
28 TCpuMatrix<AFloat> & input_weight_gradients,
29 TCpuMatrix<AFloat> & state_weight_gradients,
30 TCpuMatrix<AFloat> & bias_gradients,
31 TCpuMatrix<AFloat> & df,
32 const TCpuMatrix<AFloat> & state,
33 const TCpuMatrix<AFloat> & weights_input,
34 const TCpuMatrix<AFloat> & weights_state,
35 const TCpuMatrix<AFloat> & input,
36 TCpuMatrix<AFloat> & input_gradient)
37 -> TCpuMatrix<AFloat> &
51 if (input_gradient.GetNoElements() > 0) Multiply(input_gradient, df, weights_input);
54 if (state_gradients_backward.GetNoElements() > 0) Multiply(state_gradients_backward, df, weights_state);
61 if (input_weight_gradients.GetNoElements() > 0) {
62 TransposeMultiply(input_weight_gradients, df, input, 1. , 1.);
64 if (state_weight_gradients.GetNoElements() > 0) {
65 TransposeMultiply(state_weight_gradients, df, state, 1. , 1. );
69 if (bias_gradients.GetNoElements() > 0) {
70 SumColumns(bias_gradients, df, 1., 1.);
80 return input_gradient;