梯度下降的 theta 值是什么意思?

What does theta values of gradient descent mean?

我有所有的组件,我只是不太确定这是我的输出:

Theta-->: 0.09604203456288299, 1.1864676227195392

我该如何解释?这是什么意思?

我基本上只是修改了 this description 中的示例。但我不确定它是否真的适用于我的问题。我正在尝试对一组文档执行二进制分类。文档呈现为形式为词袋样式的特征向量:

示例:

Document 1 = ["I", "am", "awesome"]
Document 2 = ["I", "am", "great", "great"]

字典是:

["I", "am", "awesome", "great"]

所以作为向量的文档看起来像:

Document 1 = [1, 1, 1, 0]
Document 2 = [1, 1, 0, 2]

这是我的梯度下降代码:

public static double [] gradientDescent(final double [] theta_in, final double alpha, final int num_iters, double[][] data ) 
{
    final double m = data.length;   
    double [] theta = theta_in;
    double theta0 = 0;
    double theta1 = 0;
    for (int i = 0; i < num_iters; i++) 
    {                        
        final double sum0 = gradientDescentSumScalar0(theta, alpha, data );
        final double sum1 = gradientDescentSumScalar1(theta, alpha, data);                                   
        theta0 = theta[0] - ( (alpha / m) * sum0 ); 
        theta1 = theta[1] - ( (alpha / m) * sum1 );                        
        theta = new double [] { theta0, theta1 };
    }
    return theta;
}


//data is the feature vector
//this theta is weight
protected static double [] matrixMultipleHthetaByX( final double [] theta, double[][] data ) 
{
    final double [] vector = new double[ data.length ];
    int i = 0;                 
    for (final double [] d : data) 
    {
        vector[i] = (1.0 * theta[0]) + (d[0] * theta[1]);            
        i++;
    } // End of the for // 
    return vector;
}


protected static double gradientDescentSumScalar0(final double [] theta, final double alpha, double[][] data ) 
{        
    double sum = 0;
    int i = 0;
    final double [] hthetaByXArr = matrixMultipleHthetaByX(theta, data ); 
    for (final double [] d : data) 
    {
        final double X = 1.0;
        final double y = d[1];
        final double hthetaByX = hthetaByXArr[i];    
        sum = sum + ( (hthetaByX - y) * X );
        i++;
    } // End of the for //
    return sum;
}
protected static double gradientDescentSumScalar1(final double [] theta, final double alpha, double[][] data ) 
{        
    double sum = 0;
    int i = 0;
    final double [] hthetaByXArr = matrixMultipleHthetaByX(theta, data );
    for (final double [] d : data) 
    {
        final double X = d[0];
        final double y = d[1];            
        final double hthetaByX = hthetaByXArr[i];         
        sum = sum + ( (hthetaByX - y) * X );
        i++;
    } // End of the for //
    return sum;
}

public static double [] batchGradientDescent( double [] weights, double[][] data ) 
{
    /*
     * From tex:
     * \theta_j := \theta_j - \alpha\frac{1}{m} \sum_{i=1}^m ( h_\theta (x^{(i)})
     */
    final double [] theta_in = weights;
    double [] theta = gradientDescent(theta_in, alpha, iterations, data );
    lastTheta = theta;
    System.out.println("Theta-->: " + theta[0] + ", " + theta[1]);
    return theta;
}

我这样称呼它:

   final int globoDictSize = globoDict.size(); // number of features

   double[] weights = new double[globoDictSize + 1];
   for (int i = 0; i < weights.length; i++) 
   {
       //weights[i] = Math.floor(Math.random() * 10000) / 10000;
       //weights[i] = randomNumber(0,1);
       weights[i] = 0.0;
   }


   int inputSize = trainingPerceptronInput.size();
   double[] outputs = new double[inputSize];
   final double[][] a = Prcptrn_InitOutpt.initializeOutput(trainingPerceptronInput, globoDictSize, outputs, LABEL);



       for (int p = 0; p < inputSize; p++) 
       {

           Gradient_Descent.batchGradientDescent( weights, a );
       }

我如何验证此代码是否在执行我想要的操作?它不应该输出一个预测的标签什么的吗?我听说我也可以向它应用一个错误函数,例如 hinge loss,它会在调用批梯度下降作为一个单独的组件之后出现,不是吗?

你的代码很复杂(我以前在 Octave 中实现批量梯度下降,而不是在 OO 编程语言中)。但据我在你的代码中看到的(使用这种表示法很常见)Theta 是一个参数向量。在 grad descend 算法收敛后 returns 你的最佳 Theta 向量。之后,您可以使用公式计算新示例的输出:

theta_transposed * X,

其中 theta_trasponsed 是 theta 的转置向量,X 是输入特征的向量。

附带说明一下,您提到的示例是回归任务(它是关于线性回归的)。虽然您描述的任务是一个 class 化问题,但您需要为输入集分配一个标签,而不是预测某个值(某个数字 - 重量、长度等)。它可以用很多不同的算法来完成,但肯定不能用你发布的文章中描述的线性回归来完成。

我还需要指出,完全不清楚您尝试执行哪种 class化。在您的示例中,您有一袋单词描述(单词计数矩阵)。但是 classificaiton 标签在哪里?是多输出class化吗?或者只是多class?还是二进制?

我真的建议你学习 ml 课程。也许在课程上。这个很好: https://www.coursera.org/course/ml 它还涵盖了梯度下降的完整实现。