Pull to refresh

Comments 74

Эх, а ведь самая интересная часть свёрточных нейронных сетей — нелинейные преобразования, не затронуты вообще. Именно в них и заключается магия, потому что только линейными преобразованиями, которыми являются свёртки, результата не добиться.

Обратите внимание на схему:
Input -> Conv -> ReLU -> Conv ->…

ReLU — это просто преобразование max(x, 0), т.е. если x > 0, то оставляем x, а если x < 0, то заменяем на 0.

Почему в качестве нелинейного слоя в свёрточных нейронных сетях используется именно ReLU? Да чисто из практических соображений. Существует большое количество нелинейных преобразований, в т.ч. и более эффективных (размер сети получается меньше). Но именно с ReLU есть возможность обучения сравнительно большой сети за разумное время.

Дело в том, что обучение сети — это математическая задача минимизации ошибки, как это написано в статье. Но размерности задачи настолько огромны, что долгое время не существовало эффективных методов минимизации, и нейронные сети были похоронены. Однако, в последнее десятилетие была создана теория разреженных представлений, созданы математические методы приближённого решения задач L0 и L1 минимизации. А потом выяснилось, что задача обучения свёрточной нейронной сети с нелинейностью ReLU сводится к эффективно решаемым задачам из теорий разреженных представлений, что и привело к буму нейросетей.
ReLU — это просто преобразование max(x, 0), т.е. если x > 0, то оставляем x, а если x < 0, то заменяем на 0.

да, не раскрыта тема использования гиперболического тангенса.
UFO just landed and posted this here
А откуда у вас такие детальные познания? Что такого почитать если основы уже ясны понятны? При чем хотелось бы именно в духе того что вы написали. Ну типа причина того почему именно используется ReLU и тут бах срыв покровов и тонна ценной информации, которой почему то нигде нет.
Вот кстати да. Нигде нет собсно самой мякотки — почему ReLU (ну это уже выяснили), почему ядро свертки 3*3, 5*5 или 11*11, нужно или нет ресайзить исходные картинки, и если надо в какое разрешение и aspect-ratio, как выбрать топологию сети, сколько слоёв и т.д. и т.п.
почему ядро свертки 3*3, 5*5 или 11*11

А это просто объяснить через аналогию с фонариком. Вырезаете из картинки кусочек определённого размера и пытаетесь понять, можно ли только по этому кусочку сделать обработку или классификацию. Если нет (кусочек слишком мал) — берите размер фильтра побольше. Если же вам кажется, что размер кусочка можно уменьшить, не потеряв в точности классификации — смело уменьшайте. Чем меньше лишних данных принимает алгоритм машинного обучения, тем легче он обучается и более точные результаты выдаёт.

нужно или нет ресайзить исходные картинки, и если надо в какое разрешение и aspect-ratio

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

как выбрать топологию сети, сколько слоёв

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

а ведь самая интересная часть свёрточных нейронных сетей

Жду появления статьи о том как научить нейронную сеть играть в крестики-нолики.

Эксперты — АУ!!!
Оптимальная игра в крестики-нолики неплохо реализуется в виде обычного алгоритма. Нейронные же сети следует применять там, где ничто другое не помогает, как, например, в задачах машинного зрения.
UFO just landed and posted this here
Может вам лучше сделать забивалку гвоздей, в которой в качестве ударного элемента использовался бы микроскоп?
UFO just landed and posted this here
Ну как бы разные сетки в последние годы берут первые места в соревнованиях по распознаванию/локализации объектов
https://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html
UFO just landed and posted this here
Вобще-то самое прямое. И к науке и к бизнесу. Для решения задач классификации/распознавания/etc есть огромное количество подходов разной степени паршивости. Для того, чтобы эту самую степень паршивости определить требуется некоторый объективный критерий. Один из таких критериев — точность алгоритма на известных и публично доступных датасетах (MNIST, CIFAR, ImageNet, и т.д.).
UFO just landed and posted this here
>Все «нейросетки», которые попадались мне, удается обмануть легко
Если вы работали с компьютерным зрением, то должны понимать, что там практически нет задач которые были бы решены полностью. Всегда есть некоторый предел. Новые методы этот предел отодвигают. Для многих задач, на текущий момент самые продвинутые методы основанны на Deep Learning.
Та же фигня с распознаванием голоса.

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

