Знайдіть найбільший корінь многочлена з нейронною мережею


11

Змагання

Знайдіть найменшу нейронну мережу, що подається, таку, що з урахуванням будь-якого тривимірного вхідного вектора (а,б,c) з цілими записами в [-10,10] мережа виводить найбільший (тобто "найбільш позитивний") корінь многочлен х3+ах2+бх+c з похибкою строго меншою за 0,1 .

Допустимість

Поняття допустимості в моєму попередньому виклику з нейрологічної сітки з гольфу здавалося дещо обмежуючим, тому для цього виклику ми використовуємо більш ліберальне визначення нейронної мережі feedforward:

Нейрон є функцією ν:RnR , який задається вектором wRn з ваг , A зміщення bR , і функції активації f:RR наступним чином:

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

Подача нейронної мережі з вхідними вузлами {1,,n} є функцією (x1,,xn)Rn яку можна побудувати з послідовності (νk)k=n+1N нейронів, де кожен νk:Rk1R приймає входи з (x1,,xk1)і виводить скалярxk . З урахуванням деякого заданого безлічіS{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}

  • Нейрони: νk(x1,,xk1):=xk2+xk1 для k{3,,10}

  • Вихідні вузли: {5,9,10}

Ця мережа складається з 8 нейронів, кожен з яких має нульовий зміщення та активацію ідентичності. Словом, ця мережа обчислює узагальнену послідовність Фібоначчі, породжену x1 і x2 а потім виводить 5, 9 та 10 числа з цієї послідовності в такому порядку.

Оцінка балів

З огляду на дійсне число x із закінченням десяткового розширення, нехай p(x) є найменшим невід’ємним цілим числом p для якого 10p|x|<1 , і нехай q(x) - найменше невід’ємне ціле числоq для якого10qx - ціле число. Тоді ми говоримоp(x)+q(x) єточністювідx .

Наприклад, x=1.001 має точність 4 , тоді як x=0 має точність 0 .

Ваш бал - це сума точності ваг і ухилів у вашій нейронній мережі.

(Наприклад, наведений вище приклад має оцінку 16).

Перевірка

Хоча коріння можна виразити у формі кубічної формули , найбільший корінь, можливо, найпростіше отримати за допомогою чисельних засобів. За пропозицією @ xnor, я обчислив найбільший корінь для кожного вибору цілих чисел a,b,c[10,10] , ірезультати можна знайти тут. Кожен рядок цього текстового файлу має формуa,b,c,root. Наприклад, перший рядок повідомляє, що найбільший коріньx310x210x10 - це приблизно10.99247140445449 .

Редагувати: Оригінальний файл, який я розмістив, мав помилки у випадках, коли поліном демонстрував кілька коренів. Поточна версія повинна бути без таких помилок.


3
Що відбувається у вхідному многочлені не має реальних коренів, як, коли, a=0а квадратик має два складних кореня?
xnor

Я думаю, що найчистішим рішенням було б сказати, що вхід матиме aненульовий рівень, або навіть просто 1. Також я рекомендую ввести деякі тестові випадки, даючи корені з високою точністю, щоб ми могли перевірити, чи є наші в межах 0,1. Було б також добре мати вихідні дані для всіх можливих входів, ймовірно, за посиланням, оскільки це багато для посади.
xnor

1
Мені подобаються нові правила прийнятності. Схоже, нова синусоїдна функція є надзвичайно корисною. Я маю схематичне підтвердження того, що функція форми x -> a * sin(b * softplus(x) + c)може перевищувати будь-яку кінцеву кількість точок даних з цілим числом xдо довільної точності, використовуючи надзвичайно велику та точну частоту.
xnor

1
Не впевнений, наскільки це було б корисно (для майбутніх викликів): У теорії чисел ми використовуємо функції висоти для вимірювання складності числа. Наприклад, наївна висота (зменшеної) фракції задається h = log max { | р | , | q | } (і узагальнень дуже багато). Можливо, це може бути використане як альтернативний захід. p/qh=logmax{|p|,|q|}
flawr

1
@ DustinG.Mixon Я не впевнений, чи знаєте ви, але у нас є пісочниця для розміщення чернетки та обговорення деталей виклику, а також чат .
недолік

Відповіді:


6

14,674,000,667 5436050 5403448 10385 5994 4447
3806 Росія Загальна точність

Для базової лінії я дослідив наступний підхід: Виберіть 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=1s=sx8,s=0

x9=sSsx8,s=s.

Для оцінки кожен шар має нейрони з різним рівнем точності: (1) 6+3+1+9=19 , (2) 1+4=515+5=101+1=21+1=21+1=21+1+1=33|S||S|=221|S|11

Редагувати: Покращення: (1) Ми можемо відібрати поліном набагато ефективніше, використовуючи кінцеві різниці. (2) Ми можемо обійти шари від 2 до 4, замість цього використовуючи сигмоїдну активацію. (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

rелу(т-1)-2rелу(т)+rелу(т+1)={1якщо т=00якщо тZ{0}.

Далі йде реалізація цього підходу MATLAB. Щоб було зрозуміло, чи roots.txtє кореневий файл, розміщений вище (знайдений тут ), і precце функція (знайдена тут ), яка обчислює загальну точність вектора ваг або зміщення.

Редагувати 1: Два поліпшення в порівнянні з оригіналом: (1) Я вивів деякі нейрони з циклу for. (2) Я реалізував " інтеграцію Лебега " в остаточну суму, спочатку комбінуючи умови з того ж встановленого рівня. Таким чином, я плачу за більш високу точність виходу лише один раз за кожен встановлений рівень. Крім того, раціональним кореневою теоремою можна безпечно округлити виходи до найближчої п’ятої .

Редагування 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.