Pull to refresh

Comments 45

А что вы можете рассказать об использовании нейронных сетей для сегментации изображения? Например, разбить captcha на символы?
использовать нейронные сети для распознавания капчи практически невозможно по ряду причин: сети эти не имеют обратной связи между слоями, поэтому на них можно реализовывать пусть и сложный, но всё же линейный алгоритм, поэтому даже небольшой наклон символов сведёт результат распознавания на нет. значительно эффективнее векторизовать капчу и определять символы по шаблону — нейросеть для такой работы непригодна, она работает с битовым образом.
>сети эти не имеют обратной связи между слоями

Я конечно дико извиняюсь, но среди описанных мной архитектур как минимум 2я и 3я даже в моем кратчайшем изложении очевидно содержат обратную связь.
речь идёт об обратной связи не при обучении, а при работе сети — она ведь не имеет никаких обратных связей, а различные самопальные ухищрения непросто сделать по уму и правильно обучить.

images.google.com/images?client=opera&rls=en&q=%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F+%D1%81%D0%B5%D1%82%D1%8C&sourceid=opera&oe=utf-8&um=1&ie=UTF-8&ved=0CCQQsAQwAw&imgtype=i_similar&sa=X&ei=GeF0S4WKGNO-_Qarz-iYCg&ct=img-sim-l&oi=image_sil&resnum=2&tbnid=O15ly5nQjLFK9M:
Я, разумеется, писал об обратных связях и при обучении, и при работе, странно, что из текста статьи это неочевидно — у меня нет ни слова о разделении этих режимов. Как вы себе вообще представляете обратные связи, которые мы учим, но отключаем при работе? Какой в них смысл тогда, зачем их учить?

Да, правильно обучить — не очень легко, чтобы заново вывести формулы для обучения рекуррентного перцептрона по методу RTRL, без многократной развертки сети во времени (как в методе BPTT), я потратил недели две (не смог найти их описанными достаточно подробно для программной реализации), на то, чтобы их улучшить, у меня ушло полгода. Над созданием метода обучения динамической ассоциативной памяти по псевдоинверсному алгоритму, мы работали почти год.

Но я со всей ответственностью утверждаю, что эти архитектуры работают. И если динамчиеская ассоциативная память еще не пригодна для практических применений, слишком много ограничений нам пришлось ввести при ее создании, то рекуррентный перцептрон популярен уже десятки лет, и для задач управления дает результаты, недостижимые при использовании обычного перцептрона без обратных связей. Даже простейшие эксперименты, которые при должном навыке можно провести за полчаса, доказывают это.
На сколько мне известно, нейронные сети довольно часто используются для распознавания образов.
Я конечно извиняюсь, но вы абсолютно не правы. Причем тут обратная связь, когда главная задача — это умение выделять инвариантные признаки для заданного класса изображений, включая инвариантность к наклону, смещению, масштабу и повороту.
И сделать это можно двумя способами — либо на входе поставить жеско заданный (hard-wired) алгоритм выделения инвариантных признаков (например SIFT), а на выходе обучаемую систему (НС как частный случай), либо, что идеалогически красивее, обучать как выделению признаков, так и их классификации.
Другое дело, что ни одним из перечисленных в этой статье типов НС это эффективно сделать не удастся.
И, кстати, в довольно близкой задаче распознавания рукописных символов до сих пор НС держат лидерство.
Разбивать капчу на символы — в принципе можно поломать голову над какой-то специфической архитектурой для этого дела, но ИМХО это не будет эффективно — проще как следует поработать над обычным алгоритмом для такого разбиения. Равно как и для построения признаков распознавания — выделить прямые, их пересечения, закругления всяческие — это лучше не сетью, а вот из такого набора признаков определить, что за буква — тут уже нейросеть будет полезна, и сэкономит время.

