Рециркуляционные нейронные сети

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

    Рециркуляционные сети характеризуются как прямым Y=f(X), так и обратным X=f(Y) преобразованием информации. Задачей такого преобразования является достижение наилучшего автопрогноза или самовоспроизводимости вектора X. Рециркуляционные нейронные сети применяются для сжатия (прямое преобразование) и восстановления исходной (обратное преобразование) информации. Такие сети являются самоорганизующимися в процессе работы. Они были предложены в 1988 году. Теоретической основой рециркуляционных нейронных сетей является анализ главных компонент.

    Метод главных компонент


    Метод главных компонент применяется в статистике для сжатия информации без существенных потерь ее информативности. Он состоит в линейном ортогональном преобразовании входного вектора X размерности n в выходной вектор Y размерности p, где p<n. При этом компоненты вектора Y являются некоррелированными и общая дисперсия после преобразования остается неизменной. Совокупность входных паттернов представим в виде матрицы:


    где

    соответствует k-му входному образу, L — общее количество образов.

    Будем считать, что матрица X является центрированной, то есть вектор математических ожиданий µ=0. Этого добиваются при помощи следующих преобразований:


    Матрица ковариаций входных данных X определяется как

    где σij — ковариация между i-ой и j-ой компонентой входных образов.

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

    где i,j = 1,…,n.

    Метод главных компонент состоит в нахождении таких линейных комбинаций исходных переменных

    что


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

    Переменные у, i = 1,…,p называются главными компонентами. В матричной форме преобразование главных компонент можно представить как

    где строки матрицы WT должны удовлетворять условию ортогональности, т.е

    при этом вектор Wi определяется как


    Для определения главных компонент необходимо определить весовые коэффициенты Wi,j = 1,…,p.

    Архитектура рециркуляционной нейронной сети


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


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

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

    Такое представление сети является эквивалентным и характеризует полный цикл преобразования информации. При этом промежуточный слой нейронных элементов производит кодирование (сжатие) входных данных X, а последний слой осуществляет восстановление сжатой информации Y. Назовем слой нейронной сети, соответствующий матрице связи W прямым, а соответствующий матрице связей W’ — обратным.

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

    Восстановление или реконструкция данных происходит при обратном преобразовании информации:


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


    Линейные рециркуляционные сети, в которых весовые коэффициенты определяются в соответствии с методом главных компонент называются РСА сетями.

    Обработка изображений


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

    Пример работы нейронной сети можно увидеть ниже:


    Слева исходное изображение, справа — восстановленное после сжатия. Использовалось окно размером 3 на 3 пикселя, количество нейронов на втором слое — 21, максимальная допустимая ошибка — 50. Коэффициент сжатия составил 0,77. Для обучения нейронной сети потребовалось 129 итераций.

    Исходные коды можно найти здесь (или здесь — более быстрая версия).

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

      –10
      Мне одному показалось, что это идентичные картинки? 0_о
      Даже URL у них совпадает.
        +17
        Вообще, это одна картинка. Просто слева до — справа после
          +5
          А Вы сделайте с помощью нейросети следующее:

          Исходная картинка -> Сжатая -> Восстановленная -> Сжатая ->
          Сжатая -> Восстановленная ->
          Сжатая -> Восстановленная ->
          Сжатая -> Восстановленная ->


          Было бы интересно посмотреть результат
            0
            Да, будет видна специфика добавляемых артефактов, у каждого алгоритма сжатия она своя.
            +2
            Такое ощущение, что справа насыщенней, чем слева.
              0
              Тоже на iPhone сайт смотрите? :)
                +2
                Нет :) LG L1952T
                0
                На highsreen cosmo они одинаковые ))
              +11
              Они склеены в одну картинку. Разумеется URL совпадает.
            +5
            Можно взглянуть на картинки в большем разрешении? Мне тяжело на глаз определить различия…
              0
              Не увидите. Там разница до трех единиц яркости по каждому каналу(из 256).
                0
                Ну тогда не вижу смысла приводить какие-либо картинки. Наверное, нужно изменить задачу обучения для наглядного представления. Нейросеть, как я понял, представляет собой некий «фильтр», работающий в обе стороны… было бы неплохо сделать его более наглядным.
                  +1
                  Нейронные сети бывают разные. В топике я описал рециркуляционные, задача которых сжатие и восстановление информации. При этом, разумеется, важным является потеря данных при восстановлении. То, что изображения не различимы — признак хорошей степени обученности сети.
                    –1
                    Ну это да… но на сжатое изображение можно взглянуть?
                      0
                      Разумеется нет. В сжатом виде это просто информация, которая никак не соотносится с изображением.
                        0
                        Ну возможно как-то визуально оценить потери? А потери есть.
                          0
                          Потери можно оценить по восстановленному образу. Он приведен.
                            –2
                            Ну вот и вернулись к моему первому комментарию — по приведенной картинке это сложно сделать:
                            1. Разрешение низкое.
                            2. Картинки соединены — по размеру даже не сравнить.

                            Реально сделать более наглядно? Выделить области, где потеряна информация, продемонстрировать на изображениях с большим разрешением и т.д.
                    0
                    В данном случае нейросеть работает как архив, перегруппировывая данные. Ухудшение вы получите если плохо ее обучить. А цель автора я так понимаю, как раз и заключалась в том, чтобы доказать наличие возможность сжатия/восстановления информации без больших потерь данных.
                    Смысл ваших просьб показать плохой вариант, лично мне не понятен. Если вас интересует, можно ли это сделать плохо? То ответ да.
                +7
                Справа этот мужчина переодетый женщиной выглядит примерно минуты на две старше.
                  +1
                  Здесь важно просто доверять, а не проверять)
                    +3
                    На глаз видно, что правая картинка как бы чуть чётче (заметно по завиткам сверху).

                    p.s. я правильно понял, что комментарии свелись к обсуждению картинок, т.к. формулы и матрицы в статье никто не понял? :)
                      0
                      В качестве функции активации нейронных элементов F может использоваться как линейная, так и нелинейная функции

                      Не понятно какую функцию активации вы использовали?
                        0
                        Линейную.
                          0
                          Тогда статья скорее про PCA чем про нейросети.
                            0
                            Именно.
                        +1
                        Посжимайте белый шум пожалуйста (ну можно еще и коррелированные случайные поля посжимать при разной корреляции), сразу станет все ясно.
                          +1
                          Господа! Приведенный пример в высшей степени не нагляден.

                          1) Давайте сразу учтем, что уж коль png срабатывает без потерь по этой картинке с коэффициентом сжатия 74%, то нет никакого смысла применять любой алгоритм сжатия с потерями, который отработает хуже (в статье заявлено сжатие 77%).

                          2) Поэтому, предлагаю выложить в комментариях образцы, подвергшиеся сжатию со степенью <20%. Это позволит наглядно оценить характер вносимых алгоритмом искажений, и сделать выводы о пригодности данного алгоритма «в реальной жизни».

                            +2
                            Пока подробно не вникал в суть, но сразу замечания по оформлению:
                            1. Нечитаемые формулы из ворда. (Хотя бы крупнее их сделать, местами линии просто пропали, а лучше нормальные формулы в TeX сделать)
                            2. Кривые отсканированные картинки. (Неужели сложно перерисовать — это 15 минут).
                              +1
                              Хоть и обвиняют русскоязычные блоги в неблагодарности по отношению к автору, но в данном случае всё-таки я бы сделал замечание автору за сильный перекос статьи в сторону ненужных теоретических подробностей.
                              Вместо этого следовало:
                              1. Взять несколько примеров сжимаемых картинок (природа, портрет, рисунок, белый/розовый шум) и ужать их как можно сильнее, чтобы понять как и насколько вылезающие артефакты соотносятся с исходным изображением.
                              2. Объяснить почему для реализации был выбран именно Clojure — не имею ничего против, но почему не Python, C#, Haskell или, простигосподи, Malbolge? С какими сложностями при реализации пришлось столкнуться? Какова производительность в зависимости от размера исходника? Кстати, большой плюс за дублирование реализации на Java — это более user friendly, пока что.
                              3. Прокомментировать свой вклад в тему — то ли он впервые применил рециркуляционные НС для сжатия изображений, то ли просто взял готовый алгоритм и реализовал его на любимом языке.

                              Извиняюсь за наезд, просто сам с детства сталкиваюсь с тем что кроме того что нужно добиться результата, нужно уметь правильно его преподносить.
                                +1
                                И ещё — не мелковаты ли блоки 3х3 пикселя? :) Может стоило наоборот экстремальные варианты взять типа 128х128 и более?
                                  0
                                  Вот еще на тему sparse autoencoders замечательный туториал от Andrew Ng из Стенфорда:
                                  ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial

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

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