Tìm gốc lớn nhất của đa thức với mạng nơ ron


11

Các thách thức

Tìm mạng nơ ron dẫn nguồn nhỏ nhất sao cho, với bất kỳ vectơ đầu vào 3 chiều có các số nguyên trong , mạng sẽ xuất ra gốc lớn nhất (nghĩa là "tích cực nhất") của đa thức với sai số nhỏ hơn .(a,b,c)[10,10]x3+ax2+bx+c0.1

Quyền tiếp nhận

Khái niệm về sự dễ chấp nhận trong thử thách chơi gôn thần kinh trước đây của tôi có vẻ hơi hạn chế, vì vậy đối với thử thách này, chúng tôi đang sử dụng một định nghĩa tự do hơn về mạng lưới thần kinh feedforward:

Một tế bào thần kinh là một chức năng được xác định bởi một vector của trọng lượng , một thiên vị và một hàm kích hoạt theo cách sau:ν:RnRwRn b R f : RR bR f:RR

ν(x):=f(wx+b),xRn.

Mạng thần kinh tiếp theo với các nút đầu vào là một hàm của có thể được xây dựng từ một chuỗi của các nơ-ron, trong đó mỗi lấy đầu vào từ và xuất ra một vô hướng . Cho một số tập xác định của các nút đầu ra , thì đầu ra của mạng nơ ron là vectơ .{1,,n}(x1,,xn)Rn(νk)k=n+1Nνk:Rk1R(x1,,xk1)xkS{1,,N}(xk)kS

Vì các chức năng kích hoạt có thể được điều chỉnh cho bất kỳ tác vụ nhất định, chúng tôi cần hạn chế lớp chức năng kích hoạt để giữ cho thử thách này thú vị. Các chức năng kích hoạt sau đây được cho phép:

  • Danh tính. f(t)=t

  • ReLU. f(t)=max(t,0)

  • SoftPlus. f(t)=ln(et+1)

  • Sigmoid. f(t)=etet+1

  • Xoang. f(t)=sint

Nhìn chung, một mạng lưới thần kinh được chấp nhận được chỉ định bởi các nút đầu vào, một chuỗi các nơ-ron và các nút đầu ra, trong khi mỗi nơ-ron được chỉ định bởi một vectơ trọng số, độ lệch và hàm kích hoạt từ danh sách trên. Ví dụ, mạng lưới thần kinh sau đây được chấp nhận, mặc dù nó không đáp ứng mục tiêu hiệu suất của thử thách này:

  • Các nút đầu vào: {1,2}

  • Các nơ-ron: choνk(x1,,xk1):=xk2+xk1k{3,,10}

  • Các nút đầu ra: {5,9,10}

Mạng này bao gồm 8 nơ-ron, mỗi nơ-ron không có độ lệch và kích hoạt nhận dạng. Nói cách khác, mạng này sẽ tính toán chuỗi Fibonacci tổng quát được tạo bởi và và sau đó đưa ra các số thứ 5, 9 và 10 từ chuỗi này theo thứ tự đó.x1x2

Chấm điểm

Cho một số thực với việc mở rộng thập phân kết thúc, hãy để là số nguyên không âm nhỏ nhất với và để là số nguyên không âm nhỏ nhất cho trong đó là số nguyên. Khi đó ta nói là độ chính xác của .xp(x)p10p|x|<1q(x)q10qxp(x)+q(x)xx

Ví dụ: có độ chính xác là , trong khi có độ chính xác là .x=1.0014x=00

Điểm của bạn là tổng của các phần của trọng số và thành kiến ​​trong mạng lưới thần kinh của bạn.

(Ví dụ: ví dụ trên có số điểm là 16)

xác minh

Trong khi các gốc có thể được biểu thị theo công thức bậc ba , gốc lớn nhất có lẽ dễ dàng truy cập nhất bằng phương tiện số. Theo đề xuất của @ xnor, tôi đã tính toán gốc lớn nhất cho mọi lựa chọn số nguyên và kết quả có thể tìm thấy ở đây . Mỗi dòng của tệp văn bản này có dạng . Ví dụ: dòng đầu tiên báo cáo rằng gốc lớn nhất của là khoảng .a,b,c[10,10]x 3 - 10 x 2 - 10 x - 10 10,99247140445449a,b,c,rootx310x210x1010.99247140445449

Chỉnh sửa: Tệp gốc tôi đã đăng có lỗi trong trường hợp đa thức thể hiện nhiều gốc. Phiên bản hiện tại không có lỗi như vậy.


