public Matrix <double>[] Gradients(Matrix <double> x, Vector <double> ygold) { //Forward Matrix <double> x1 = NNOperations.matrixmul(W [0], x); Matrix <double> x2 = NNOperations.add(W [1], x1); Matrix <double> x3 = NNOperations.sigm(x2); Matrix <double> x4 = NNOperations.matrixmul(W [2], x3); Matrix <double> x5 = NNOperations.add(W [3], x4); //Loss //double loss = NNOperations.mse (x5.Column(0),ygold); //Backward Matrix <double> ym = ygold.ToColumnMatrix(); Matrix <double>[] gx5_gym = NNOperations.mse_b(x5, ym, 1.0); Matrix <double>[] gw3_gx4 = NNOperations.add_b(W[3], x4, gx5_gym[0]); Matrix <double>[] gw2_gx3 = NNOperations.matrixmul_b(W[2], x3, gw3_gx4[1]); Matrix <double> gx2 = NNOperations.sigm_b(x2, x3, gw2_gx3[1]); Matrix <double>[] gw1_gx1 = NNOperations.add_b(W[1], x1, gx2); Matrix <double>[] gw0_gx = NNOperations.matrixmul_b(W[0], x, gw1_gx1[1]); Matrix <double> [] gradients = { gw0_gx[0], gw1_gx1[0], gw2_gx3[0], gw3_gx4[0] }; return(gradients); }
public Matrix <double>[] Gradients(Matrix <double> x, int action, double qtarget) { //Forward Matrix <double> x1 = NNOperations.matrixmul(W [0], x); Matrix <double> x2 = NNOperations.add(W [1], x1); Matrix <double> x3 = NNOperations.sigm(x2); Matrix <double> x4 = NNOperations.matrixmul(W [2], x3); Matrix <double> x5 = NNOperations.add(W [3], x4); //Loss Matrix <double> ind = Matrix <double> .Build.Dense(x5.RowCount, 1); ind [action, 0] = 1.0; Matrix <double> x6 = x5.PointwiseMultiply(ind); Matrix <double> ygold = ind.Multiply(qtarget); Matrix <double>[] gx6_gyg = NNOperations.mse_b(x6, ygold, 1.0); Matrix <double>[] gx5_gind = NNOperations.ewisemul_b(x5, ind, gx6_gyg [0]); Matrix <double>[] gw3_gx4 = NNOperations.add_b(W[3], x4, gx5_gind[0]); Matrix <double>[] gw2_gx3 = NNOperations.matrixmul_b(W[2], x3, gw3_gx4[1]); Matrix <double> gx2 = NNOperations.sigm_b(x2, x3, gw2_gx3[1]); Matrix <double>[] gw1_gx1 = NNOperations.add_b(W[1], x1, gx2); Matrix <double>[] gw0_gx = NNOperations.matrixmul_b(W[0], x, gw1_gx1[1]); Matrix <double> [] gradients = { gw0_gx[0], gw1_gx1[0], gw2_gx3[0], gw3_gx4[0] }; return(gradients); }
public Matrix <double> lossbackward(Matrix <double>[] x) { //Layer1 Matrix <double>[] gx1_gyg = NNOperations.mse_b(x[2], x[3], 1.0); Matrix <double>[] gx_gind = NNOperations.ewisemul_b(x[0], x[1], gx1_gyg [0]); return(gx_gind [0]); }