ニューラルネットワークで多項式の最大根を求める


11

チャレンジ

整数エントリを持つ3次元入力ベクトルが与えられると、ネットワークは、多項式、誤差はより厳密に小さい。(a,b,c)[10,10]x3+ax2+bx+c0.1

許容性

私の以前のニューラルネットゴルフチャレンジの許容性の概念は少し制限的であるように思われたので、このチャレンジでは、フィードフォワードニューラルネットワークのより寛大な定義を使用しています。

ニューロンは、機能であるのベクトルで指定されるの重みバイアスアクティベーション関数は次のようになります。ν:RnRwR bR fRR

νバツ:=fwバツ+bバツR

有するフィードフォワードニューラルネットワークの入力ノード の関数であるそれが配列から構築することができるのニューロン。各はとスカラーを出力します。出力ノードの指定されたセットが与えられた場合、ニューラルネットワークの出力はベクトルです。{1}バツ1バツR(νkk=+1Nνk:Rk1R(x1,,xk1)xkS{1,,N}(xk)kS

アクティブ化関数は任意のタスクに合わせて調整できるため、この課題を面白く保つために、アクティブ化関数のクラスを制限する必要があります。以下のアクティベーション機能が許可されています。

  • 身元。 f(t)=t

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

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

  • シグモイド。 f(t)=etet+1

  • 正弦波。 f(t)=sint

全体として、許容ニューラルネットは、入力ノード、ニューロンのシーケンス、および出力ノードによって指定されますが、各ニューロンは、重みのベクトル、バイアス、および上記のリストからのアクティブ化関数によって指定されます。たとえば、次のニューラルネットは許容されますが、この課題のパフォーマンス目標を満たしていません。

  • 入力ノード: {1,2}

  • ニューロン: forνk(x1,,xk1):=xk2+xk1k{3,,10}

  • 出力ノード: {5,9,10}

このネットワークは8つのニューロンで構成されており、それぞれにバイアスとアイデンティティのアクティブ化がありません。つまり、このネットワークは、とによって生成された一般化フィボナッチ数列を計算し、この列から5番目、9番目、10番目の数をこの順序で出力します。x1x2

得点

実数所与小数拡張を終了すると、聞かせて最小の非負整数であるのための、およびlet最小の非負整数であるのためのこのは整数です。その後、我々は言うある精度の。xp(x)p10p|x|<1q(x)q10qxp(x)+q(x)x

たとえば、の精度はが、の精度はです。x=1.0014x=00

スコアは、ニューラルネットワークの重みとバイアスの精度の合計です。

(たとえば、上記の例のスコアは16です。)

検証

は3次式で表現できますが、最大の根はおそらく数値的手段で最も簡単にアクセスできます。XNORの提案、@の後、私は整数のすべての選択のための最大のルートを計算し、との結果がここで見つけることができます。このテキストファイルの各行の形式はです。たとえば、最初の行は、の最大ルートが約ます。a,b,c[10,10]xは3 - 10 X 2 - 10 X - 10a,b,c,rootx310x210x1010.99247140445449

編集:多項式が多重根を示す場合、私が投稿した元のファイルにエラーがありました。現在のバージョンには、このようなエラーがないはずです。


3
入力多項式に実際の根がない場合a=0、および二次関数に2つの複素根がある場合はどうなりますか?
xnor

最もクリーンな解決策は、入力がaゼロではない、または1でさえあるというものだと思います。また、ルートを高精度にして、0.1以内であることを確認できるように、いくつかのテストケースを置くことをお勧めします。すべての可能な入力に対して出力を持つことも良いでしょう。おそらくリンクにとっては、それは投稿にとって多くのことだからです。
xnor

1
新しい許容ルールが好きです。新しい正弦波関数は非常に悪用可能ですが。フォームの関数が、非常に大きく正確な周波数を使用して、任意の精度のx -> a * sin(b * softplus(x) + c)整数で任意の有限数のデータポイントをオーバーフィットできるという大まかな証明がありますx
-xnor

1
(将来の課題に対して)どれほど役立つかわかりません:数論では、高さ関数を使用して数の複雑さを測定します。例えば、(縮小)画分のナイーブ高さで与えられるH = ログマックス{ | p | | q | }(一般化がたくさんあります)。多分これは代替手段として使用できます。p/qh=logmax{|p|,|q|}
flawr

1
@ DustinG.Mixon気づいているかどうかはわかりませんが、下書きを投稿したり、チャットのほかチャレンジの詳細について話し合ったりするためのサンドボックスがあります
flawr

回答:


6

14,674,000,667 5,436,050 5,403,448 10,385 5,994 4,447
3,806合計精度

ベースラインについて、私は次のアプローチを調査しました。多項式p x = x 3 + a x 2 + b x + cをサンプリングする場合M,δ,ϵ>0選択しますp(x)=x3+ax2+bx+c

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

次いで、最大サンプルポイントsS満たすp(s)<ϵ必ずしも存在し、必ずしも内に存在する0.1の最大ルートのp。多項式のコレクションでは、M=11δ=0.1、およびϵ=104とることができます。

このロジックを実装するニューラルネットを設計するには、S多項式をサンプリングするニューロンのレイヤーから始めます。それぞれについて、sS、我々は取ります

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

次に、これらのどれがϵ=104より小さいかを特定します。それはのためにことが判明sS、それが保持しているp(s)<104場合にのみp(s)0。そのため、reluアクティベーションを使用してサンプルを正確に識別できます。

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=1ときp(s)<104さもなければ、及びx4,s=0。我々は最大シークことリコールsれるx4,s=1。この目的のために、我々は、ラベルx4,Mとしてx5,M(表記の便宜のために)、およびそれぞれのためのk1、繰り返し定義します

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

この変換のおかげで、すべてのx5,s非負整数であり、sユニークであるsいるx5,s=1。私たちは今、識別することができるs reluアクティベーションの他のアプリケーションで:

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=1であればs=sとそうでない場合x8,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をバイパスできます。(3)reluアクティベーションをより注意深く適用することにより、レイヤー5のオーバーフローの問題を回避できます(後続のレイヤーを組み合わせることができます)。(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は上記のrootsファイル(ここにあります)であり、重みまたはバイアスのベクトルの合計精度を計算するprec関数(ここにあります)です。

編集1:オリジナルの2つの改良点:(1)forループからいくつかのニューロンを除外しました。(2)同じレベルセットの用語を最初に結合することにより、最終的な合計に「ルベーグ統合」を実装しました。このように、レベルセットごとに1回だけ、出力のより高い精度の値を支払います。また、出力を有理根定理によって最も近い5分の1に丸めることも安全です。

編集2:追加のマイナーな改善:(1)forループからより多くのニューロンを分解しました。(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.