Pull to refresh

Comments 57

Только из-за такого материала еще не самоликвидировался отсюда.
Это материал обычной лабораторки второго курса университета.
Неужели большинство людей становятся способны осознать это только ко второму курсу? o_0
UFO just landed and posted this here
UFO just landed and posted this here
Да, помню фигачил в матлабе такие штуки. Клёвые времена!
Мне всегда казалось, что нейронные сети для распознавания — тупиковая ветвь.

Т.е. поначалу прогресс хороший, но наступает момент — и сколько не бейся — результат лучше не станет, оставаясь хуже классических систем. Потому реквестирую сравнение качества распознавания с боевыми алгоритмами )
Какие, например, боевые алгоритмы? НС — вообще попытка копировать модель мозга человека, просто может она еще не так точно аппроксимирует наш потенциал и возможность на своем этапе развития.
Сейчас более модно использовать Condition Random Field их преимущество перед нейронными сетями в том что они сходятся к глобальному минимуму, и так же могу обучатся для предсказания любой структуры. НС редко успешно применяется на практике.
UFO just landed and posted this here
Существуют эвристические методы обучения сети (ГА, имитация отжига, напр.), которые также при правильной настройке дают схождение к глобальному экстремуму.
ГА — вообще ничего не гарантирует. имитация отжига — это метод, который в некоторых случаях избегает лок. минимумов, но тоже ничего не гарантирует.
Почему же не гарантирует? Если, к примеру, имеется 10 генов с 4-мя (опять же к примеру) возможными значениями, то можно с уверенностью сказать, что генотип в популяции из 10^4 (т.е. 10000) особей в любом случае будет содержать «правильные» значения всех генов, но разбросанные по разным особям.
Написал на вскидку — где-то на Хабре было четкое с точки зрения комбинаторики обоснование. Суть в том, что зная количество значений каждого гена всегда можно всегда определить величину популяции, при которой мы обязательно попадем именно в глобальный экстремум (если он один; если не один, то ситуация еще проще).
Другое дело, что с практической точки зрения получаемый таким образом размер популяции может быть неприемлем. В ту же степь и случай кодирования генной информации «флотАми». Там либо спускаемся до разрядности представления дробного числа, либо условимся о точности (о квантовании по уровню). Но суть остается та же.

«Отжиг», думаю, тоже у каждого свой. Кто-то настраивается на «шоб работало», а кто-то хочет гарантии.
Согласен, попытки избежать локальных минимумов — это то еще удовольствие. У нас на мехмате к НС относились как к лженауке. Недавно в Науке 2.0 было обсуждение кризиса в разработке искуственного интелекта. Так что лучше заниматься какими-то более реальными вещами.
Я лично не считаю ИНС «не реальным» инструментом. Например, систему диффернциальных уравнений в Форме Коши (мат. модель динамической системы) можно представить в виде однослойной рекуррентной сети.
ок, почему не нравятся, старые добрые численные методы?
дабы прояснить мою точку зрения: я не против НС, и я абсолютно согласен, что с их помощью можно решать огромный класс прикладных задач. Вопрос в том, можно ли решать с их помощью задачи, для которых не разработаны классические алгоритмы решения?
В качестве плюсов использования ИНС могу указать следующие:
1) унифицированный подход к решению широкого класса задач;
2) возможность построения системы управления со свойствами робастности (устойчивость к возмущениям) и избыточностью (информационной и функциональной).
3) из п. 1 и 2 получаем возможность унифицированным образом строить системы управления сложными объектами, устойчивую к возможным возмущениям (измерительному шуму), отказам и обладающую универсальными аппроксимирующими свойствами.

Там, где не нужно точное аналитическое решение (или его не существует вовсе), ИНС позволяют с заданными точностными характеристиками (достаточными) найти решение, пригодное для практического использования.
Например, Support Vector Machines, AdaBoost?!
Нейронные сети были разработаны 50 лет назад, из них всё выжали в то же время. И с тех пор не придумали ничего нового.
Нейронные сети — это прошлый век, у них нет будущего.
У сетей 50 летней давности — очень может быть.

