梯度下降的 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
它还涵盖了梯度下降的完整实现。
我有所有的组件,我只是不太确定这是我的输出:
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 它还涵盖了梯度下降的完整实现。