我已经查看了可能有我的答案的提议问题,并且我认为这不是重复的。如果是的话,那是因为我需要一些更基本的东西,所以我会说这种语言。如果有人能给我指出正确的 Material ,我愿意通过投票/失去代表来解决这个问题。我什至可能进错论坛了。
我是一位经验丰富的程序员,但非数学家。我很迷茫,我什至不知道如何表达这个问题。
我正在尝试在应用程序中实现机器学习组件,我可以看到我需要做什么的粗略轮廓,但库手册都是用希腊语编写的。我知道“alpha”是学习率,“theta”是 float 矩阵(也称为神经网络)。
我一直在复习 Andrew Ng 的斯坦福讲座,他们帮助我理解算法的最终应用将需要访问者将神经网络矩阵 (Theta) 应用于“东西”。无论您是尝试推断新功能集还是生成输出,数学都是相同的。耶!
我可以看到如何在实现学习引擎类后对其进行组件化(为什么其他人没有这样做?),但我不明白如何在组件化信封内实现这些内容。部分问题在于,库和示例(Apache Commons Math、TensorFlow 等)都假设您首先是一名数学家,因此它们使用数学家的语言而不是程序员的语言。
有人可以在不使用诸如 theta、导数、LUDecomposition、Eigen 或字母汤流之类的单词的情况下解释一下,在很好地布置输入后如何使用这些库吗?
// The final code should look something like this, I think
public void train () {
// do something involving alphabet soup and theta here
// might be "Stochastic Gradient Descent?"
// new model = stochasticGradientDescent(model)
// hypothesis = applyModel (newModel)
// difference = (hypothesis - actual)**2
}
最佳答案
编写梯度下降的第一个重要方面是识别特征并开发公式(假设),该公式可以定义输入(设置特征)和参数(thetha)之间的关系。通过几个例子我们可以更好地理解这一点。
假设我是 Netflix 的用户,喜欢 Action 片。用数学术语来说,我将为用户分配一个数字。该值可以是 0 到 1 之间的任何值。大多数 theta 值仍然未知,必须使用替代最小二乘法(ALS) 等方法导出。 Action 可以是一个特征,也应该有一个单位。我会给重型 Action 片更多的权重,而在 Action 场景较少的地方则更少。输出可以是你对这部电影的喜欢程度。您对 Action 片的偏好程度高于我将其评分为 5 的程度。如果偏好程度较低,则评分为 1。
一旦我们有了特征和评级,下一步就是确定假设。假设可以是基于特征列表的线性函数或多项式函数。我们只考虑了特征,我们可以使用简单的线性函数。
User likability for movie = User parameter to watch a movie + User parameter to watch a action movie * Action scenes in the movie
更精确地用数学术语来说,它可以写成
Y = theta0 + theta1*x
现在我们知道 Y 和 x 的值了。 theta0 和 theta1 值未知。这可以使用各种梯度下降方法得出。我不会详细介绍如何根据上述假设定义梯度下降公式。我们可以使用下面的梯度下降公式。
theta0 := theta0 - learing rate* sum of all training set(actual rating - rating derived using hypothesis)/total no of training set
theta0 := theta0 - (learing rate* sum of all training set(actual rating - rating derived using hypothesis)/total no of training set) * feature number
在训练方法中,第一步是为 theta0 和 theta1 提供起始值。按照惯例,该值从 0.1 开始。学习率控制收敛发生的速度。它将控制达到最终 theta 值的速度。
在训练方法的第二步中,您将循环遍历训练集。对于随机梯度下降,您已将训练数据集分成多个批处理。 theta0 值将在单个批处理数据集上计算,并将它们作为初始 theta 值传递给其他批处理。当训练集规模相当大(数百万)时,应该使用此方法。
public Parameter train(List<UserSkuMatrix> ratings, User user) {
double theta0=0.1,theta1=0.1;
double tempTheta0=0,tempTheta1=0;
for(int i = 0;i<iteration;i++) {
if(verifyConvergence(theta0, tempTheta0)
&& verifyConvergence(theta1, tempTheta1)) {
break;
}
tempTheta0 = theta0;
tempTheta1 = theta1;
theta0 = theta0 - gradientDesent(ratings, theta0,theta1,1);
theta1 = theta1 - gradientDesent(ratings, theta0,theta1,2);
}
return p;
}
protected boolean verifyConvergence(double theta, double tempTheta) {
return (theta - tempTheta) < GLOBAL_MINIMUM;
}
protected double partialDerivative(List<UserSkuMatrix> ratings, double theta0, double theta1, int factor){
double sum=0.0;
for(UserSkuMatrix d:ratings) {
double x = d.getSku().getFeature1Value(),
y = d.getRank(), x1=d.getSku().getFeature2Value();
Hypothesis h = new Hypothesis(p, x, x1);
double s = (h.hypothesis2()-y);
if(factor == 2) {
s = s*x;
} else if( factor==3) {
s = s*x1;
}
sum = sum + s;
}
return sum;
}
public double gradientDesent(List<UserSkuMatrix> ratings, double theta0, double theta1, int factor) {
double m = ratings.size();
double total = partialDerivative(ratings,theta0,theta1,factor);
return (1.0 * total) / m;
}
导出 theta0 和 theta1 后,您的模型就准备好了。该值可以保存在文件或数据库中。该模型可用于预测用户对 future 上映的新 Action 片的偏好。
Apache flink 还为随机梯度下降提供了一个很好的实现。 https://ci.apache.org/projects/flink/flink-docs-release-1.2/
关于java - 如何在实际应用程序中应用任何库中的简单梯度下降算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44768699/