Есть много задач, для решения которых нейронные сети прямого распространения с сигмоидальной активационной функцией не являются оптимальными. Например — задачи распознавание бинарных изображений, с первичной обработкой с помощью преобразования Фурье. В ходе этих преобразований изображение становится инвариантным к смещениям, масштабированию и поворотам. Пример таких преобразований приведен ниже.[1] На выходе такой метод выдает вектор комплексных чисел. Современные нейронные сети не могут с ними работать т.к. они работают только с вещественными числами.
image

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

Ряд Фурье

Комплексный ряд Фурье от одной переменной.

image

Но нейронные сети зачастую работают с функциями многих переменных. Предлагаю рассмотреть ряд Фурье от двух независимых переменных. [2]

image

В общем случае следует использовать ряд Фурье для функций от «k» переменных.

image

Архитектура

Рисунок 1. Архитектура комплексной сети (КИНСФ)

На рисунке 1 показана архитектура комплексной искусственной нейронной сети Фурье (КИНСФ), которая по сути реализует формулу 9. Здесь скрытый слой представляет собой матрицу нейронов mxn где m — число дескрипторов разложения Фурье, а n — размерность входного вектора. Веса в первом слое имеют физический смысл частот с наибольшей энергией, а веса второго слоя имеют смысл коэффициентов ряда Фурье. Таким образом, количество входов у каждого нейрона выходного слоя равно m*n, что соответствует количеству коэффициентов ряда Фурье.

На рисунке 2 представлена схема отдельного нейрона скрытого слоя.

Рисунок 2. Схема нейрона скрытого слоя.

На рисунке 3 — схема нейрона выходного слоя.


Рисунок 3. Схема нейрона выходного слоя.

Оптимизация архитектуры

Создание матрицы нейронов предполагает использование больших вычислительных ресурсов. Можно сократить количество нейронов на скрытом слое в n раз. В этом случае каждый нейрон скрытого слоя имеет n выходов, если у нас в сети n входов, то при таком подходе количество связей уменьшается n квадрат раз без потери качества аппроксимации функций. Такая нейронная сеть представлена на рисунке 4.


Рисунок 4. КИНСФ, сведение матрицы в вектор.

Принцип работы НС

Запишем принцип работы данной НС в матричной форме.



Выражение 10 описывает выход скрытого слоя, где: n — размерность вектора входного «x», m — размерность выходного вектора скрытого слоя «y1», f—активационная вектор-функция, j — мнимая единица, w—матрица весов, net1=w*x, k — количество выходов НС. Выражение 11 в свою очередь показывает работу выходного слоя, вектор «y2» получен путем n-кратного дублирования вектора y1. В приложении «А», для наглядности методов реализации, представлен листинг программы, которая работает на основе выражений 10-11.

Сведение задачи обучения, к задаче обучения однослойного персептрона.

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

Модификация КИНСФ для задач распознавания

В задачах распознавания или классификации на выходе нейронные сети необходимо получить, так называемую функцию принадлежности[3], значение которой лежит в пределах, от нуля до единицы. Для ее получения очень удобно использовать логистическую сигмоидальную функцию(Рисунок 5). преобразовав немного нейроны моей сети, возможно получить сеть для распознавания образов. Такая сеть хорошо подходит для распознавания бинарных изображений, обработанных по методу, который указан выше(выражения 1—6). Она принимает на вход комплексные числа, после чего аппроксимирует функцию принадлежности образа к классу.[4]
На рисунке 6 изображен нейрон скрытого слоя, а на рисунке 7 — выходного.

Как мы видим, схема скрытого нейрона не изменилась, чего нельзя сказать о нейронах выходного слоя.


Рисунок 6. Схема скрытого нейрона.


Рисунок 7. Схема выходного нейрона.

Эксперимент

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

Приведение к общему виду выполнялось по алгоритму, представленному выше(1-6). После чего вектор, в случае с КИНСФ подавался полностью «как есть» на искусственную нейронную сеть, а в случае с НС с сигмаидальной активационной функцией, отдельно подавались реальные и мнимые компоненты, после чего вектор распознавался. Эксперимент проводился с использованием двух типов НС. Сеть прямого распространения с сигмоидальной активационной функцией и КИНСФ. Объем обучающей выборки составил 660 векторов разбитых на 33 класса. Программа представлена на рисунке 8.


Рисунок 8. Программа для распознавания рукописного текста.

На сеть с сигмоидальной активационной функцией подаются отдельно реальные и мнимые составляющие комплексного вектора. КИНСФ и ИНС с сигмоидальной активационной функцией обучались с помощью дельта-правила 500 циклов обучения. В результате тестирования 400 изображений КИНСФ выдал точность в 87%, а ИНС с сигмоидальной активационной функцией 73%.

