我正試圖實現一個非常簡單的1維梯度下降算法。我的代碼根本不起作用。基本上取決於我的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;
}
據我所見,你的函數「f」是一個隨機函數,但你的漸變不一定對應那個函數。如果梯度沒有很好的定義,那麼下降不能保證轉換。我錯過了什麼嗎? – Pedrom
不要緊......只是意識到這是一個隨機噪聲 – Pedrom
是的,'f'只是用來生成訓練數據。 'h'是我執行下降的功能。 – Alec