ค้นหารากที่ใหญ่ที่สุดของพหุนามด้วยเครือข่ายประสาท


11

ความท้าทาย

ค้นหาเครือข่ายนิวรัล feedforward ที่เล็กที่สุดเช่นที่ให้เวกเตอร์อินพุต 3 มิติ(a,b,c)มีรายการจำนวนเต็มใน[10,10]เครือข่ายเอาท์พุตรากที่ใหญ่ที่สุด (เช่น "บวกที่สุด") พหุนามx3+ax2+bx+cด้วยข้อผิดพลาดอย่างเคร่งครัดมีขนาดเล็กกว่า0.10.1

ภัณฑ์

แนวคิดเรื่องความสามารถในการยอมรับในความท้าทายการเล่นกอล์ฟสุทธิของประสาทก่อนหน้านี้ของฉันดูเหมือนจะมีข้อ จำกัด ดังนั้นสำหรับความท้าทายนี้เรากำลังใช้คำจำกัดความเสรีของเครือข่ายประสาท feedforward:

เซลล์ประสาทเป็นฟังก์ชันν:RnRที่ระบุไว้โดยเวกเตอร์wRnของน้ำหนักเป็นอคติ bRและฟังก์ชั่นการเปิดใช้งาน f:RRในลักษณะต่อไปนี้:

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

เครือข่ายนิวรัลไปข้างหน้าพร้อมโหนดอินพุต {1,,n}เป็นฟังก์ชันของ(x1,,xn)Rnที่สามารถสร้างขึ้นจากลำดับ(νk)k=n+1Nของเซลล์ประสาท โดยที่แต่ละνk:Rk1Rใช้อินพุตจาก(x1,,xk1)และผลเกลาxk k ได้รับบางส่วนที่ระบุชุดS{1,,N}ของโหนดที่ส่งออกแล้วส่งออกของเครือข่ายประสาทเป็นเวกเตอร์(xk)kS S

เนื่องจากสามารถเปิดใช้งานฟังก์ชั่นการเปิดใช้งานสำหรับงานที่กำหนดเราจำเป็นต้อง จำกัด คลาสของฟังก์ชั่นการเปิดใช้งานเพื่อให้ความท้าทายนี้น่าสนใจ อนุญาตให้ใช้งานฟังก์ชั่นต่อไปนี้:

  • เอกลักษณ์ f(t)=t

  • Relu f(t)=max(t,0)

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

  • sigmoid f(t)=etet+1

  • sinusoid f(t)=sint

โดยรวมแล้วโครงข่ายประสาทที่ยอมรับได้นั้นถูกระบุโดยโหนดอินพุตลำดับของเซลล์ประสาทและโหนดเอาต์พุตในขณะที่แต่ละเซลล์ประสาทถูกระบุโดยเวกเตอร์ของน้ำหนักอคติและฟังก์ชั่นการเปิดใช้งานจากรายการด้านบน ตัวอย่างเช่นตาข่ายประสาทต่อไปนี้สามารถใช้ได้แม้ว่าจะไม่เป็นไปตามเป้าหมายประสิทธิภาพของการท้าทายนี้:

  • โหนดอินพุต: {1,2}

  • เซลล์ประสาท: νk(x1,,xk1):=xk2+xk1สำหรับk{3,,10}

  • โหนดเอาต์พุต: {5,9,10}

เครือข่ายนี้ประกอบด้วย 8 เซลล์ประสาทซึ่งแต่ละศูนย์มีอคติและเปิดใช้งานข้อมูลประจำตัว ในคำพูดเครือข่ายนี้คำนวณลำดับฟีโบนัชชีทั่วไปที่สร้างขึ้นโดยx1และx2แล้วส่งออกหมายเลขลำดับที่ 5, 9 และ 10 จากลำดับนี้ตามลำดับ

เกณฑ์การให้คะแนน

