public void Backward (string s, double[] DValues, AlphaMem am, NetworkMem ValMem, NetworkMem FocMem) { var LocDValues = am.DLocation(DValues); DValues = am.DGlobalContext(DValues); DValues = Activations.InverseSoftMax(DValues, am.GlobalContextOutputs); Parallel.For(0, s.Length, j => { var ldv = LocDValues[j]; double[] cdv = new double[1] { DValues[j] / s.Length }; for (int i = ValueNetwork.Layers.Count() - 1; i >= 0; i--) { ldv = ValMem.Layers[i].DActivation(ldv, am.LocationOutputs[j][i + 1]); ValMem.Layers[i].DBiases(ldv, ValueNetwork.Layers[i], s.Length); ValMem.Layers[i].DWeights(ldv, am.LocationOutputs[j][i], ValueNetwork.Layers[i], s.Length); ldv = ValMem.Layers[i].DInputs(ldv, ValueNetwork.Layers[i]); } for (int i = AttentionNetwork.Layers.Count() - 1; i >= 0; i--) { try { cdv = FocMem.Layers[i].DActivation(cdv, am.LocalContextOutputs[j][i + 1]); FocMem.Layers[i].DBiases(cdv, AttentionNetwork.Layers[i], s.Length); FocMem.Layers[i].DWeights(cdv, am.LocalContextOutputs[j][i], AttentionNetwork.Layers[i], s.Length); cdv = FocMem.Layers[i].DInputs(cdv, AttentionNetwork.Layers[i]); } catch (Exception e) { e.OutputError(); } } }); }
public void Backward(string s, double[] DValues, AlphaContext context, AlphaMem am, NetworkMem mem, NetworkMem CtxtMem) { var LocDValues = am.DLocation(DValues); DValues = am.DGlobalContext(DValues); DValues = Activations.InverseSoftMax(DValues, am.GlobalContextOutputs); context.Backward(DValues, s.Length, am, CtxtMem); Parallel.For(0, s.Length, j => { var ldv = LocDValues[j]; for (int i = Network.Layers.Count() - 1; i >= 0; i--) { ldv = mem.Layers[i].DActivation(ldv, am.LocationOutputs[j][i + 1]); mem.Layers[i].DBiases(ldv, Network.Layers[i], s.Length); mem.Layers[i].DWeights(ldv, am.LocationOutputs[j][i], Network.Layers[i], s.Length); ldv = mem.Layers[i].DInputs(ldv, Network.Layers[i]); } }); }