Хотя можно построить полноценную систему компьютерного зрения на нейросетях (я себе довольно отчетливо представляю как, но, к сожалению не могу гарантировать, что будет хорошо работать) — но капча тут будет очень незначительным побочным результатом :)
очень простой способ чтения капчи: сверточная сеть + попиксельное смещение окна отображения на сверточную сеть слева направо.
нейронная сеть, состоящая из сотен китайских голов и рук, справляется на ура, мало ест и распознает даже иероглифы.
И всё это, плюс бонус из двадцати индусов, если вы закажете услугу прямо сейчас, достанется вам по цене всего $5 в день за комплект сети!

ниже, у пользователя xiWera классное решение, я даже думал над идеей пару часов
во-первых, хабр сегодня не кормили и он съел мои теги «шутка вкл/выкл», а во-вторых, пользователь xiWera не может быть ниже, он априори высок!
Вообще лит-ра по обработке изображений с использованием нейронных сетей интересна=)
По-моему, можно было и картинки вставить )
Хм… Да, это отличная мысль, сегодня днем постараюсь организовать. Я как-то сконцентриовался на понятности текста, а не статьи в целом.
еще есть сверточные сети, сейчас самое мощное в распознавании образов именно они
Они действительно очень интересны для распознавания изображений, а вот об их успехах в других областях я не слышал…
Вообще о них конечно тоже стоит написать — но я с ними пока не работал и не разбирался толком, так что это на будущее.
в распознавании звуков их тоже с успехом используют. Тут же главное определить методологию свертки.
Здорово! И как я умудрился не заметить эту статью?..
Наконец-то я понял суть сверточных сетей, обучать ядра, которыми мы выделяем признаки — это блестящая идея! Спасибо за этот текст!
В моих экспериментах с нейронными сетями оказался перспективным «алгебраический» метод обучения (я прочитал о нем в какой-то математической статье, хотя не могу быть уверен, что я не переврал то, что там было изложено и не придумал в результате что-то свое). В нем фиксируется какое-то количество входных данных, а затем последовательно перебираются все нейроны. Для каждого нейрона делается предположение, что его выходные данные будут линейно влиять на ответ, откуда задача оптимизации всех весов входящих в него связей становится задачей на поиск минимума многомерной квадратичной функции (в предположении, что погрешность нейронной сети мы оцениваем по сумме квадратов ошибок). К этой функции можно еще добавить разные члены, чтобы придать процессу обучения большую устойчивость. В итоге для каждого нейрона нужно решить некую систему линейных уравнений. В результате нейронная сеть меняется очень быстро, в отличие от метода обратного распространения ошибки (так же известного как движение вдоль градиента с малым шагом). Недостаток метода — решение системы линейных уравнений требует на много больше времени по сравнению с градиентным спуском. В моем случае, генерация обучающих примеров была еще более трудоемкой, так что меня это не волновало, но в других случаях не понятно какой из методов лучше.
Предположение о линейной зависимости выхода сети от выхода нейрона — очень сильное, в общем случае неверное, и имеет какой-то смысл только для перцептронов с малым числом слоев. Возможно, при таком допущении можно получить довольно неплохое начальное состояние сети, но для достижения оптимума нужно двигаться дальше по градиенту.
Т.е. смысл такого метода — ускорить обучение (что, возможно, в некоторых задачах будет полезным), но улучшения качества результата обучения тут ожидать вроде не приходится.
Линейная зависимость здесь подразумевается своя для каждого из входных примеров (вычисляется примерно так же, как и в методе распространения ошибки). Так что преград для достижения оптимума тут нет.
А, ну если так — то можно конечно, но тогда это уже довольно-таки похоже на градиентный спуск. Мы идем по градиенту (т.к. берем линейное приближение), но только не на малый шаг, а сразу в предполагаемый оптимум. Потом повторяем процесс, и так до победы. Правда, могут быть баги с плохой сходимостью — но наверное авторы метода этот процесс исследовали, и как-то их побороли.
Я думаю смысл этого метода в том, что на начальном этапе правильно проинициализированная сеть вся фукнкционирует в линейной области сигмоида, поэтому ее в принципе можно лианеризовать и на первом шаге использовать алгебраические методы настройки параметров. Более того, для каких-то задач этого будет достаточно. Но фишка в том, что НС как раз используются там, где нужны сложные нелинейные преобразования, поэтому в дальнейшем все равно необходимо будет использовать градиентные или эвристические методы.
Почему вы считаете, что это не эвристический метод (а вообще весь этот класс методов называется методы оптимизации)? Нелинейность тут тоже не причем. Градиентный спуск точно так же использует приближение нейронной сети линейной функцией, но в обоих методах чтобы получить эту линейную функцию нужно для начала применить нашу (нелинейную) нейронную сеть ко входам, а затем посчитать производные выходов по каким-либо параметрам (в случае градиентного спуска — по всем весам сети, в случае «алгебраического» обучения — по добавке к входу оптимизируемого нейрона).

