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

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

$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)


  1. qrck13
    13.07.2017 00:42
    +2

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

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


    1. Zachar_5
      13.07.2017 01:10
      +1

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


  1. mbait
    13.07.2017 01:12
    +1

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


    1. Zachar_5
      13.07.2017 01:22

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


      1. mbait
        13.07.2017 02:01

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


        1. Zachar_5
          13.07.2017 08:21

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


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


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


    1. AC130
      13.07.2017 10:22
      +2

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


  1. Arastas
    13.07.2017 01:48
    +3

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


    1. Zachar_5
      13.07.2017 08:13

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


      1. Arastas
        13.07.2017 09:44

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


        1. AC130
          13.07.2017 10:23
          +1

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


          1. Arastas
            13.07.2017 13:46
            -1

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


            1. AC130
              13.07.2017 14:25
              +2

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


              1. Arastas
                14.07.2017 02:09

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


  1. daiver19
    13.07.2017 06:15
    +2

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

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

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

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


    1. Zachar_5
      13.07.2017 08:06

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


      1. daiver19
        13.07.2017 08:45
        +1

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


  1. AC130
    13.07.2017 10:31
    +1

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

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

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


    1. Zachar_5
      13.07.2017 11:13

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


      1. Zachar_5
        13.07.2017 11:20

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


    1. Zachar_5
      17.07.2017 00:57

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


  1. Arseny_Info
    13.07.2017 10:41

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


    1. Zachar_5
      13.07.2017 11:02

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


  1. masai
    13.07.2017 11:01
    +1

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


    1. Zachar_5
      13.07.2017 11:06

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


      1. alexeykuzmin0
        13.07.2017 13:22

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


      1. masai
        14.07.2017 10:35

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


        1. Zachar_5
          14.07.2017 12:16

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


  1. mbrdancer
    13.07.2017 12:49

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

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

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


    1. alexeykuzmin0
      13.07.2017 13:23
      +1

      Да, если автор сможет подобный подход применить к какой-то более гибкой модели, это будет офигеть. Будем ждать новых статей цикла!


      1. Zachar_5
        17.07.2017 00:58

        https://habrahabr.ru/post/333382 — новая статья.


    1. Zachar_5
      17.07.2017 01:01

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


  1. kadmy
    13.07.2017 12:58
    +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. Только придется одну итерацию использовать для оптимизации весов одного слоя иначе значения весов расходятся. Это хороший метод ня небольших сетей, так как очень быстро учится, но для больших вычислительная сложность становится такой что градиентный спуск лучше.


    1. Zachar_5
      13.07.2017 13:00

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


      1. kadmy
        13.07.2017 13:13
        +1

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


        1. Zachar_5
          13.07.2017 14:41

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


          1. kadmy
            13.07.2017 14:58

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


  1. a_tito_v
    16.07.2017 11:41

    Уровень современной персептронизации поражает.