รับจำนวนจริงxด้วยการยุติการขยายทศนิยมปล่อยให้p(x)เป็นจำนวนเต็ม nonnegative ที่น้อยที่สุดpซึ่ง10p|x|<1และให้q(x)เป็นจำนวนเต็มที่ไม่ใช่ค่าลบน้อยที่สุดqซึ่ง10qxเป็นจำนวนเต็ม แล้วเราบอกว่าp(x)+q(x)เป็นความแม่นยำของxx

ยกตัวอย่างเช่นx=1.001มีความแม่นยำของ4ขณะที่x=0มีความแม่นยำของ00

คะแนนของคุณคือผลรวมของการชั่งน้ำหนักและอคติในเครือข่ายประสาทของคุณ

(เช่นตัวอย่างข้างต้นมีคะแนน 16)

การตรวจสอบ

ในขณะที่รากสามารถแสดงออกในรูปของสูตรลูกบาศก์ได้แต่รากที่ใหญ่ที่สุดอาจเข้าถึงได้ง่ายที่สุดด้วยวิธีตัวเลข ต่อไปนี้ @ ข้อเสนอแนะ XNOR ผมคำนวณรากที่ใหญ่ที่สุดสำหรับการเลือกทุกจำนวนเต็ม, , [ - 10 , 10 ]และผลที่สามารถพบได้ที่นี่ บรรทัดของแฟ้มข้อความนี้แต่ละคนจะอยู่ในรูป ยกตัวอย่างเช่นรายงานบรรทัดแรกว่ารากที่ใหญ่ที่สุดของx 3 - 10 x 2 - 10 x - 10จะอยู่ที่ประมาณ10.99247140445449a,b,c[10,10]a,b,c,rootx310x210x1010.99247140445449

แก้ไข:ไฟล์ต้นฉบับที่ฉันโพสต์มีข้อผิดพลาดในกรณีที่พหุนามแสดงหลายรูต เวอร์ชันปัจจุบันควรปราศจากข้อผิดพลาดดังกล่าว


3
เกิดอะไรขึ้นในพหุนามพหุนามไม่มีรากแท้เช่นเดียวกับเมื่อa=0และกำลังสองมีสองรากที่ซับซ้อน?
xnor

ฉันคิดว่าวิธีการแก้ปัญหาที่สะอาดที่สุดคือการพูดว่าการป้อนข้อมูลจะไม่aเป็นศูนย์หรือเพียงแค่ 1 นอกจากนี้ฉันขอแนะนำให้ใส่ในกรณีทดสอบบางอย่างให้รากที่มีความแม่นยำสูงเพื่อให้เราสามารถตรวจสอบได้ภายใน 0.1 มันจะเป็นการดีถ้ามีเอาต์พุตสำหรับอินพุตที่เป็นไปได้ทั้งหมดอาจอยู่ในลิงก์เนื่องจากมีจำนวนมากสำหรับโพสต์
xnor

1
ฉันชอบกฎการรับเข้าใหม่ ดูเหมือนว่าฟังก์ชั่น sinusoid ใหม่นั้นสามารถใช้ประโยชน์ได้อย่างมาก ฉันมีหลักฐานx -> a * sin(b * softplus(x) + c)คร่าวๆว่าฟังก์ชั่นของแบบฟอร์มสามารถรองรับจำนวนจุดข้อมูลใด ๆ ที่มีจำนวนเต็มxจนถึงความแม่นยำตามอำเภอใจโดยใช้ความถี่ที่มีขนาดใหญ่และแม่นยำมาก
xnor

1
ไม่แน่ใจว่ามีประโยชน์ก็จะเป็น (สำหรับความท้าทายในอนาคต): ในทฤษฎีจำนวนที่เราใช้ฟังก์ชั่นความสูงในการวัดความซับซ้อนของตัวเลข ตัวอย่างเช่นความสูงที่ไร้เดียงสาของเศษส่วน (ลดลง) มอบให้โดยh = log max { | p | , | q | } (และมีลักษณะทั่วไปจำนวนมาก) บางทีนี่อาจใช้เป็นการวัดทางเลือกก็ได้ p/qh=logmax{|p|,|q|}
ข้อบกพร่อง