>И ещё разок. Котенка никто не учит, что такое собака.
А какая разница как кто учит котенка? «Биологические» нейронные сети и то что мы называем Deep Learning это довольно разные вещи.
UFO just landed and posted this here
> Я и возражал. Deep Learning и «нейросети» не имеют никакого отношения ни к живым организмам, ни к ИИ.
Ну я этого нигде не утверждал. И это не мешает сетям показывать лучший результат во многих задачах.
Подозреваю, чтобы сделать «распознавание как у котенка» надо бы хорошо понимать как собственно оно у котенка работает. И даже после этого нет гарантии что получится нечто лучше существующих методов.

>Но опять, сделайте ловушку для тараканов, станете миллиардером
Для начала — я не специалист по Deep Learning/Computer Vision. Ну и подозреваю, что себестоимость роботизированных систем для истребления тараканов и стоимость RnD просто не позволят выйти даже в плюс, не то чтобы заработать миллиарды.

Если что — я никого не минусую.
UFO just landed and posted this here
Могу перестать спорить, это уже становится довольно скучно и однообразно, если честно =(
RnD дорогой не потому, что Deep learning такой плохой, а потому, что кейз «распознай таракана в темноте между кучей объектов» довольно сложен и не тривиален. Но это не самая большая проблема. Я даже думаю что некоторые успехи можно даже получить используя классические методы компьютерного зрения. Большая часть средств уйдет на сам инструмент уничтожения тараканов. Не окупится это все дело потому, что себестоимость железки будет большой, относительно классических средств. При этом физически уничтожать тараканов это не так эффективно как их травить. Т.е. мы получаем дорогое и не эффективное средство которое надо разработать, против вроде как хорошего и дешевого которое уже существует.
Не стоит сваливать на DL/CV недостатки бизнес-модели.
UFO just landed and posted this here
RnD — https://en.wikipedia.org/wiki/Research_and_development.
DL/CV — Deep Learning / Computer Vision, мне просто надоело писать длинные названия

Мне кажется вам стоит несколько лучше разобраться в той сфере о которой вы пытаетесь делать выводы.
Можно начать с этого https://habrahabr.ru/post/274725/

На этом у меня все.
Да, если что, на гиктаймс проскакивала статья про отпугивание котов при помощи DL. Как первое приближение можете взять локализацию для тараканоловушки оттуда
Вы с животными видимо только по книжкам общались, да в зоопарке за решёткой видели?
Когда собака выкармливает котят или кошка щенков, система даёт сбой?
В быту кошки с собаками порой неплохо ладят.
А котёнок любит спину дыбить даже на руку — этому его кто учил?
UFO just landed and posted this here
Еще будучи студентом, использовал этот тип НС для решения задачи распознавания цифр из базы MNIST. При этом весь процесс распознавания запускал на видеокарте, используя технологию CUDA. Тогда получилось достичь точности распознавания около 97,8%, но в научных работах людям удавалось достичь точности около 99%. Подозреваю, что здесь большую роль играют начальные настройки НС, когда только начинаем процесс обучения.
Большую роль играет ещё и training data set.
Он же написал, что training data set — это MNIST
MNIST — это просто набор изображений. Training data set они становятся только после соответствующей предобработки, учитывающей особенности алгоритма машинного обучения.

Скажите, Вы реализовывали все сами или использовали какие-то готовые решения для нейронных сетей? Если да, то какие позволяют использовать видеокарту?

Писал все сам. Использовал язык С и SDK CUDA, тогда еще версия была примерно 2.0. Компилировал всё в Visual Studio.
> Писал все сам.

Вполне возможно, что в этом и проблема, если вы не делали gradient checking. Очень просто сделать какую-то мелкую ошибку в паре прямое-обратное распространение, типа индекса сдвинутого на 1, с которой все в принципе работает, но не так, как могло бы.

Из-за того, что сеть по сути функция, а обратное распространение считает градиент, его правильность можно очень просто проверить численно через определение градиента (df(x)/dx = (f(x+eps) — f(x-eps)) / (2*eps)). В данном случае f(x) — cost function, которые минимизируется, x — параметры сети. Результаты, полученные численно и обратным распространением, должны совпадать числа до 5-6. Если разница больше, то что-то не так.
Я также не откидал этот вариант, что в коде кроется ошибка. Те ошибки, что получилось найти — исправил. Но наверное не все. А готовые библиотеки не использовал, так как это был дипломный проект в университете.
Их довольно много, на самом деле — TensorFlow/Theano/Keras(поверх предыдущих двух)/etc
какие-то готовые решения для нейронных сетей? Если да, то какие позволяют использовать видеокарту?

Сейчас все современные библиотеки для нейронных сетей используют GPU или кластер из GPU. Это просто необходимость. На CPU в production-применении сети не обучают и ничего не классифицируют ими, потому что это очень-очень медленно. Берите любую библиотеку:
caffe, tensorflow, cntk, theano


Но надо учесть, что требуется современная мощная видеокарта (обычно NVIDIA c compute capability не меньше 3.0).

Большое спасибо! Я посмотрел разные библиотеки, пока остановился на TensorFlow, показалось самой интересной, читаю туториалы.

Интересно, но что по можете указать по поводу искусственной нейронной сети Хопфилда? Она обладает свойством памяти, фильтрации и востановления изображения.
Скорость обучения — это параметр, который выбирается программистом. Высокая скорость обучения означает, что в обновлениях веса делались более крупные шаги, поэтому образцу может потребоваться меньше времени, чтобы набрать оптимальный набор весов. Но слишком высокая скорость обучения может привести к очень крупным и недостаточно точным скачкам, которые помешают достижению оптимальных показателей.

а почему бы не ввести скорость обучения сети как один из выходных параметров, чтобы сеть сама оптимально задавала себе её?
Большая часть продвинутых алгоритмов оптимизации и так стараются адаптивно регулировать скорость обучения.
Это параметр процесса оптимизации, а не самой модели. Если Вы хотите оптимизировать оптимизацию :) то это другой процесс которому тоже нужны параметры.
Но есть похожая рабочая идея — синтетические градиенты. Цель, правда, там другая.
Подозреваю, что создать алгоритм, который бы оптимально подбирал параметры оптимизации — это на данном этапе развития более сложная задача, чем подобрать параметры вручную.
Сделали бы вы курс по машинному обучению, даже самый вводный. С радостью бы прошел…
Введение в машинное обучение на coursera