Но есть массы модификаций. Например, люди пытаются сделать нижние слои фиксированными, имитируя в них операции реально происходящие в зрительных нейронах. Или строят сети, которые выдают характеристики более-менее инвариантные относительно разных аффинных преобразований. Полученные сети вполне конкурируют с наилучшими алгоритмами.
Это простите почему у них нет будущего?
Не говорите, иногда для распознавания капчи нейронная сеть в моей голове пасует. Наверное, нейронов мало :)
UFO just landed and posted this here
Было бы интересно почитать не про использование готовых шаблонов матлаба, а про создание нейронной сети. Но автору все равно спасибо, что затронули тему
Давно еще делал НС на С#. До конца не довел из-за нехватки времени. Постараюсь сдуть пыль со своего проекта и осветить, что сейчас уже проделано в мире.
Вам 22 года, какой, нафиг, «давно», и какая, к черту, «пыль»?! -)
Ну я относительно своих 22 лет и оперирую временными понятиями.
Скорость оседания пыли возрастает по мере увеличения диаметра пылинок. Время оседания пылинки диаметром 0,05 с высоты 1 м, равняется 320 часам, а пылинка размером 1 u этот же путь проходит за 3 часа, а частички диаметром 100 u оседают в течение 3 секунд. Поэтому в воздухе, попадающим в дыхательные пути находится относительно мало частичек диаметром больше 10 u.
UFO just landed and posted this here
я бы сказал, что было бы интересно почитать, про методы оптимизации структуры самой нейронной сети. Потому что сейчас это просто тыкание пальцем в него.
На Хабре уже была статья про эволюционные метода настройки весов НС. Я сам этой идеей заразился (применительно к задачи решения переопределенных СЛАУ). Результаты уже есть — так что ГА + ИНС это работающая связка.
UFO just landed and posted this here
Очень, а то буквы уже достали )
Я сейчас для диплома написал на C# движок для нейронок и для генетических алгоритмов(для обучения). Как будет время после сдачи диплома, обязательно попробую эту задачу. Выложу свои результаты и наверное сам пакет с движком. Вообще результаты показывает неплохие, но у меня кол-ко входов гораздо меньше.
Кое-что об ошибках. При обучении обычно полезно контролировать две ошибки
1) ошибка обучения (это ошибка при распознавании образов из обучающей выборки)
2) ошибка обобщения (это ошибка на незнакомых данных, т.н. тестовая выборка) — гораздо более важный параметр, который показывает чему же в конце концов мы научили сеть.

Почти всегда рост числа нейронов снижает ошибку обучения, вплоть до переобучения (паралича сети), но одновременно с её снижением в определенный момент начинает расти ошибка обобщения — это и есть оптимальный размер сети. В вашем случае растет именно ошибка обучения, что противоречит теории — видимо дело в матлабе, неверном типе данных, или еще в чем то, сложно сказать, но это — аномалия техногенного характера. Точно.

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

1) Экстенсивный, вместо одной сети использовать их комитет — чем он больше тем ниже будут обе ошибки.
2) Интенсивный — использовать другую топологию, например сверточные нейросети.
3) Если свойства объекта могут быть проанализированы аналитически использовать не нейросети, а подходящий под задачу более адекватный алгоритм: дерево решений, сингулярный анализ (или метод главных компонент), преобразование фурье (спектр) и т.д.
Глянул файл characters.mat. А почему размерность алфавита 48 на x? Судя по статье должно быть 35 на x.
Это файл сохранен с MATLAB 7.5, я в программе учитываю это.
Например, в 2011 Matlab (7.12): ALPHABET — 35x26 matrix of 5x7 bit maps for each letter. TARGETS — 26x26 target vectors.
Поскольку занимаюсь с нейронными сетями обнаружил небольшую закономерность: в качестве примера их использования в подавляющем большинстве случаев(>97%) используют задачи распознавания и предсказания, которые имхо несколько оторваны от практики. Не кого не критикую, просто небольшое наблюдение.
а какие методы использования НС более практичны?
Хороший вопрос, на который, я думаю, ни у кого нет ответа. Лично пытаюсь их применить к задаче управления динамическими объектами.
Странно спрашивать об универсальном методе где он более практичен?
Везде, но в разной конфигурации.
я бы предположил что управление действиями npc-персонажей в играх.
Прочитал краткую теорию нейросетей по ссылке в конце статьи. Если я правильно понял, то суть этих нейросетей в том, что у нас есть много однотипных устройств (нейронов) с простой логикой работы и вместо того, чтобы соединять эти устройства следуя логике (как это делают при обычном программировании), мы берём входные данные, требуемые выходные данные и настраиваем сеть так, чтобы на входных данных получалось что то похожее на нужные выходные данные. Здесь главное, чтобы этими нейронами можно было, в принципе, реализовать любую функцию.

