java - 如何在实际应用程序中应用任何库中的简单梯度下降算法?

标签 java machine-learning

我已经查看了可能有我的答案的提议问题,并且我认为这不是重复的。如果是的话,那是因为我需要一些更基本的东西,所以我会说这种语言。如果有人能给我指出正确的 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/

相关文章:

java - 创建对象的列表/数组列表并对列表进行排序 (Java)

java - 使用 PDFBox 获取文本颜色

python - 如何向量化生成 scipy 稀疏矩阵的代码?

tensorflow - 用于在 keras 中调用的自定义宏

tensorflow - 在强化学习中限制神经网络输出的最佳方法

java - 根据对象键的 2 个值对 HashMap 进行排序

java - Java Maven 项目中的库版本冲突

java - RxJava2 .startWith(..) 不起作用

python - SelectPercentile 评分函数如何工作?

algorithm - 模拟退火是一种蒙特卡洛方法吗?