Алгоритм обучения нейронных сетей с помощью нового вида чисел

    Приветствую, читатель. Когда я был ребёнком и учился в школе, моим любимым предметом была математика, любимым предметом она была из-за того, что я очень люблю решать задачи, в какой-то момент своей жизни я начал составлять сам для себя заведомо нерешаемые задачи и пытался их решить, по полной напрягая свой разум в продумывании подхода для решения нерешаемой задачи, иногда оказывалось, что нерешаемая задача только казалась таковой из-за упущения некоторых неочевидных моментов. Любовь к решению задач сильно повлияла на меня, из-за чего я у себя в голове постоянно решаю какие-либо задачи, не только математические, но и из других сфер. За жизнь у меня накопилось множество идей (решений), от 3d принтера печатающего сталью до способа решения проблемы утилизации радиоактивных отходов атомных электростанций. Наверняка многие идеи на самом деле не реализуемы, по тем или иным причинам, а некоторые наверняка были придуманы до меня, а я просто о них не знал (так уже бывало). В прошлой моей статье я упомянул (сам не знаю зачем) о том, что я придумал новый вид чисел с помощью которых можно обучать нейронные сети. Я хотел открыть сервис по обучению нейронных сетей с помощью этих чисел, но с учётом пандемии и моего плохого состояния здоровья, я подумал, что вдруг я реально первый кто додумался до этих чисел и будет крайне плохо если я умру и знания о этих числах уйдут со мной. Поэтому я и решил написать эту статью, в которой расскажу подробно о этих числах и как их использовать для обучения нейронных сетей. Сразу скажу, что я не прорабатывал все необходимые формулы для работы с такими числами, так как был занят своим языком программирования, это лишь идея, а не готовая реализация.

    Для того, что бы полностью понять о чём пойдёт речь в статье, нужно иметь знание о строении простых feedforward нейронных сетей.

    Предположим нужно обучить feedforward нейронную сеть имея некую обучающую выборку, в которой есть примеры того, что подаётся на вход нейронной сети и что ожидается получить на выходе. Для такого случая можно написать функцию, назовём её fitness (как в генетическом алгоритме), на вход такой функции даётся нейронная сеть и обучающая выборка, а функция возвращает число от 0 до 1, число соответствует тому, на сколько данная нейронная сеть обучена данной выборкой, где 0 - максимально не обучена, 1 - идеально обучена. Используя такую fitness функцию, нейронную сеть можно представить как математическую функцию у которой аргументы - это веса нейронной сети, а результатом является результат fitness функции применяемой к нейронной сети с данными весами и обучающей выборкой. Я начал размышлять "как найти максимум такой функции?". В свой голове я представил 3х мерный график функции с 2 аргументами и подумал, что если добавить условие что каждый вес будет ограничен каким либо конечным диапазоном возможных значений, то можно разделить этот график на две части, в одной части графика первый аргумент имеет одни значения из своего возможного диапазона, а вторая часть графика имеет все оставшиеся значения аргумента, затем проанализировать в какой части максимум больше, взять эту часть и делить её таким же образом, но уже опираясь на другой аргумент, после чего полученную в результате второго деления часть, снова нужно разделить на две части опираясь на первый аргумент. Такое деление на части нужно производить до тех пор, пока значения результата функции на полученном от делении участке, будут иметь слишком большие колебания. Любые аргументы из полученной части графика и являются подходящими весами. Для лучшего понимания, поясню вышесказанное на примере.

    График функции y = sin x
    График функции y = sin x

    Предположим есть функция y(x) = sin x, x принадлежит множеству [-4, 4], нужно найти максимум, или значение очень близкое к максимуму, данной функции на данном участке. Разделим график на 2 части, в одной части x принадлежит множеству [-4, 0], во второй части x принадлежит множеству [0, 4], как видно на графике максимум находится во второй части, затем делим вторую часть на две части [0, 2] и [2, 4]. В какой-то момент в результате деления получится часть, в которых минимальное и максимальное значение функции очень близко к 1, например [pi * 999999 / 2000000, pi / 2], из этой части любой x будет приемлемым решением. Теперь о том как вышесказанное реализовать на практике. Однажды я сидел и смотрел в интернете научно-популярное видео, касалось оно космоса и в нём вскользь мелькнула информация о суперпозиции, в этот момент я подумал о числах которые не занимают определённую позицию, а находятся во многих местах одновременно. Например представить множество [0, 1], не как множество, а как число одновременно имеющее значение всех чисел из множества. Назовём такие числа "суперпозиционными". Результатом применения любой унарной операции к суперпозиционному числу, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения унарной операции к любому числу из множества, которое охватывает исходное суперпозиционное число. Например: sin([-pi, pi]) = [-1, 1]. Результатом применения любой бинарной операции над суперпозиционными числами, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения бинарной операции к двум любым числам из множеств, которые охватывают исходные суперпозиционные числа. Например: [-3, 6] - [-12, 7] = [-10, 18]. Вещественные числа так же можно представить в виде суперпозиционных как множество с одним числом, например [3, 3]. Что дают такие числа? Если есть некая функция с одним или несколькими неизвестными аргументами, но при этом значения этих аргументов ограничены каким либо конечным множество возможных значений, то подставив в качестве таких аргументов суперпозиционные числа, охватывающие собой множества возможных аргументов, можно узнать диапазон возможных значений функции. Вот как я придумал обучать простые feedforward нейронные сети:

    • создать нейронную сеть в которой все веса - суперпозиционные числа с множеством, которое ограниченно минимальным и максимальным значением веса

    • создать fintess функцию которая принимает указную нейронную сеть и обучающую выборку

    • уменьшить размер множества из суперпозиционного числа в одном весе в 2 раза, охватив либо половину множества с меньшими числами, либо с большими числами. Выбирается та половина, заменив на которую fitness функция даст большее значение. Если для обоих половин fitness функция выдаёт одинаковое значение, то выбирается случайная половина

    • выше указанные действия повторяются для каждого веса

    • выше указанные действия повторяются до тех пор, пока границы всех множеств суперпозиционных чисел в весах отличаются на определённое значение

    • заменить каждый вес на любое вещественное число из множества охватываемого суперпозиционным числом из соответствующего веса

    Выше указанный алгоритм уже сейчас можно реализовать и опробовать на сколько он эффективен. Мне очень хотелось бы это сделать, но категорически не хватает времени. После того как я придумал данный алгоритм, я периодически о нём думал и понял, что у него есть очень весомая проблема - когда fitness функция будет производить анализ того на сколько нейронная сеть подходит для выборки, естественно что в процессе анализа, функция в том числе будет смотреть на сколько нейронная сеть подходит для каждого отдельного примера и может так получиться, что для каждого отдельного примера лучшие веса находятся в одном диапазоне значений, но самые подходящие веса для всей выборки в целом - в другом диапазоне. Для решения этой проблемы, мною был придуман ещё один вид чисел, а также новый алгоритм обучения который, как мне кажется, должен значительно увеличить вероятность выбора правильного множества чисел.

    Хотя как идея, суперпозиционные числа олицетворяют собой числа которые находятся одновременно в нескольких местах, по факту вышеуказанные алгоритм использует такие числа как олицетворение вещественного числа находящегося в неком промежутке, а в результате получаем промежуток в котором может быть результат действий производимого над числами. Одна из проблем такого подхода в том, что совершенно не учитываются вероятность получения каких либо значений в диапазоне чисел. Например: если есть некое число принадлежащее множеству [1, 2] и есть второе число принадлежащее множеству [4, 5], то если сложить два этих числа, получится число принадлежащее множеству [5, 7], но число 5 можно получить только если сложить 1 и 4, а для числа 6 существует бесконечное количество пар чисел, поэтому вероятность получения числа 6 выше, чем вероятность получения числа 5. Поэтому мною были придуман новый вид чисел, с помощью которых можно учитывать вероятности. Разумеется если взять некое бесконечное множество и некое неизвестное число гарантированно принадлежащее данному множеству, то вероятность того что это число будет равным некому заранее известному числу из этого множества, стремится к 0, поскольку множество бесконечно. Но вот что я придумал сделать, предположим есть множество [a, b] и есть некое случайное число x принадлежащее множеству, предположим что если разделить множество на n равных частей, то x имеет некую вероятность принадлежать одной из частей, для каждой части вероятность может быть различной. Предположим что есть функция f получающая номер части и возвращающая вероятность (от 0 до 1) того, принадлежит ли этой части число x. На основе функции f можно создать функцию f1, f1(x) = f(x) * n. При стремлении n к бесконечности, функция f1 возвращает значение, с помощью которого можно оценить вероятность того, что x находится в окрестностях некого числа. Если f1 возвращает значение 0, то считается, что вероятность существует, но она минимально возможная, а чем выше число, тем выше вероятность. Для создания нового вида чисел, я взял суперпозиционные числа и добавил к ним функцию f1. Характеристику числа, которую описывает функция f1 я изначально назвал концентрацией, но уже после того как я всё придумал, мне в подписки на youtube пришло два видео (первое, второе), в которых рассказывается о вероятности вероятностей и там такую характеристику называли плотностью, поэтому и я тоже буду называть её плотностью, а сами числа - плотностными. Для удобства в дальнейшем областью определения (какому множеству принадлежит x) функции в плотностных числах, будет множество [0, 1], а для получения плотности в конкретной точке, значение получаемое из функции, будет масштабироваться.

    С помощью таких плотностных чисел у fitness функции куда больше данных, для более качественной оценки весов нейронной сети. Выше я уже писал, что для уменьшения проблемы вызванной суперпозиционными числами, я придумал не только новый вид чисел, но и новый алгоритм обучения. Думая о том как решить проблему вызванную суперпозиционными числами, я понял что эта проблема очень сильно усугубляется тем, что все веса являются суперпозиционными числами и если в один момент во время обучения суперпозиционным числом будет только один вес, то это должно колоссально снизить проблему, а если заменить суперпозиционное число на плотностное, проблема должна ещё больше снизиться. И так, теперь только один вес является плотностным числом, а какими значениями заполнить все остальные числа? Случайными? Не очень мне такой подход нравиться и я решил, что можно в начале обучить нейронную сеть способом используемым с суперпозиционными числами, но вместо суперпозиционных чисел, использовать плотностные, а затем уже использовать новый подход. В результате финальный вариант алгоритма получился следующим:

    • создать нейронную сеть в которой все веса - плотностные числа с множеством, которое ограниченно минимальным и максимальным значением веса и с функцией y(x) = 1

    • создать fintess функцию которая принимает указную нейронную сеть и обучающую выборку

    • уменьшить размер множества из плотностного числа в одном весе в 2 раза, охватив либо половину множества с меньшими числами, либо с большими числами. Выбирается та половина, заменив на которую fitness функция даст большее значение. Если для обоих половин fitness функция выдаёт одинаковое значение, то выбирается случайная половина

    • выше указанные действия повторяются для каждого веса

    • выше указанные действия повторяются до тех пор, пока границы всех множеств плотностных чисел в весах отличаются на определённое значение

    • заменить каждый вес на любое вещественное число из множества охватываемого плотностным числом из соответствующего веса

    • заменить один вес на плотностное число, охватывающее множество ограниченное минимальным и максимальным значением веса

    • уменьшить размер множества из плотностного числа в одном весе в 2 раза, охватив либо половину множества с меньшими числами, либо с большими числами. Выбирается та половина, заменив на которую fitness функция даст большее значение. Если для обоих половин fitness функция выдаёт одинаковое значение, то выбирается случайная половина

    • выше указанное действие повторять до тех пор, пока границы множества плотностного числа в весе отличаются на определённое значение

    • заменить вес на любое вещественное число из множества охватываемого плотностным числом из веса

    • повторить 4 последних действия над каждым весом

    • если в результате последних 5-ти действий нейронная сеть стала более обученной, то повторить эти 5 действий ещё раз

    Хотя и в суперпозиционных числах, и в плотностных числах может быть сколь угодно много отрезков возможных чисел (например: суперпозиционное число состоящее из 3 отрезков ([0, 1], [20, 40], [100, 101]) ), поскольку я эти числа использую только в контексте обучения нейронных сетей, то всё что я говорю ниже, относиться к плотностным числам которые состоят из 1 отрезка ограниченного 2-мя вещественными числами. В начале этой статьи я писал о том, что я не проработал все необходимые формулы и вот о каких формулах идёт речь. Если взять два плотностных числа [1, 2, y(x) = 1], [4, 5, y(x) = 1], то при сложении этих чисел получается число [5, 7, y(x) = 1 - |0.5 - x| * 2]. Откуда взялась функция y(x) = 1 - |0.5 - x| * 2? Я её вывел вручную и возможно она не верна, но даже если я не прав с формулой, то в любом случае при сложении двух плотностных чисел, в результирующем числе будет функция которая использует функции из слагаемых. Если в качестве функции активации нейронов использовать функцию y(x) = x, то даже в таком случае для обучения моим алгоритмом, нужно знать как складывать и перемножать 2 плотностных числа. С учётом того, что в результате сложения или перемножения двух плотностных чисел, формулы из 2-х исходных чисел будут храниться и в результирующем числе, то при увеличении количества нейронов и слоёв в сети, количество времени и памяти для обучения растёт экспоненциально. Однако есть одно но, для того чтобы узнать какая функция будет в результате сложения, необходимо знать только функции из слагаемых, т.е. в выражении [a1, b1, y1(x) = f1(x)] + [a2, b2, y2(x) = f2(x)] = [a3, b3, y3(x) = f3(x)], f3 не зависит от a1, b1, a2, b2, а зависит только от f1 и f2, если этим свойством обладает и произведение, то есть несколько оптимизаций с помощью которых можно значительно сократить скорость роста потребления памяти и времени во время обучения. Поскольку статья получилась и так не маленькой, а так же поскольку формулы для сложения и произведения пока не известны, рассказ об оптимизациях отложу на потом.

    P. S. Достаточно быстро я остановил разработку компилятора для моего языка, о котором была моя прошлая статья. Кратко о том, почему я это сделал. После прекращения разработки, я начал разработку нового языка, у которого отсутствуют недостатки предыдущего. На момент написания статьи я реализовал новый язык, компилятор и стандартную библиотеку на 80%. Мне очень хочется закончить новый вариант своего языка программирования, а так же реализовать хотя бы, несколько из своих идей (когда закончу ЯП, хочу попробовать реализовать свой алгоритм сжатия изображений, аудио и видео). Но в последнее время жизнь складывается не очень (как в прочем и у многих), из-за совокупности нескольких факторов (включая пандемию), я потерял работу и если осенью я хотя бы грибами питался, то сейчас иногда приходиться и ролтоны есть. Из за того, что в данный момент я много времени трачу на поиск работы (подработок) и иногда еды, а так же из-за психологического давления того факта, что у меня нет средств к существованию, разработка языка продвигается медленно. Если я бы смог фокусироваться на разработке, то компилятор и стандартную библиотеку я закончил бы, скорее всего к концу февраля. Поскольку моя обычная зарплата не превышает 200 долларов США в месяц, даже незначительная финансовая помощь поможет мне значительно. Поэтому, прошу помощи у всех не равнодушных (на Хабре есть кнопка "Задонатить"). Благодарю всех откликнувшихся.

    Реклама
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее

    Комментарии 62

      +1

      Очень любопытная идея. Желаю успехов в развитии.
      Мне только не понятно, зачем делать свой компилятор и свой язык? Разве нельзя реализовать это как библиотеку к существующему языку? Например к тому же питону.

        0
        Разве нельзя реализовать это как библиотеку к существующему языку? Например к тому же питону.
        Я язык пишу не для реализации этого алгоритма. Количество времени на разработку ограниченно и приходится выбирать, чем заниматься.
        +2
        извините, не удержался:
        офтоп - картинка про инженера-негуманитария
        image
          0

          1) Если как-то оптимизировать вычисление плотности вероятности, жертвуя точностью в угоду скорости, то легко пропустить локальный минимум. А если считать всё точно, то даже для крайних значений для каждого веса объём вычислений вырастет как 2^N, где N — количество нейронов.


          2) Обучение базируется на том, чтобы корректировать веса с помощью обратного распространения ошибки, который, в свою очередь, требует того, чтобы функция активации была дифференцируема. Вопрос — как это считать в случае с использованием плотностей вероятности?

            0
            Если как-то оптимизировать вычисление плотности вероятности, жертвуя точностью в угоду скорости, то легко пропустить локальный минимум. А если считать всё точно, то даже для крайних значений для каждого веса объём вычислений вырастет как 2^N, где N — количество нейронов.
            Объём вычислений зависит не только от количества нейронов, но и от количества слоёв. Про оптимизацию о которой я упомянул в статье, понятно в двух предложениях не рассказать, но она позволяет спроектировать сеть таким образом, что объем данных и количество вычислений можно снизить, а так же вычисления можно будет очень сильно распараллелить. Это всё равно не позволит обучать большого размера нейронные сеть, но позволит увеличить допустимый размер сети. Как я писал раньше, для такой оптимизации необходимо, чтобы произведение плотностных чисел, обладало нужным свойством.
            Обучение базируется на том, чтобы корректировать веса с помощью обратного распространения ошибки, который, в свою очередь, требует того, чтобы функция активации была дифференцируема. Вопрос — как это считать в случае с использованием плотностей вероятности?
            При использовании плотностных чисел, функция активации может быть фактически любой, главное чтобы её было легко вычислять. Думаю f(x) = x — в полне подойдёт.
              0

              Не всегда. Докакзана возможность обученич нейронных сетей просто эволюционным алгоритмом. Т. е. помимо градиентных методов можно обучать и без градиентов. Другие алгоритмы могут существовать.

                0
                Абсолютно согласен.
                Более десяти лет назад учил нейронки генетическим алгоритмом довольно успешно, потому что не разобрался в back propagation. Заметил, что последний не всегда качественно обучает.
                Надо делать много подходов — разных сетей, которые по факту инициализируются рандомными весами. По сути генетич. алгоритм.
                Прошло много лет. Повторил дифуры, разобрался в back propagation и другой математике. Видел как рос DeepLearning и развивались методы оптимизации.
                Ой! А что ж это? Dropout! Опять пришли откуда начинали.
                P.S. Мозг это не полносвязная НС. В этом зарыт, я бы сказал, сакральный момент.
              +1
              Искать оптимум в многомилиономерном пространстве параметров нейросети методом дихотомии… Причем для одной итерации обучения каждого веса нужно два раза прогнать всю обучающую выборку через нейросеть. Вы представляете НАСКОЛЬКО чудовищно медленно такое обучение будет происходить?
                0
                Представляю! Но я нигде не упомянул, что алгоритм быстрый, этот алгоритм может оказаться эфективным с точки зрения качества обучения. Так же мною была упомянута оптимизация которая может ускорить процесс обучения, правда я забыл уточнить, что данная оптимизация позволяет значительно упростить и сделать эффективнее процесс расспаралеливания вычислений.

                Как я писал в статье, этот алгоритм не готовое решение, а просто идея и опять же, как указанно в статье, я озвучил идею потому, что если каким то чудом (хотя навряд ли конечно, но всё же) только я додумался до такого алгоритма, в случае если со мной что то случиться, эти знания не будут утеряны. А там глядишь кто то прочитает эту статью и на основе высказанных мною идей придумает что то реально применимое.
                  +1
                  этот алгоритм может оказаться эфективным с точки зрения качества обучения

                  Что такое "качество" обучения, и как вы меряете "эффективность"?

                    0
                    Что такое «качество» обучения

                    То на сколько обученная сеть справляется с поставленными задачами.
                    и как вы меряете «эффективность»?

                    Даю сети работу на которую она была рассчитана, чем меньше ошибок и чем точнее результат, тем эффективность выше.
                      +1

                      Ну то есть на самом деле, ваше "качество" и "эффективность" — это одно и то же, и оба они — это обычная метрика качества (ну не знаю там, RMSE, если у вас задача регрессии).


                      И вы утверждаете, что у вас эти метрики будут хорошими. Насколько хорошими? Будут ли они (заведомо) лучше чем те метрики, которые дают существующие методы обучения? Если да, то почему?

                        0
                        И вы утверждаете, что у вас эти метрики будут хорошими.
                        Покажите пожалуйста где я такое утверждал? Я сказал что он может оказаться эффективным, в начале нужно его реализовать, затем сравнить с существующими решениями. Не нужно путать, я ничего не утверждал.
                          +1

                          Ах, может… ну тогда да, может. Вопрос только, кто готов тратить ресурсы на это "может", учитывая, что теоретического доказательства нет?

                            0
                            А зачем вы мне этот вопрос задаёте? Я кому то предложил это реализовать? Нет! Цитата из статьи:
                            будет крайне плохо если я умру и знания о этих числах уйдут со мной. Поэтому я и решил написать эту статью
                              +1

                              Вроде бы уже выяснили, что в знании об этих числах нет ничего уникального, так что с вами оно точно никуда не уйдет.

                                –1
                                В этих числах нет ничего уникального, уникально здесь их применение для обучения нейронных сетей и даже если такое применение существует, то я о нём не знал и в любом случае должен был написать статью.
                                  –1
                                  я о нём не знал и в любом случае должен был написать статью.

                                  То есть вы считаете, что надо писать статью обо всем, о чем вы не знали?

                                    0
                                    То есть я считаю, что нужно писать статью о том, что может быть полезно.
                                      0

                                      Вот это самое обоснование полезности я пытаюсь из вас достать. Пока оно сводится к "мне кажется, что это может быть полезно".

                                        0
                                        "мне кажется" и я написал статью. По моему мнению если есть идея которая может быть полезна, но это не доказано, то лучше её опубликовать и пусть даже она окажется бесполезной. Если вы с этим не согласны, то это ваше мнение и если вы придумаете хорошую, по вашему мнению, идею алгоритма, но вы не сможете доказать её полезность, то вы можете её не публиковать, я вас за это упрекать точно не буду.
                                          0
                                          По моему мнению если есть идея которая может быть полезна, но это не доказано, то лучше её опубликовать и пусть даже она окажется бесполезной.

                                          Это одна из причин, почему на хабре так много бесполезных статей.

                                            +2

                                            Да ладно вам. Человек написал оригинальный текст о своей идее. Он не перепечатал очередной туториал для новичков, не рекламирует ни курсов, ни свой канал в телеграме.
                                            Возможно он переизобрел велосипед, но в комментариях знающие люди дали ссылки на смежные темы.

                  0
                  Предлагаете взять метод градиентного спуска?
                  0
                  Суперпозиционные числа назовем общепринято — множество (диапазон) чисел. Плотностные числа — это называется распределением вероятности дискретной случайной величины или распределением плотности вероятности непрерывной случайной величины.
                  Эти математические объекты по своей сути — функции, и могут преобразовываться математическими операциями. Если операции дифференцируемы, то решения (результаты преобразования) можно найти аналитически. Там поверхностные интегралы, муть та еще…
                    –1
                    Суперпозиционные числа назовем общепринято — множество (диапазон) чисел.

                    Нельзя назвать суперпозиционное число множеством, поскольку хоть они и похожи, но работа с ними ведётся по разному. Например и у множеств и у суперпозиционных чисел есть термин «разность», но означает совершенно разные операции. С таким подходом комплексное число можно назвать, комплексом из двух чисел, но результатом сложения комплекса из двух чисел — комплекс из четырёх чисел, но результат сложения двух комплексных чисел — комплексное число. Ну и говоря программистским языком — «Суперпозиционные числа и множества — это два разных типа, имеющие одинаковую структуру, но различные функции для работы с объектами данных типов.»
                    Плотностные числа — это называется распределением вероятности дискретной случайной величины или распределением плотности вероятности непрерывной случайной величины.

                    Таким способом можно называть всё что угодно:
                    дробь — отложенное вычисление
                    питьевая вода — соли различных металов растворённые в большом количестве монооксида водорода
                    воздух — газообразная смесь состоящая из кислорода и азота, с небольшим вкраплением водяного пара и иных газов

                    Я не претендую на общепринятость моих названии и написал статью об обучении нейронных сетей, но в статье указал как я пришёл к такому алгоритму, но чтобы в статье постоянно не писать «вот эти вот числа», или «вот те числа что я там раньше придумал», или тем более «распределением плотности вероятности непрерывной случайной величины», я дал таким числам название.
                      +1
                      Например и у множеств и у суперпозиционных чисел есть термин «разность», но означает совершенно разные операции.
                      Сделал поиск в вашей слова «разность», но не нашёл его. Да и вообще математической формализации вашего изобретения тут явно не хватает, поэтому и написал ниже, что «если я правильно понял вашу мысль».

                      Разность можно воспринимать не только как операцию, но и как функцию от двух аргументов. Поэтому вместо того, что изобретать новые числа — можно взять существующие математические объекты и задать (и именовать) для них новые функции.
                        0
                        Сделал поиск в вашей слова «разность», но не нашёл его. Да и вообще математической формализации вашего изобретения тут явно не хватает, поэтому и написал ниже, что «если я правильно понял вашу мысль».

                        Цитата с примерами из статьи:
                        Результатом применения любой унарной операции к суперпозиционному числу, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения унарной операции к любому числу из множества, которое охватывает исходное суперпозиционное число. Например: sin([-pi, pi]) = [-1, 1]. Результатом применения любой бинарной операции над суперпозиционными числами, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения бинарной операции к двум любым числам из множеств, которые охватывают исходные суперпозиционные числа. Например: [-3, 6] — [-12, 7] = [-10, 18].

                        Из этих определений можно понять, что к суперпозиционным числам можно применять такие же унарные и бинарные действия, как и к вещественным.
                        Поэтому вместо того, что изобретать новые числа — можно взять существующие математические объекты и задать (и именовать) для них новые функции.
                        Это очевидно, как и очевидно то, что вычисления с комплексными числами можно сделать и без них, поэтому вместо того, что изобретать новые числа — можно взять существующие математические объекты и задать (и именовать) для них новые функции (это ваша логика). А знаете почему ввели комплексные числа? Потому, что это удобней.
                          +1
                          А знаете почему ввели комплексные числа? Потому, что это удобней.
                          А знаете, почему ввели числа с тремя мнимыми единицами, но не ввели числа с двумя мнимыми единицами? Потому что над числами с двумя мнимыми единицами не получилось построить непротиворечивую алгебру и рассматривать комплексные числа как их подмножество.

                          В математике есть строго определённые критерии, по которым математический объект можно рассматривать как «число».
                        0
                        С таким подходом комплексное число можно назвать, комплексом из двух чисел, но результатом сложения комплекса из двух чисел — комплекс из четырёх чисел, но результат сложения двух комплексных чисел — комплексное число.
                        Но вполне можно определить операцию над двумя комплексными числами, чтобы в результате получить кватернион — комплекс из четырёх чисел. А затем из него можно получить матрицу поворота 3х3 — комплекс из девяти чисел. И придумывать новый тип чисел для всего этого совсем не обязательно.
                      0
                      Если я правильно понял вашу мысль, то суперпозиционные числа в математике давно известны и называются либо векторами, либо многочленами. Ну а вы вправе определять алгебру над такими числами так, как вам вздумается.
                        0
                        Нет вы не правильно поняли, не по строению не по работе, это ни вектор, ни многочлен.
                        +1
                        Достойно уважения то, что вы переизобрели такие понятия, как плотность вероятности и некоторые другие.

                        Но, к сожалению, вы опоздали на пару сотен лет. В нынешнее время более продуктивно сначала изучить то, что изобретено другими, а уже потом изобретать своё. Можно ли поинтересоваться вашим возрастом?

                        Насчёт предложенного вами метода поиска максимума. Рассмотрим одномерный случай, чтобы не усложнять.

                        Так вот, вы имеете функцию sin(x) на сегменте [-4,4] и хотите найти её максимум. Вы делите промежуток на 2 части [-4,0]; [0, 4] и выбираете ту из них, максимум на которой больше. Главная загвоздка данного шага в том, чтобы узнать, какую половину сегмента выбрать.

                        Понятно, что для синуса координаты максимумов известны, но что, если ваша функция неизвестная? Для неизвестной функции вам недоступна операция нахождения максимума на промежутке. Всё, что вы можете — это вычислить значение функции в какой-нибудь точке.

                        Чтобы выбрать промежуток, максимум на котором больше, вам придётся вычислить одно или несколько значений в каких-то точках на каждом из промежутков-кандидатов. Сколько это будет точек? Чтобы точно найти максимум на каждой из половин, надо вычислить значения на всём бесконечном множестве точек.

                        Поэтому ваш метод, хотя и интересен с философской точки зрения, на практике неприменим.

                        Реально работающие методы поиска максимума (например, метод золотого сечения) вычисляют значение функции, руководствуясь определённой стратегией, и постепенно сходятся к максимуму. Критерий эффективности таких методов обычно в том, чтобы решить задачу за минимальное количество вычислений функции.
                          0
                          Достойно уважения то, что вы переизобрели такие понятия, как плотность вероятности и некоторые другие.

                          Зачем вы дали мне статью на википедию, в статье указано что я знаком с этим термином, числа по этому я и назвал «плотностные», от названия плотность вероятности, хотя я и узнал об этом термине после того как придумал алгоритм из статьи.
                          Но, к сожалению, вы опоздали на пару сотен лет. В нынешнее время более продуктивно сначала изучить то, что изобретено другими, а уже потом изобретать своё.

                          Количество знаний накопленных человечеством слишком велико, что один человек мог знать всё. Математика это не основной мой род занятий, с натяжкой можно назвать хобби. Но даже в моём основном хобби, которым является программирование, которым к слову я уже увлечён без малого 20 лет, 6 лет назад мне понадобилась структура с определёнными свойствами и я её изобрёл, а потом оказалось что такая структура была изобретена в 1959 и называется она «префиксное дерево», за 14 лет я читал и смотрел множество учебников, статей, видеороликов по программированию, проходил курсы и нигде никто не упомянул о префиксных деревьях. К тому же эта статья не о плотности вероятности, а про применение её в обручении нейронных сетей. Может кто то уже без меня придумал такой способ обучения, но мне об этом не известно. Если кто-то уже придумал такой подход в обучении нейросетей, ну ладно, одной статьёй больше, одной меньше, зато я буду уверен что если никто ещё не додумался использовать плотность вероятности в обучении нейронных сетей, то эта идея не исчезнет, если со мной, что то случиться.
                          Можно ли поинтересоваться вашим возрастом?
                          31
                          Так вот, вы имеете функцию sin(x) на сегменте [-4,4] и хотите найти её максимум. Вы делите промежуток на 2 части [-4,0]; [0, 4] и выбираете ту из них, максимум на которой больше. Главная загвоздка данного шага в том, чтобы узнать, какую половину сегмента выбрать.
                          Вы не внимательно читали статью, как находить в какой половине находиться максимум, указано (для этого и используются суперпозиционные числа).
                          Понятно, что для синуса координаты максимумов известны, но что, если ваша функция неизвестная? Для неизвестной функции вам недоступна операция нахождения максимума на промежутке. Всё, что вы можете — это вычислить значение функции в какой-нибудь точке.
                          Вы либо очень не внимательно читали статью, либо не смогли ничего понять. Попытаюсь объяснить максимально просто. Все расчёты в функциях ведутся с использованием суперпозиционных чисел. Допустим есть неизвестная нам функция, пусть это будет y = x^2 + 1, а нам нужно найти максимум на участке от 0 до 10, в начале вычисляем y([0, 5]) = ([0, 5])^2 + 1 = [0, 25] + 1 = [1, 26], затем вычислим y([5, 10]) = [5, 10]^2 + 1 = [25, 100] + 1 = [26, 101]. Как мы видим в первой половине значения варьируются от 1 до 26, а во второй от 26 до 101. Поскольку функция нам не известна, мы не знаем в какой конкретной точке находится максимум, но мы точно знаем в какой половине находится максимум, с помощью метода бинарного поиска мы сможем найти если не максимум, то как минимум число очень близкое к нему, что для обучения нейросетей нам и нужно.
                          Реально работающие методы поиска максимума (например, метод золотого сечения) вычисляют значение функции, руководствуясь определённой стратегией, и постепенно сходятся к максимуму. Критерий эффективности таких методов обычно в том, чтобы решить задачу за минимальное количество вычислений функции.
                          Функцию y = sin(x) я брал лишь для примера и простоты объяснения, на практике для обучения нейронных сетей нужно будет искать максимум в функции вида y(x1,x2,x3… xn) = огромное выражение использующие все иксы, не думаю что метод золотого сечения будет эффективней.
                            0
                            в начале вычисляем y([0, 5]) = ([0, 5])^2 + 1 = [0, 25] + 1 = [1, 26], затем вычислим y([5, 10]) = [5, 10]^2 + 1 = [25, 100] + 1 = [26, 101]

                            … и как же вы это вычисляете для произвольной функции? Вот, скажем, для сигмоиды?


                            Поставим вопрос иначе: для ваших "чисел" определены все операции, которые используются в современном машинном обучении?

                              0
                              Поставим вопрос иначе: для ваших «чисел» определены все операции, которые используются в современном машинном обучении?

                              Для суперпозиционных чисел доступны все действия, которые доступны и для вещественных чисел. Вот цитата из статьи:
                              Результатом применения любой унарной операции к суперпозиционному числу, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения унарной операции к любому числу из множества, которое охватывает исходное суперпозиционное число. Например: sin([-pi, pi]) = [-1, 1]. Результатом применения любой бинарной операции над суперпозиционными числами, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения бинарной операции к двум любым числам из множеств, которые охватывают исходные суперпозиционные числа. Например: [-3, 6] — [-12, 7] = [-10, 18].
                                +1
                                Для суперпозиционных чисел доступны все действия, которые доступны и для вещественных чисел.

                                Это утверждение, которое нуждается в обосновании. Точнее, нуждается в обосновании возможность сделать это действие без перебора всего множества.

                                  0
                                  Все действия которые можно производить над вещественными числами, можно производить и над суперпозиционными, по определению. Другой вопрос, что на практике некоторые действия не возможно посчитать, но числа предназначены для обучения простых feedforward нейронных сетей, а там используется только сложение, умножение и действия из функции активации. Изучая нейронные сети, первой функцией активации с которой я познакомился, была сигмоида и возвести e в степень являющуюся суперпозиционным числом — не составляет никакого труда.
                                    0
                                    Все действия которые можно производить над вещественными числами, можно производить и над суперпозиционными, по определению.

                                    По какому такому определению? Вот у вас есть число x=[-1, 1], чему равно 1/x?


                                    Другой вопрос, что на практике некоторые действия не возможно посчитать

                                    Ээээ… так "можно производить" или "невозможно посчитать"?


                                    обучения простых feedforward нейронных сетей, а там используется только сложение, умножение и действия из функции активации

                                    Это какое-то ваше собственное определение "простых feedforward", я так понимаю?

                                      0
                                      По какому такому определению?

                                      Результатом применения любой унарной операции к суперпозиционному числу, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения унарной операции к любому числу из множества, которое охватывает исходное суперпозиционное число. Например: sin([-pi, pi]) = [-1, 1]. Результатом применения любой бинарной операции над суперпозиционными числами, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения бинарной операции к двум любым числам из множеств, которые охватывают исходные суперпозиционные числа. Например: [-3, 6] — [-12, 7] = [-10, 18].


                                      Вот у вас есть число x=[-1, 1], чему равно 1/x?
                                      (-бесконечность,0)(0, бесконечность)
                                      Ээээ… так «можно производить» или «невозможно посчитать»?
                                      Можем ли мы в математическом смысле вычислить выражение TREE(3)*TREE(3) — да можем, а использовать для вычисления в реальных компьютерных программах — нет, не хватит места для хранения в двоичном виде.
                                      Это какое-то ваше собственное определение «простых feedforward», я так понимаю?

                                      Да. Но в различных источниках по которым я изучал нейронные сети, всегда рассматривалась нейронная сеть в которой каждый сигнал поступает на вход каждого нейрона следующего слоя и сигналы умножались на веса, а сумма каждого сигнала перемноженного на вес поступает на вход функции активации, в последствии я изучал и более сложные feedforward сети и у меня почему то отложилось в голове название таких сетей как «простые feedforward», это мой недочёт, но я и не идеален и не претендую на звание лучший писатель.
                                        –1
                                        Результатом применения любой унарной операции к суперпозиционному числу, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения унарной операции к любому числу из множества, которое охватывает исходное суперпозиционное число.

                                        Проблема в том, что 0 входит в множество [-1, 1], но операцию 1/0 производить нельзя. Поэтому ваше определение не работает.


                                        (-бесконечность,0)(0, бесконечность)

                                        Угу. А x/x?


                                        Можем ли мы в математическом смысле вычислить выражение TREE(3)*TREE(3) — да можем

                                        … а точно можем?


                                        Да.

                                        Так вот, даже если принять это определение на веру, то это получится очень узкий (и, прямо скажем, не так уж часто применимый сейчас) класс сетей. Ну и какой тогда смысл?

                              0
                              в начале вычисляем y([0, 5]) = ([0, 5])^2 + 1 = [0, 25] + 1 = [1, 26], затем вычислим y([5, 10]) = [5, 10]^2 + 1 = [25, 100] + 1 = [26, 101]. Как мы видим в первой половине значения варьируются от 1 до 26, а во второй от 26 до 101.

                              Это работает только для монотонных функций. Вычисление же значений произвольной функции на концах отрезка не даёт вам информации о том, в каких пределах она на этом отрезке меняется.

                              Вот пример функции, на которой ваш метод не работает: y=4*x^3 — 3*x, нужно найти максимум на участке [-0.9, 0.9].

                              Следуя вашему методу, делим отрезок пополам, получаем два сегмента: [-0.9, 0] и [0, 0.9]. Вычисляем значения функции на концах. f(-0.9)=-0.21, f(0)=0, f(0.9)=0.21, отсюда делаем ошибочный вывод о том, что функция меняется в пределах [-0.21, 0] на первом отрезке и в пределах [0, 0.21] — на втором. Ваш метод будет искать максимум на правом сегменте [0, 0.9].

                              Но на самом деле максимум находится на левом сегменте, а выводы относительно пределов изменения функции — ошибочны. Можете построить график и убедиться в этом.
                                0
                                Вы не правильно поняли, функция не рассматривается на концах, программист определяет бинарные и унарные операции, а затем в функцию подставляется x в виде суперпозиционного числа, то есть вычисления будут вот такими:
                                4*[0, 0.729] — 3 * [0, 0.9] = [0, 2.916] — [0, 2.7] = [-2.7, 2.916]
                                4*[-0.729, 0] — 3 * [-0.9, 0] = [-2.916, 0] — [-2.7, 0] = [-2.916, 2.7]
                                Но как видно, результат все равно не верный. Но алгоритм обучения нейронных сетей с помощью плотностных чисел всё ещё может быть пригодным для использования, поскольку в конце когда только один вес становиться плотностным числом, ошибка может в результате оказаться не значительной и алгоритм может подстроиться под ошибку. Но всё нужно смотреть на практике.
                            +1
                            есть множество [a, b] и есть некое случайное число x принадлежащее множеству, предположим что если разделить множество на n равных частей, то x имеет некую вероятность принадлежать одной из частей

                            Похоже на это

                              0
                              Действительно похоже.
                              +1
                              Есть ещё интервальная арифметика, тоже похоже.
                                0
                                Это прям один в один суперпозиционные числа.
                                +1
                                По запросу "interval arithmetic neural network" нашлось немного (примерно 2 260 000) результатов. Может, там тоже что-нибудь интересное найдётся.
                                  0
                                  Я гуглил «probability density function neural network» на 5-ти первых страницах ничего интересного нету, в основном построение плотности вероятности с помощью нейросетей, а не наоборот. Хотя найдено 59 700 000 раз.
                                    0
                                    Так а по предложенному мною варианту есть что-то интересное или похожее? Просто я сам нейросетями не увлекаюсь, поэтому и адекватно оценить релевантность результатов не смогу. Другое дело — алгоритмы сжатия изображения/аудио, тут смогу поддержать беседу или даже подкинуть идей) Хотя сам считаю эту тему чересчур избитой, чтобы тратить ресурсы на практическую реализацию.
                                      0
                                      Так а по предложенному мною варианту есть что-то интересное или похожее?
                                      Нашлось нечто похожее на вариант с «суперпозиционными» числами, но чего то похожего на вариант с «плотностными» числами, не увидел.
                                      Другое дело — алгоритмы сжатия изображения/аудио, тут смогу поддержать беседу или даже подкинуть идей)
                                      Я не то, что сильно такой тематикой интересуюсь, просто размышляя над решением одной задачи, я пришёл к алгоритму с помощью которого можно сжимать данные с потерями и в голову сразу пришла мысль о изображениях, аудио, и видео. В реализации алгоритма нет ни каких сложностей, его можно реализовать хоть сейчас, но реализация и испытания займут от недели до месяца, а я в данный момент занят своим компилятором, как допишу его, на своём языке и реализую этот алгоритм и сравню его с jpeg.
                                  +1
                                  Я согласен с MichaelBorisov, что автором изобретено понятие плотности вероятности.
                                  Если уж говорить о «суперпозиции» — тогда лучше рассматривать разложение функции в ряд Фурье.
                                  Просто иногда беда программистов, занимающихся нейросетями и машинным обучением в том, что они не знают основ матанализа.
                                    0

                                    У вас в примере написано "sin([-pi, pi]=[-1,1]". А чему будет равно "1/sin([-pi, pi])". Или "1/[-1, 1]"?

                                      0
                                      (-бесконечность, -1], [1, бесконечность)
                                        0

                                        Вау! Из отношения целого и "суперпозиционного " числа мы получим два "суперпозиционных" числа. Да ещё и бесконечность есть (хотя бесконечность — это не число). А что тогда будет за число, которое записывается в виде следующего выражения: "1/sin((- бесконечность, бесконечность))"?

                                          0
                                          Вау! Из отношения целого и «суперпозиционного » числа мы получим два «суперпозиционных» числа
                                          Получаем одно суперпозиционное число, состоящее из 2 промежутков.
                                          хотя бесконечность — это не число
                                          И что? В математике бесконечность встречается сплошь и рядом, а при обучении нейронных сеть, если функция активации подобрана корректно, бесконечность мы никогда и не получим.
                                          «1/sin((- бесконечность, бесконечность))»
                                          (-бесконечность, 0) (0, бесконечность)
                                            0
                                            1. Значит ваш вид чисел может состоять не просто из промежутка, а из двух, а то и более промежутков. А как, тогда, простите, определяется какие промежутки к каким числам относятся? Никакого дополнительного символа нет, более того, вы сами в статье пишете "числа как олицетворение вещественного числа, находящегося в неком промежутке, а в результате получаем промежуток, в котором может быть результат действий, производимых над числами". Нигде не говорится, что ваши суперпозиционные числа могут состоять из двух или более промежутков. Более того, если мы просто полставляя такие числа в функцию получаем два числа, то классическое определение функции больше не подходит. И это логично, потому что вы не определили в своей арифметике, что будет, если сложить число, состоящее из двух промежутков, с числом, состоящим из одного промежутка. А может ли ваше число состоять из нуля промежутков?
                                            2. На счёт вопроса про бесконечность. Помните, как вы ловко складывали промежутки по своим правилам? А теперь сложите промежутки с бесконечностью с каким-нибудь (1,3) промежутком. Боюсь, что этого сделать невозможно, потому что бесконечность является понятием (число, больше любого наперед заданного, как например для плюс бесконечности). И чтобы применить ваши числа в нейронных сетях нужно не просто уметь их складывать и вычитать, нужно уметь находить производную (от такого хитрого аргумента), функции более высокого порядка, проверить это все на "бумаге", и лишь потом приступать к реализации и моделировании в компьютерах.
                                            3. Удивлён таким способом расчёта. По предыдущему примеру здесь должно было получиться бесконечное число промежутков, но они у вас по какой-то магии слились в два.
                                              0
                                              Значит ваш вид чисел может состоять не просто из промежутка, а из двух, а то и более промежутков. А как, тогда, простите, определяется какие промежутки к каким числам относятся? Никакого дополнительного символа нет
                                              Так я и не пытаюсь ввести в математику новые числа, эта статья об обучении нейронных сетей. Видимо для того, чтобы абстрагироваться от вычислений, мой мозг придумал некие числа, я мог бы вообще не упоминать эти числа, но поскольку в статье я не только написал об алгоритме, но и о том как я его придумал, то я и написал о числах. Поскольку при обучении нейронных сетей не будет возникать ситуаций, когда одно число состоит из нескольких промежутков, никакого символа придумывать не нужно.
                                              Нигде не говорится, что ваши суперпозиционные числа могут состоять из двух или более промежутков.

                                              Цитата из статьи:
                                              Хотя и в суперпозиционных числах, и в плотностных числах может быть сколь угодно много отрезков возможных чисел (например: суперпозиционное число состоящее из 3 отрезков ([0, 1], [20, 40], [100, 101]) ), поскольку я эти числа использую только в контексте обучения нейронных сетей, то всё что я говорю ниже, относиться к плотностным числам которые состоят из 1 отрезка ограниченного 2-мя вещественными числами.


                                              Более того, если мы просто полставляя такие числа в функцию получаем два числа, то классическое определение функции больше не подходит. И это логично, потому что вы не определили в своей арифметике, что будет, если сложить число, состоящее из двух промежутков, с числом, состоящим из одного промежутка.

                                              Вообще то определил, цитаты из статьи:
                                              Результатом применения любой бинарной операции над суперпозиционными числами, это суперпозиционное число, которое охватывает множество чисел, которые могут быть получены в результате применения бинарной операции к двум любым числам из множеств, которые охватывают исходные суперпозиционные числа.

                                              Число состоящее из двух промежутков — ([0, 1], [2, 3])
                                              Число состоящее из одного промежутка — [12, 17]
                                              Сумма чисел = [12, 20]
                                              А может ли ваше число состоять из нуля промежутков?
                                              Нет
                                              На счёт вопроса про бесконечность. Помните, как вы ловко складывали промежутки по своим правилам? А теперь сложите промежутки с бесконечностью с каким-нибудь (1,3) промежутком. Боюсь, что этого сделать невозможно

                                              При обучении нейронных сетей это и не нужно.
                                              И чтобы применить ваши числа в нейронных сетях нужно не просто уметь их складывать и вычитать, нужно уметь находить производную
                                              Алгоритм обучения без вычисления производной уже указан в статье.
                                              Удивлён таким способом расчёта. По предыдущему примеру здесь должно было получиться бесконечное число промежутков, но они у вас по какой-то магии слились в два.
                                              Синус может быть вычислен для любого вещественного числа, но результат всегда будет в промежутке от -1 до 1, а результатом выражения 1/x, где x принадлежит множеству [-1, 1] может быть любое число кроме 0.
                                      +1
                                      Я ещё забыл упомянуть про дельта-функцию, это ещё одно ваше переизобретение. В тексте статьи вы ее назвали f1, стремящуюся к бесконечности в окрестности точки.

                                      К сожалению, для нейронных сетей идея применения матаппарата распределений случайных величин неприменима, как бы не ощущался потенциал.
                                        0
                                        Ваше описание похоже на аппарат нечеткой логики и нечетких множеств. На этой логике также строятся нейронные сети
                                          0
                                          Спасибо за статью.
                                          получится часть, в которых минимальное и максимальное значение функции очень близко к 1, например [pi * 999999 / 2000000, pi / 2],

                                          А как найти границы этой части для [pi * 999999 / 2000000, pi / 2]?

                                            0
                                            А как найти границы этой части для [pi * 999999 / 2000000, pi / 2]?
                                            Функция y = sin (x) выбрана для того, чтобы наглядно проилюстрировать идею. Для того, чтобы находить на этой функции максимум, не нужно делить график на 2 части, мы и так знаем как ведет себя sin x. А тому как находить такие границы уже при обучении нейронных сетей, посвещенно примерно 40% статьи.

                                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                            Самое читаемое