Sinir ağına sahip bir polinomun en büyük kökünü bulun


11

Meydan okuma

da tamsayı girişleri olan herhangi bir 3 boyutlu giriş vektörü verildiğinde, ağın küçük hata ile polinom .(a,b,c)[10,10]x3+ax2+bx+c0.1

kabul edilebilirlik

Önceki nöral ağ golf zorluğumdaki kabul edilebilirlik kavramı biraz kısıtlayıcı görünüyordu, bu nedenle bu zorluk için ileri beslemeli sinir ağının daha liberal bir tanımını kullanıyoruz:

Bir nöron bir fonksiyonudur bir vektör tarafından belirtilen ve ağırlıkları , bir önyargı ve etkinleştirme işlevi şu şekilde:ν:RnRwRn bR f:RR

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

\ {1, \ ldots, n \} giriş düğümlerine sahip bir ileri beslemeli sinir ağı , bir diziden (\ nu_k) _ oluşturulabilen \ mathbf {R} ^ n işlevinin (x_1, \ ldots, x_n) \ işlevidir. {k = n + 1} ^ Nöronların N'si ; burada her \ nu_k \ colon \ mathbf {R} ^ {k-1} \ to \ mathbf {R} , (x_1, \ ldots, x_ {k-1 }) ve bir skaler x_k çıktısı verir . Bazı belirli grubu göz önüne alındığında, S \ subseteq \ {1, \ ldots, N \} bölgesinin çıkış düğümlerine , daha sonra sinir ağının çıkış vektörüdür (x_k) = {S k \} .{1,,n}(x1,,xn)Rn(νk)k=n+1Nνk:Rk1R(x1,,xk1)xkS{1,,N}(xk)kS

Etkinleştirme işlevleri herhangi bir görev için ayarlanabildiğinden, bu zorluğu ilginç tutmak için etkinleştirme işlevleri sınıfını kısıtlamamız gerekir. Aşağıdaki etkinleştirme işlevlerine izin verilir:

  • Kimlik. f(t)=t

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

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

  • Sigmoid. f(t)=etet+1

  • Sinüzoidi. f(t)=sint

Genel olarak, kabul edilebilir bir sinir ağı giriş düğümleri, bir nöron dizisi ve çıkış düğümleri ile belirtilirken, her bir nöron, bir ağırlık vektörü, bir sapma ve yukarıdaki listeden bir aktivasyon fonksiyonu ile belirtilir. Örneğin, bu sinir ağının performans hedefini karşılamasa da, aşağıdaki sinir ağı kabul edilebilir:

  • Giriş düğümleri: {1,2}

  • Nöronlar: içinνk(x1,,xk1):=xk2+xk1k{3,,10}

  • Çıkış düğümleri: {5,9,10}

Bu ağ, her biri sıfır yanlılık ve kimlik aktivasyonuna sahip 8 nörondan oluşur. Kelimelerde, bu ağ ve tarafından oluşturulan genelleştirilmiş Fibonacci dizisini hesaplar ve daha sonra bu diziden 5., 9. ve 10. sayıları bu sırayla çıkarır.x1x2

puanlama

Gerçek sayısı göz önüne alındığında sonlandırma ondalık genişlemesi ile, izin en küçük pozitif bir tamsayı olmak olan , ve izin en küçük pozitif bir tamsayı olmak için ki bu tamsayıdır. Daha sonra ki olan kesinlik ve .xp(x)p10p|x|<1q(x)q10qxp(x)+q(x)x

Örneğin, bir hassasiyete sahiptir ise, bir hassasiyete sahiptir .x=1.0014x=00

Puanınız sinir ağınızdaki ağırlık ve önyargıların toplamıdır.

(Örneğin, yukarıdaki örnekte 16 puan vardır.)

Doğrulama

Kökler kübik formül açısından ifade edilebilirken , en büyük köke belki de en kolay şekilde sayısal yollarla erişilebilir. @ Xnor'ın önerisini takiben her tamsayı seçimi için en büyük kökü hesapladım ve sonuçlar burada bulunabilir . Bu metin dosyasının her satırı formdadır . Örneğin, ilk satır en büyük kökünün yaklaşık .a,b,c[10,10]a,b,c,rootx310x210x1010.99247140445449

Düzenleme: Gönderdiğim orijinal dosyada, polinomun çoklu bir kök sergilediği durumlarda hatalar vardı. Mevcut sürümde bu tür hatalar olmamalıdır.


3
Giriş polinomunda ne olur a=0ve kuadratik olanın iki karmaşık kökü olduğu gibi gerçek kökleri yoktur ?
xnor

Bence en temiz çözüm, girişin asıfırdan, hatta sadece 1 olacağını söylemek olacaktır . Ayrıca, bazı test durumlarına koymanızı ve köklerimizi yüksek hassasiyetle vermenizi tavsiye ederiz, böylece bizimkiler 0.1 içinde. Muhtemelen tüm bağlantılar için çıktıların olması da iyi olacaktır, çünkü yazı için çok şey var.
xnor

