2017-10-18 44 views
0

我在JavaScript中使用梯度下降实现了我的第一个(单变量)线性回归。梯度下降收敛一个参数的速度比其他参数快

const LEARNING_RATE = 0.000001; 

let m = 0; 
let b = 0; 

const hypothesis = x => m * x + b; 

const learn = (alpha) => { 
    if (x.length <= 0) return; 

    let sum1 = 0; 
    let sum2 = 0; 

    for (var i = 0; i < x.length; i++) { 
    sum1 += hypothesis(x[i]) - y[i]; 
    sum2 += (hypothesis(x[i]) - y[i]) * x[i]; 
    } 

    b = b - alpha * sum1/(x.length); 
    m = m - alpha * sum2/(x.length); 
} 

// repeat until convergence learn(LEARNING_RATE); 

假设中m的斜率快速调整,但y轴的交点需要时间进行调整。我不得不为b使用不同的学习率来使其工作。

const learn = (alpha) => { 
    if (x.length <= 0) return; 

    let sum1 = 0; 
    let sum2 = 0; 

    for (var i = 0; i < x.length; i++) { 
    sum1 += hypothesis(x[i]) - y[i]; 
    sum2 += (hypothesis(x[i]) - y[i]) * x[i]; 
    } 

    b = b - 100000 * alpha * sum1/(x.length); 
    m = m - alpha * sum2/(x.length); 
} 

任何人都可以指出我的算法有什么问题吗?它可以在GitHub repositorythis article中找到。

回答

0

首先,你必须看到收敛速度到全局最小值,而不是以偏差变化的速度。模型中没有错误(也许你只是忘记2/N系数,但对于m和b系数,这个参数将是1)。

正如您所知,梯度下降法使用预测中的错误更新每次迭代的权重。所以,如果你的偏见得到小错误,那么更新将抓住小的变化。这是模型的正常行为。

There are例子很好的解释。

PS。自定义更改学习率可能会导致异常行为和减少到最小的问题。推荐this courselink for course I have posted above

+0

感谢您的回复。我有没有把你说得对,算法本身没有错误?但是,只需要很短的时间学习一个小的学习率? –

+1

是的,我没有发现任何错误。是的,对于小的学习率,你会在稍后发现gminimal。 –