Tôi đang cố gắng viết ra một chút mã cho thuật toán gốc gradient giải thích trong bài giảng về Máy học Stanford (lecture 2 at around 25:00). Dưới đây là thực hiện tôi sử dụng lúc đầu, và tôi nghĩ rằng nó được sao chép đúng từ bài giảng, nhưng nó không hội tụ khi tôi thêm số lượng lớn (>8
) vào tập huấn luyện.Thuật toán gốc dốc sẽ không hội tụ
Tôi đang nhập một số X
, và point (X,X)
được thêm vào tập huấn luyện, vì vậy vào lúc này, tôi chỉ cố gắng để làm cho nó hội tụ về y=ax+b
nơi a=1=theta\[1\]
và b=0=theta\[0\]
. Bộ đào tạo là mảng x
và y
, trong đó (x[i],y[i])
là một điểm.
void train()
{
double delta;
for (int i = 0; i < x.size(); i++)
{
delta = y[i]-hypothesis(x[i]);
theta[1] += alpha*delta*x[i];
theta[0] += alpha*delta*1;
}
}
void C_Approx::display()
{
std::cout<<theta[1]<<"x + "<<theta[0]<<" \t "<<"f(x)="<<hypothesis(1)<<std::endl;
}
một số kết quả tôi nhận được: tôi vào một con số, nó chạy train()
một vài lần, sau đó display()
1
0.33616x + 0.33616 f(x)=0.67232
1
0.482408x + 0.482408 f(x)=0.964816
1
0.499381x + 0.499381 f(x)=0.998762
1
0.499993x + 0.499993 f(x)=0.999986
1
0.5x + 0.5 f(x)=1
Một ví dụ về nó phân kỳ sau khi nó trôi qua 8
:
1
0.33616x + 0.33616 f(x)=0.67232
2
0.705508x + 0.509914 f(x)=1.21542
3
0.850024x + 0.449928 f(x)=1.29995
4
0.936062x + 0.330346 f(x)=1.26641
5
0.951346x + 0.231295 f(x)=1.18264
6
0.992876x + 0.137739 f(x)=1.13062
7
0.932206x + 0.127372 f(x)=1.05958
8
1.00077x + 0.000493063 f(x)=1.00126
9
-0.689325x + -0.0714712 f(x)=-0.760797
10
4.10321e+08x + 4.365e+07 f(x)=4.53971e+08
11
1.79968e+22x + 1.61125e+21 f(x)=1.9608e+22
12
-3.9452e+41x + -3.26957e+40 f(x)=-4.27216e+41
Tôi đã thử giải pháp được đề xuất here về chia tỷ lệ bước và kết thúc với kết quả tương tự. Tôi đang làm gì sai?
Bạn sẽ xác định α dựa trên mẫu ngẫu nhiên như thế nào? – howardh
@ howardh, chỉ đơn giản bằng cách thử các giá trị khác nhau và chọn một giá trị hội tụ nhanh đến một J nhỏ (θ). –
Vì vậy, tôi chỉ tạo một tập dữ liệu mới được chọn ngẫu nhiên từ tập huấn luyện ban đầu, gọi train() với tập hợp đó với một số α, và nếu lỗi không giảm theo từng bước, tôi giảm α và lặp lại? – howardh