3
Điều gì xảy ra trong đa thức đầu vào không có gốc thực sự, như khi nào a=0và bậc hai có hai gốc phức?
xnor

Tôi nghĩ rằng giải pháp sạch nhất sẽ là nói rằng đầu vào sẽ alà khác không, hoặc thậm chí chỉ là 1. Ngoài ra, tôi khuyên bạn nên đưa vào một số trường hợp thử nghiệm, cho rễ có độ chính xác cao để chúng tôi có thể kiểm tra giá trị của chúng tôi trong vòng 0,1. Nó cũng sẽ là tốt để có đầu ra cho tất cả các đầu vào có thể, có thể trong một liên kết vì đó là rất nhiều cho bài viết.
xnor

1
Tôi thích các quy tắc tiếp nhận mới. Có vẻ như chức năng hình sin mới là cực kỳ khai thác. Tôi có một bằng chứng sơ sài rằng một hàm của biểu mẫu x -> a * sin(b * softplus(x) + c)có thể vượt quá bất kỳ số điểm dữ liệu hữu hạn nào với số nguyên xđến độ chính xác tùy ý bằng cách sử dụng tần số cực kỳ lớn và chính xác.
xnor

1
Không chắc nó hữu ích như thế nào (đối với các thách thức trong tương lai): Trong lý thuyết số, chúng tôi sử dụng các hàm chiều cao để đo độ phức tạp của một số. Ví dụ: chiều cao ngây thơ của phân số (giảm) được cho bởi (và có rất nhiều khái quát). Có lẽ điều này có thể được sử dụng như một biện pháp thay thế. p/qh=logmax{|p|,|q|}
flawr

1
@ DustinG.Mixon Tôi không chắc là bạn có biết hay không nhưng chúng tôi có một hộp cát để đăng các bản nháp và thảo luận chi tiết về một thách thức cũng như một cuộc trò chuyện .
flawr

Câu trả lời:


6

14674000667 5.436.050 5.403.448 10.385 5994 4447
3806 tổng chính xác

Đối với đường cơ sở, tôi đã nghiên cứu cách tiếp cận sau: Chọn sao cho nếu chúng ta lấy mẫu đa thức tạiM,δ,ϵ>0p(x)=x3+ax2+bx+c

S:={M,M+δ,M+2δ,,M},

sau đó điểm mẫu lớn nhất thỏa mãn nhất thiết phải tồn tại và nhất thiết phải nằm trong gốc lớn nhất của . Người ta có thể chỉ ra rằng đối với bộ sưu tập đa thức của chúng ta, người ta có thể lấy , và .sSp(s)<ϵ0.1pM=11δ=0.1ϵ=104

Để thiết kế một mạng lưới thần kinh mà cụ logic này, chúng ta bắt đầu với một lớp tế bào thần kinh mà mẫu đa thức trên . Với mỗi , chúng tôi lấySsS

x1,s=s2a+sb+1c+s3.

Tiếp theo, chúng tôi xác định cái nào trong số này nhỏ hơn . Nó chỉ ra rằng đối với , nó chỉ giữ nếu . Như vậy, chúng ta có thể sử dụng kích hoạt relu để xác định chính xác các mẫu của mình:ϵ=104sSp(s)<104p(s)0