Если out_1 — наш выход, out_2 — правильное значение выхода, diff — производная по входу оптимизируемого нейрона, o_1,...,o_n — выходы нейронов предыдущего слоя, dw_1,...,dw_n — добавки к весам нейронной сети которые мы ищем, то я добавляю к сумме (которую я потом буду минимизировать) слагаемое f(dw_1,...,dw_n) = ((o_1 * dw_1 +… + o_n * dw_n) * diff + out_1 — out_2)^2. Значения out_1, out_2, diff, o_1,…, o_n зависят от тестового примера нелинейным образом, так что нелинейность сети сама по себе нисколько не мешает методу.

Проблемы у меня возникали с нейронами, которые постоянно работают в режиме насыщения. Тогда у них значение diff очень маленькое, а значит оптимальные значения dw_i получаются большими. С этим можно бороться добавляя слагаемые const*(w_i+dw_i)^2 призванные удерживать веса сети около нуля.

PS А основная проблема градиентного спуска в том, что в типичных задачах многомерной оптимизации направление градиента и направление на оптимум значительно отличаются (считайте, что между ними 90-epsilon градусов) поэтому сходимость получается очень медленная.
Может конечно я не так понял. Но когда говорится алгебраический, у меня возникает ассоциация с методами линейной алгебры.
Это я к тому, что сигма-функция дифференцируема, но нелинейна. Точнее линейна на определенном своем участке. И вот если вся сеть функционирует только в этих участках, ее можно просто описать в матричном виде и соответственно вычислить значения весов методами линейной алгебры.
Если вся сеть на линейном участке, то ее можно свести к однослойной и большого смысла в ней действительно нет. Поэтому никто так и не делает.

Так что тут методы линейной алгебры используются только для решения симметричной системы линейных уравнений, полученной из задачи оптимизации квадратичной функции и на этом «алгебраичность» подхода заканчивается.
Ну специально сводить тоже смысла нет. Это произойдет в неявном виде в ходе матричных операций. Я вообще имел ввиду, что на начальном этапе обучения многие сети таки функционируют в линейной области.
В любом случае мне нравится ваш ход мыслей, плюсанул. =)
Интересно было бы почитать практику применения разных типов сетей. Типа: задача такая-то, поскольку тип задач такой-то, то сеть будем использовать такую-то, реализацию возмем этакую (например, matlab или еще что готовое), сконфигурирем так-то, получим результат такой-то, сделаем выводы, введем поправку и т.д. + картинки, куда же без них :).
Хм… Я подумаю на эту тему. Проблема в том, что я занимаюсь в основном исследовательскими задачами, а те прикладные, которые иногда попадаются, решаются без сетей (к сожалению, такие уж они по своей сути, нейросети там не к месту).
А про пандемониум Селфриджа можете рассказать? насколько я понял, это тоже вид НС, однако у нас в курсе про него немного было сказано, но выглядит весьма интересно… беглый поиск тоже мало чего дал…
К сожалению, я с этой идеей не знаком. Беглый поиск в инете дал только самые общие сведения — и я в принципе разделяю точку зрения, что в процессе мышления очень большую роль играют ассоциативные связи, переход активности от одного понятия к другому — но это общая мысль. А то, в какой степени она будет работать, зависит от конкретики при реализации — и на эту тему я ничего не нашел, увы. Так что сказать что-либо определенное не могу.
Ок, значит тема еще недостаточно раскрыта, дождусь книжку по НС и попробую подробно разобраться
Прошу прощения за дилетантский вопрос — случайно не подскажете в каких конкретных прикладных областях применяются экспертные системы на основе нейронных сетей? И чем они лучше rule-based экспертных систем?
Нет, я вообще не слышал о таких экспертных системах (впрочем, я не особо интересовался этой тематикой, так что возможно их не так уж и мало). Нейронные сети в экспертной системе — это крайняя мера, основным достоинством этих систем обычно считается прозрачность рассуждений, возможность проверить и, при необходимости, улучшить работу системы просто прочитав последовательность выводов, сделанных ей при решении некоторой задачи.

