Я хотел бы предложить другой вид игры в гольф для этого сообщества:
(Искусственные) нейронные сети являются очень популярными моделями машинного обучения, которые могут быть разработаны и обучены для приближения к любой заданной (обычно неизвестной) функции. Они часто используются для решения очень сложных задач, которые мы не знаем, как решать алгоритмически, такие как распознавание речи, определенные виды классификации изображений, различные задачи в автономных системах вождения, ... Для начинающих в нейронных сетях посчитайте это превосходным Статья в Википедии .
Поскольку это первая из серии задач по гольф-обучению в области машинного обучения, я хотел бы сделать все как можно проще:
На языке и структуре по вашему выбору спроектируйте и обучите нейронную сеть, которая с учетом вычисляет их произведение для всех целых чисел между (и включая) и .
Цель производительности
Чтобы соответствовать требованиям, ваша модель не может отклоняться более чем на от правильного результата по любой из этих записей.
правила
Ваша модель
- должна быть «традиционной» нейронной сетью (значение узла рассчитывается как взвешенная линейная комбинация некоторых узлов в предыдущем слое с последующей функцией активации),
- разрешается использовать только следующие стандартные функции активации:
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- ,
- должен принимать либо целое число / вектор / список / ... целых чисел, либо число с плавающей запятой как единственный вход,
- вернуть ответ в виде целого числа, числа с плавающей запятой (или подходящего контейнера, например, вектора или списка, который содержит этот ответ).
Ваш ответ должен включать (или ссылку на) весь код, необходимый для проверки ваших результатов, в том числе обученные веса вашей модели.
счет
Нейронная сеть с наименьшим количеством весов (включая веса смещения) выигрывает.
Наслаждайтесь!
источник
f(x) = x
пересылку своих входных данных?Ответы:
21 13 119 весовЭто основано на поляризационной идентичности билинейных форм, которая в одномерном реальном случае сводится к полиномиальной идентичности:
Так
y1
что просто вычисляет[x+y, x-y]
с использованием линейного преобразования, иy3
это просто абсолютное значениеy1
в качестве шага предварительной обработки для следующего: затем «трудная» часть вычисляет квадраты, которые я объясню ниже, а после этого просто вычисляя разницу и масштабирование, которое снова линейная операция.Для вычисления квадратов я использую экспоненциальный ряд который должен быть точным для всех целых чисел пределах примерно . Эта серия имеет видs {0,1,2,…,20} 0.5
где я только что оптимизировал для весов=(wi)i
W2
( ). Вся эта аппроксимация снова включает в себя только два линейных преобразования с экспоненциальной активацией, расположенной между ними. Такой подход приводит к максимальному отклонению около .0.02
Попробуйте онлайн!
источник
abs
. Но все хорошо в любом случае.y0
нужно 4,y1
нужно 2,y3
нужно 2,y4
нужно 1,y5
нужно 1 иy6
нужно 2. Это 12?7 весов
Попробуйте онлайн!
Использует следующее приближенное равенство для малых основанное на разложении Тейлора :ϵ ex≈1+x+x22
Достаточно маленький выбор позволяет нам выйти за границы допустимых ошибок. Обратите внимание, что и являются постоянными весами в коде.ϵ
eps
c
источник
C = -B
(1 вес) и затем иметь[e_s, e_d] = conv([A,B,C], [eps, eps])
(2 веса), чтобы сэкономить один вес :) (Кстати: очень умный подход!)exp
)3331 весовПопробуйте онлайн!
Это делает длинное умножение в (sorta) двоичном и, таким образом, возвращает точный результат. Должна быть возможность воспользоваться окном ошибок 0,5 для игры в гольф, но я не уверен, как это сделать.
Слои с 1 по 6 разбивают первый вход на 5 «битов». По причинам, связанным с игрой в гольф, мы не используем настоящий бинарный файл. Наиболее значимый «бит» имеет вес -15 вместо 16, а когда входное значение равно 0, все «биты» равны 0,5 (что все еще отлично работает, поскольку сохраняет идентичность
inputA = -15*a15 + 8*a8 + 4*a4 + 2*a2 + 1*a1
).источник
43 веса
Два решения, опубликованные до сих пор, были очень умными, но их подходы, вероятно, не будут работать для более традиционных задач в машинном обучении (таких как OCR). Поэтому я хотел бы представить «общее» (без хитрых уловок) решение этой задачи, которое, мы надеемся, вдохновит других людей улучшить ее и погрузиться в мир машинного обучения:
Моя модель представляет собой очень простую нейронную сеть с 2 скрытыми слоями, встроенными в TensorFlow 2.0 (но любой другой фреймворк также подойдет):
Как вы можете видеть, все слои плотные (что, безусловно, не оптимально), функция активации - tanh (что на самом деле хорошо для этой задачи), за исключением выходного слоя, который, в силу характера этой задачи, имеет линейную функцию активации.
Есть 43 веса:
Затем я настроил их - оптимизировал максимальное отклонение для любой задачи целочисленного умножения. К сожалению, мои заметки не показывают особой настройки, которую я закончил, но это было очень незначительно. В окрестностях 100 эпох на тех 441 обучающих выборках, с размером партии 441.
Вот те веса, с которыми я закончил:
Мою модель можно найти здесь, а также попробовать онлайн! в среде Google Colab.
источник
2 веса
Как сойти с рук всего 1 вес (!)
(Возможно, мы должны изменить то, как повторно используемые веса будут оцениваться в будущих задачах игры в нейронную сеть.)
источник