コード例 #1
0
    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);
    }
コード例 #2
0
    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);
    }
コード例 #3
0
 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]);
 }