From b29ec245f21b54ca5b35be6f0df296d8d7f0a5e2 Mon Sep 17 00:00:00 2001 From: hyeonseok lee Date: Thu, 30 Dec 2021 13:54:28 +0900 Subject: [PATCH] [grucell] enable multi inout - Enable multi inout for grucell - Generate grucell layer/model unittest Self evaluation: Build test: [X]Passed [ ]Failed [ ]Skipped Run test: [X]Passed [ ]Failed [ ]Skipped Signed-off-by: hyeonseok lee --- nntrainer/compiler/recurrent_realizer.cpp | 4 +- nntrainer/layers/grucell.cpp | 518 +++++++++++---------- nntrainer/layers/grucell.h | 22 +- packaging/unittest_layers_v2.tar.gz | Bin 46347 -> 49691 bytes packaging/unittest_models_v2.tar.gz | Bin 19875 -> 22153 bytes test/input_gen/genLayerTests.py | 32 +- test/input_gen/genModelsRecurrent_v2.py | 24 +- test/input_gen/transLayer.py | 30 ++ test/unittest/layers/unittest_layers_grucell.cpp | 37 +- test/unittest/models/unittest_models_recurrent.cpp | 62 ++- 10 files changed, 406 insertions(+), 323 deletions(-) diff --git a/nntrainer/compiler/recurrent_realizer.cpp b/nntrainer/compiler/recurrent_realizer.cpp index d0215bc..6e56fd6 100644 --- a/nntrainer/compiler/recurrent_realizer.cpp +++ b/nntrainer/compiler/recurrent_realizer.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -188,8 +187,7 @@ static void propagateTimestep(LayerNode *node, unsigned int time_step, auto is_recurrent_type = [](LayerNode *node) { return node->getType() == RNNCellLayer::type || node->getType() == LSTMLayer::type || - node->getType() == ZoneoutLSTMCellLayer::type || - node->getType() == GRUCellLayer::type; + node->getType() == ZoneoutLSTMCellLayer::type; }; if (is_recurrent_type(node)) { diff --git a/nntrainer/layers/grucell.cpp b/nntrainer/layers/grucell.cpp index 1dc1a79..08e8be9 100644 --- a/nntrainer/layers/grucell.cpp +++ b/nntrainer/layers/grucell.cpp @@ -39,7 +39,211 @@ namespace nntrainer { -static constexpr size_t SINGLE_INOUT_IDX = 0; +void grucell_forwarding(const unsigned int unit, const unsigned int batch_size, + const bool disable_bias, const bool integrate_bias, + const bool reset_after, ActiFunc &acti_func, + ActiFunc &recurrent_acti_func, const Tensor &input, + const Tensor &prev_hidden_state, Tensor &hidden_state, + const Tensor &weight_ih, const Tensor &weight_hh, + const Tensor &bias_h, const Tensor &bias_ih, + const Tensor &bias_hh, Tensor &zrg) { + input.dot(weight_ih, zrg); + + Tensor update_reset_gate = + zrg.getSharedDataTensor({batch_size, 1, 1, 2 * unit}, 0, false); + Tensor memory_cell = + zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 2 * unit, false); + + Tensor weight_hh_update_reset_gate; + Tensor weight_hh_memory_cell; + weight_hh_update_reset_gate.copy_with_stride( + weight_hh.getSharedDataTensor({unit, 2 * unit}, 0, false)); + weight_hh_memory_cell.copy_with_stride( + weight_hh.getSharedDataTensor({unit, unit}, 2 * unit, false)); + + update_reset_gate.add_i_strided( + prev_hidden_state.dot(weight_hh_update_reset_gate)); + if (!disable_bias) { + if (integrate_bias) { + const Tensor bias_h_update_reset_gate = + bias_h.getSharedDataTensor({2 * unit}, 0); + update_reset_gate.add_i(bias_h_update_reset_gate); + } else { + const Tensor bias_ih_update_reset_gate = + bias_ih.getSharedDataTensor({2 * unit}, 0); + update_reset_gate.add_i(bias_ih_update_reset_gate); + const Tensor bias_hh_update_reset_gate = + bias_hh.getSharedDataTensor({2 * unit}, 0); + update_reset_gate.add_i(bias_hh_update_reset_gate); + } + } + + recurrent_acti_func.run_fn(update_reset_gate, update_reset_gate); + + Tensor update_gate = + update_reset_gate.getSharedDataTensor({batch_size, 1, 1, unit}, 0, false); + Tensor reset_gate = update_reset_gate.getSharedDataTensor( + {batch_size, 1, 1, unit}, unit, false); + + Tensor temp; + if (reset_after) { + prev_hidden_state.dot(weight_hh_memory_cell, temp); + if (!disable_bias && !integrate_bias) { + const Tensor bias_hh_memory_cell = + bias_hh.getSharedDataTensor({unit}, 2 * unit); + temp.add_i(bias_hh_memory_cell); + } + temp.multiply_i_strided(reset_gate); + memory_cell.add_i_strided(temp); + } else { + reset_gate.multiply_strided(prev_hidden_state, temp); + memory_cell.add_i_strided(temp.dot(weight_hh_memory_cell)); + if (!disable_bias && !integrate_bias) { + const Tensor bias_hh_memory_cell = + bias_hh.getSharedDataTensor({unit}, 2 * unit); + memory_cell.add_i(bias_hh_memory_cell); + } + } + if (!disable_bias) { + if (integrate_bias) { + const Tensor bias_h_memory_cell = + bias_h.getSharedDataTensor({unit}, 2 * unit); + memory_cell.add_i(bias_h_memory_cell); + } else { + const Tensor bias_ih_memory_cell = + bias_ih.getSharedDataTensor({unit}, 2 * unit); + memory_cell.add_i(bias_ih_memory_cell); + } + } + + acti_func.run_fn(memory_cell, memory_cell); + + update_gate.multiply_strided(prev_hidden_state, hidden_state); + temp = update_gate.multiply(-1.0).add(1.0); + + hidden_state.add_i(memory_cell.multiply_strided(temp)); +} + +void grucell_calcGradient( + const unsigned int unit, const unsigned int batch_size, + const bool disable_bias, const bool integrate_bias, const bool reset_after, + ActiFunc &acti_func, ActiFunc &recurrent_acti_func, const Tensor &input, + const Tensor &prev_hidden_state, Tensor &d_prev_hidden_state, + const Tensor &d_hidden_state, Tensor &d_weight_ih, const Tensor &weight_hh, + Tensor &d_weight_hh, Tensor &d_bias_h, Tensor &d_bias_ih, + const Tensor &bias_hh, Tensor &d_bias_hh, const Tensor &zrg, Tensor &d_zrg) { + Tensor d_weight_hh_update_reset_gate = + d_weight_hh.getSharedDataTensor({unit, 2 * unit}, 0, false); + Tensor d_weight_hh_memory_cell = + d_weight_hh.getSharedDataTensor({unit, unit}, 2 * unit, false); + + Tensor update_gate = + zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 0, false); + Tensor reset_gate = + zrg.getSharedDataTensor({batch_size, 1, 1, unit}, unit, false); + Tensor memory_cell = + zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 2 * unit, false); + + Tensor d_update_gate = + d_zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 0, false); + Tensor d_reset_gate = + d_zrg.getSharedDataTensor({batch_size, 1, 1, unit}, unit, false); + Tensor d_memory_cell = + d_zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 2 * unit, false); + + d_hidden_state.multiply_strided( + update_gate, d_prev_hidden_state); // d_prev_hidden_state = d1 + d_hidden_state.multiply_strided(prev_hidden_state, + d_update_gate); // d_update_gate = d2 + d_update_gate.add_i_strided(d_hidden_state.multiply_strided(memory_cell), + -1.0f); // d_update_gate = d5 + update_gate.multiply(-1.0, d_memory_cell); + d_memory_cell.add_i(1.0); + d_memory_cell.multiply_i_strided(d_hidden_state); // d_memory_cell = d6 + + recurrent_acti_func.run_prime_fn(update_gate, d_update_gate, + d_update_gate); // d_update_gate = d7 + acti_func.run_prime_fn(memory_cell, d_memory_cell, + d_memory_cell); // d_memory_cell = d8 + + Tensor d_update_reset_gate = d_zrg.getSharedDataTensor( + {batch_size, 1, 1, 2 * unit}, 0, false); // d_update_gate+d_reset_gate + + Tensor weight_hh_memory_cell; + weight_hh_memory_cell.copy_with_stride( + weight_hh.getSharedDataTensor({unit, unit}, 2 * unit, false)); + Tensor weight_hh_update_reset_gate; + weight_hh_update_reset_gate.copy_with_stride( + weight_hh.getSharedDataTensor({unit, 2 * unit}, 0, false)); + + Tensor temp = Tensor(batch_size, 1, 1, unit); + Tensor d_memory_cell_contiguous; + d_memory_cell_contiguous.copy_with_stride(d_memory_cell); + + if (reset_after) { + prev_hidden_state.dot(weight_hh_memory_cell, temp); + if (!disable_bias && !integrate_bias) { + const Tensor bias_hh_memory_cell = + bias_hh.getSharedDataTensor({unit}, 2 * unit); + temp.add_i(bias_hh_memory_cell); + } + d_memory_cell_contiguous.multiply_strided( + temp, d_reset_gate); // d_reset_gate = d15 + + // reset temp: d_memory_cell_contiguous * reset_gate for + // d_bias_hh_memory_cell, d_prev_hidden_state and d_weight_hh_memory_cell + d_memory_cell_contiguous.multiply_strided(reset_gate, temp); + if (!disable_bias && !integrate_bias) { + Tensor d_bias_hh_memory_cell = + d_bias_hh.getSharedDataTensor({unit}, 2 * unit); + temp.sum(0, d_bias_hh_memory_cell, 1.0, 1.0); + } + temp.dot(weight_hh_memory_cell, d_prev_hidden_state, false, true, + 1.0); // d_prev_hidden_state = d1 + d14 + d_weight_hh_memory_cell.add_i_strided( + prev_hidden_state.dot(temp, true, false)); + } else { + if (!disable_bias && !integrate_bias) { + Tensor d_bias_hh_memory_cell = + d_bias_hh.getSharedDataTensor({unit}, 2 * unit); + d_memory_cell.sum(0, d_bias_hh_memory_cell, 1.0, 1.0); + } + + d_memory_cell_contiguous.dot(weight_hh_memory_cell, temp, false, true); + temp.multiply_strided(prev_hidden_state, d_reset_gate); + temp.multiply_strided(reset_gate, d_prev_hidden_state, 1.0f); + + // reset temp: reset_gate * prev_hidden_state for and + // d_weight_hh_memory_cell + reset_gate.multiply_strided(prev_hidden_state, temp); + d_weight_hh_memory_cell.add_i_strided( + temp.dot(d_memory_cell_contiguous, true, false)); + } + + recurrent_acti_func.run_prime_fn(reset_gate, d_reset_gate, + d_reset_gate); // d_reset_gate = d16 + + if (!disable_bias) { + if (integrate_bias) { + d_zrg.sum(0, d_bias_h, 1.0, 1.0); + } else { + d_zrg.sum(0, d_bias_ih, 1.0, 1.0); + Tensor d_bias_hh_update_reset_gate = + d_bias_hh.getSharedDataTensor({2 * unit}, 0); + d_bias_hh_update_reset_gate.add_i( + d_zrg.sum(0).getSharedDataTensor({2 * unit}, 0)); + } + } + + Tensor d_update_reset_gate_contiguous; + d_update_reset_gate_contiguous.copy_with_stride(d_update_reset_gate); + d_weight_hh_update_reset_gate.add_i_strided( + prev_hidden_state.dot(d_update_reset_gate_contiguous, true, false)); + input.dot(d_zrg, d_weight_ih, true, false, 1.0f); + d_update_reset_gate_contiguous.dot( + weight_hh_update_reset_gate, d_prev_hidden_state, false, true, + 1.0); // d_prev_hidden_state = d1 + d14 + d12 + d17 +} enum GRUCellParams { weight_ih, @@ -47,7 +251,6 @@ enum GRUCellParams { bias_h, bias_ih, bias_hh, - hidden_state, zrg, dropout_mask }; @@ -56,11 +259,10 @@ enum GRUCellParams { // tensors GRUCellLayer::GRUCellLayer() : LayerImpl(), - grucell_props(props::Unit(), + grucell_props(props::Unit(), props::IntegrateBias(), props::ResetAfter(), props::HiddenStateActivation() = ActivationType::ACT_TANH, props::RecurrentActivation() = ActivationType::ACT_SIGMOID, - props::DropOutRate(), props::IntegrateBias(), - props::ResetAfter(), props::MaxTimestep(), props::Timestep()), + props::DropOutRate()), acti_func(ActivationType::ACT_NONE, true), recurrent_acti_func(ActivationType::ACT_NONE, true), epsilon(1e-3) { @@ -87,18 +289,26 @@ void GRUCellLayer::finalize(InitLayerContext &context) { const ActivationType recurrent_activation_type = std::get(grucell_props).get(); const float dropout_rate = std::get(grucell_props).get(); - const unsigned int max_timestep = - std::get(grucell_props).get(); - if (context.getNumInputs() != 1) { - throw std::invalid_argument("GRUCell layer takes only one input"); + if (context.getNumInputs() != 2) { + throw std::invalid_argument( + "Number of input is not 2. GRUCell layer takes should takes 2 input"); } // input_dim = [ batch_size, 1, 1, feature_size ] const TensorDim &input_dim = context.getInputDimensions()[0]; if (input_dim.channel() != 1 && input_dim.height() != 1) { throw std::invalid_argument( - "Input must be single time dimension for GRUCell"); + "Input must be single time dimension for GRUCell(shape should be " + "[batch_size, 1, 1, feature_size]"); + } + // input_hidden_state_dim = [ batch_size, 1, 1, unit ] + const TensorDim &input_hidden_state_dim = + context.getInputDimensions()[INOUT_INDEX::INPUT_HIDDEN_STATE]; + if (input_hidden_state_dim.channel() != 1 || + input_hidden_state_dim.height() != 1) { + throw std::invalid_argument("Input hidden state's dimension should be " + "[batch, 1, 1, unit] for GRUCell"); } const unsigned int batch_size = input_dim.batch(); @@ -148,12 +358,6 @@ void GRUCellLayer::finalize(InitLayerContext &context) { } } - // hidden_state_dim = [ max_timestep * batch_size, 1, 1, unit ] - TensorDim hidden_state_dim(max_timestep * batch_size, 1, 1, unit); - wt_idx[GRUCellParams::hidden_state] = context.requestTensor( - hidden_state_dim, "hidden_state", Tensor::Initializer::NONE, true, - TensorLifespan::ITERATION_LIFESPAN, false); - // zrg_dim = [ batch_size, 1, 1, NUM_GATE * unit ] TensorDim zrg_dim(batch_size, 1, 1, NUM_GATE * unit); wt_idx[GRUCellParams::zrg] = @@ -192,12 +396,12 @@ void GRUCellLayer::forwarding(RunLayerContext &context, bool training) { std::get(grucell_props).get(); const bool reset_after = std::get(grucell_props).get(); const float dropout_rate = std::get(grucell_props).get(); - const unsigned int max_timestep = - std::get(grucell_props).get(); - const unsigned int timestep = std::get(grucell_props).get(); - const Tensor &input = context.getInput(SINGLE_INOUT_IDX); - Tensor &output = context.getOutput(SINGLE_INOUT_IDX); + const Tensor &input = context.getInput(INOUT_INDEX::INPUT); + const Tensor &prev_hidden_state = + context.getInput(INOUT_INDEX::INPUT_HIDDEN_STATE); + Tensor &output = context.getOutput(INOUT_INDEX::OUTPUT); + const unsigned int batch_size = input.getDim().batch(); const Tensor &weight_ih = context.getWeight(wt_idx[GRUCellParams::weight_ih]); @@ -213,96 +417,14 @@ void GRUCellLayer::forwarding(RunLayerContext &context, bool training) { ? context.getWeight(wt_idx[GRUCellParams::bias_hh]) : empty; - Tensor &hidden_states = - context.getTensor(wt_idx[GRUCellParams::hidden_state]); - hidden_states.reshape({max_timestep, 1, batch_size, unit}); - Tensor prev_hidden_state; - if (!timestep) { - prev_hidden_state = Tensor(batch_size, unit); - prev_hidden_state.setZero(); - } else { - prev_hidden_state = hidden_states.getBatchSlice(timestep - 1, 1); - } - prev_hidden_state.reshape({batch_size, 1, 1, unit}); - Tensor hidden_state = hidden_states.getBatchSlice(timestep, 1); - hidden_state.reshape({batch_size, 1, 1, unit}); - Tensor &zrg = context.getTensor(wt_idx[GRUCellParams::zrg]); - input.dot(weight_ih, zrg); + Tensor hidden_state; - Tensor update_reset_gate = - zrg.getSharedDataTensor({batch_size, 1, 1, 2 * unit}, 0, false); - Tensor memory_cell = - zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 2 * unit, false); - - Tensor weight_hh_update_reset_gate; - Tensor weight_hh_memory_cell; - weight_hh_update_reset_gate.copy_with_stride( - weight_hh.getSharedDataTensor({unit, 2 * unit}, 0, false)); - weight_hh_memory_cell.copy_with_stride( - weight_hh.getSharedDataTensor({unit, unit}, 2 * unit, false)); - - update_reset_gate.add_i_strided( - prev_hidden_state.dot(weight_hh_update_reset_gate)); - if (!disable_bias) { - if (integrate_bias) { - const Tensor bias_h_update_reset_gate = - bias_h.getSharedDataTensor({2 * unit}, 0); - update_reset_gate.add_i(bias_h_update_reset_gate); - } else { - const Tensor bias_ih_update_reset_gate = - bias_ih.getSharedDataTensor({2 * unit}, 0); - update_reset_gate.add_i(bias_ih_update_reset_gate); - const Tensor bias_hh_update_reset_gate = - bias_hh.getSharedDataTensor({2 * unit}, 0); - update_reset_gate.add_i(bias_hh_update_reset_gate); - } - } - - recurrent_acti_func.run_fn(update_reset_gate, update_reset_gate); - - Tensor update_gate = - update_reset_gate.getSharedDataTensor({batch_size, 1, 1, unit}, 0, false); - Tensor reset_gate = update_reset_gate.getSharedDataTensor( - {batch_size, 1, 1, unit}, unit, false); - - Tensor temp; - if (reset_after) { - prev_hidden_state.dot(weight_hh_memory_cell, temp); - if (!disable_bias && !integrate_bias) { - const Tensor bias_hh_memory_cell = - bias_hh.getSharedDataTensor({unit}, 2 * unit); - temp.add_i(bias_hh_memory_cell); - } - temp.multiply_i_strided(reset_gate); - memory_cell.add_i_strided(temp); - } else { - reset_gate.multiply_strided(prev_hidden_state, temp); - temp.dot(weight_hh_memory_cell, memory_cell, false, false, 1.0f); - if (!disable_bias && !integrate_bias) { - const Tensor bias_hh_memory_cell = - bias_hh.getSharedDataTensor({unit}, 2 * unit); - memory_cell.add_i(bias_hh_memory_cell); - } - } - if (!disable_bias) { - if (integrate_bias) { - const Tensor bias_h_memory_cell = - bias_h.getSharedDataTensor({unit}, 2 * unit); - memory_cell.add_i(bias_h_memory_cell); - } else { - const Tensor bias_ih_memory_cell = - bias_ih.getSharedDataTensor({unit}, 2 * unit); - memory_cell.add_i(bias_ih_memory_cell); - } - } - - acti_func.run_fn(memory_cell, memory_cell); - - update_gate.multiply_strided(prev_hidden_state, hidden_state); - temp = update_gate.multiply(-1.0).add(1.0); - hidden_state.add_i(memory_cell.multiply_strided(temp)); + grucell_forwarding(unit, batch_size, disable_bias, integrate_bias, + reset_after, acti_func, recurrent_acti_func, input, + prev_hidden_state, hidden_state, weight_ih, weight_hh, + bias_h, bias_ih, bias_hh, zrg); if (dropout_rate > epsilon && training) { Tensor mask = context.getTensor(wt_idx[GRUCellParams::dropout_mask]); @@ -314,7 +436,8 @@ void GRUCellLayer::forwarding(RunLayerContext &context, bool training) { } void GRUCellLayer::calcDerivative(RunLayerContext &context) { - Tensor &outgoing_derivative = context.getOutgoingDerivative(SINGLE_INOUT_IDX); + Tensor &outgoing_derivative = + context.getOutgoingDerivative(INOUT_INDEX::INPUT); const Tensor &weight_ih = context.getWeight(wt_idx[GRUCellParams::weight_ih]); const Tensor &d_zrg = context.getTensorGrad(wt_idx[GRUCellParams::zrg]); @@ -330,11 +453,15 @@ void GRUCellLayer::calcGradient(RunLayerContext &context) { std::get(grucell_props).get(); const bool reset_after = std::get(grucell_props).get(); const float dropout_rate = std::get(grucell_props).get(); - const unsigned int max_timestep = - std::get(grucell_props).get(); - const unsigned int timestep = std::get(grucell_props).get(); - const Tensor &input = context.getInput(SINGLE_INOUT_IDX); + const Tensor &input = context.getInput(INOUT_INDEX::INPUT); + const Tensor &prev_hidden_state = + context.getInput(INOUT_INDEX::INPUT_HIDDEN_STATE); + Tensor &d_prev_hidden_state = + context.getOutgoingDerivative(INOUT_INDEX::INPUT_HIDDEN_STATE); + const Tensor &incoming_derivative = + context.getIncomingDerivative(INOUT_INDEX::OUTPUT); + const unsigned int batch_size = input.getDim().batch(); Tensor &d_weight_ih = context.getWeightGrad(wt_idx[GRUCellParams::weight_ih]); @@ -355,171 +482,48 @@ void GRUCellLayer::calcGradient(RunLayerContext &context) { ? context.getWeightGrad(wt_idx[GRUCellParams::bias_hh]) : empty; - Tensor d_weight_hh_update_reset_gate = - d_weight_hh.getSharedDataTensor({unit, 2 * unit}, 0, false); - Tensor d_weight_hh_memory_cell = - d_weight_hh.getSharedDataTensor({unit, unit}, 2 * unit, false); - Tensor &hidden_states = - context.getTensor(wt_idx[GRUCellParams::hidden_state]); - hidden_states.reshape({max_timestep, 1, batch_size, unit}); - Tensor &d_hidden_states = - context.getTensorGrad(wt_idx[GRUCellParams::hidden_state]); - const Tensor &incoming_derivative = - context.getIncomingDerivative(SINGLE_INOUT_IDX); const Tensor &zrg = context.getTensor(wt_idx[GRUCellParams::zrg]); Tensor &d_zrg = context.getTensorGrad(wt_idx[GRUCellParams::zrg]); - d_hidden_states.reshape({max_timestep, 1, batch_size, unit}); - Tensor d_hidden_state = d_hidden_states.getBatchSlice(timestep, 1); - d_hidden_state.reshape({batch_size, 1, 1, unit}); - if (timestep + 1 == max_timestep) { + if (context.isGradientFirstAccess(wt_idx[GRUCellParams::weight_ih])) { d_weight_ih.setZero(); + } + if (context.isGradientFirstAccess(wt_idx[GRUCellParams::weight_hh])) { d_weight_hh.setZero(); - if (!disable_bias) { - if (integrate_bias) { + } + if (!disable_bias) { + if (integrate_bias) { + if (context.isGradientFirstAccess(wt_idx[GRUCellParams::bias_h])) { d_bias_h.setZero(); - } else { + } + } else { + if (context.isGradientFirstAccess(wt_idx[GRUCellParams::bias_ih])) { d_bias_ih.setZero(); + } + if (context.isGradientFirstAccess(wt_idx[GRUCellParams::bias_hh])) { d_bias_hh.setZero(); } } - d_hidden_state.setZero(); } - d_hidden_state.add_i(incoming_derivative); - - Tensor prev_hidden_state; - Tensor d_prev_hidden_state; - if (timestep) { - prev_hidden_state = hidden_states.getBatchSlice(timestep - 1, 1); - d_prev_hidden_state = d_hidden_states.getBatchSlice(timestep - 1, 1); - } else { - prev_hidden_state = Tensor(batch_size, unit); - prev_hidden_state.setZero(); - d_prev_hidden_state = Tensor(batch_size, unit); - d_prev_hidden_state.setZero(); - } - prev_hidden_state.reshape({batch_size, 1, 1, unit}); - d_prev_hidden_state.reshape({batch_size, 1, 1, unit}); + Tensor d_hidden_state(batch_size, 1, 1, unit); + d_hidden_state.copyData(incoming_derivative); if (dropout_rate > epsilon) { - d_hidden_states.multiply_i( + d_hidden_state.multiply_i( context.getTensor(wt_idx[GRUCellParams::dropout_mask])); } - Tensor update_gate = - zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 0, false); - Tensor reset_gate = - zrg.getSharedDataTensor({batch_size, 1, 1, unit}, unit, false); - Tensor memory_cell = - zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 2 * unit, false); - - Tensor d_update_gate = - d_zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 0, false); - Tensor d_reset_gate = - d_zrg.getSharedDataTensor({batch_size, 1, 1, unit}, unit, false); - Tensor d_memory_cell = - d_zrg.getSharedDataTensor({batch_size, 1, 1, unit}, 2 * unit, false); - - d_hidden_state.multiply_strided( - update_gate, d_prev_hidden_state); // d_prev_hidden_state = d1 - d_hidden_state.multiply_strided(prev_hidden_state, - d_update_gate); // d_update_gate = d2 - d_update_gate.add_i_strided(d_hidden_state.multiply_strided(memory_cell), - -1.0f); // d_update_gate = d5 - update_gate.multiply(-1.0, d_memory_cell); - d_memory_cell.add_i(1.0); - d_memory_cell.multiply_i_strided(d_hidden_state); // d_memory_cell = d6 - - recurrent_acti_func.run_prime_fn(update_gate, d_update_gate, - d_update_gate); // d_update_gate = d7 - acti_func.run_prime_fn(memory_cell, d_memory_cell, - d_memory_cell); // d_memory_cell = d8 - - Tensor d_update_reset_gate = d_zrg.getSharedDataTensor( - {batch_size, 1, 1, 2 * unit}, 0, false); // d_update_gate+d_reset_gate - - Tensor weight_hh_memory_cell; - weight_hh_memory_cell.copy_with_stride( - weight_hh.getSharedDataTensor({unit, unit}, 2 * unit, false)); - Tensor weight_hh_update_reset_gate; - weight_hh_update_reset_gate.copy_with_stride( - weight_hh.getSharedDataTensor({unit, 2 * unit}, 0, false)); - - Tensor temp = Tensor(batch_size, 1, 1, unit); - Tensor d_memory_cell_contiguous; - d_memory_cell_contiguous.copy_with_stride(d_memory_cell); - - if (reset_after) { - prev_hidden_state.dot(weight_hh_memory_cell, temp); - if (!disable_bias && !integrate_bias) { - const Tensor bias_hh_memory_cell = - bias_hh.getSharedDataTensor({unit}, 2 * unit); - temp.add_i(bias_hh_memory_cell); - } - d_memory_cell_contiguous.multiply_strided( - temp, d_reset_gate); // d_reset_gate = d15 - - // reset temp: d_memory_cell_contiguous * reset_gate for - // d_bias_hh_memory_cell, d_prev_hidden_state and d_weight_hh_memory_cell - d_memory_cell_contiguous.multiply_strided(reset_gate, temp); - if (!disable_bias && !integrate_bias) { - Tensor d_bias_hh_memory_cell = - d_bias_hh.getSharedDataTensor({unit}, 2 * unit); - temp.sum(0, d_bias_hh_memory_cell, 1.0, 1.0); - } - temp.dot(weight_hh_memory_cell, d_prev_hidden_state, false, true, - 1.0); // d_prev_hidden_state = d1 + d14 - d_weight_hh_memory_cell.add_i_strided( - prev_hidden_state.dot(temp, true, false)); - } else { - if (!disable_bias && !integrate_bias) { - Tensor d_bias_hh_memory_cell = - d_bias_hh.getSharedDataTensor({unit}, 2 * unit); - d_memory_cell.sum(0, d_bias_hh_memory_cell, 1.0, 1.0); - } - - d_memory_cell_contiguous.dot(weight_hh_memory_cell, temp, false, true); - temp.multiply_strided(prev_hidden_state, d_reset_gate); - temp.multiply_strided(reset_gate, d_prev_hidden_state, 1.0f); - - // reset temp: reset_gate * prev_hidden_state for and - // d_weight_hh_memory_cell - reset_gate.multiply_strided(prev_hidden_state, temp); - temp.dot(d_memory_cell_contiguous, d_weight_hh_memory_cell, true, false, - 1.0f); - } - - recurrent_acti_func.run_prime_fn(reset_gate, d_reset_gate, - d_reset_gate); // d_reset_gate = d16 - - if (!disable_bias) { - if (integrate_bias) { - d_zrg.sum(0, d_bias_h, 1.0, 1.0); - } else { - d_zrg.sum(0, d_bias_ih, 1.0, 1.0); - Tensor d_bias_hh_update_reset_gate = - d_bias_hh.getSharedDataTensor({2 * unit}, 0); - d_bias_hh_update_reset_gate.add_i( - d_zrg.sum(0).getSharedDataTensor({2 * unit}, 0)); - } - } - - Tensor d_update_reset_gate_contiguous; - d_update_reset_gate_contiguous.copy_with_stride(d_update_reset_gate); - d_weight_hh_update_reset_gate.add_i_strided( - prev_hidden_state.dot(d_update_reset_gate_contiguous, true, false)); - input.dot(d_zrg, d_weight_ih, true, false, 1.0f); - d_update_reset_gate_contiguous.dot( - weight_hh_update_reset_gate, d_prev_hidden_state, false, true, - 1.0); // d_prev_hidden_state = d1 + d14 + d12 + d17 + grucell_calcGradient(unit, batch_size, disable_bias, integrate_bias, + reset_after, acti_func, recurrent_acti_func, input, + prev_hidden_state, d_prev_hidden_state, d_hidden_state, + d_weight_ih, weight_hh, d_weight_hh, d_bias_h, d_bias_ih, + bias_hh, d_bias_hh, zrg, d_zrg); } void GRUCellLayer::setBatch(RunLayerContext &context, unsigned int batch) { const float dropout_rate = std::get(grucell_props); - unsigned int &max_timestep = std::get(grucell_props); - context.updateTensor(wt_idx[GRUCellParams::hidden_state], - max_timestep * batch); + context.updateTensor(wt_idx[GRUCellParams::zrg], batch); if (dropout_rate > epsilon) { context.updateTensor(wt_idx[GRUCellParams::dropout_mask], batch); diff --git a/nntrainer/layers/grucell.h b/nntrainer/layers/grucell.h index d02281c..db6f11e 100644 --- a/nntrainer/layers/grucell.h +++ b/nntrainer/layers/grucell.h @@ -99,25 +99,27 @@ public: private: static constexpr unsigned int NUM_GATE = 3; + enum INOUT_INDEX { + INPUT = 0, + INPUT_HIDDEN_STATE = 1, + OUTPUT = 0, + }; /** * Unit: number of output neurons - * HiddenStateActivation: activation type for hidden state. default is tanh - * RecurrentActivation: activation type for recurrent. default is sigmoid - * DropOutRate: dropout rate * IntegrateBias: integrate bias_ih, bias_hh to bias_h * ResetAfter: Whether apply reset gate before/after the matrix * multiplication. Apply reset gate after the mulplication if true. - * MaxTimeStep: Maximum timestep of gru - * TimeStep: timestep for which gru should operate + * HiddenStateActivation: activation type for hidden state. default is tanh + * RecurrentActivation: activation type for recurrent. default is sigmoid + * DropOutRate: dropout rate * * */ - std::tuple + std::tuple grucell_props; - std::array wt_idx; /**< indices of the weights */ + std::array wt_idx; /**< indices of the weights */ /** * @brief activation function for h_t : default is sigmoid diff --git a/packaging/unittest_layers_v2.tar.gz b/packaging/unittest_layers_v2.tar.gz index f2263ebd4d526f5c51169ef819d6bad5cf982f04..73f8c899e2aaefab9d4316017a957062c35c75a3 100644 GIT binary patch delta 35376 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ɄR3zk=|=J@Q^z0WN>=gO%4T;g^I`G?3fM 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 diff --git a/packaging/unittest_models_v2.tar.gz b/packaging/unittest_models_v2.tar.gz index 28b6020c78e2a3f00b8f71242388ed66daed28e9..f752d8bb851f04fc25e649d3f2175c54a969b692 100644 GIT binary patch literal 22153 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 literal 19875 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 #include -auto semantic_grucell = - LayerSemanticsParamType(nntrainer::createLayer, - nntrainer::GRUCellLayer::type, - {"unit=1", "max_timestep=1", "timestep=0", - "integrate_bias=false", "reset_after=true"}, - 0, false, 1); +auto semantic_grucell = LayerSemanticsParamType( + nntrainer::createLayer, + nntrainer::GRUCellLayer::type, + {"unit=1", "integrate_bias=false", "reset_after=true"}, 0, false, 2); INSTANTIATE_TEST_CASE_P(GRUCell, LayerSemantics, ::testing::Values(semantic_grucell)); -auto grucell_single_step = - LayerGoldenTestParamType(nntrainer::createLayer, - {"unit=5", "max_timestep=1", "timestep=0", - "integrate_bias=true", "reset_after=false"}, - "3:1:1:7", "gru_single_step.nnlayergolden", - LayerGoldenTestParamOptions::DEFAULT); +auto grucell_single_step = LayerGoldenTestParamType( + nntrainer::createLayer, + {"unit=5", "integrate_bias=true", "reset_after=false"}, "3:1:1:7,3:1:1:5", + "grucell_single_step.nnlayergolden", LayerGoldenTestParamOptions::DEFAULT); + +auto grucell_reset_after_single_step = LayerGoldenTestParamType( + nntrainer::createLayer, + {"unit=5", "integrate_bias=false", "reset_after=true"}, "3:1:1:7,3:1:1:5", + "grucell_reset_after_single_step.nnlayergolden", + LayerGoldenTestParamOptions::DEFAULT); + +auto grucell_single_step_act = LayerGoldenTestParamType( + nntrainer::createLayer, + {"unit=5", "integrate_bias=true", "reset_after=false", + "hidden_state_activation=sigmoid", "recurrent_activation=tanh"}, + "3:1:1:7,3:1:1:5", "grucell_single_step_act.nnlayergolden", + LayerGoldenTestParamOptions::DEFAULT); INSTANTIATE_TEST_CASE_P(GRUCell, LayerGoldenTest, - ::testing::Values(grucell_single_step)); + ::testing::Values(grucell_single_step, + grucell_reset_after_single_step, + grucell_single_step_act)); diff --git a/test/unittest/models/unittest_models_recurrent.cpp b/test/unittest/models/unittest_models_recurrent.cpp index d7ac3b2..7859851 100644 --- a/test/unittest/models/unittest_models_recurrent.cpp +++ b/test/unittest/models/unittest_models_recurrent.cpp @@ -459,6 +459,7 @@ static std::unique_ptr makeSingleGRUCell() { auto outer_graph = makeGraph({ {"input", {"name=input", "input_shape=1:1:2"}}, + {"input", {"name=input_hidden_state", "input_shape=1:1:2"}}, /// here grucell is being inserted {"mse", {"name=loss", "input_layers=grucell_scope/a1"}}, }); @@ -467,19 +468,24 @@ static std::unique_ptr makeSingleGRUCell() { } auto grucell = makeGraph({ + {"input", {"name=dummy_0", "input_shape=1"}}, + {"input", {"name=dummy_1", "input_shape=1"}}, {"grucell", - {"name=a1", "unit=2", "integrate_bias=false", "reset_after=true"}}, + {"name=a1", "unit=2", "integrate_bias=false", "reset_after=true", + "input_layers=dummy_0, dummy_1"}}, }); - nn->addWithReferenceLayers(grucell, "grucell_scope", {"input"}, {"a1"}, - {"a1"}, ml::train::ReferenceLayersType::RECURRENT, - { - "unroll_for=2", - "as_sequence=a1", - "recurrent_input=a1", - "recurrent_output=a1", - }); + nn->addWithReferenceLayers( + grucell, "grucell_scope", {"input", "input_hidden_state"}, + {"a1(0)", "a1(1)"}, {"a1"}, ml::train::ReferenceLayersType::RECURRENT, + { + "unroll_for=2", + "as_sequence=a1", + "recurrent_input=a1(0), a1(1)", + "recurrent_output=a1(0), a1(0)", + }); + nn->setProperty({"input_layers=input, input_hidden_state"}); nn->setOptimizer(ml::train::createOptimizer("sgd", {"learning_rate = 0.1"})); return nn; } @@ -490,30 +496,41 @@ static std::unique_ptr makeStackedGRUCell() { auto outer_graph = makeGraph({ {"input", {"name=input", "input_shape=1:1:2"}}, + {"input", {"name=a1_input_hidden_state", "input_shape=1:1:2"}}, + {"input", {"name=a2_input_hidden_state", "input_shape=1:1:2"}}, /// here grucells are being inserted - {"mse", {"name=loss", "input_layers=grucell_scope/a2"}}, + {"mse", {"name=loss", "input_layers=grucell_scope/a2(0)"}}, }); for (auto &node : outer_graph) { nn->addLayer(node); } auto grucell = makeGraph({ + {"input", {"name=dummy_0", "input_shape=1"}}, + {"input", {"name=dummy_1", "input_shape=1"}}, + {"input", {"name=dummy_2", "input_shape=1"}}, {"grucell", - {"name=a1", "unit=2", "integrate_bias=false", "reset_after=true"}}, + {"name=a1", "unit=2", "integrate_bias=false", "reset_after=true", + "input_layers=dummy_0, dummy_1"}}, {"grucell", {"name=a2", "unit=2", "integrate_bias=false", "reset_after=true", - "input_layers=a1"}}, + "input_layers=a1(0), dummy_2"}}, }); - nn->addWithReferenceLayers(grucell, "grucell_scope", {"input"}, {"a1"}, - {"a2"}, ml::train::ReferenceLayersType::RECURRENT, - { - "unroll_for=2", - "as_sequence=a2", - "recurrent_input=a1", - "recurrent_output=a2", - }); + nn->addWithReferenceLayers( + grucell, "grucell_scope", + {"input", "a1_input_hidden_state", "a2_input_hidden_state"}, + {"a1(0)", "a1(1)", "a2(1)"}, {"a2"}, + ml::train::ReferenceLayersType::RECURRENT, + { + "unroll_for=2", + "as_sequence=a2", + "recurrent_input=a1(0), a1(1), a2(1)", + "recurrent_output=a2(0), a1(0), a2(0)", + }); + nn->setProperty( + {"input_layers=input, a1_input_hidden_state, a2_input_hidden_state"}); nn->setOptimizer(ml::train::createOptimizer("sgd", {"learning_rate = 0.1"})); return nn; } @@ -576,9 +593,8 @@ INSTANTIATE_TEST_CASE_P( ModelTestOption::ALL_V2), mkModelTc_V2(makeStackedRNNCell, "rnncell_stacked__1", ModelTestOption::ALL_V2), - mkModelTc_V2(makeSingleGRUCell, "grucell_single__1", - ModelTestOption::ALL_V2), - mkModelTc_V2(makeStackedGRUCell, "grucell_stacked__1", + mkModelTc_V2(makeSingleGRUCell, "grucell_single", ModelTestOption::ALL_V2), + mkModelTc_V2(makeStackedGRUCell, "grucell_stacked", ModelTestOption::ALL_V2), }), [](const testing::TestParamInfo &info) { -- 2.7.4