Однако в случае, если мы сами не можем сформулировать правило, по которому определяется некоторый элемент, из которого потом строится логический вывод — например, если он зависит от множества факторов, возможно не вполне определенных, из которых не удается построить инвариантный признак — применение нейросети для этой цели возможно. Но в таком случаее скорее стоит говорить о подготовке данных нейросетью для последующей обработки экспертной системой.
То есть получается, что если мы работаем с хорошо известной областью знаний и нас больше интересуют сами знания, а не inference logic, которая в конкретной прикладной узкой области знаний стандартна, то нейронные сети — это «пушкой по воробьям», неподходящий инструмент?
Не то чтобы «пушкой по воробьям», просто задачи обычно разные. Если нам нужно получить результат как-нибудь, лишь бы работало — то нейронные сети уместны, если же нам нужно знать, почему именно так а не иначе, важно иметь возможность вручную проконтролировать выводы системы — то нейросеть тут не подходит.
Спасибо, очень интересно. Как я понял, если мы имеем дело с экспертной системой на нейронной сети, то об explanation facility речи быть не может.
Да, это один из фундаментальных недостатков нейросетей. Хотя в принципе немало работ посвящено извлечению знаний из обученных сетей, и некоторые успехи в этой области явно есть — обычно в таких работах как раз рассматривают процесс превращения нейросети в экспертную систему классического вида, и в некоторых случаях получают вполне неплохие результаты.
«Понял, будем искать» :)
Повторно задам вопрос, который не раз встречался Выше — кто может привести конкретный пример практического использования нейронных сетей? Сеть такая-то, задача такая-то, проблемы такие-то, результаты такие-то, результаты используются там-то и там-то… Ну или что-то в таком духе.
Ну, например такая задача: в машине стоят 4 ультразвуковых датчика и один излучатель, по получаемым ими сигналам нужно определить, находятся ли водитель и пассажир в положении, при котором следует открывать подушки безопасности в случае аварии (задача возникла из-за того, что в существенном проценте случаев люди пострадали бы меньше, если бы подушки не открывались).
Имеем на входе 4 графика интенсивности отраженного сигнала от времени, порядка сотни точек в каждом. На выходе — один из 5 классов ситуаций (взрослый/ребенок в нормальном/опасном положении, и отсутствие человека). Замеряно огромное количество примеров, несколько сотен тысяч. Проанализировать сигнал вручную не получилось вообще никак.
Проверено много различных конфигураций 3-4-5-слойных перцептронов, в итоге трехслойный перцептрон с конфигурацией примерно 300-50-5 дал ~98% правильных ответов на независимом тестировании (входов меньше 400, т.к. оказалось, что хвосты измерений можно отбросить без каких-либо потерь). Точнее я сейчас не помню, да и приводить в точности все параметры весьма бессмысленно — в любой реальной задаче нужно пробовать несколько разных конфигураций.
… а, да, результаты, насколько мне известно, стоят на Ягуарах
спасибо — это именно тот пример который я хотел получить
Sign up to leave a comment.

Articles