Код

      public class KINSF_Simple
    {
        ComplexVector input; // Вход
        ComplexVector output, //Выход 
                        fOut; //Выход скрытого слоя
        Matrix fL; // Матрица весов первого слоя
        ComplexMatrix C; // Матрица весов второго слоя
        int inpN, outpN, hN, n =0 ;
        Complex J = new Complex(0,1); // Мнимая единица
        
        
        public KINSF_Simple(int inpCout, int outpCout, int hLCount)
        {
            inpN = inpCout;
            outpN = outpCout;
            hN = hLCount;
            // Инициализация весов случ. образом 
            fL = Statistic.rand(inpN, hN);
            C = Statistic.randComplex(inpN*hN,outpN);
        }
        
        
        
        /// <summary>
        /// Вектор-функция активации первого слоя
        /// </summary>
        /// <param name="compVect">Вход</param>
        /// <returns></returns>
        public ComplexVector FActiv1(ComplexVector compVect)
        {
            ComplexVector outp = compVect.Copy();
            for(int i = 0; i<outp.N; i++)
            {
                outp.Vecktor[i] = Complex.Exp(J*outp.Vecktor[i]);
            }
            return outp;
        }
        
        
        
        /// <summary>
        /// Выход первого слоя
        /// </summary>
        /// <param name="inp">Вход</param>
        void OutputFirstLayer(ComplexVector inp)
        {
            input = inp;
            fOut = FActiv1(inp*fL);
        }
        
        
        /// <summary>
        /// Выход второго слоя
        /// </summary>
        void OutputOutLayer()
        {
                List<Complex> outList = new List<Complex>();
                for(int i = 0; i<inpN; i++)
                {
                    outList.AddRange(fOut.Vecktor);
                }
                ComplexVector outVector = new ComplexVector(outList.ToArray());
                
                output = fOut*C;
        }
        
        
        
        /// <summary>
        /// Отклик НС на входной вектор
        /// </summary>
        /// <param name="inp">Входной вектор</param>
        /// <returns></returns>
        public ComplexVector NetworkOut(ComplexVector inp)
        {
            OutputFirstLayer(inp);
            OutputOutLayer();
            return output;
        }
}

Видео работы

Ниже приведено видео работы данной программы, что была в тесте. Записывал его как демонстрацию того, как можно применять ИНС. Сразу извиняюсь за вольное изложение.


Итоги

Преимущества:

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

Недостатки:

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

Дальнейшее изучение:

В ходе дальнейшей работы над этой нейронной сетью планируется: разработать более совершенные методы обучения, доказать сходимость обучения, доказать отсутствие ошибки переобучения для любого количества нейронов на скрытом слое, построить рекуррентную нейронную сеть на базе КИНСФ, предназначенную для обработки речевых и прочих сигналов.

Литература
1. Осовский C… Нейронные сети для обработки информации/Пер. с польского И.Д. Рудинского — М.: Финансы и статистика, 2004.
2. Фихтенгольц Г.М. Курс дифференциального и интегрального исчисления. Том 3. — М.: ФИЗМАТЛИТ, 2001.
3. Заде Л. Понятие лингвистической переменной и его применение к принятию приближенных решений. — М.: Мир, 1976.
4. Рутковская Д., Пилиньский М., Рутковский Л. Нейронные сети, генетические алгоритмы и нечеткие системы: Пер. с польск. И. Д. Рудинского. — М.: Горячая линия -Телеком, 2006.
Поделиться с друзьями
-->

