Соревнование
Найдите наименьшую нейронную сеть с прямой связью, чтобы при любом трехмерном входном векторе с целочисленными значениями в сеть выводила самый большой (т. Е. «Наиболее положительный») корень полином с ошибкой, строго меньшей .
допустимость
Понятие допустимости в моей предыдущей игре в нейронную сеть выглядело немного ограничительным, поэтому для этой задачи мы используем более либеральное определение нейронной сети с прямой связью:
Нейрон является функцией , который задается вектором из весов , A смещения , и функции активации следующим образом:
Нейронная сеть с прямой связью с входными узлами является функцией которая может быть построена из последовательности нейронов, где каждый принимает входные данные из и выводит скаляр . С учетом некоторого заданного множестваизвыходных узлов, то выход из нейронной сети является вектор .
Поскольку функции активации могут быть настроены для любой конкретной задачи, нам нужно ограничить класс функций активации, чтобы эта задача была интересной. Разрешены следующие функции активации:
Идентичность.
РЕЛУ.
Softplus.
Сигмовидной.
Синусоида.
В целом, допустимая нейронная сеть определяется входными узлами, последовательностью нейронов и выходными узлами, в то время как каждый нейрон задается вектором весов, смещением и функцией активации из приведенного выше списка. Например, допустима следующая нейронная сеть, хотя она не соответствует цели производительности этой задачи:
Входные узлы:
Нейроны: для
Выходные узлы:
Эта сеть состоит из 8 нейронов, каждый с нулевым смещением и активацией идентичности. Словом, эта сеть вычисляет обобщенную последовательность Фибоначчи, сгенерированную и а затем выводит 5-е, 9-е и 10-е числа из этой последовательности в указанном порядке.
счет
Дано вещественное число с завершающим десятичным разложением, пусть наименьшее неотрицательное целое число для которого , и пусть наименьшее неотрицательное целое число для которого является целым числом. Тогда мы говорим , является точностью от .
Например, имеет точность , тогда как имеет точность .
Ваша оценка - это сумма точности весов и смещений в вашей нейронной сети.
(Например, приведенный выше пример имеет оценку 16.)
верификация
В то время как корни могут быть выражены через кубическую формулу , самый большой корень, возможно, легче всего получить с помощью числовых средств. Следуя предложению @ xnor, я вычислил самый большой корень для каждого выбора целых чисел , и результаты можно найти здесь . Каждая строка этого текстового файла имеет форму a,b,c,root
. Например, первая строка сообщает, что самый большой корень из составляет примерно .
Редактировать: исходный файл, который я разместил, имел ошибки в тех случаях, когда полином имел многократный корень. Текущая версия не должна содержать таких ошибок.
источник
a=0
квадратик имеет два сложных корня?a
отличны от нуля или даже равны 1. Кроме того, я бы порекомендовал ввести несколько тестовых случаев, чтобы получить корни с высокой точностью, чтобы мы могли проверить, что наши значения находятся в пределах 0,1. Также было бы хорошо иметь выходные данные для всех возможных входов, вероятно, в виде ссылки, поскольку это много для поста.x -> a * sin(b * softplus(x) + c)
может переопределить любое конечное число точек данных с целочисленнойx
или произвольной точностью, используя чрезвычайно большую и точную частоту.Ответы:
14674000667543605054034481038559944
4473806 общей точностиДля базовой линии я исследовал следующий подход: выберитеM,δ,ϵ>0 , чтобы при выборке полинома p(x)=x3+ax2+bx+c в
тогда наибольшая выборочная точкаs⋆∈S удовлетворяющая условию p(s⋆)<ϵ обязательно существует и обязательно находится в пределах 0.1 от наибольшего корня из p . Можно показать, что для нашего набора полиномов можно взять M=11 , δ=0.1 и ϵ=10−4 .
Чтобы создать нейронную сеть , которая реализует эту логику, мы начинаем со слоем нейронов, образец многочлена наS . Для каждого s∈S примем
Далее мы определяем, какие из них меньшеϵ=10−4 . Оказывается, что для s∈S верно, что p(s)<10−4 только если p(s)≤0 . Таким образом, мы можем использовать активацию relu для точной идентификации наших образцов:
Мы реализуем это с помощью нескольких слоев нейронов:
В этот момент мы имеемx4,s=1 когда p(s)<10−4 , а в противном случае x4,s=0 . Напомним, что мы ищем наибольшее значение s⋆ для которого x4,s⋆=1 . Для этого обозначим x4,M как x5,M (для удобства обозначения) и для каждого k≥1 итеративно определяем
Благодаря этому преобразованию каждоеx5,s является неотрицательным целым числом, а s⋆ является единственным s для которого x5,s=1 . Теперь мы можем определить s⋆ другим применением РЕЛУ активаций:
Явно мы определяем нейроны
Thenx8,s=1 if s=s⋆ and otherwise x8,s=0 . We linearly combine these to produce our output node:
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.
Далее следует код MATLAB. Для ясности,
prec
это функция (найденная здесь ), которая вычисляет точность вектора весов или смещений.источник
532682959629306 Общая точностьЧастное общение с @ A.Rex привело к этому решению, в котором мы строим нейронную сеть, которая запоминает ответы. Основная идея заключается в том, что каждая функцияе: S→ R над конечным множеством S наслаждается разложением
Таким образом, можно построить реализацию нейронной сетие сначала преобразовав вход в индикаторную функцию входа, а затем линейно скомбинировав, используя нужные выходы в качестве весов. Кроме того, активация relu делает возможным это преобразование:
Далее следует реализация этого подхода в MATLAB. Для ясности,
roots.txt
файл корней, размещенный выше (найден здесь ), иprec
является функцией (найденной здесь ), которая вычисляет общую точность вектора весов или смещений.Редактировать 1: Два улучшения по сравнению с оригиналом: (1) Я вычленял несколько нейронов из циклов for. (2) Я реализовал « интеграцию Лебега » в окончательной сумме, сначала объединив термины из того же набора уровней. Таким образом, я плачу за более высокую точность вывода только один раз за каждый установленный уровень. Кроме того, безопасно округлять выходные данные до ближайшей пятой по рациональной корневой теореме .
Редактировать 2: Дополнительные незначительные улучшения: (1) Я выделил больше нейронов из цикла for. (2) Я не пытаюсь вычислить термин в окончательной сумме, для которой результат уже равен нулю.
источник