1
Yeni kabul edilebilirlik kurallarını seviyorum. Görünüşe göre yeni sinüsoid fonksiyonu son derece sömürülebilir. Formun bir işlev son derece büyük ve hassas bir frekans kullanarak rasgele hassasiyet x -> a * sin(b * softplus(x) + c)tamsayı ile herhangi bir sayıda sınırlı sayıda veri noktalarına uyacak kabataslak bir kanıt var x.
xnor

1
Ne kadar yararlı olacağından emin değilim (gelecekteki zorluklar için): Sayı teorisinde , bir sayının karmaşıklığını ölçmek için yükseklik fonksiyonlarını kullanırız. Örnek olarak bir (düşük) fraksiyonu naif yüksekliği verilir h = log maksimum { | p | , | q | } (ve birçok genelleme vardır). Belki bu alternatif bir önlem olarak kullanılabilir. p/qh=logmax{|p|,|q|}
Kusur

1
@ DustinG.Mixon Farkında olup olmadığınızdan emin değilim ancak taslaklar yayınlamak ve bir meydan okumanın ayrıntılarını bir sohbetin yanı sıra tartışmak için bir sanal alanımız var .
Kusur

Yanıtlar:


6

14.674.000.667 5.436.050 5.403.448 10.385 5.994 4.447
3.806 toplam hassasiyet

Bir taban için, aşağıdaki yaklaşım araştırılmıştır: Seç M,δ,ϵ>0 öyle ki çokterimli örnek ise p(x)=x3+ax2+bx+c de

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

o zaman p ( s ) < ϵ değerini karşılayan en büyük numune noktası sS mutlaka vardır ve zorunlu olarak p'nin en büyük kökünün 0.1'inde bulunur . Bir polinomların koleksiyonumuz için, tek bir alabilir gösterilebilir M = 11 , δ = 0.1 ve ε = 10 - 4 .p(s)<ϵ0.1pM=11δ=0.1ϵ=104

Bu mantığı uygulayan bir sinir ağı tasarlamak için, S üzerindeki polinomu örnekleyen bir nöron tabakası ile başlıyoruz . Her sS için

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

Sonra bunlardan hangisinin ϵ=104 az olduğunu tespit ediyoruz . Bunun için çıkıyor sS , burada geçerli p(s)<104 , yalnızca p(s)0 . Bu nedenle, örneklerimizi tam olarak tanımlamak için relu aktivasyonlarını kullanabiliriz:

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

Bunu birkaç kat nöronla uyguluyoruz:

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

Bu noktada, elimizdeki x4,s=1 olduğunda p(s)<104 , ve aksi takdirde x4,s=0 . Hatırlama biz büyük aradığı s kendisi için x4,s=1 . Bu amaçla, etiketlemek x4,M olarak x5,M (notasyon uygunluğu için) ve her biri için k1, tekrar tekrar tanımlarız

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

Bu dönüşüm sayesinde, her x5,s , negatif olmayan bir tam sayı olduğu, ve s benzersiz s için de x5,s=1 . Şimdi tanımlayabilir s relu aktivasyonlar başka bir uygulama tarafından:

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

Explicitly, we define neurons by

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

Then x8,s=1 if s=s and otherwise x8,s=0. We linearly combine these to produce our output node:

x9=sSsx8,s=s.

For the score, each layer has neurons with different levels of precision: (1) 6+3+1+9=19, (2) 1+4=5, (3) 1, (4) 5+5=10, (5) 1+1=2, (6) 1+1=2, (7) 1+1=2, (8) 1+1+1=3, (9) 3|S|. Furthermore, all but two of the layers have |S|=221 neurons; layer 5 has |S|1 neurons and layer 9 has 1 neuron.

Edit: Improvements: (1) We can sample the polynomial much more efficiently using finite differences. (2) We can bypass layers 2 through 4 by instead using a sigmoid activation. (3) The overflow issues in layer 5 can be averted (and subsequent layers can be combined) by more carefully applying relu activations. (4) The final sum is cheaper with summation by parts.

What follows is the MATLAB code. To be clear, prec is a function (found here) that computes the precision of a vector of weights or biases.

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 total precision

Private communication with @A.Rex led to this solution, in which we construct a neural net that memorizes the answers. The core idea is that every function f:SR over a finite set S enjoys the decomposition

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

As such, one may construct a neural net implementation of f by first transforming the input into an indicator function of the input, and then linearly combining using the desired outputs as weights. Furthermore, relu activations make this transformation possible:

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

What follows is a MATLAB implementation of this approach. To be clear, roots.txt is the roots file posted above (found here), and prec is a function (found here) that computes the total precision of a vector of weights or biases.

Edit 1: Orijinal üzerinde iki gelişme: (1) Ben döngüler dışında bazı nöronlar faktörü. (2) İlk olarak aynı seviye setindeki terimleri birleştirerek " Lebesgue entegrasyonu " nu nihai toplamda kullandım. Bu şekilde, bir çıkışın yüksek hassasiyetli değerini her seviye için yalnızca bir kez öderim. Ayrıca, çıktıları rasyonel kök teoremi tarafından en yakın beşinci seviyeye yuvarlamak güvenlidir .

Edit 2: Ek küçük iyileştirmeler: (1) Bir for döngüsü dışında daha fazla nöron faktörü. (2) Çıktının zaten sıfır olduğu son toplamdaki terimi hesaplamaya zahmet etmiyorum.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.