Комментарии (26)


  1. GeMir
    03.02.2017 01:35
    +5

    С формулами на первой, да и на последующих «иллюстрациях» в статье стряслось что-то очень нехорошее.


    1. Zachar_5
      03.02.2017 01:37
      -3

      Я вначале в Word писал, а потом отскринил.


      1. GeMir
        03.02.2017 01:55
        +4

        Очевидно, что так делать не нужно. Ну и так далее.


      1. babylon
        03.02.2017 02:16

        Браво Захар! Очевидно, что над формулами которые Вы привели кто-то сильно подумал. Но разве оптическая сетка не вносит искажения или это где-то учтено в них.


        1. Zachar_5
          03.02.2017 07:00

          Если Вы за формулы 1-6, то это сделано для получения пространства признаков.


          1. MadWombat
            05.02.2017 18:33

            То что библиотека tensorflow умеет обращаться с комплексными числами не значит, что вариант нейронных сетей приведенный автором широко используется.


  1. erwins22
    03.02.2017 10:08

    Tensorflow работает с комплексными числами.


    1. Zachar_5
      03.02.2017 10:28
      -2

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


      1. BalinTomsk
        03.02.2017 19:46
        +1

        Как можно пропустить сеть которaя в основном мировом тренде?

        https://www.tensorflow.org/api_docs/python/math_ops/complex_number_functions


        1. Danov
          04.02.2017 12:39
          +1

          А разве это не просто мат библиотека для работы с комплексными числами?
          Отсюда не следует, что сети в Tensorflow работают с комплексными числами. Например, если комплексное число разбивается на пару (Re,Im) и подается на сетку двумя скалярными переменными, тогда это не работа сети с комплексными числами.


          1. erwins22
            05.02.2017 16:23

            разницы нет…
            Комплексные числа сводятся линейно к вещественным.


            1. Zachar_5
              05.02.2017 18:36

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


              1. erwins22
                06.02.2017 10:01

                Потому, что размерность сетки в 2 раза меньше.

                увеличьте скрытые слои в 2 раза. (а лучше в 2 и еще попробуйте в !,4)


                1. Zachar_5
                  06.02.2017 15:32

                  Тогда возникнет ошибка переобучения. Но я по пробую.


                  1. erwins22
                    07.02.2017 14:17

                    Будет интересно почитать ваши результаты.
                    Ждемс.


                    1. Zachar_5
                      07.02.2017 16:00

                      Да Вы правы, точность возросла, но все равно не так: она стала от 79% до 84%, а там на разных тестах от 78% до 93%. Выборку и количество циклов и начальный шаг не менял.


  1. devpony
    03.02.2017 10:47
    +8

    Вы показали нам формулу разложения функции в бесконечный (!) ряд Фурье, потом показали нам обычный однослойный перцептрон с экспоненциальной функцией активации и утверждаете теперь, что «сеть работает на основе ряда Фурье». Нет, не работает.

    1. Почему вы показываете нам бесконечный ряд, когда ваша сеть обладает конечным набором параметров?
    2. Где доказательство, что коэффициенты сойдутся к коэффициентам ряда Фурье? (Подсказка: не сойдутся)
    3. Почему в статье полно формул, которые вообще ничего не значат и нет ни одной важной, например формулы инициализации весов?

    У вашей сети и ряда Фурье из общего только значёк экспоненты. По факту это традиционный однослойный перцептрон с очень плохой функцией активации. К слову, комплекснозначная сеть полностью аналогична такой же вещественнозначной в два раза большего размера. А привычная CNN решила бы вашу задачу распознавания на 99%.


    1. Zachar_5
      03.02.2017 11:02
      -3

      1) CNN нужно около 1000 образов на класс, так же CNN не имеет расчетных формул и ее архитектура подбирается эмпирически.
      2) Если расписать уравнение этой сети, то Вы получите ряд Фурье для многих переменных.
      3) Так же я писал, что сеть не доработана. И сейчас я занимаюсь ее доработкой.
      4) Сигмоидальная функция в другой модификации, а в первой ее нет. И первая работает так же как и ряд Фурье.


      1. devpony
        03.02.2017 11:36
        +4

        Вот ваша сеть:

        huynya

        (почему я, а не вы сделали эту картинку?)

        Вот разложение функции в ряд Фурье в L2:

        image

        Где коэффициенты, к слову, определяются единственным образом как скалярное произведение функции на элементы базиса. Если честно, даже отдалённого сходства не вижу.

        Но… даже если бы сходство было… У вас сумма конечная, у ряда Фурье — бесконечная. К каким именно по счёту членам ряда сойдутся ваши коэффициенты? К первым? Почему? Почему не к сорок второму? Почему в ходе оптимизации коэффициенты сойдутся к аналитическим? Похожесть (и даже одинаковость) формул этого не гарантирует и не может гарантировать.


      1. erwins22
        03.02.2017 11:39

        Сделайте на tensorflow,

        там уже есть все необходимые функции.


        1. Zachar_5
          03.02.2017 17:48

          Спасибо за наводку, у меня есть проект на C#, я могу туда подключить tensorflow? А то писать свою CNN слишком накладно.


          1. erwins22
            03.02.2017 18:57

            Там это есть. Буквально 10 строк взять из примера


    1. babylon
      05.02.2017 19:35

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


  1. Halt
    03.02.2017 17:17

    Но зачем картинки если на хабре уже давно работают формулы? Имхо, выкладывать статью в таком виде — проявлять неуважение к читателям.


    1. Zachar_5
      03.02.2017 17:44

      Я извиняюсь за такой вид! Не умею верстать в этом редакторе. Если подскажете как загружать doсx или pdf файлы — будет здорово. Но я не нашел.


  1. Gryphon88
    05.02.2017 18:40

    Извините, а откуда следует TRS-инвариантность, если мы используем классическую матрицу с квадратным пикселом? Насколько я знаю, совсем наоборот (Glenn D. Boreman "Modulation Transfer Function in Optical and ElectroOptical Systems", SPIE, 2001)