И еще на Stepic есть хороший вводный курс по нейронным сетям
UFO just landed and posted this here
UFO just landed and posted this here
Кто-нибудь расскажет, чем свёрточная сеть принципиально отличается от Перцептерона, предложенного ещё в 50-х годах прошлого столетия?
UFO just landed and posted this here
Хороший вопрос, хоть и задан 4 года назад. Простите за некрокоммент.

Персептрон (однослойный) — это на каждом нейроне собранная сумма с входов с коэффициентами. Это, по сути, то самое, как тут описан свёрточный фильтр. И фильтров таких в свёрточной сети несколько, ровно как нейронов в персептроне.

Только персептрон применялся сразу весь, и сразу ко всем своим входам. А каждый фильтр в свёрточной сети применяется к большой куче разных фрагментов входного слоя.

То есть, получается, свёрточный слой в свёрточной сети — это фактически тот самый персептрон, но который просто последовательно коммутируют к разным фрагментам входного потока. И его выходы накапливают в качестве входов для следующего слоя нейронной сети.
Мне кажется, что через 10-20 лет будет придуман более простой механизм распознавания образов.
Мы хотим, чтобы компьютер мог различать все данные ему изображения и распознавать уникальные особенности, которые делают собаку собакой, а кошку кошкой.

И мы думаем, что раз мы можем, значит и компьютер сможет. Забывая, что мы всегда видим мир в движении и когда оно застывает — это кажется неестественным. Думаю, это фундаментальная ошибка обучателей нейросетей.
Например, по картинкам сеть не узнает, что шерсть колышется на ходу.
Например, о динозаврах вы в детстве наверняка обучались по статичным картинкам, ничего не зная о моторике их шерсти/чешуи. Тем не менее, распознаете динозавров, я уверен, с высокой точностью. ;)
Человек знает, что динозавр — это ящер. И у человека есть опыт из которого он знает, что ящер — трёхмерный и двигается.

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

Такая же фигня со всеми объектами — обучать сеть НУЖНО НА ВИДЕО!
Такова природа свёрточных сетей — они видят исключительно локально, небольшими фрагментами, без учёта контекста. Обычная свёрточная сеть способна определить текстуру, даже найти составные части (голова, конечность), но возможности абстрактного мышления у неё крайне ограничены как концептуально, так и технически.

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

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

