gpt4 book ai didi

c++ - 任何人都可以查看一些简单的梯度下降代码吗?

转载 作者:行者123 更新时间:2023-11-30 04:17:52 29 4
gpt4 key购买 nike

我正在尝试实现一个非常简单的一维梯度下降算法。我的代码根本不起作用。基本上取决于我的 alpha 值,最终参数要么非常大(比如 ~70 位),要么基本上为零(~0.000)。我觉得梯度下降在 alpha 中不应该如此敏感(我在 [0.0,1.0] 中生成小数据,但我认为梯度本身应该考虑数据的规模,不是吗?)。

代码如下:

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>

using namespace std;

double a, b;
double theta0 = 0.0, theta1 = 0.0;

double myrand() {
return double(rand()) / RAND_MAX;
}

double f(double x) {
double y = a * x + b;
y *= 0.1 * (myrand() - 0.5); // +/- 5% noise

return y;
}

double h(double x) {
return theta1 * x + theta0;
}

int main() {
srand(time(NULL));
a = myrand();
b = myrand();

printf("set parameters: a = %lf, b = %lf\n", a, b);

int N = 100;

vector<double> xs(N);
vector<double> ys(N);
for (int i = 0; i < N; ++i) {
xs[i] = myrand();
ys[i] = f(xs[i]);
}

double sensitivity = 0.008;
double d0, d1;

for (int n = 0; n < 100; ++n) {
d0 = d1 = 0.0;
for (int i = 0; i < N; ++i) {
d0 += h(xs[i]) - ys[i];
d1 += (h(xs[i]) - ys[i]) * xs[i];
}

theta0 -= sensitivity * d0;
theta1 -= sensitivity * d1;

printf("theta0: %lf, theta1: %lf\n", theta0, theta1);
}

return 0;
}

最佳答案

改变 alpha 的值会导致算法发散,所以这可能是发生这种情况的原因之一。您可以通过计算每次迭代中的误差来检查,看看是在增加还是在减少。

此外,建议在开始时随机设置 theta 的值,而不是将它们分配为零。

除此之外,在更新 theta 值时应除以 N,如下所示:

theta0 -= 灵敏度 * d0/N;

theta1 -= 灵敏度 * d1/N;

关于c++ - 任何人都可以查看一些简单的梯度下降代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16814899/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com