Оригинал взят у
lexpartizan в
Нейронные сети. Просто о сложном. Наткнулся на
потрясающе доступное описание принципа работы нейронных сетей, которым хочу поделиться.
Для чего же нужны нейросети?
Нейросеть - это обучаемая система. Она действует не только в соответствии с заданным алгоритмом и формулами, но и на основании прошлого опыта. Этакий ребенок, который с каждым разом складывает пазл, делая все меньше ошибок.
Нейросеть применяется там, где алгоритм решения задачи и правила решения неизвестны.
Например, как нам распознать изображение? По какому алгоритму? Как распознать лицо или текст, по зашумленной картинке, пользуясь математическими формулами? Да никак. Тут уравнения не помогут. Тут нужен опыт и только опыт. Опыт узнавания. А опыт получается при обучении.
Важно понимать, что такой результат не даёт 100% гарантии. Это не формула. Опыт может быть ошибочным. Даже человек часто путается. Но это один из способов решения неформализованных задач, когда классический подход "запрограммируй все варианты" не подходит или слишком трудоёмок.
Рассмотрим, как работают нейронные сети на примере распознавания текста.
Итак, исходя из поставленной задачи - сколько вариантов выхода может быть? Правильно, столько, сколько букв мы будем уметь определять. В алфавите их пока только 33, на том и остановимся. Значит, нам нужно 33 нейрона.
Далее, определимся со входными данными.Чтобы слишком не заморачиваться - будем подавать на вход битовый массив 30х30 в виде растрового изображения:
В итоге - нужно создать 33 нейрона, у каждого из которых будет 30х30=900 входов.
Чтобы не углубляться в INI или, не дай бог, базы данных, я решил хранить память нейронов в тех же растровых изображениях 30х30. Вот например, память нейрона «К» после прогона программы по разным шрифтам:
Договоримся, что нейрон - это просто некая воображаемая чёрная коробка, у которой кучка входных отверстий и одно выходное. Причем как входящая, так и исходящая информация может быть аналоговой (чаще всего так и будет).
Как выходной сигнал формируется из кучи входных - определяет внутренний алгоритм нейрона.
Рассмотрим, что же он из себя представляет.
На вход мы снова будем подавать изображение, поэтому входные данные представляют собой двумерный массив. Далее, каждый кусочек входных данных соединяется с нейроном с помощью специальной связи (синапса) - на рисунке красные линии. Но это не простые связи. Каждая из них имеет какую-то значимость для нейрона.
Распознавать нейрон будет так:
- Берем 1й пиксель
- Сравниваем его с 1м пикселем в памяти (там лежит значение 0..255)
- Сравниваем разницу с неким порогом
- Если разница меньше порога - считаем, что в данной точке буква похожа на лежащую в памяти, добавляем +1 к весу нейрона.
То есть, если точка в памяти белая, а в изображении чёрная - то это, скорее всего, не та буква и +1 мы не прибавляем.
Если и в памяти и в изображении точки белые или чёрные, то +1. Если точка в памяти серая, то в зависимости от значения её "серости".
Фактически, каждый пиксель придаёт определённый вес(чаще нулевой) всем нейронам.
И так по всем пикселям. Вес нейрона - это некоторое число (в теории до 900), которое определяется степенью сходства обработанной информации с хранимой в памяти.
В конце распознавания у нас будет набор нейронов, каждый из которых считает, что он прав на сколько-то процентов. Эти проценты - и есть вес нейрона. Чем больше вес, тем вероятнее, что именно этот нейрон прав.
И, конечно, необходимо заносить в память нейрона несовпадающие точки в процессе обучения.
Вот так выглядит буква Г в памяти нейрона после нескольких итераций обучения.
После краткого обучения
Система начинает распознавать даже образы с помехами.
А после обучения на разных шрифтах способна распознавать даже такое
(это пример от другой подобной сети, где чёрный и белый инвертированы и система заточена на цифры)
Конечно, это всё примитивный подход и в жизни всё немного сложнее, но для объяснения работы нейросетей он очень неплох. Как видим, всё не так страшно, сложно и заумно, как кажется.
Впрочем, нейросети усложняются, они заставляют информацию циркулировать, используют генетические алгоритмы.
Click to view
Нейросети позволяют решать задачи, для которых невозможно придумать алгоритмы.
Например, побеждать в аркадных играх.
Искусственному интеллекту не сообщали правила игры. Нейросеть сама анализировала состояние и искала способ, каким образом набрать максимальное количество очков. При обучении и принятии решения она учитывала только четыре последних кадра.
И её успехи действительно впечатляют. Вот интересное видео роста мастерства в процессе самообучения.
Click to view
Нейросеть от Google смогла в 22 из 49 игр превзойти лучший результат людей-игроков и в 43 из 49 игр победить любой другой специализированный компьютерный алгоритм.
Интересно ещё и то, что в 20 играх ИИ не смог превзойти человека. Например, он серьёзно облажался в игре Pac-Man, так и не научившись планировать свои действия на несколько секунд вперёд. Он также не понял, что съев определённые волшебные шарики можно пожирать призраков. В итоге, программа сумела набрать всего 13% от рекорда, поставленного лучшим профессиональным игроком.
Думаю, это связано с тем, что нейросеть учитывала только 4 последних кадра и не смогла связать события пожирания волшебных шариков и пожирание призраков.
Нейросети учатся играть в шахматы.
Студент Имперского колледжа Лондона Мэтью Лай (Matthew Lai) разработал компьютерную программу Giraffe, которая трое суток играла в шахматы сама с собой - и смогла извлечь все предметно-ориентированные знания, необходимые для игры на уровне международного мастера ФИДЕ. Для этого ей достаточно вычислительных ресурсов нормального компьютера.
В научной работе автор пишет, что после тренировки в течение 72 часов программа выбирала наилучший возможный ход в 46% случаев, а один из трёх наилучших ходов - в 70% случаев. Это очень неплохой результат даже для обычных шахматных программ.
Интересно, что самообучение достигло некоего потолка(на уровне мастера ФИДЕ) и не дало дальнейшего роста.
Ну а
хакер Geohot собрал дома авто-автомобиль, бросив вызов гигантам индустрии, вроде Google и Tesla Motors. Что вызывает, конечно,
лютый баттхёрт у той же Теслы. Хотя они предлагали ему работу и миллионы баксов))
Впрочем, кое в чём они правы. Главной проблемой нейросети является низкая надёжность. Она может ездить лучше человека, но, в отличии от стандартных алгоритмов, достаточно не предсказуемо. В нейросети ошибки находятся(и накапливаются при неправильном обучении) не в алгоритмах, а конкретно в данных. И их очень трудно обнаружить. Нельзя гарантировать, что нейросеть примет правильное решение. Но оно может быть более правильным, чем решение человека в 98% случаев.
Хакер использовал лидар, шесть вебок за 13 баксов, и комп с линуксом.
Работа над автопилотом была начата в октябре. Всего за два месяца обучения автопилот освоил езду по шоссе, в том числе с плохо различимой дорожной разметкой, а также ряд специфических манёвров.
Geohot объясняет, что его автопилот фундаментально отличается от присутствующих на рынке. Он не полагается на набор запрограммированных правил. Система представляет собой самообучаемую нейросеть, которая «наблюдает» за действиями водителя. В реальности, программное обеспечение занимает всего лишь около 2000 строк кода. Всего 2000 строк кода, Карл! Нейросеть уже отлично ездит по шоссе, перестраивается из полосы в полосу, тормозит и разгоняется по мере наобходимости, отлично вписывается в повороты и не требует участия водителя на протяжении многих и многих километров. Например, если автопилот видит велосипедиста, то освобождает ему немножечко полосы, потому что Geohot так делал в прошлом.
Click to view
То ли в шутку, то ли всерьёз Джордж говорит, что собирается несколько месяцев таксовать через Uber, чтобы дать системе достаточно информации.