Допустим, Вы видите картинку, леопарда|дивана в плохом разрешении. Издалека. Вы распознаете по контексту (ковер на стене, часы, журнальный столик). Из этого контекста получается «комната», а в комнате леопарду делать нечего, следовательно это что-то, что может быть в комнате. О! Диван.

Надо понимать, что нахождение объектов на картинке (кадре) это еще не «компьютерное зрение». Это лишь один из слоев. Что, ни в коем случае, не уменьшает его важности.
У Путина дома живёт тигрёнок, так почему бы и леопарду не жить в комнате?
не в плоскости видео/статика. Анализ видео теми же алгоритмами даст вам просто гораздо большую коллекцию картинок, которые будут чрезвычайно схожи, а после нормализации вообще одинаковы. В результате, обучение станет низко эффективным.

Зрение должно выделять ДВИЖУЩИЕСЯ объекты. Например, нейросети лягушки вообще не видят, то что неподвижно.
А теперь представьте размер нейросети, которая способна решать подобные задачи на видео. И представьте, какой объём данных понадобится, чтобы её обучить.
Прежде всего нужно обучить нейросеть выделять движущиеся объекты отделяя от неподвижных. А затем анализировать уже выделенные объекты. Что потребует разделения нейронной сети на «отделы мозга».
Для выделения движущихся объектов давно созданы простые и быстрые алгоритмы — нейросеть здесь не нужна.

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

И как вы собираетесь анализировать выделенные объекты? Объём данных (всевозможные видеофрагменты распознаваемых объектов), достаточных для обучения нейросети, будет настолько большой, а скорость обработки настолько медленной, что эффективнее будет использовать биологическую реализацию нейросети (живого человека).
Обучать нейросеть нужно именно на выделенных объектах. Иначе будет полнейшая хрень вроде дивана леопардового окраса.

Сам метод обучения на статических картинках — ущербный, потому что объект это не цветные пятна с характерным узором, а трёхмерный объект.
Обучать нейросеть нужно именно на выделенных объектах.

Обучайте. Я что, против? Я просто указал на то, что для забивания гвоздя достаточно использования молотка.

Сам метод обучения на статических картинках — ущербный, потому что объект это не цветные пятна с характерным узором, а трёхмерный объект.

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

К тому же не забывайте про фотографии или про ситуацию, когда леопард спит.
Леопард спит — это не пятна в вытянутые горизонтально, а это трёхмерный объект принявший позу для сна.
А с определением «леопард спит — это пятна вытянутые горизонтально» будет получен тот самый диван, потому что он вытянут горизонтально и имеет пятна,
Трёхмерных объектов не существует, есть только двухмерные изображения, то которым можно сделать выводы о трёхмерности.

А чучело леопарда — это леопард? А чучело леопарда, оформленное в виде дивана?
Упоротый лис — это тоже лис.
Скажите, каков ваш опыт работы в области машинного зрения в целом, и какие успехи в применении того подхода, который вы описываете?
Может быть, напишете подробную статью? Уверен не только мне было бы интересно узнать больше подробностей о столь новаторском подходе, особенно если он действительно у вас показывает лучшую эффективность, чем стандартный.
Когда леопард лежит, то ты не видишь ни четырёх лап, ни хвоста
… но, тем не менее известно, что они у него есть и он может их прятать. Если не видно ни лап, ни хвоста, то объект вероятно леопард, и на 100% уверенности в этом нет. Уверенность возникает — когда он пошевелился.
Или человек в костюме леопарда.
Темпоральные сети уже придуманы, и тоже активно развиваются. Видео, аудио и прочие потоки информации не останутся без внимания!
С ростом вычислительных мощностей можно будет и на трехмерных видео обучать.
То что сейчас делают разработчики алгоритмов — детские игрушки, у самого простого таракана миллион нейронов.
UFO just landed and posted this here
>некоторые нейроны активировались,
>когда воспринимали вертикальные границы,
>а некоторые — горизонтальные или диагональные

То есть у этих нейронов дендриты «выросли» так, что в итоге нейрон умеет реагировать на определённый паттерн. Но «вырастить» все возможные паттерны на всех уровнях невозможно. Поэтому для ассоциирования на верхних уровнях у нейронной сети и возникло широковещательное распространение паттернов.
Sign up to leave a comment.

Articles