1
@ DustinG.Mixon ผมไม่แน่ใจว่าถ้าคุณทราบ แต่เราจะมีSandboxสำหรับร่างการโพสต์และรายละเอียดการอภิปรายของความท้าทายเป็นอย่างดีในฐานะแชท
ข้อบกพร่อง

คำตอบ:


6

14,674,000,667 5,436,050 5,403,448 10,385 5,994 4,447
3,806 ความแม่นยำทั้งหมด

M,δ,ϵ>0p(x)=x3+ax2+bx+c

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

sSp(s)<ϵ0.1pM=11δ=0.1ϵ=104

SsS

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

ϵ=104sSp(s)<104p(s)0

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

เราใช้สิ่งนี้กับเซลล์ประสาทสองสามชั้น:

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

x4,s=1p(s)<104x4,s=0sx4,s=1x4,Mx5,Mk1เรากำหนดซ้ำ ๆ

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

x5,sssx5,s=1s

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

อย่างชัดเจนเรากำหนดเซลล์ประสาทโดย

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

x8,s=1s=sx8,s=0

x9=sSsx8,s=s.

6+3+1+9=191+4=515+5=101+1=21+1=21+1=21+1+1=33|S||S|=221|S|11

แก้ไข: การปรับปรุง: (1) เราสามารถสุ่มตัวอย่างพหุนามได้อย่างมีประสิทธิภาพมากขึ้นโดยใช้ความแตกต่างอัน จำกัด (2) เราสามารถข้ามเลเยอร์ 2 ถึง 4 โดยใช้การเปิดใช้งาน sigmoid แทน (3) ปัญหาโอเวอร์โฟลว์ในเลเยอร์ 5 สามารถย้อนกลับ (และสามารถรวมเลเยอร์ต่อมา) โดยการเปิดใช้งาน relu อย่างระมัดระวังมากขึ้น (4) ผลรวมสุดท้ายคือราคาถูกที่มีผลบวกโดยชิ้นส่วน

สิ่งที่ตามมาคือรหัส MATLAB เพื่อความชัดเจนprecเป็นฟังก์ชัน (พบได้ที่นี่ ) ซึ่งคำนวณความแม่นยำของเวกเตอร์ของน้ำหนักหรืออคติ

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 ความแม่นยำโดยรวม

f:SRS

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

f

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

สิ่งที่ตามมาคือการนำ MATLAB ไปใช้ในแนวทางนี้ เพื่อความชัดเจนroots.txtคือไฟล์รูทที่โพสต์ไว้ด้านบน (พบได้ที่นี่ ) และprecเป็นฟังก์ชั่น (พบที่นี่ ) ซึ่งคำนวณความแม่นยำโดยรวมของเวกเตอร์ของน้ำหนักหรืออคติ

แก้ไข 1:การปรับปรุงสองอย่างเหนือกว่าแบบดั้งเดิม: (1) ฉันแยกเซลล์ประสาทบางส่วนออกจากลูป (2) ฉันใช้งาน " Lebesgue Integration " ในผลรวมสุดท้ายโดยรวมคำแรกจากชุดระดับเดียวกัน ด้วยวิธีนี้ฉันจ่ายค่าความแม่นยำสูงกว่าของเอาต์พุตเพียงครั้งเดียวทุกระดับที่ตั้งค่า นอกจากนี้ก็มีความปลอดภัยในผลรอบที่ห้าที่ใกล้ที่สุดโดยทฤษฎีบทรากเหตุผล

แก้ไข 2:การปรับปรุงเล็กน้อยเพิ่มเติม: (1) ฉันแยกเซลล์ประสาทออกจากลูปเป็นจำนวนมาก (2) ฉันไม่รำคาญที่จะคำนวณคำในผลรวมสุดท้ายที่ผลลัพธ์เป็นศูนย์อยู่แล้ว

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.