relu(104t)relu(t)104={1if t00if t104.

Chúng tôi thực hiện điều này với một vài lớp tế bào thần kinh:

x2,s=relu(1x1,s+104),x3,s=relu(1x1,s),x4,s=104x2,s104x3,s.

Tại thời điểm này, chúng ta có khi , và nếu không thì . Hãy nhớ lại rằng chúng ta tìm kiếm lớn nhất trong đó . Để kết thúc này, chúng tôi gắn nhãn là (để thuận tiện cho công chứng) và với mỗi , chúng tôi xác định lặp lạix4,s=1p(s)<104x4,s=0sx4,s=1x4,Mx5,Mk1

x5,Mkδ=1x4,Mkδ+2x5,M(k1)δ=j=0k2kjx4,Mjδ.

Nhờ phép chuyển đổi này, mọi là một số nguyên không âm và là duy nhất mà . Bây giờ chúng tôi có thể xác định bằng một ứng dụng kích hoạt relu khác:x5,sssx5,s=1s

relu(t2)2relu(t1)+t={1if t=10if tZ0{1}.

Rõ ràng, chúng tôi định nghĩa tế bào thần kinh bằng

x6,s=relu(1x5,s2),x7,s=relu(1x5,s1),x8,s=1x6,s2x7,s+1x5s.

Khi đó nếu và ngược lại . Chúng tôi kết hợp tuyến tính những thứ này để tạo ra nút đầu ra của chúng tôi:x8,s=1s=sx8,s=0

x9=sSsx8,s=s.

Đối với điểm số, mỗi lớp có các nơ-ron với mức độ chính xác khác nhau: (1) , (2) , (3) , (4) , (5) , (6) , (7) , (8) , (9). Hơn nữa, tất cả trừ hai trong số các lớp có nơ-ron; lớp 5 có nơ ron và lớp 9 có nơ ron.6+3+1+9=191+4=515+5=101+1=21+1=21+1=21+1+1=33|S||S|=221|S|11

Chỉnh sửa: Cải tiến: (1) Chúng ta có thể lấy mẫu đa thức hiệu quả hơn nhiều bằng cách sử dụng các khác biệt hữu hạn. (2) Thay vào đó, chúng ta có thể bỏ qua các lớp 2 đến 4 bằng cách sử dụng kích hoạt sigmoid. (3) Các vấn đề tràn trong lớp 5 có thể được khắc phục (và các lớp tiếp theo có thể được kết hợp) bằng cách áp dụng cẩn thận hơn kích hoạt relu. (4) Tổng cuối cùng rẻ hơn với tổng của các bộ phận .

Mã MATLAB sau đây là gì. Để rõ ràng, preclà một hàm (tìm thấy ở đây ) tính toán độ chính xác của một vectơ trọng số hoặc độ lệch.

function sstar = findsstar2(a,b,c)

relu = @(x) x .* (x>0);

totprec = 0;

% x1 samples the polynomial on -11:0.1:11
x1=[];
for s = -11:0.1:11
    if length(x1) < 5
        w1 = [s^2 s 1];
        b1 = s^3;
        x1(end+1,:) = w1 * [a; b; c] + b1;
        totprec = totprec + prec(w1) + prec(b1);
    else
        w1 = [-1 4 -6 4];
        x1(end+1,:) = w1 * x1(end-3:end,:);
        totprec = totprec + prec(w1);
    end
end

% x4 indicates whether the polynomial is nonpositive
w4 = -6e5;
b4 = 60;
x4=[];
for ii=1:length(x1)
    x4(end+1) = sigmf(w4 * x1(ii) + b4, [1,0]);
    totprec = totprec + prec(w4) + prec(b4);
end

% x6 indicates which entries are less than or equal to sstar
x5 = zeros(size(x1));
x6 = zeros(size(x1));
x5(end) = 0;
x6(end) = 0;
for ii = 1:length(x5)-1
    w5 = [-1 -1];
    b5 = 1;
    x5(end-ii) = relu(w5 * [x4(end-ii); x6(end-ii+1)] + b5);
    totprec = totprec + prec(w5) + prec(b5);
    w6 = -1;
    b6 = 1;
    x6(end-ii) = w6 * x5(end-ii) + b6;
    totprec = totprec + prec(w6) + prec(b6);
end

% a linear combination produces sstar
w7 = 0.1*ones(1,length(x1));
w7(1) = -11;
sstar = w7 * x6;

%disp(totprec) % uncomment to display score

end

2

53.268 29.596 29.306 tổng độ chính xác

Giao tiếp riêng với @ A.Rex đã dẫn đến giải pháp này, trong đó chúng tôi xây dựng một mạng lưới thần kinh ghi nhớ các câu trả lời. Ý tưởng cốt lõi là mọi hàm trên tập hữu hạn thích phân rãf:SRS

f(x)=sSf(s){1if x=s0else}.

Như vậy, người ta có thể xây dựng một triển khai mạng nơ ron của bằng cách trước tiên chuyển đổi đầu vào thành một hàm chỉ thị của đầu vào, sau đó kết hợp tuyến tính bằng cách sử dụng các đầu ra mong muốn làm trọng số. Hơn nữa, kích hoạt relu làm cho sự chuyển đổi này có thể:f

relu(t1)2relu(t)+relu(t+1)={1if t=00if tZ{0}.

Điều gì sau đây là một triển khai MATLAB của phương pháp này. Để rõ ràng, roots.txtlà tập tin gốc được đăng ở trên (tìm thấy ở đây ), và preclà một hàm (tìm thấy ở đây ) tính tổng độ chính xác của một vectơ trọng số hoặc độ lệch.

Chỉnh sửa 1: Hai cải tiến so với bản gốc: (1) Tôi đã tìm ra một số nơ-ron ngoài vòng lặp. (2) Tôi đã triển khai " tích hợp Lebesgue " trong tổng số cuối cùng bằng cách kết hợp các thuật ngữ đầu tiên từ cùng một cấp độ được đặt. Bằng cách này, tôi trả tiền cho giá trị độ chính xác cao hơn của đầu ra chỉ một lần mỗi cấp được đặt. Ngoài ra, an toàn để làm tròn đầu ra đến thứ năm gần nhất theo định lý gốc hợp lý .

Chỉnh sửa 2: Những cải tiến nhỏ khác: (1) Tôi đã tạo ra nhiều nơ ron hơn từ một vòng lặp for. (2) Tôi không bận tâm tính toán thuật ngữ trong tổng cuối cùng mà đầu ra đã bằng không.

function r = approxroot(a,b,c)

relu = @(x)x .* (x>0);

totalprec=0;

% x4 indicates which entry of (-10:10) is a
w1 = ones(21,1);   b1 = -(-10:10)'-1;    x1 = relu(w1 * a + b1);
w2 = ones(21,1);   b2 = -(-10:10)';      x2 = relu(w2 * a + b2);
w3 = ones(21,1);   b3 = -(-10:10)'+1;    x3 = relu(w3 * a + b3);
w4p1 = ones(21,1); w4p2 = -2*ones(21,1); w4p3 = ones(21,1);
x4 = w4p1 .* x1 + w4p2 .* x2 + w4p3 .* x3;
totalprec = totalprec + prec(w1) + prec(w2) + prec(w3) + prec(b1) + prec(b2) + prec(b3) + prec(w4p1) + prec(w4p2) + prec(w4p3);

% x8 indicates which entry of (-10:10) is b
w5 = ones(21,1);   b5 = -(-10:10)'-1;    x5 = relu(w5 * b + b5);
w6 = ones(21,1);   b6 = -(-10:10)';      x6 = relu(w6 * b + b6);
w7 = ones(21,1);   b7 = -(-10:10)'+1;    x7 = relu(w7 * b + b7);
w8p1 = ones(21,1); w8p2 = -2*ones(21,1); w8p3 = ones(21,1);
x8 = w8p1 .* x5 + w8p2 .* x6 + w8p3 .* x7;
totalprec = totalprec + prec(w5) + prec(w6) + prec(w7) + prec(b5) + prec(b6) + prec(b7) + prec(w8p1) + prec(w8p2) + prec(w8p3);

% x12 indicates which entry of (-10:10) is c
w9 = ones(21,1);    b9 = -(-10:10)'-1;     x9 = relu(w9 * c + b9);
w10 = ones(21,1);   b10 = -(-10:10)';      x10 = relu(w10 * c + b10);
w11 = ones(21,1);   b11 = -(-10:10)'+1;    x11 = relu(w11 * c + b11);
w12p1 = ones(21,1); w12p2 = -2*ones(21,1); w12p3 = ones(21,1);
x12 = w12p1 .* x9 + w12p2 .* x10 + w12p3 .* x11;
totalprec = totalprec + prec(w9) + prec(w10) + prec(w11) + prec(b9) + prec(b10) + prec(b11) + prec(w12p1) + prec(w12p2) + prec(w12p3);

% x15 indicates which row of the roots file is relevant
x15=[];
for aa=-10:10
    w13 = 1;
    b13 = -2;
    x13 = w13 * x4(aa+11) + b13;
    totalprec = totalprec + prec(w13) + prec(b13);
    for bb=-10:10
        w14p1 = 1;
        w14p2 = 1;
        x14 = w14p1 * x13 + w14p2 * x8(bb+11);
        totalprec = totalprec + prec(w14p1) + prec(w14p2);
        for cc=-10:10
            w15p1 = 1;
            w15p2 = 1;
            x15(end+1,1) = relu(w15p1 * x14 + w15p2 * x12(cc+11));
            totalprec = totalprec + prec(w15p1) + prec(w15p2);
        end
    end
end

% r is the desired root, rounded to the nearest fifth
A = importdata('roots.txt');
outputs = 0.2 * round(5 * A(:,4)');
uniqueoutputs = unique(outputs);
x16 = [];
for rr = uniqueoutputs
    if rr == 0
        x16(end+1,:) = 0;
    else
        lvlset = find(outputs == rr);
        w16 = ones(1,length(lvlset));
        x16(end+1,:) = w16 * x15(lvlset);
        totalprec = totalprec + prec(w16);
    end
end
w17 = uniqueoutputs;
r = w17 * x16;
totalprec = totalprec + prec(w17);

%disp(totalprec) % uncomment to display score

end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.