Pull to refresh

Comments 25

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

Способность нейронных сетей выявлять некоторые зависимости во входных данных (на что, по большей мере, не способны разработанные точные алгоритмы) нашла широкое применение, в том числе и в сжатии данных, в частности — изображений.

Алгоритм, описанный в статье сложно применять в реальных боевых условиях из-за ряда недостатков. Но есть и плюсы. Возможно, кто-то после прочтения статьи проанализирует преимущества и недостатки и решит использовать данный подход для решения какой-то своей задачи.
В институте у меня был похожий дипломный проект. Он так и назывался. Сжатие данных с помощью нейронных сетей. Я уже не помню в деталях, но суть исследования была в определении различных зависимостей от количества нейронов в скрытом слое. Коэффициент сжатия, коэффициент потерь.
Есть достаточно известный конкурс на сжатие 100 мб классических английских тестов (Hutter Prize).
Так вот там уже давно лидируют программы побитового сжатия, внутри которых используется предсказание нейросетью.
Если вы создаете алгоритм сжатия без потери данных, это значит, что вы хотите обучить нейронную сеть на работу без ошибок, т.к. аккуратность работы = 100% Чтобы этого достичь вам нужно провести обучение по всем возможным параметрам входа и затем ждать когда обучение сойдется с коэф. ошибки 0. Если вы хотите сжимать изображение, скажем, 100х100 пикселей, то для этого требуется 2^(100x100) экземпляров для обучения (при условии что изображение ч/б). По-моему, запаритесь обучать :)
Верно говорите, уйдут века. Хотя, нужно будет попробовать и посмотреть на сходимость ошибки.
Я склоняюсь к мысли, что если и применять подобный алгоритм для сжатия без потерь, то стоит наперед знать какие данные мы будем сжимать и передавать. То есть, грубо говоря, нам нужно постоянно передавать 20 изображений. Обучаем сеть и наслаждаемся результатом. НО, если нужно будет передавать еще одно изображение, то сеть может выдать для него неверный результат. С этого следует, что при добавлении каждого нового вектора сеть стоит переобучать.

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

Может я и ошибаюсь, но такую информацию получил от авторитетного источника — человека, который занимался и видел это на практике. Хотя, он человек весьма пожилой и было это, возможно, давненько, но все же было. А может и до сих пор есть, однозначно отрицать это нельзя.
вы не совсем корректно высказались, модели не перестраиваются заново, но действительно строятся годами — а это большая разница. Если комп.время на расчет модели занимает год — такая модель никому я думаю не нужна.
>и затем ждать когда обучение сойдется с коэф. ошибки 0

Не нужно этого ждать, т.к. этого не произойдет. Среди всех возможных образов будет масса представителей белого шума — которые (все одновременно) без потерь сжать невозможно в принципе.
chainik выше уже сказал, что самое место нейросети в предсказании веса символа исходя из каких-либо прочих условий (например контекста). При этом кодером может выступать тотже арифметик.
Нейронная сеть такой архитектуры НЕ обеспечивает сжатие без потерь. Это раз.
Два — нейронная сеть такой архитектуры не факт что вообще дает какое-либо сжатие: требование к точности сигнала в «горлышке» существенно повышается — и если мы кодируем бинарные данные на входе, то при попытке заменить сигналы нейронов в горлышке на бинарные, все сжатие исчезнет.

Подобная архитектура может быть полезна только в одном случае: если нужно передавать данные определенного типа, с некоторыми внутренними зависимостями, которые лень анализировать серьезно. Тогда примененная «в лоб» нейросеть эти зависимости выловит, и сможет использовать для сжатия (с потерями). Но как только мы попытаемся сжать такой системой данные другого типа — то получим на выходе нечто, весьма слабо напоминающее исходный результат.
Сейчас популярен метод Deep Learning, хотя это является методом с потерями.
И еще, забыл написать: на входе вы подаете биты (0, 1), а в скрытом слое у вас действительные числа (double), которые занимают больше места чем булевы.
Подумал о том же. Немного уточню комментарий Irokez'а:
Вы предполагаете, что цепочка такая: 10 бит — 3 бит — 3 бит — 10 бит
На самом деле цепочка такая:
10 бит — 640 бит — 192 бит — 192 бит — 640 бит — 10 бит

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

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

Polosatyi прав. НС в первую очередь полезен будет для сжатия с потерями.
>практической точки зрения интересны два факта – коэффициент сжатия и время сжатия/восстановления.
>Сеть почти 100%-во обучается и отлично функционирует, сжимая данные в 3 раза. "

Сожмите сжатый файл (zip или mp3) в 3 раза :)
UFO just landed and posted this here
Можно.
Сеть обучается с учителем. В качестве алгоритма обучения — метод обратного распространения ошибки.

Обучающая выборка — множество векторов, которые надо сжать. Она состоит из двух массивов векторов. Первый массив — входные вектора, второй — желаемые выходные вектора. Если нам надо просто сжать данные, то эти массивы идентичны (как в примере). (Почему я говорю «просто сжать»? А потому, что подобную архитектуру можно попробовать использовать как альтернативу двунаправленной ассоциативной памяти).

После завершения обучения сеть разбивается на две части — кодер и декодер. На вход кодера подаются данные из обучающей выборки (и не только), выход кодера передается по каналу связи и подается на вход декодера. Декодер восстанавливает исходный вектор.
UFO just landed and posted this here
Посмотрите в сторону FANN — это библиотека, написанная на С, которая имеет интерфейсы на множество языков, в том числе C++, C#, Ruby, Java, Python, Perl, PHP, Lua. Возможно, это то, что Вам нужно.
UFO just landed and posted this here
Интересно. Дайте мне знать, пожалуйста, когда Ваша библиотека увидит свет.

В неочень далеком будущем планирую большой проект с широким использованием нейронных сетей и вопрос производительности стоит на одном из первых мест. Надо бы поискать что-то подходящее, присмотреться и потестировать. Еще есть вариант написать велосипед что-то абсолютно свое, либо распараллелить какую-то из существующих библиотек с открытым исходным кодом.
UFO just landed and posted this here
прикольно с теоретической точки зрения, спасибо, почитал с интересом. Но в реальных проектах всё же вряд ли применимо.
Спасибо. Лично мне было интересно как она проявляет себя на практике, ведь в Интернете ничего по этому поводу нету — повсюду все те же два абзаца.

Ну смотря что Вы имеете ввиду под «реальными проектами» :) Если в проектах компании Google, Microsoft, то да, навряд ли они будут использовать. А если в своем проекте/стартапе, где ключевая роль отводится нейронным сетям, то почему бы и нет. Лично меня очень порадовала скорость работы. Возможно, в совокупности еще с какой-то нейронной сетью они будут давать хорошие результаты. В любом случае, удалось пролить немного света на эту область и тут все еще остается не паханное поле :) Нужно пробовать и экспериментировать.
Sign up to leave a comment.

Articles