Метод безытеративного обучения однослойной сети прямого распространения с линейной активационной функцией

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

    Перспективы безытеративного обучения нейронных сетей очень велики, это, потенциально, самый быстрый способ обучения НС. Начать цикл работ по безытеративному обучению я хочу с самого простого случая(где упрощать уже некуда). А именно, с однослойной сети прямого распространения с линейной активационной функцией, взвешенного сумматора. Функция ошибки для одного нейрона задана как:

    $f_{los}(W)=\sum_{i=1}^n[y^i-(\sum^m_{j=1}w_j\cdot x^i_j)]^2$


    Где $W = \{w_1,...w_k\};$, m — количество входов в нейронной сети, n — мощность обучающей выборки, которая состоит из пар: выходного идеального значения «y» для каждого нейрона и входного вектора «x». Так же стоит отметить, что обучать каждый нейрон можно по отдельности.

    Сеть будет обучена, если: $f_{los}(W) \rightarrow min$, т.е. если ошибка будет минимальной.

    Учитывая, что функция активации линейна, а уравнение функции ошибки квадратичное, то очевидно что максимума такая функция не имеет, а следовательно условие при котором $\frac{\partial f_{los}(W)}{\partial w_i} = 0$, это условие минимума. Давайте для начала определим эту производную и приравняем её к 0.

    $\frac{\partial f_{los}(W)}{\partial w_k} = -2\cdot \sum_{i=1}^{n}(y^i-\sum _{j=1}^mw_j\cdot x_j^i)x_k^i = 0 ;$


    После ряда преобразований получаем:

    $\sum_{j=1}^m(w_j\cdot \sum_{i=1}^{n}x_j^i\cdot x^i_k)=-\sum_{i=1}^{n}x_k^i\cdot y^i;$


    Где k — номер уравнения в системе.

    Для завершения обучения нам нужно рассчитать вектор весов W. Не сложно заметить что последнее выражение, если его записать для каждого уравнения, представляет собой СЛАУ относительно W. Для решения этой системы я выбрал метод Крамера(метод Гаусса быстрее работает, но он не такой наглядный). Каждый вес нейрона можно записать как:

    $\\w_j=\frac{det(A_j)}{det(A)}; \\A= \begin{pmatrix} a_{11} ..... .... a_{1m}\\ ..... ....\\ .. ... .. ..\\ a_{m1} ..... .... a_{mm} \end{pmatrix}; \\B=\begin{pmatrix} b_1\\ ..\\ ..\\ b_m \end{pmatrix}; \\a_{kj} = \sum_{i=1}^nx_j^i\cdot x^i_k; \\b_k = -\sum_{i=1}^ny^i\cdot x^i_k;$


    Здесь матрица $A_j$ это матрица «A» в которой j-й столбец заменен на вектор B. Это обучение одного нейрона, в силу того, что нейроны никак не связаны между собой можно обучать их параллельно, независимо друг от друга.

    P.S. Если есть замечания по статье, пишите, всегда рад конструктивной критики.
    Поделиться публикацией

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

      +2
      Во первых это не персептрон, по определению. Perception должен порождать двоичную классификацию входных данных: либо данные принадлежат к какому-то классу, либо не принадлежат. Ну либо у нас нет уверенности в классификации и тогда на выходе что-то посрединке между 0 и 1.
      По этому линейную функцию активации ну просто никак нельзя использовать. Можно использовать либо ступенчатую функцию, либо сигмоид, либо что-то аналогичное.

      Ну а систему уравнений вы решили да, правильно. Только к нейронным сетям это не имеет отношения.
        +1

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

        +1

        А разве решение СЛАУ не будет итеративным? Вообще, о каких итерациях идёт речь? Если взять размер mini-batch равным размеру всей обучающей выборки, это будет считаться безитерационным обучением?

          0

          Имеется ввиду, что методы оптимизации итеративно приближают ошибку к минимуму, т.е. на каждой итерации алгоритм все ближе подходит к минимуму и в общем случае не достигает его. При решении СЛАУ методом Крамера мы сразу получаем значения весов которые приводят в минимум, т.е. при первой прогонки алгоритма.
          На слайде показано обучение 2-х слойной НС, зависимость ошибки от итерации.
          image

            0

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

              0

              "Хорошо, а чем ваш подход лучше?" — не знаю, возможно, что ничем. Как протестирую напишу. Просто была идея, я ее описал и все. Для небольшого кол-ва входов ожидается бОльшая скорость обучения и возможно, обучение будет точнее.


              "Метод Крамера это самый неэффективный метод." — я знаю, я в статье написал, что метод Гаусса лучше.


              Хотя там ожидаются матрицы 5х5, 10х10, думаю, и Крамером нормально будет. После тестирования отпишусь.

            +2
            А зачем брать мини-батчи? Коэффициенты СЛАУ можно же посчитать сразу по всей выборке, это просто операция суммирования. Решение СЛАУ будет итеративным если размерность пространства фич m будет большой. Если она маленькая, то можно использовать LU разложение.
            +3

            Вы изобретаете заново метод наименьших квадратов в задаче линейной регрессии. Почему, кстати, у Вас матрица A квадратная?

              0

              Квадратная т.к. оба индекса j,k "пробегают" значения от 1 до m. Где m — кол-во входов. k — количество уравнений в системе.

                0

                Хорошо. А почему число уравненийй от 1 до m, а не до n?

                  +1
                  Для нахождения m коэффициентов \omega_k нужно m линейных уравнений.
                    –1

                    Хорошо. А что с остальными n-m уравнениями? Просто отбросим и не будем учитывать содержащуюся в них информацию?

                      +2
                      Простите, их там нет. Автор берёт m производных таргет-функции по \omega_k, приравнивает каждую к 0 и получает таким образом ровно m линейных уравнений. Если вы знаете способ добавить дополнительные уравнения, то опишите его, пожалуйста.
                        0

                        Все, я увидел, он эти данные включает внутрь коэффициентов матрицы. Непривычная мне запись.

              +2
              А именно, с однослойной сети прямого распространения с линейной активационной функцией, взвешенного сумматора.

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

              Ну и да, вы вроде собрались строить в памяти матрицу всех входных данных (N^2, на секундочку) да еще и решать её потом, а это O(n^3) для метода Гаусса.

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

                1) Таких решений для множественной регрессии я не видел(если есть скиньте ссылку на статью).
                2) Тут N — это не мощность обучающей выборки, а количество входов, если их около 10, то метод может работать быстрее градиентных.
                3) Да это с трудом можно назвать нейронной сетью, просто в дальнейшим планирую писать про обучение с разными ф-ями активации. И отдельно рассмотреть сверточные слои. Просто нужно было от чего-то отталкиваться. А это самый простой пример, не более того.

                  +1
                  Я тоже много каких решений не видел, но это же не значит, что они эффективны. Неn, если вы придумаете быстрый метод обучения НС, то будет здорово. Но это явно не то. Регрессия должна эффективно работать с большим количеством весов и кубическая сложность даже от веса — это слишком много (я уже молчу о динамическом обучении). А вот расширить этот метод для НС вряд ли выйдет.
                +1
                Не буду высказывать свои сомнения по поводу вашего метода, выше уже отписались, и я полностью согласен что пока это просто регрессия. Надеюсь, в будущих публикациях тема раскроется.

                Пока немного позанудствую по формулам:
                1) В выражении для ошибки вы написали сумму от i до m, а не от 1 до m.
                2) В том же выражении: если вы используете индекс i для точек выборки и пишете его при переменной x сверху, то можно и при переменной y писать его сверху.
                3) В выражении для производной вы берёте производную не по \omega_j, а по \omega_k.

                Спасибо! Жду следующую статью.
                  0

                  Спасибо за замечания, сейчас исправлю.
                  1) Опечатка.
                  2) Тут i означает i-й вектор x. A "y" число, но лучше действительно так, тут просто цель была показать что y_i не вектор, а число.
                  3) В тетради, где выводил, было \omega_j, а когда начал переписывать, подумал, что индекс j занят и написал k.

                    0

                    Да, понял, про что Вы. Я там писал k, потом видно, когда перепроверял изменил на j.

                    0

                    https://habrahabr.ru/post/333382 — следующая статья.

                    0
                    Итеративное обучение на основе градиентного спуска позволяет обучаться на любых больших наборах данных благодаря мини-батчам. Не надо рассматривать итеративность как недостаток.
                      0

                      Так тут тоже коэффициенты матрицы рассчитываются по большим наборам данных.

                      +1

                      Погуглите «нормальное уравнение» — это одна формула в явном виде для решения вашей задачи (линейная регрессия с наименьшими квадратами).

                        0

                        Да, но там везде функция ОДНОЙ переменной, здесь же многих. Как я писал выше, если есть такое решение, то скиньте мне статью/учебник, в общем, то где она описана.

                          0
                          У нас такое было много лет назад на лекциях Воронцова. Вот методичка: pdf. Читайте параграфы 5.1 и 5.3.
                            0

                            Неважно, сколько там переменных, формула не меняется. Вот статья с объяснением.

                              0

                              Спасибо! Интересная статья, решили они по другому, но смысл тот же.

                          0
                          Независимо от того, что СЛАУ решено катастрофически неоптимально (ну и пусть, можно же решение заменить потом, это техническая деталь), я все-таки принципиально не вижу потенциала для реализации безытеративного обучения.
                          Вот взята задача, эквивалентная линейной регрессии с квадратичной функцией потерь. Известно, что с точки зрения оптимизации она выпуклая, поэтому мы и можем применить решение СЛАУ и «обучить» такую модель в один проход.

                          Проблема-то в том, что принципиально подавляющее большинство современных моделей невыпуклые для оптимизации. За пределами технических подробностей, как мне кажется, не освещена главная деталь: где в описываемом методе ресурс для безытеративной оптимизации (многомерных, но это не слишком важно) невыпуклых задач? Машинное обучение тут ни при чем — это вопрос из методов оптимизации. Намек: итеративные методы существуют не от хорошей жизни…

                          Впрочем, если на этот вопрос у автора есть ответ, — пожалуй, я буду с нетерпением следить за его публикациями. Нобелевки по математике нет, но есть куча других не менее достойных премий.
                            +1
                            Да, если автор сможет подобный подход применить к какой-то более гибкой модели, это будет офигеть. Будем ждать новых статей цикла!
                            0

                            Я не собирался решать СЛАУ, просто показал на простом примере откуда взялся вектор B и матрица A, что будет использовано в дальнейшем. Про использование вектора B я написал тут: https://habrahabr.ru/post/333382

                            +1
                            Добрый день, статья хорошая, только надо было сначала это реализовать а потом писать. Сделаю несколько замечаний.
                            1 Учесть нелинейную функцию активации в данном случае очень просто, например если используете гиперболический тангенс — нужно просто взять арктангенс от выходных данных.
                            2 Если y= W*X то W = y*pinv(X). pinv(X) — это псевдообратная матрица она не обязательно квадратная и всегда имеет единственное решение для любого X. Если X'*X невырожденная — то pinv(X) = (X'*X)^-1*X'
                            3 Решение эквивалентно поиску минимума методом наименьших квадратов, но это хорошая идея для многослойных сетей, а для однослойной нет. Если вы просто сложите все данные по классам (для mnist все единички, двоечки и т.п) и используете эти данные в качестве весов то получите после нормировки лучший результат.
                            4 И самое интересное — расширить этот метод на многослойные сети можно. Только дляучета нелинейности без итераций не обойтись. Просто в методе градиентного спуска там где идет умножение на выходные значения слоя исользуйте pinv. Только придется одну итерацию использовать для оптимизации весов одного слоя иначе значения весов расходятся. Это хороший метод ня небольших сетей, так как очень быстро учится, но для больших вычислительная сложность становится такой что градиентный спуск лучше.
                              0

                              Спасибо за дополнение! Тут проблема в другом нужно доказать, что производная равна нулю в минимуме.(это я про нелинейные ф-и)

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

                                  Если ф-я ограничена сверху и снизу, то 0 производной будет как в минимуме, так и в максимуме.

                                    0
                                    В случае такой функции конечно. Я имел в виду функции у которых обратная имеет единственное значение на всей области определения, монотонно возрастающие или убывающие например tanh или 1/(1-e^-x). relu и пороговая не подойдут, так как если попасть в точку где производная равна нулю то вообще непонятно в какую сторону веса изменять.
                              0
                              Уровень современной персептронизации поражает.

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

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