Java 计算θ更新规则的梯度输出

Java 计算θ更新规则的梯度输出,java,gradient-descent,Java,Gradient Descent,因为它使用了一个sigmoid函数而不是零/一激活函数,我想这是计算梯度下降的正确方法,对吗 static double calculateOutput( int theta, double weights[], double[][] feature_matrix, int file_index, int globo_dict_size ) { //double sum = x * weights[0] + y * weights[1] + z * weights[2] + w

因为它使用了一个sigmoid函数而不是零/一激活函数,我想这是计算梯度下降的正确方法,对吗

  static double calculateOutput( int theta, double weights[], double[][] feature_matrix, int file_index, int globo_dict_size )
  {
     //double sum = x * weights[0] + y * weights[1] + z * weights[2] + weights[3];
     double sum = 0.0;

     for (int i = 0; i < globo_dict_size; i++) 
     {
         sum += ( weights[i] * feature_matrix[file_index][i] );
     }
     //bias
     sum += weights[ globo_dict_size ];

     return sigmoid(sum);
  }

  private static double sigmoid(double x)
  {
      return 1 / (1 + Math.exp(-x));
  }

更新 现在我更新了一些东西,看起来更像这样:

  double loss, cost, hypothesis, gradient;
  int p, iteration;

  iteration = 0;
  do 
  {
    iteration++;
    cost = 0.0;
    loss = 0.0;

    //loop through all instances (complete one epoch)
    for (p = 0; p < number_of_files__train; p++) 
    {

      // 1. Calculate the hypothesis h = X * theta
      hypothesis = calculateHypothesis( theta, feature_matrix__train, p, globo_dict_size );

      // 2. Calculate the loss = h - y and maybe the squared cost (loss^2)/2m
      loss = hypothesis - outputs__train[p];

      // 3. Calculate the gradient = X' * loss / m
      gradient = calculateGradent( theta, feature_matrix__train, p, globo_dict_size, loss );

      // 4. Update the parameters theta = theta - alpha * gradient
      for (int i = 0; i < globo_dict_size; i++) 
      {
          theta[i] = theta[i] - (LEARNING_RATE * gradient);
      }

    }

    //summation of squared error (error value for all instances)
    cost += (loss*loss);


  /* Root Mean Squared Error */
  if (iteration < 10) 
      System.out.println("Iteration 0" + iteration + " : RMSE = " + Math.sqrt( cost/number_of_files__train ) );
  else
      System.out.println("Iteration " + iteration + " : RMSE = " + Math.sqrt( cost/number_of_files__train ) );
  //System.out.println( Arrays.toString( weights ) );

  } 
  while(cost != 0 && iteration<=MAX_ITER);


}

static double calculateHypothesis( double theta[], double[][] feature_matrix, int file_index, int globo_dict_size )
{
    double hypothesis = 0.0;

     for (int i = 0; i < globo_dict_size; i++) 
     {
         hypothesis += ( theta[i] * feature_matrix[file_index][i] );
     }
     //bias
     hypothesis += theta[ globo_dict_size ];

     return hypothesis;
}

static double calculateGradent( double theta[], double[][] feature_matrix, int file_index, int globo_dict_size, double loss )
{
    double gradient = 0.0;

     for (int i = 0; i < globo_dict_size; i++) 
     {
         gradient += ( feature_matrix[file_index][i] * loss);
     }

     return gradient;
}

public static double hingeLoss()
{
    // l(y, f(x)) = max(0, 1 − y · f(x))

    return HINGE;
}
双重损失、成本、假设、梯度;
int p,迭代;
迭代=0;
做
{
迭代++;
成本=0.0;
损失=0.0;
//循环所有实例(完成一个历元)
对于(p=0;p而(cost!=0&&iteration您的
calculateOutput
方法看起来是正确的。您的下一段代码我真的不这么认为:

weights[i] += LEARNING_RATE * localError * feature_matrix__train[p][i] * output_gradient[i]
查看您在网站上发布的图像:

让我们尝试在代码中识别这些规则的每一部分

  • Theta0和
    Theta1:看起来像是代码中的
    weights[i]
    ;我希望
    globo\u dict\u size=2

  • alpha
    :似乎是你的
    学习率

  • 1/m
    :我在你的更新规则中找不到这一点。
    m
    是Andrew Ng视频中的训练实例数。在你的情况下,我认为应该是
    1/number of u files\u train
    ;虽然这不是很重要,但即使没有它,事情也应该很好

  • 求和:使用
    calculateOutput
    函数执行此操作,在
    localError
    变量中使用该函数的结果,然后乘以
    feature\u matrix\u train[p][i]
    (相当于Andrew Ng符号中的
    x(i)

    这部分是偏导数,也是梯度的一部分!

    为什么?因为
    [h_θ(x(i))-y(i)]^2
    θ0
    的偏导数等于:

    2*[h_theta(x(i)) - y(i)] * derivative[h_theta(x(i)) - y(i)]
    derivative[h_theta(x(i)) - y(i)] =
    derivative[Theta0 * x(i, 1) + Theta1*x(i, 2) - y(i)] =
    x(i, 1)
    
    当然,你应该得到整个的总和。这也是为什么Andrew Ng使用<代码> 1(/2m)< /代码>的代价函数,因此<代码> 2 < /C> >将取消< <代码> 2 >代码>我们从派生得到。

    请记住,
    x(i,1)
    ,或者仅仅是
    x(1)
    应该包含所有的值。在代码中,您应该确保:

    feature_matrix__train[p][0] == 1
    
  • 就是这样!我不知道你的代码中应该有什么
    output\u gradient[I]
    ,你没有在任何地方定义它


  • 我建议你看一下,以便更好地理解你所使用的算法。因为你使用的是sigmoid函数,看起来你想进行分类,但是你应该使用不同的成本函数。该文档还涉及逻辑回归。

    当你说
    特征矩阵列[p][i]==1
    ,这是什么意思?!当然不是==1,这是它对应的单词在全球词典中出现的次数!它可以等于一次,但也可以等于零或五百次!@s.Matthew_English-我的错,我的意思是写
    0
    而不是
    I
    。第一个元素应该等于1仅限使用。抱歉,我现在更正了。这与偏差术语相同吗?为什么我必须将其放在开头,可以放在结尾吗?@S.Matthew_English-是的,它是偏差术语。通常放在开头,因为这样可以更容易地进行向量化,但您可以将其放在案例中的任何地方。
    feature_matrix__train[p][0] == 1