public (FloatArray dhprev, FloatArray dcprev) Backward(FloatArray dh, FloatArray dcnext, FloatArray cprev, FloatArray fGate, FloatArray iGate, FloatArray cGate, FloatArray cellState, FloatArray oGate) { // Set outputs F.Output = fGate; I.Output = iGate; C.Output = cGate; O.Output = oGate; // cell State Derivate var cellStateAct = cellState.Tanh(); var cellStateDer = (1 - cellStateAct * cellStateAct); // cell state gradient var dcellSate = dcnext.Clone(); dcellSate += dh * oGate * cellStateDer; // output gate gradient var doGate = O.BackWard(dh * cellStateAct); // cell gate gradient var dcGate = C.BackWard(dcellSate * iGate); // input gate gradient var diGate = I.BackWard(dcellSate * cGate); // forget gate gradient var dfGate = F.BackWard(dcellSate * cprev); // lstm next var dz = (F.Weights * dfGate).SumLine() + (I.Weights * diGate).SumLine() + (C.Weights * dcGate).SumLine() + (O.Weights * doGate).SumLine(); // dhPrev, cprev return(dz, fGate *dcellSate); }
private FloatArray Tanh(FloatArray x) { return(x.Tanh()); }
public static FloatArray Tanh(FloatArray x) { return(x.Tanh()); }
public FloatArray Activate(FloatArray sum) { return(sum.Tanh()); }