Почему бы не заменить нейрон устройством «nand-gate», известным в программировании FPGA (nand это булева функция: nand(a, b) = not(and(a, b)))? Сеть из nand-ов может реализовать любую функцию, потому что из композиций nand можно построить любую функцию. В этом случае получится FPGA (или ПЛИС, по нашему) — схема которую можно перепрограммировать самому. Почему тогда для программирования FPGA не используют подход нейросетей, а программируют как обычно? Наверно потому что подбирать параметры соединений FPGA слишком долго. Вот поэтому мне кажется, что решить какую либо задачу проще обычной программой, а не нейросетью.

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

По поводу построения сети:
Функция активации — вообще тема для отдельной статьи, но, хотя бы, привести несколько других можно было бы.
Кол-во скрытых слоев — «возьмем один», а почему 1?
Кол-во нейронов подберем в ручную…
Я конечно дико извиняюсь, но я на вступительной работе в бауманку делал распознавание рукописного ввода с автоматическим определением параметров нейросети с самостоятельным написанием всего и вся на дельфи.
А тут — человек просто нашел в матлабе модуль для работы с нейросетями, толком не разобрался с самими НС и сделал «проект» за 10 минут и решил это запостить.
Либо рассказывайте почему вы делаете так, а не иначе(сравнительный обзор, например), либо приведите интересную реализацию. Распознавание печатного текста уже было неоднократно.
Присоединяюсь…
Нейронные сети были разработаны 50 лет назад, из них всё выжали в то же время. И с тех пор не придумали ничего нового.

50 лет на мой взгляд нормальный срок (это еще не давно). В науке все небыстро. А вот про «выжали» не согласен. Как раз нет твердой методологии по проектированию структуры сети. И здесь, на Хабре, требовать сухого теоретического обоснования не нужно. Но хоть какое-то обоснование хотелось бы увидеть.
И ГА и ИНС еще недостаточно обоснованы с теоретической точки зрения, но они работают. А чего больше надо «практику»?
Забыл про «приведение входов». Да это очень важная тема. В цифровой обработке сигналов в этом плане легче — всегда есть максимум и минимум на выходе датчика. Нужно лишь поточнее их определить или взять с запасом. А вот в распознавании все посложнее. Если автор напишет свои соображения по этому поводу, будет хорошо.

Про функцию активации — пробовал обучать ИНС с сигмоидом во входном слое (сетка для решения СЛАУ) и ничего толком не вышло. Заменил все на чисто линейную функцию и замечательно обучается, но ведь это уже не интересно. Что за сеть без нелинейных функций активации? Если по этой теме кто-то отпишется, тоже буду очень благодарен.
1) Почему один скрытый слой?
Ну, начнем сначала, почему он вообще там есть. Из теории известно, что нейронная сеть, которая состоит всего из входного и выходного слоев без скрытых слоев, представляет собой линейный персептрон. Из названия уже понятно, что такие персептроны способны моделировать только линейные функции, поэтому используются очень редко. Хотя они обеспечивают универсальную линейную аппроксимацию, что часто и требуется для конкретной задачи, но явно не нашей. Но если проблема значительно нелинейная, имеет смысл попытаться решить ее с помощью линейного персептрона.
Математики долго бьются над вопросом, сколько оптимально скрытых слоев должно быть, но в реальной сети использование большего количества слоев приводит к уменьшению суммарного количества элементов в скрытых слоях. Но анализ людей, работающей в этой области науки, считает, что для решения большинства практических задач достаточно одного, иногда двух скрытых слоев. Причина такого несоответствия теории и практики лежит, по-видимому, в том, что сложность реальных проблем намного меньше, чем это теоретически возможно. Поэтому решение задачи удобно начинать с такого рассуждения, да и в MATLAB удобно показывать на примере, рассматриваемом в статье.
2) Количество нейронов в скрытом слое я потом изменял и проиллюстрировал результаты, в комментарии дали хороший развернутый ответ на полученную зависимость качества НС от количества нейронов в скрытом слое.
3) Тут человек нашел в MATLAB модуль, не нашел такой статьи на Хабре, нашел желание и показал на примере практическое применение.
4) К сожалению, потратил не 10 минут, а наверно 10 часов на всё.
Спасибо за Ваш комментарий.

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

Это если функция активации тоже линейная, так?
Да, можно это понимать как линейный классификатор (делим на два множества с помощью бесконечной линии)
Sign up to leave a comment.

Articles