Многослойные нейронные сети с сигмовидной функцией — глубокое обучение для новичков (2)
Перевод
Ссылка на автора
Глава 1: Представляем глубокое обучение и нейронные сети
Глава 2. Многослойные нейронные сети с сигмоидальной функцией.
Следуй за мной по щебет узнать больше о жизни в стартапе глубокого обучения.
Привет всем! Добро пожаловать в мой второй пост серииГлубокое обучение для новичков (DLFR)По-настоящему, новичок;) Не стесняйтесь обращаться к мой первый пост здесь или мой блог если вам трудно следовать. Или выделите на этой странице заметки или оставьте комментарий ниже! Ваши отзывы также будут высоко оценены.
На этот раз мы углубимся в нейронные сети, и пост будет несколько более техническим, чем в прошлый раз. Но не беспокойтесь, я сделаю так, чтобы вы могли легко и интуитивно выучить основы без знания CS / Math. Скоро вы сможете похвастаться своим пониманием;)
Обзор от DLFR 1
В прошлый раз мы представили область глубокого обучения и изучили простую нейронную сеть — персептрон … или динозавра … серьезно, однослойный персептрон. Мы также исследовали, как сеть персептрона обрабатывает входные данные, которые мы вводим, и возвращает выходные данные.
Основные понятия: входные данные, веса, суммирование и сложение смещения, функция активации (в частности, функция шага), а затем вывод. Скучно еще? Не беспокойся 🙂 Я обещаю, что будет … больше глаголов! Но ты скоро к ним привыкнешь. Обещаю.

Еще в 1950-х и 1960-х годах у людей не было эффективного алгоритма обучения однослойного персептрона для изучения и идентификации нелинейных паттернов (помните проблему с воротами XOR?). И публика потеряла интерес к персептрону. В конце концов, большинство проблем в реальном мире нелинейны, и, как отдельные люди, вы и я чертовски хороши в принятии решений по линейным или бинарным задачам, таким какя должен изучать глубокое обучение или нетбез необходимости персептрона. Хорошо, «хорошо» — это сложное слово, так как наш мозг на самом деле не такой рациональный. Но я оставлю это поведенческим экономистам и психологам.
Прорыв: многослойный персептрон
За два десятилетия до 1986 года Джеффри Хинтон, Дэвид Румелхарт и Рональд Уильямс опубликовали статью «Изучение представлений по ошибкам обратного распространения», Который ввел:
- обратное распространениепроцедура длянеоднократно корректировать весачтобы минимизировать разницу между фактическим и желаемым выходом
- Скрытые слои, которыенейронные узлы, расположенные между входами и выходами, позволяя нейронным сетям изучать более сложные функции (такие как логика XOR)
Если вы совершенно новичок в DL, вы должны помнить Джеффри Хинтона, который играет ключевую роль в развитии DL. Итак, это были некоторые важные новости: мы всего 20 лет думали, что у нейронных сетей нет будущего для решения реальных проблем. Теперь мы видим свет от маяка на берегу! Давайте посмотрим на эти 2 новых введения.
Хм, первый,обратное распространениеупоминается в последнем посте. Помните, что мы повторили важность разработки нейронной сети, чтобы сеть могла учиться на разнице междужелаемый вывод(что это за факт) ифактический объем производства(что возвращает сеть), а затем отправить сигнал обратно весам и попросить весы подстроиться? Это сделает выход сети ближе к желаемому результату при следующем запуске.
Как насчет второго, скрытых слоев? Что такое скрытый слой? Скрытый слой превращает однослойный персептрон в многослойный персептрон! Вот план, по техническим причинам,Я сосредоточусь на скрытых слоях в этом посте, а затем расскажу о распространении в следующем посте.,
Просто случайныйзабавный фактздесь: я подозреваю, что Джеффри Хинтон имеет рекорд за то, что был самым старым стажером в Google: D Проверьте эта статья из New York Times и поиск «Хинтон». В любом случае, если вы уже знакомы с машинным обучением, я уверен, что его курс по Coursera подойдет.

Нейронные сети со скрытыми слоями
Скрытые слои нейронной сети буквально просто добавляют больше нейронов между входным и выходным слоями.

Данные во входном слое помечены какИксс подписками1, 2, 3,…, м, Нейроны в скрытом слое помечены какчасс подписками1, 2, 3,…, n, Примечание для скрытого слояегоNи нетм, поскольку количество нейронов скрытого слоя может отличаться от количества во входных данных. И как вы видите на графике ниже, нейроны скрытого слоя также помечены верхним индексом1 Это так, что когда у вас есть несколько скрытых слоев, вы можете определить, какой это скрытый слой:первый скрытый слой имеет верхний индекс 1, второй скрытый слой имеет верхний индекс 2 и т. д., как вГрафик 3, Выход помечен какYсшапка,

Чтобы облегчить жизнь, мы будем использовать некоторые жаргоны, чтобы немного прояснить ситуацию. Я знаю, жаргон может раздражать, но вы привыкнете к нему 🙂 Во-первых, если у нас естьмвходные данные (х1, х2,…, хм), мы называем этом особенности, Особенность — это только одна переменная, которую мы считаем влияющей на конкретный результат. Как наш пример по итогамесли вы решили изучать DL или нет,у нас есть 3 функции: 1. Будете ли вы зарабатывать больше денег после изучения DL, 2. Трудно с математикой / программированием, 3. Нужен ли вам графический процессор для начала.
Во-вторых, когда мы умножаем каждый из m признаков на вес (w1, w2,…, wm) и суммировать их все вместе, этоскалярное произведение:

Итак, вот вынос на данный момент:
- См особенностина входеИКС,тебе нужномвеса для выполнения точечного произведения
- СNскрытые нейроны в скрытом слое, вам нужноNнаборы весов (W1, W2, … Wn) для выполнения точечных произведений
- С 1 скрытым слоем вы выполняетеNточечные продукты, чтобы получить скрытый выводчас:(h1, h2,…, hn)
- Тогда это как однослойный персептрон, мы используем скрытый выводчас:(h1, h2,…, hn) в качестве входных данных, которые имеютn функций,выполнятьТочечный продукт с 1 наборомNвес (w1, w2,…, wn) чтобы получить окончательный результатy_hat,
Процедура того, как входные значенияраспространяться впередв скрытый слой, а затем из скрытого слоя на выход такой же, как вГрафик 1, Ниже я приведу описание того, как это делается, используя следующую нейронную сеть вГрафик 4,



Теперь вычисляются выходные данные скрытого слоя, мы используем их в качестве входных данных для расчета конечного результата.

Ура! Теперь вы полностью понимаете, как работает персептрон с несколькими слоями 🙂 Это похоже на однослойный персептрон, за исключением того, что в этом процессе у вас намного больше весов. Когда вы тренируете нейронные сети на больших наборах данных со многими другими функциями (такими как word2vec в Natural Language Processing), этот процесс потребляет много памяти на вашем компьютере. Это была одна из причин, по которой Deep Learning не взлетела до последних нескольких лет, когда мы начали выпускать гораздо более качественное оборудование, которое могло бы обрабатывать потребляющие память глубокие нейронные сети.
Сигмовидные нейроны: введение
Так что теперь у нас есть более сложная нейронная сеть со скрытыми слоями. Но мы не решили проблему активации с помощью функции step.
В последнем посте мы говорили об ограничениях линейности ступенчатой функции. Помните одно:Если функция активации является линейной, то вы можете сложить столько скрытых слоев в нейронной сети, сколько пожелаете, и конечный результат по-прежнему линейная комбинация исходных входных данных, пожалуйста убедитесь, что вы читаете эту ссылку дляобъяснение, если концепции трудно следовать. Эта линейность означает, что она не может действительно понять сложность нелинейных задач, таких как логика XOR или шаблоны, разделенные кривыми или кругами.
Между тем, функция шага также не имеет полезной производной (ее производная равна 0 везде или не определена в точке 0 на оси x). Это не работает дляобратное распространениеОб этом мы обязательно поговорим в следующем посте!

Ну, вот еще одна проблема: Персептрон с пошаговой функцией не очень «стабилен» как «кандидат на отношения» для нейронных сетей. Подумайте об этом: у этой девочки (или мальчика) есть серьезные биполярные проблемы! Один день (дляZ<0), (s) он все «тихий» и «подавленный», что дает вам нулевой ответ. Затем еще один день (дляZ≥ 0), (s) он внезапно становится «разговорчивым» и «живым», разговаривая с вами без остановки. Черт, радикальные перемены! Нет никакого изменения для ее / его настроения, и вы не знаете, когда оно понижается или повышается. Да … это пошаговая функция.
В общем, небольшое изменение любого веса во входном слое нашей сети персептронов может привести к тому, что один нейрон внезапно переключится с 0 на 1, что может снова повлиять на поведение скрытого слоя, а затем повлиять на конечный результат. Как мы уже говорили, нам нужен алгоритм обучения, который мог бы улучшить нашу нейронную сеть за счет постепенного изменения весов, а не путем плоского отсутствия ответа или внезапных скачков. Если мы не можем использовать пошаговую функцию для постепенного изменения веса, то это не должен быть выбор

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


Если функция выглядит очень абстрактно или странно для вас, не стоит слишком беспокоиться о таких деталях, как число Эйлераеили как кто-то придумал эту сумасшедшую функцию. Для тех, кто не разбирается в математике, единственная важная вещь о сигмовидной функции вГрафик 9во-первых, его кривая, а во-вторых, его производная. Вот еще несколько деталей:
- Сигмовидная функция дает результаты, аналогичные шаговой функции, в том случае, если выходной сигнал находится между 0 и 1. Кривая пересекает 0,5г = 0, который мы можем установить правила для функции активации, такие как: Если выходной сигнал сигмоидного нейрона больше или равен 0,5, он выводит 1; если выходное значение меньше 0,5, оно выдает 0.
- Сигмовидная функция не имеет рывка на своей кривой. Он гладкий и имеет очень красивую и простую производную отσ (z) * (1-σ (z)),который дифференцируем повсюду на кривой. Исчисление производной производной можно найти в переполнении стека Вот если хочешь это увидеть. Но вам не нужно знать, как его получить. Здесь нет стресса.
- ЕслиZочень отрицательный, тогда выходной сигнал равен приблизительно 0; еслиZочень положительный результат примерно 1; но вокругг = 0гдеZне является ни слишком большим, ни слишком маленьким (между двумя внешними вертикальными пунктирными линиями сетки вГрафик 9) у нас относительно больше отклонений, чемZменяется.
Теперь это похоже на материал для датировки нашей нейронной сети 🙂 Функция сигмоида, в отличие от функции шага, вносит нелинейность в нашу модель нейронной сети. Нелинейный просто означает, что выходной сигнал мы получаем от нейрона, который является точечным произведением некоторых входных данных.х (х1, х2,…, хм)и весw (w1, w2,…, wm)плюс смещение, а затем положить в сигмовидную функцию, не может быть представлен линейная комбинация вводах (х1, х2,…, хм),
Эта нелинейная функция активации, когда используется каждым нейроном в многослойной нейронной сети, производит новую « представление Исходных данных, и в конечном итоге учитывает нелинейную границу решения, такую как XOR. Таким образом, в случае XOR, если мы добавим два сигмоидных нейрона в скрытом слое, мы могли бы в другом пространстве преобразовать исходный 2D-график в нечто похожее на 3D-изображение в левой частиГрафик 10ниже. Таким образом, этот гребень позволяет классифицировать затвор XOR и представляет светло-желтоватую область затвора 2D XOR с правой стороныГрафик 10, Таким образом, если наше выходное значение находится в верхней части гребня, то оно должно быть истинным или 1 (например, погода холодная, но не жаркая, или погода жаркая, но не холодная); если наше выходное значение находится в нижней плоской области по двум углам, тогда оно ложно или равно 0, поскольку неправильно говорить, что погода горячая и холодная, а также ни горячая, ни холодная (хорошо, я думаю, что погода может быть не горячей или холодно … вы понимаете, что я имею в виду, хотя … верно?).

Я знаю, что эти разговоры о нелинейности могут сбивать с толку, поэтому, пожалуйста, прочитайте больше о линейности и нелинейности Вот (интуитивно понятный пост с анимацией из отличного блога Кристофера Олаха), Вот (по Вивек Ядав с функцией активации ReLU), и Вот (Себастьян Рашка). Надеюсь, у вас есть понимание того, почему важна функция нелинейной активации, а если нет, то сделайте это легко и дайте некоторое время ее переварить.
Проблема решена … на данный момент;) Мы увидим несколько различных типов функции активации в ближайшем будущем, потому что у сигмоидальной функции тоже есть свои проблемы! Некоторые популярные из них включаютTANHа такжеРЕЛУ, Это, однако, для другого поста.
Многоуровневые нейронные сети: интуитивный подход
Хорошо. Итак, мы внедрили скрытые слои в нейронную сеть и заменили персептрон сигмовидными нейронами. Мы также ввели идею о том, что нелинейная функция активации позволяет классифицировать нелинейные границы решений или шаблоны в наших данных. Вы можете запомнить эти выводы, поскольку они являются фактами, но я призываю вас немного погуглить в Интернете и посмотреть, сможете ли вы лучше понять концепцию (естественно, что мы потратим некоторое время, чтобы понять эти концепции)
Теперь мы никогда не говорили об одном очень важном моменте: с какой стати мы вообще хотим, чтобы скрытые слои в нейронных сетях? Как скрытые слои волшебным образом помогают нам решать сложные проблемы, которые однослойные нейроны не могут решить?
Из приведенного выше примера XOR вы видели, что добавление двух скрытых нейронов в 1 скрытый слой может перевернуть нашу проблему в другое пространство, что волшебным образом позволило нам классифицировать XOR с гребнем. Таким образом, скрытые слои каким-то образом искажают проблему таким образом, чтобы нейронной сети было легко классифицировать проблему или шаблон. Теперь мы будем использовать классический пример из учебника: распознавание рукописных цифр, чтобы помочь вам интуитивно понять, что делают скрытые слои.

Цифры вГрафик 11принадлежат к набору данных под названием MNIST, Он содержит 70000 примеров цифр, написанных руками человека. Каждая из этих цифр представляет собой изображение размером 28×28 пикселей. Таким образом, в целом каждое изображение цифры имеет 28 * 28 = 784 пикселей. Каждый пиксель принимает значение от 0 до 255 (цветовой код RGB). 0 означает цвет белый, а 255 означает цвет черный.

Теперь компьютер не может «видеть» цифру, как мы, люди, но если мы разберем изображение на массив из 784 чисел, таких как [0, 0, 180, 16, 230,…, 4, 77, 0, 0, 0], тогда мы можем передать этот массив в нашу нейронную сеть. Компьютер не может понять изображение, «увидев» его, но он может понимать и анализировать числа пикселей, которые представляют изображение.

Итак, давайте настроим нейронную сеть, как указано выше вГрафик 13, Он имеет 784 входных нейронов для значений 28×28 пикселей. Предположим, у него есть 16 скрытых нейронов и 10 выходных нейронов. Каждый из 10 выходных нейронов, возвращенных нам в массиве, будет отвечать за классификацию цифр от 0 до 9. Поэтому, если нейронная сеть считает, что рукописная цифра равна нулю, то мы должны получить выходной массив [1, 0, 0, 0, 0, 0, 0, 0, 0, 0], первый выход в этом массиве, который воспринимает цифру как ноль, «запускается», чтобы быть нашей 1 нейронной сетью, а остальные 0 Если нейронная сеть считает, что рукописная цифра — 5, то мы должны получить [0, 0, 0, 0, 0, 1, 0, 0, 0, 0]. Шестой элемент, отвечающий за классификацию пяти, срабатывает, а остальные нет. Так далее и тому подобное.
Помните, мы упоминали, что нейронные сети становятся лучше за счет повторного обучения самим данным, чтобы они могли корректировать весовые коэффициенты в каждом слое сети, чтобы приблизить конечные результаты / фактические результаты к желаемым результатам? Поэтому, когда мы на самом деле обучаем эту нейронную сеть всем обучающим примерам в наборе данных MNIST, мы не знаем, какие веса мы должны назначить каждому из слоев. Поэтому мы просто случайным образом просим компьютер назначить веса в каждом слое. (Мы не хотим, чтобы все веса были равны 0, что я объясню в следующем посте, если позволит место).
Эта концепция случайной инициализации весов важна, потому что каждый раз, когда вы тренируете нейронную сеть с глубоким обучением, вы инициализируете разные числа для весов. По сути, вы и я понятия не имеем, что происходит в нейронной сети до тех пор, пока сеть не обучена. Обученная нейронная сеть имеет веса, которые оптимизируются при определенных значениях, которые дают лучший прогноз или классификацию по нашей проблеме. Это черный ящик, буквально. И каждый раз обучаемая сеть будет иметь разные наборы весов.
Ради аргумента, давайте представим следующий случай вГрафик 14, который я позаимствовал у Майкла Нильсена онлайн книга:

После обучения нейронной сети с раундами и раундами помеченных данных в контролируемом обучении, предположим, что первые 4 скрытых нейрона научились распознавать паттерны выше в левой частиГрафик 14, Затем, если мы передадим нейронной сети массив рукописных цифр ноль, сеть должна правильно запустить 4 верхних скрытых нейрона в скрытом слое, в то время как другие скрытые нейроны молчат, а затем снова запустить первый выходной нейрон, в то время как остальные молчит.

Если вы тренируете нейронную сеть с новым набором рандомизированных весов, она может создать следующую сеть (сравнить график 15 с графиком 14), поскольку веса рандомизированы, и мы никогда не знаем, какой из них узнает какой или какой шаблон. Но сеть, если она должным образом обучена, должна по-прежнему вызывать правильные скрытые нейроны и затем правильный вывод

И последнее, что следует упомянуть: в многослойной нейронной сети первый скрытый слой сможет выучить несколько очень простых шаблонов. Каждый дополнительный скрытый слой каким-то образом сможет постепенно выучить более сложные паттерны. Проверять, выписыватьсяГрафик 16от Scientific American с примером распознавания лиц 🙂

Некоторые замечательные люди создали следующий сайт для вас, чтобы поиграть с нейронными сетями и посмотреть, как работают скрытые слои. Попробуйте это. Это действительно интересно!
Tensorflow — игровая площадка нейронной сети
Это методика построения компьютерной программы, которая учится на данных. Он очень слабо основан на том, как мы думаем …
playground.tensorflow.org
Офир Самсон писал хороший пост, также объясняющий, что такое нейронная сеть с довольно хорошей визуализацией, и она короткая и лаконичная!
Еженедельник глубокого обучения: что такое нейронная сеть?
Для этой недели я хотел бы сосредоточиться на разъяснении, что такое нейронная сеть, на простом примере, который я собрал…
medium.com
резюмировать
В этом посте мы рассмотрели ограничения персептрона, представили сигмовидные нейроны с новой функцией активации, называемой сигмовидной функцией. Мы также говорили о том, как работают многослойные нейронные сети, и об интуиции скрытых слоев в нейронной сети.
Мы почти заканчиваем полный курс понимания базовых нейронных сетей;) Хе-хе, это еще не конец! В следующем посте я расскажу о так называемой функции потерь, а также об этом загадочном распространении, о котором мы только упоминали, но никогда не посещали! Проверьте следующие ссылки, если вам не терпится ждать:
CS231n сверточные нейронные сети для визуального распознавания
Материалы курса и заметки для Стэнфордского класса CS231n: Сверточные нейронные сети для визуального распознавания.
cs231n.github.io
Шаг за шагом Пример обратного распространения
Фон Backpropagation является распространенным методом обучения нейронной сети. В Интернете нет недостатка в документах, которые …
mattmazur.com
Оставайтесь с нами и, самое главное, получайте удовольствие от обучения: D
Вам понравилось это чтение? Не забудьте подписаться на меня щебет !
Знакомимся с методом обратного распространения ошибки
Всем привет! Новогодние праздники подошли к концу, а это значит, что мы вновь готовы делиться с вами полезным материалом. Перевод данной статьи подготовлен в преддверии запуска нового потока по курсу «Алгоритмы для разработчиков».
Поехали!

Метод обратного распространения ошибки – вероятно самая фундаментальная составляющая нейронной сети. Впервые он был описан в 1960-е и почти 30 лет спустя его популяризировали Румельхарт, Хинтон и Уильямс в статье под названием «Learning representations by back-propagating errors».
Метод используется для эффективного обучения нейронной сети с помощью так называемого цепного правила (правила дифференцирования сложной функции). Проще говоря, после каждого прохода по сети обратное распространение выполняет проход в обратную сторону и регулирует параметры модели (веса и смещения).
В этой статья я хотел бы подробно рассмотреть с точки зрения математики процесс обучения и оптимизации простой 4-х слойной нейронной сети. Я считаю, что это поможет читателю понять, как работает обратное распространение, а также осознать его значимость.
Определяем модель нейронной сети
Четырехслойная нейронная сеть состоит из четырех нейронов входного слоя, четырех нейронов на скрытых слоях и 1 нейрона на выходном слое.

Простое изображение четырехслойной нейронной сети.
Входной слой
На рисунке нейроны фиолетового цвета представляют собой входные данные. Они могут быть простыми скалярными величинами или более сложными – векторами или многомерными матрицами.

Уравнение, описывающее входы xi.
Первый набор активаций (а) равен входным значениям. «Активация» — это значение нейрона после применения функции активации. Подробнее смотрите ниже.
Скрытые слои
Конечные значения в скрытых нейронах (на рисунке зеленого цвета) вычисляются с использованием zl – взвешенных входов в слое I и aI активаций в слое L. Для слоев 2 и 3 уравнения будут следующими:
Для l = 2:

Для l = 3:

W2 и W3 – это веса на слоях 2 и 3, а b2 и b3 – смещения на этих слоях.
Активации a2 и a3 вычисляются с помощью функции активации f. Например, эта функция f является нелинейной (как сигмоид, ReLU и гиперболический тангенс) и позволяет сети изучать сложные паттерны в данных. Мы не будем подробно останавливаться на том, как работают функции активации, но, если вам интересно, я настоятельно рекомендую прочитать эту замечательную статью.
Присмотревшись внимательно, вы увидите, что все x, z2, a2, z3, a3, W1, W2, b1 и b2 не имеют нижних индексов, представленных на рисунке четырехслойной нейронной сети. Дело в том, что мы объединили все значения параметров в матрицы, сгруппированные по слоям. Это стандартный способ работы с нейронными сетями, и он довольно комфортный. Однако я пройдусь по уравнениям, чтобы не возникло путаницы.
Давайте возьмем слой 2 и его параметры в качестве примера. Те же самые операции можно применить к любому слою нейронной сети.
W1 – это матрица весов размерности (n, m), где n – это количество выходных нейронов (нейронов на следующем слое), а m – число входных нейронов (нейронов в предыдущем слое). В нашем случае n = 2 и m = 4.

Здесь первое число в нижнем индексе любого из весов соответствует индексу нейрона в следующем слое (в нашем случае – это второй скрытый слой), а второе число соответствует индексу нейрона в предыдущем слое (в нашем случае – это входной слой).
x – входной вектор размерностью (m, 1), где m – число входных нейронов. В нашем случае m = 4.

b1 – это вектор смещения размерности (n, 1), где n – число нейронов на текущем слое. В нашем случае n = 2.

Следуя уравнению для z2 мы можем использовать приведенные выше определения W1, x и b1 для получения уравнения z2:

Теперь внимательно посмотрите на иллюстрацию нейронной сети выше:

Как видите, z2 можно выразить через z12 и z22, где z12 и z22 – суммы произведений каждого входного значения xi на соответствующий вес Wij1.
Это приводит к тому же самому уравнению для z2 и доказывает, что матричные представления z2, a2, z3 и a3 – верны.
Выходной слой
Последняя часть нейронной сети – это выходной слой, который выдает прогнозируемое значение. В нашем простом примере он представлен в виде одного нейрона, окрашенного в синий цвет и рассчитываемого следующим образом:

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

(1) – входной слой
(2) – значение нейрона на первом скрытом слое
(3) – значение активации на первом скрытом слое
(4) – значение нейрона на втором скрытом слое
(5) – значение активации на втором скрытом уровне
(6) – выходной слой
Заключительным шагом в прямом проходе является оценка прогнозируемого выходного значения s относительно ожидаемого выходного значения y.
Выходные данные y являются частью обучающего набора данных (x, y), где x – входные данные (как мы помним из предыдущего раздела).
Оценка между s и y происходит через функцию потерь. Она может быть простой как среднеквадратичная ошибка или более сложной как перекрестная энтропия.
Мы назовем эту функцию потерь С и обозначим ее следующим образом:

Где cost может равняться среднеквадратичной ошибке, перекрестной энтропии или любой другой функции потерь.
Основываясь на значении С, модель «знает», насколько нужно скорректировать ее параметры, чтобы приблизиться к ожидаемому выходному значению y. Это происходит с помощью метода обратного распространения ошибки.
Обратное распространение ошибки и вычисление градиентов
Опираясь на статью 1989 года, метод обратного распространения ошибки:
Постоянно настраивает веса соединений в сети, чтобы минимизировать меру разности между фактическим выходным вектором сети и желаемым выходным вектором.
и
…дает возможность создавать полезные новые функции, что отличает обратное распространение от более ранних и простых методов…
Другими словами, обратное распространение направлено на минимизацию функции потерь путем корректировки весов и смещений сети. Степень корректировки определяется градиентами функции потерь по отношению к этим параметрам.
Возникает один вопрос: Зачем вычислять градиенты?
Чтобы ответить на этот вопрос, нам сначала нужно пересмотреть некоторые понятия вычислений:
Градиентом функции С(x1, x2, …, xm) в точке x называется вектор частных производных С по x.

Производная функции С отражает чувствительность к изменению значения функции (выходного значения) относительно изменения ее аргумента х (входного значения). Другими словами, производная говорит нам в каком направлении движется С.
Градиент показывает, насколько необходимо изменить параметр x (в положительную или отрицательную сторону), чтобы минимизировать С.
Вычисление этих градиентов происходит с помощью метода, называемого цепным правилом.
Для одного веса (wjk)l градиент равен:

(1) Цепное правило
(2) По определению m – количество нейронов на l – 1 слое
(3) Вычисление производной
(4) Окончательное значение
Аналогичный набор уравнений можно применить к (bj)l:

(1) Цепное правило
(2) Вычисление производной
(3) Окончательное значение
Общая часть в обоих уравнениях часто называется «локальным градиентом» и выражается следующим образом:

«Локальный градиент» можно легко определить с помощью правила цепи. Этот процесс я не буду сейчас расписывать.
Градиенты позволяют оптимизировать параметры модели:
Пока не будет достигнут критерий остановки выполняется следующее:

Алгоритм оптимизации весов и смещений (также называемый градиентным спуском)
- Начальные значения w и b выбираются случайным образом.
- Эпсилон (e) – это скорость обучения. Он определяет влияние градиента.
- w и b – матричные представления весов и смещений.
- Производная C по w или b может быть вычислена с использованием частных производных С по отдельным весам или смещениям.
- Условие завершение выполняется, как только функция потерь минимизируется.
Заключительную часть этого раздела я хочу посвятить простому примеру, в котором мы рассчитаем градиент С относительно одного веса (w22)2.
Давайте увеличим масштаб нижней части вышеупомянутой нейронной сети:

Визуальное представление обратного распространения в нейронной сети
Вес (w22)2 соединяет (a2)2 и (z2)2, поэтому вычисление градиента требует применения цепного правила на (z2)3 и (a2)3:

Вычисление конечного значения производной С по (a2)3 требует знания функции С. Поскольку С зависит от (a2)3, вычисление производной должно быть простым.
Я надеюсь, что этот пример сумел пролить немного света на математику, стоящую за вычислением градиентов. Если захотите узнать больше, я настоятельно рекомендую вам посмотреть Стэндфордскую серию статей по NLP, где Ричард Сочер дает 4 замечательных объяснения обратного распространения.
Заключительное замечание
В этой статье я подробно объяснил, как обратное распространение ошибки работает под капотом с помощью математических методов, таких как вычисление градиентов, цепное правило и т.д. Знание механизмов этого алгоритма укрепит ваши знания о нейронных сетях и позволит вам чувствовать себя комфортно при работе с более сложными моделями. Удачи вам в путешествии по глубокому обучению!
На этом все. Приглашаем всех на бесплатный вебинар по теме «Дерево отрезков: просто и быстро».
F0:
11196971
F1:
Нейрокомпьютерные системы
F2:
Бозиев О.Л.
F3:
5 курс, 9 семестр, 4 курс,7сем.СП
VI:
1. Введение в искусственные нейронные
сети
I:
ТЗ № 1
S:
Дендрит – это …
-:
тело нейрона
+:
входное волокно нейрона
-:
выходное волокно нейрона
-:
место контакта нервных волокон
I:
ТЗ № 2
S:
Аксон – это …
-:
тело нейрона
-:
входное волокно нейрона
+:
выходное волокно нейрона
-:
место контакта нервных волокон
I:
ТЗ № 3
S:
Синапс – это …
-:
тело нейрона
-:
входное волокно нейрона
-:
выходное волокно нейрона
+:
место контакта нервных волокон
I:
ТЗ № 4
S:
Биологические нейроны …
+:
участвуют в обмене веществ
+:
взаимодействуют с помощью электрохимических
сигналов
-:
взаимодействуют с помощью оптических
сигналов
+:
рассеивают энергию
I:
ТЗ № 5
S:
Биологические нейроны не …
-:
участвуют в обмене веществ
-:
взаимодействуют с помощью электрохимических
сигналов
+:
взаимодействуют с помощью оптических
сигналов
-:
рассеивают энергию
I:
ТЗ № 6
S:
Искусственные нейронные сети обладают
способностью
-:
самоорганизации
+:
обучаемости
+:
обобщения
+:
абстрагирования
I:
ТЗ № 7
S:
Искусственные нейронные сети не обладают
способностью
+:
самоорганизации
-:
обучаемости
-:
обобщения
-:
абстрагирования
I:
ТЗ № 8
S:
Взаимодействуя между собой, нейроны
формируют
+:
нейронные сети
-:
функциональные сети
-:
локальные сети
-:
глобальные сети
I:
ТЗ № 9
S:
Взаимодействующие нейроны не способны
формировать
-:
нейронные сети
+:
функциональные сети
+:
локальные сети
+:
глобальные сети
I:
ТЗ № 10
S:
Искусственная нейронная сеть – это
+:
модель биологической нейронной сети
-:
искусственное объединение биологических
нейронов
-:
естественное объединение биологических
нейронов
-:
математическая формализация нейронной
сети
I:
ТЗ № 11
S:
Искусственная нейронная сеть не является
-:
моделью биологической нейронной сети
+:
искусственным объединением биологических
нейронов
+:
естественным объединением биологических
нейронов
+:
математической формализацией нейронной
сети
I:
ТЗ № 12
S:
Области применения искусственных
нейронных сетей:
+:
распознавание образов
+:
ассоциативный поиск информации
-:
автоматизированное проектирование
-:
управление производством
I:
ТЗ № 13
S:
Искусственные нейронные сети не
применяются для
-:
распознавания образов
-:
ассоциативного поиска информации
+:
автоматизированного проектирования
+:
управления производством
I:
ТЗ № 14
S:
Весовой коэффициент соответствует …
-:
весу нейрона
-:
длине аксона
+:
усилению сигнала синапсом
-:
выходу активационной функции
I:
ТЗ № 15
S:
Весовой коэффициент не соответствует
…
+:
весу нейрона
+:
длине аксона
-:
усилению сигнала синапсом
+:
выходу активационной функции
I:
ТЗ № 16
S:
Назначением активационной функции
является …
-:
преобразование входного вектора
+:
преобразование выходного сигнала
сумматора
-:
получение взвешенной суммы входных
сигналов
-:
преобразование выходного вектора
I:
ТЗ № 17
S:
Назначением активационной функции не
является …
-:
преобразование выходного сигнала
сумматора
+:
получение взвешенной суммы входных
сигналов
+:
преобразование выходного вектора
+:
преобразование входного вектора
I:
ТЗ № 18
S:
Активационная функция «жесткая ступенька»
имеет вид
-:
![]()
+:

-:

-:

I:
ТЗ № 19
S:
Активационная функция «пологая ступенька»
имеет вид
-:
![]()
-:

+:

-:

I:
ТЗ № 20
S:
Логистическая активационная функция
имеет вид
+:
![]()
-:

-:

-:

I:
ТЗ № 21
S:
Активационная функция «гиперболический
тангенс» имеет вид
-:
![]()
-:

-:

+:

I:
ТЗ № 22
Q:
Активационным функциям соответствуют
выражения
L1:
жесткая ступенька
L2:
сигмоида
L3:
гиперболический тангенс
L4:
пологая
ступенька
R1:

R2:
![]()
R3:
![]()
R4:

I:
ТЗ № 23
S:
Выбор активационной функции определяется
+:
алгоритмом обучения
+:
спецификой задачи
-:
количеством нейронов
+:
удобством реализации
I:
ТЗ № 24
S:
Выбор активационной функции не
определяется
—
алгоритмом обучения
-:
спецификой задачи
+:
количеством нейронов
-:
удобством реализации
VI: 3. Искусственная нейронная сеть
I:
ТЗ № 25
S:
При создании искусственных нейронных
сетей используется … подход
-:
электрохимический
+:
биологический
-:
компьютерный
+:
информационный
I:
ТЗ № 26
S:
При создании искусственных нейронных
сетей не используется … подход
+:
электрохимический
-:
биологический
+:
компьютерный
-:
информационный
I:
ТЗ № 27
S:
Сети прямого распространения
-:
содержат обратные связи
-:
связывают нейрон с самим собой
-:
соединяют слой сети с предшествующим
+:
не содержат обратных связей
I:
ТЗ № 28
S:
Сети прямого распространения
+:
не содержат обратных связей
+:
не связывают нейрон с самим собой
+:
не соединяют слой сети с предшествующим
-:
содержат обратные связи
I:
ТЗ № 29
S:
Сети с обратными связями
-:
связывают нейроны одного слоя
+:
связывают слой с самим собой
+:
соединяют слой сети с предшествующим
-:
не принимают входных сигналов
I:
ТЗ № 30
S:
Сети с обратными связями
+:
не связывают нейроны одного слоя
-:
не связывают слой с самим собой
-:
не соединяют слой сети с предшествующим
-:
не принимают входных сигналов
I:
ТЗ № 31
S:
Многослойная сеть состоит из
+:
чередующихся множеств нейронов и весов
-:
множества соединений между нейронами
-:
множества входных сигналов и весов
-:
чередующихся множеств весов и активационных
функций
I:
ТЗ № 32
S:
Многослойная сеть содержит
+:
чередующиеся множества нейронов и весов
+:
множества соединений между нейронами
-:
множества входных сигналов и весов
-:
чередующиеся множества весов и
активационных функций
I:
ТЗ № 33
S:
Отличительными признаками многослойных
сетей являются то, что
+:
каждый нейрон сети имеет нелинейную
функцию активации
+:
сеть обладает высокой степенью связанности
-:
каждый нейрон сети имеет линейную
функцию активации
-:
сеть обладает низкой степенью связанности
I:
ТЗ № 34
S:
Искусственные нейронные сети подразделяются
на типы:
+:
полносвязные
+:
многослойные
+:
слабосвязные
-:
циклические сети
I:
ТЗ № 35
S:
В полносвязных сетях
+:
каждый нейрон передает выходной сигнал
остальным нейронам
-:
нейроны имеют соединения от выходов к
входам
-:
каждый слой, кроме последнего, разбит
на возбуждающий и тормозящий блоки
-:
нейроны входного слоя передают сигналы
нейронам 1-го скрытого слоя
I:
ТЗ № 36
S:
В монотонных сетях
-:
каждый нейрон передает выходной сигнал
остальным нейронам
-:
последний слой разбит на возбуждающий
и тормозящий блоки
+:
каждый слой, кроме последнего, разбит
на возбуждающий и тормозящий блоки
-:
нейроны входного слоя передают сигналы
нейронам 1-го скрытого слоя
I:
ТЗ № 37
S:
В слабосвязных сетях
-:
каждый нейрон передает выходной сигнал
остальным нейронам
-:
нейроны имеют соединения от выходов к
входам
-:
каждый слой, кроме последнего, разбит
на возбуждающий и тормозящий блоки
+:
нейроны входного слоя передают сигналы
нейронам 1-го скрытого слоя
I:
ТЗ № 38
S:
Каждый нейрон полносвязной сети передает
выходной сигнал
+:
всем нейронам
-:
двум соседним нейронам
-:
нейрону справа
-:
в последующий слой
I:
ТЗ № 39
S:
Каждый нейрон монотонной сети передает
выходной сигнал
-:
всем нейронам своего слоя
+:
нейронам последующего слоя
-:
одному нейрону последующего слоя
-:
нейронам предыдущего слоя
I:
ТЗ № 40
S:
Каждый нейрон слабосвязной сети передает
выходной сигнал
-:
всем нейронам своего слоя
-:
нейронам последующего слоя
-:
одному нейрону последующего слоя
+:
нейронам первого скрытого слоя
I:
ТЗ № 41
S:
В … сетях каждый нейрон передает выходной
сигнал остальным нейронам
-:
локальных
-:
монотонных
-:
слабосвязных
+:
полносвязных
I:
ТЗ № 42
S:
В … сетях каждый нейрон передает выходной
сигнал нейронам первого скрытого слоя
-:
локальных
+:
монотонных
-:
слабосвязных
-:
полносвязных
I:
ТЗ № 43
S:
В … сетях каждый нейрон передает выходной
сигнал нейронам последующего слоя
-:
локальных
-:
монотонных
+:
слабосвязных
-:
полносвязных
Соседние файлы в папке Нс
- #
- #
- #
- #
- #
- #
- #
- #
1. Что такое функция активации
2. Зачем использовать
3. Какие есть функции активации
4、sigmoid,Relu,softmax
1. Что такое функция активации
Как показано на рисунке ниже, в нейроне входные входы взвешиваются, и после суммирования также применяется функция, которая является функцией активации.

2. Зачем использовать
Если функция возбуждения не используется, выход каждого слоя является линейной функцией от входа верхнего уровня. Независимо от того, сколько слоев в нейронной сети, выход является линейной комбинацией входов.
Если используется, функция активации вводит нелинейные факторы в нейрон, так что нейронная сеть может произвольно приближать любую нелинейную функцию, так что нейронная сеть может применяться ко многим нелинейным моделям.
3. Каковы функции активации
(1) сигмовидная функция
Формула:
Кривая:
Производная:
Сигмовидная функция, также называемая логистической функцией, используется для вывода нейронов скрытого слоя, диапазон значений (0,1), она может отображать действительное число в (0,1) и может использоваться для двоичной классификации.
Эффект лучше, когда различие в функциях более сложное или разница не особенно велика.
Недостатки сигмовидной кишки:
- Функция активации требует больших вычислительных ресурсов, и когда обратное распространение ищет градиент ошибки, дифференциация включает в себя деление
- При обратном распространении градиент легко исчезает, что делает невозможным завершение обучения глубокой сети
- Функция сигмоидов насыщена и убивает градиент.
- Функция сигмоидов сходится медленно.
Ниже объясняется, почему исчезает градиент:
В алгоритме обратного распространения для получения функции активации, производное выражение сигмоиды:

Исходная сигмоидальная функция и производный граф следующие:

Из рисунка видно, что производная скоро приблизится к 0 из 0, что легко вызывает явление «исчезновение градиента»
(2) функция Тан
формула


кривая

Также называется функцией касательной к битам, диапазон значений равен [-1,1].
Эффект Таня будет очень хорошим, когда разница в функциях очевидна, и эффект функции будет продолжать расширяться в течение цикла.
Разница между и сигмоидальным состоянием состоит в том, что tanh имеет значение 0, поэтому в реальном приложении tanh будет лучше сигмовидного.
(3) ReLU
Выпрямленная линейная единица (ReLU) — для выхода нейронов скрытого слоя
формула

кривая

Особенности RELU:
Когда входной сигнал <0, на выходе все 0. Если> 0, выход равен входу
Преимущества ReLU:
Krizhevsky et al.Установлено, что скорость сходимости SGD, полученной с использованием ReLU, будет намного выше, чем сигмоид / танх
Недостатки ReLU:
Обучение очень «хрупкое», его легко «умереть»
Например, через нейрон ReLU протекает очень большой градиент. После обновления параметров этот нейрон больше не будет активировать какие-либо данные, затем градиент этого нейрона Это всегда будет 0.
Если скорость обучения велика, вероятно, что 40% нейронов в сети «мертвы».
(4) функция softmax
Softmax-для мультиклассовых выходов нейронной сети
формула

Возьмите пример, чтобы увидеть значение формулы:

То есть, если определенный zj больше других z, компоненты этого отображения близки к 1, а другие близки к 0. Основное применение — мультиклассификация.
Первая причина, по которой вы хотите получить показатель, состоит в том, чтобы моделировать поведение max, поэтому сделайте его больше.
Вторая причина — это необходимость в производной функции.
4. Сравнение сигмовидной, ReLU, softmax
Сигмоид и ReLU сравнение:
Проблема исчезновения градиента сигмоида, производной ReLU, не имеет такой проблемы, ее производная выражается следующим образом:

Кривая как показано

Основные изменения по сравнению с сигмовидными функциями:
1) Одностороннее подавление
2) Относительно широкая граница возбуждения
3) Разреженная активация.
Разница между сигмоидом и софтмаксом:
softmax is a generalization of logistic function that “squashes”(maps) a K-dimensional vector z of arbitrary real values to a K-dimensional vector σ(z) of real values in the range (0, 1) that add up to 1.
Сигмоид отображает действительное значение в интервал (0,1), который используется для двоичной классификации.
И softmax отображает k-мерный вектор действительного значения (a1, a2, a3, a4 …) в a (b1, b2, b3, b4 …), где bi — постоянная от 0 до 1, и сумма выходных нейронов Он равен 1,0, поэтому он эквивалентен значению вероятности, и тогда задача мультиклассификации может быть выполнена в соответствии с вероятностью bi.
Для двух задач классификации сигмоид и софтмакс одинаковы, и оба стремятся к потере перекрестной энтропии, а софтмакс можно использовать для задач мультиклассификации
Softmax является расширением сигмовидной кишки, потому что, когда число категорий k = 2, регрессия softmax вырождается в логистическую регрессию. В частности, когда k = 2, предполагаемая функция регрессии softmax равна:

Используя функцию избыточности параметра регрессии softmax, вычтите вектор θ1 из обоих векторов параметров, чтобы получить:

Наконец, θ ′ используется для представления θ2-θ1, и приведенная выше формула может быть выражена как вероятность того, что регрессия softmax предсказывает одну из категорий как

Вероятность другой категории

Это согласуется с логистической регрессией.
Распределение, используемое для моделирования softmax, является полиномиальным распределением, в то время как логистика основана на распределении Бернулли
Множественная логистическая регрессия может также обеспечить эффект мультиклассификации с помощью суперпозиции, но мультиклассификация с помощью регрессии softmax является взаимоисключающей между классами, то есть один вход может быть классифицирован только Это категория, множественные логистические регрессии используются для множественной классификации, и выходные категории не являются взаимоисключающими, то есть слово «яблоко» относится как к категории «фрукты», так и к категории «3C».
5. Как выбрать
При выборе он настраивается в соответствии с преимуществами и недостатками каждой функции, например:
Если вы используете ReLU, будьте осторожны, чтобы установить скорость обучения, и следите за тем, чтобы в сети не появлялось много «мертвых» нейронов. Если это не легко решить, вы можете попробовать Leaky ReLU, PReLU или Maxout.
2.3 ВЫБОР ФУНКЦИИ АКТИВАЦИИ И ОБУЧЕНИЕ НЕЙРОННОЙ СЕТИ
Синапсы осуществляют связь между нейронами и умножают входной сигнал на число, характеризующее силу связи — вес синапса. Сумматор выполняет сложение сигналов, поступающих по синаптическим связям от других нейронов и внешних входных сигналов. Преобразователь реализует функцию одного аргумента, выхода сумматора, в некоторую выходную величину нейрона. Эта функция называется функцией активации нейрона. Нейрон в целом реализует скалярную функцию векторного аргумента. В общем случае входной сигнал и весовые коэффициенты могут принимать действительные значения. Выход определяется видом функции активации и может быть как действительным, так и целым. Синаптические связи с положительными весами называют возбуждающими, с отрицательными весами — тормозящими.
Таким образом, нейрон полностью описывается своими весами и функцией активации F. Получив набор чисел (вектор) в качестве входов, нейрон выдает некоторое число на выходе.
Активационная функция может быть различного вида [61]. Наиболее широко используемые варианты приведены в таблице (табл.2.1).
Одними из наиболее распространенных функций являются:
- 1. линейная,
- 2. нелинейная с насыщением — логистическая функция или сигмоид,
- 3. гиперболический тангенс.
Линейная функция наилучшим образом соответствует сущности данной задачи. Ее областью определения является диапазон (-∞, ∞). Это позволяет, используя ценовые характеристики товара на входе, получать характеристические значения любой величины на выходе, равные их фактической сумме.
Следует отметить, что сигмоидная функция (2.12) дифференцируема на всей оси абсцисс, что широко используется во многих алгоритмах обучения.
Таблица 2.1
Перечень функций активации нейронов
|
Название |
Формула |
Область значений |
|
Пороговая |
|
0, 1 |
|
Знаковая |
|
-1, 1 |
|
Сигмовидная |
|
(0, 1) |
|
Полулинейная |
|
(0, ∞) |
|
Линейная |
|
(-∞, ∞) |
|
Радиальная базисная |
|
(0, 1) |
|
Полулинейная с насыщением |
|
(0, 1) |
|
Линейная с насыщением |
|
(-1, 1) |
|
Гиперболический тангенс |
|
(-1, 1) |
|
Треугольная |
|
(0, 1) |
. (2.12)
Рис.2.12 Вид сигмоидной функции
Кроме того, она обладает свойством усиливать слабые сигналы лучше, чем сильные, и предотвращает насыщение от сильных сигналов, так как они соответствуют областям аргументов, где сигмоид имеет пологий наклон (рис.2.12). Эти особенности важны для задачи моделирования совершенной конкуренции. Рынок совершенной конкуренции характеризуется однородностью, которая заключается в том, что все производители выпускают одинаковый по числу, свойствам и неценовым характеристикам товар. Единственное отличие однотипных товаров разных производителей — это его ценовые параметры. В условиях рыночной экономики отличия ценовых параметров достаточно характерны для рынков товаров и услуг. Однако они, чаще всего, носят не значительный характер. Поэтому разница между однотипными ценовыми параметрами разных товаров, подаваемых на вход нейронной сети, будет невелика, что предъявляет к чувствительности функции дополнительные требования. Нейроны должны «распознавать» слабо различающиеся входные сигналы. Это делает (2.12) наиболее применимой.
В условиях конкуренции участники рынка, производящие или потребляющие товар по очень высоким или по слишком низким ценам, соответственно, не определяют положение дел на рынке. Основными участниками конкурентной борьбы являются предприятия, действующие в области наиболее конкурентоспособной цены. Это обстоятельство вполне соответствует виду функции (2.12).
Другой широко используемой активационной функцией является гиперболический тангенс. В отличие от логистической функции гиперболический тангенс принимает значения различных знаков, что для ряда сетей оказывается выгодным.
Важно отметить, что выбор вида активационной функции предлагается осуществлять симметрично в производственном и потребительском сегменте по уровням подсистем. Это обосновывается тем, что производство и потребление товара на рынке являются «зеркальными» процессами и должны протекать по одинаковым принципам. Сам же вид функций определяется исходя из требований точности.
При решении с помощью нейронных сетей задач необходимо собрать достаточный и представительный объем данных для того, чтобы обучить нейронную сеть решению таких задач. Обучающий набор данных — это набор наблюдений, содержащих признаки изучаемого объекта. Нейронные сети работают с числовыми данными, взятыми, как правило, из некоторого ограниченного диапазона. В данной задаче эта выборка может быть построена на основе статистической информации, собранной за время существования рынка. Кроме того, количество производителей и поставщиков на рынке совершенной конкуренции достаточно велико и при отсутствии других данных текущие показатели товара могут быть рассмотрены, как обучающая выборка.
Вопрос о том, сколько нужно иметь наблюдений для обучения сети, часто оказывается непростым. Известен ряд эвристических правил, которые устанавливают связь между количеством необходимых наблюдений и размерами сети. Простейшее из них гласит, что количество наблюдений должно быть в 10 раз больше числа связей в сети. На самом деле это число зависит от сложности того отображения, которое должна воспроизводить нейронная сеть. С ростом числа используемых признаков количество наблюдений возрастает по нелинейному закону, так что уже при довольно небольшом числе признаков, скажем 50, может потребоваться огромное число наблюдений. Эта проблема носит название «проклятие размерности».
Таким образом, в условиях первого слоя нейронной системы примерное число обучающих примеров можно определить:
μ = w x l x m. (2.13)
Процесс обучения нейронной сети заключается в определении значений весовых коэффициентов, обеспечивающих однозначное преобразование входных сигналов в выходные.
Путем анализа имеющихся в распоряжении аналитика входных и выходных данных веса сети автоматически настраиваются так, чтобы минимизировать разность между желаемым сигналом и полученным на выходе в результате моделирования. Эта разность носит название ошибки обучения.
Ошибка обучения для конкретной конфигурации нейронной сети определяется путем прогона через сеть всех имеющихся наблюдений и сравнения выходных значений с желаемыми, целевыми значениями. Эти разности позволяют сформировать так называемую функцию ошибок (критерий качества обучения). При моделировании нейронных сетей с линейными функциями активации нейронов можно построить алгоритм, гарантирующий достижение абсолютного минимума ошибки обучения. Для нейронных сетей с нелинейными функциями активации в общем случае нельзя гарантировать достижения глобального минимума функции ошибки.
При таком подходе к процедуре обучения может оказаться полезным геометрический анализ поверхности функции ошибок. Определим веса и смещения как свободные параметры модели и их общее число обозначим через N; каждому набору таких параметров поставим в соответствие одно измерение в виде ошибки сети. Тогда для всевозможных сочетаний весов соответствующую ошибку сети можно изобразить точкой в N-1-мерном пространстве, а все такие точки образуют некоторую поверхность, называемую поверхностью функции ошибок. При таком подходе цель обучения нейронной сети состоит в том, чтобы найти на этой многомерной поверхности глобальный минимум.
В случае линейной модели сети и функции ошибок в виде суммы квадратов такая поверхность будет представлять собой параболоид, который имеет единственный минимум, и это позволяет отыскать такой минимум достаточно просто.
В случае нелинейной модели поверхность ошибок имеет гораздо более сложное строение и обладает рядом неблагоприятных свойств, в частности может иметь локальные минимумы, плоские участки, седловые точки и длинные узкие овраги.
Определить глобальный минимум многомерной функции аналитически невозможно, и поэтому обучение нейронной сети, по сути дела, является процедурой изучения поверхности функции ошибок. Отталкиваясь от случайно выбранной точки на поверхности функции ошибок, алгоритм обучения постепенно отыскивает глобальный минимум. Как правило, для этого вычисляется градиент (наклон) функции ошибок в данной точке, а затем эта информация используется для продвижения вниз по склону. В конце концов алгоритм останавливается в некотором минимуме, который может оказаться лишь локальным минимумом, а если повезет, то и глобальным.
После многократного предъявления примеров веса сети стабилизируются, причем сеть дает правильные ответы на все (или почти все) примеры из базы данных. В таком случае говорят, что «сеть обучена». В программных реализациях можно видеть, что в процессе обучения функция ошибки (например, сумма квадратов ошибок по всем выходам) постепенно уменьшается. Когда функция ошибки достигает нуля или приемлемого малого уровня, тренировку останавливают, а полученную сеть считают натренированной и готовой к применению на новых данных.
Важно отметить, что вся информация, которую сеть имеет о задаче, содержится в наборе примеров. Поэтому качество обучения сети напрямую зависит от количества примеров в обучающей выборке, а также от того, насколько полно эти примеры описывают данную задачу.
Для решения задачи обучения могут быть использованы следующие (итерационные) алгоритмы:
- 1. алгоритмы локальной оптимизации с вычислением частных производных первого порядка;
- 1. алгоритмы локальной оптимизации с вычислением частных производных первого и второго порядка;
- 2. стохастические алгоритмы оптимизации;
- 3. алгоритмы глобальной оптимизации.
К первой группе относятся: градиентный алгоритм (метод скорейшего спуска); методы с одномерной и двумерной оптимизацией целевой функции в направлении антиградиента; метод сопряженных градиентов; методы, учитывающие направление антиградиента на нескольких шагах алгоритма [119, 122].
Ко второй группе относятся: метод Ньютона, методы оптимизации с разреженными матрицами Гессе, квазиньютоновские методы, метод Гаусса-Ньютона, метод Левенберга-Марквардта [128, 131] и другие.
Стохастическими методами являются: поиск в случайном направлении, имитация отжига, метод Монте-Карло (численный метод статистических испытаний).
Задачи глобальной оптимизации решаются с помощью перебора значений переменных, от которых зависит целевая функция (функция ошибки).
При использовании алгоритма обратного распространения ошибки сеть рассчитывает возникающую в выходном слое ошибку и вычисляет вектор градиента как функцию весов. Этот вектор указывает направление кратчайшего спуска по поверхности для данной точки, поэтому если продвинуться в этом направлении, то ошибка уменьшится. Последовательность таких шагов в конце концов приведет к минимуму того или иного типа. Определенную трудность здесь вызывает выбор величины шага.
При большой длине шага сходимость будет более быстрой, но имеется опасность перепрыгнуть через решение или уйти в неправильном направлении. Напротив, при малом шаге, вероятно, будет выбрано верное направление, однако при этом потребуется очень много итераций. На практике величина шага выбирается пропорциональной крутизне склона (градиенту функции ошибок). Такой коэффициент пропорциональности называется параметром скорости настройки. Правильный выбор параметра скорости настройки зависит от конкретной задачи и обычно осуществляется опытным путем. Этот параметр может также зависеть от времени, уменьшаясь по мере выполнения алгоритма.
Алгоритм действует итеративно, и его шаги принято называть эпохами или циклами. На каждом цикле на вход сети последовательно подаются все обучающие наблюдения, выходные значения сравниваются с целевыми значениями, и вычисляется функция ошибки. Значения функции ошибки, а также ее градиента используются для корректировки весов и смещений, после чего все действия повторяются. Начальные значения весов и смещений сети выбираются случайным образом, и процесс обучения прекращается либо когда реализовано определенное количество циклов, либо когда ошибка достигнет некоторого малого значения или перестанет уменьшаться.
Другой подход к процедуре обучения сети можно сформулировать, если рассматривать ее как процедуру, обратную моделированию. В этом случае требуется подобрать такие значения весов, которые обеспечивали бы нужное соответствие между входами и желаемыми значениями на выходе. Такая процедура обучения носит название процедуры адаптации и достаточно широко применяется для настройки параметров нейронных сетей.
Каждый слой производственного сегмента решает свою функциональную задачу в рамках нейронной системы всего рынка. По этой причине процедуру обучения можно выполнять независимо для каждого слоя.
Процесс обучения требует набора примеров ее желаемого поведения — входов H и целевых выходов Ψоpt. Во время этого процесса веса настраиваются так, чтобы минимизировать некоторый функционал ошибки. По умолчанию, в качестве такого функционала для сетей с прямой передачей сигналов принимается среднеквадратичная ошибка между векторами выхода Ψоpt и Ψ.
При обучении сети рассчитывается некоторый функционал, характеризующий качество обучения:
, (2.14)
где J — функционал; Q — объем выборки; М — число слоев сети; q — номер выборки; Sм — число нейронов выходного слоя; Ψq — вектор сигнала на выходе сети; Ψq opt — вектор желаемых (целевых) значений сигнала на выходе сети для выборки с номером q.
В случае использования линейной активационной функции нейронные сети первого слоя однослойные. В этом случае М = 1 и выражение для функционала принимает вид:
, (2.15)
где
— функция активации;
— сигнал на входе функции активации для j-го нейрона;
— вектор входного сигнала; w — число элементов вектора входа; m — число нейронов в слое;
— весовые коэффициенты сети.
Включим вектор смещения в состав матрицы весов
, а вектор входа дополним элементом, равным 1.
Применяя правило дифференцирования сложной функции, вычислим градиент функционала ошибки, зная при этом, что функция активации дифференцируема:
. (2.16)
Введем обозначение:
. (2.17)
и преобразуем выражение (2.16) следующим образом:
. (2.18)
Полученные выражения упрощаются, если сеть линейна. Поскольку для такой сети выполняется соотношение
, то справедливо условие
. В этом случае выражение (2.16) принимает вид:
. (2.19)
Выражение (2.19) положено в основу алгоритма WH, применяемого для обучения линейных нейронных сетей [132].
Линейные сети могут быть обучены и без использования итерационных методов, а путем решения следующей системы линейных уравнений:
. (2.20)
Если число неизвестных системы (2.20) равно числу уравнений, то такая система может быть решена, например, методом исключения Гаусса с выбором главного элемента. Если же число уравнений превышает число неизвестных, то решение ищется с использованием метода наименьших квадратов.
В случае нелинейной функции активации для обучения нейронных сетей предлагается применить метод обратного распространения ошибки.
Алгоритм обратного распространения ошибки является одним из эффективных обучающих алгоритмов [130]. По существу он представляет собой минимизационный метод градиентного спуска. Рассмотрим алгоритм обратного распространения ошибки для нейронной сети с одним скрытым слоем. Предположим, что имеется A исходных примеров:
= , (2.21)
где
— вектор желаемых выходов сети, соответствующий входному вектору
.
Инициализируем вектор весов Ω случайным образом.
Теперь нужно осуществить настройку весов сети с помощью процесса обучения. Для a-го примера выходы скрытых нейронов будут определяться выражениями:
, (2.22)
а выходы всей нейросети — выражениями:
(2.23)
В выражениях (2.22) и (2.23), F() — функция активации, например, сигмоидная функция.
Функционал квадратичной ошибки сети для данного входного образа имеет вид:
(2.24)
Данный функционал подлежит минимизации. Классический градиентный метод оптимизации состоит в итерационном уточнении аргумента согласно формуле:
, (2.25)
где h — коэффициент скорости обучения 0<η<1.
Параметр η имеет смысл темпа обучения и выбирается достаточно малым для сходимости метода.
Функция ошибки в явном виде не содержит зависимости от веса
, поэтому воспользуемся формулами неявного дифференцирования сложной функции:
(2.26)
Производная сигмоидной функции выражается только через само значение функции. Таким образом, все необходимые величины для подстройки весов выходного слоя получены.
Выполняется подстройка весов скрытого слоя:
(2.27)
Вычисляются производные функции ошибки:
(2.26)
При вычислении d здесь и был применен принцип обратного распространения ошибки: частные производные берутся только по переменным последующего слоя. По полученным формулам модифицируются веса нейронов скрытого слоя.
Вычисления (2.22)-(2.26) повторяются для всех обучающих векторов. Обучение завершается по достижении малой полной ошибки или максимально допустимого числа итераций.
Сходимость метода обратного распространения весьма медленная. Невысокий темп сходимости является особенностью всех градиентных методов, так как локальное направление градиента отнюдь не совпадает с направлением к минимуму. Подстройка весов выполняется независимо для каждой пары образов обучающей выборки. При этом улучшение функционирования на некоторой заданной паре может приводить к ухудшению работы на предыдущих образах.
Несмотря на то, что алгоритм обратного распространения ошибки достаточно прост, он требует обычно тысячи итераций для обучения нейросети. Если требований к точности нет, то следует использовать первый способ (2.14)-(2.20).
Для определения весов входов нейронов второго слоя, а также третьего слоя производственного сегмента нейронной системы обучение не требуется. Значения весов, в силу равнозначности положения всех производителей на рынке, выбираются равными. Никто из них не занимает по условию совершенной конкуренции привилегированного положения. Эти же принципы применимы и к товарам.
По аналогии определяются веса нейронной подсистемы потребительского сегмента рынка.
Главным этапом применения предложенной нейронной системы является процесс ее непосредственной эксплуатации. Цель этого этапа заключается в решении основной задачи — определении характеристик товара, обеспечивающих его производителю конкурентные преимущества и удовлетворяющего запросы потребителей.
Все курсы > Вводный курс > Занятие 21
В завершающей лекции вводного курса ML мы изучим основы нейронных сетей (neural network), более сложных алгоритмов машинного обучения.
Алгоритмы нейронных сетей принято относить к области глубокого обучения (deep learning). Все изученные нами ранее алгоритмы относятся к так называемому традиционному машинному обучению (traditional machine learning).
Прежде чем перейти к этому занятию, настоятельно рекомендую пройти предыдущие уроки вводного курса.
Смысл, структура и принцип работы
Смысл алгоритма нейронной сети такой же, как и у классических алгоритмов. Мы также имеем набор данных и цель, которой хотим добиться, обучив наш алгоритм (например, предсказать число или отнести объект к определенному классу).
Отличие нейросети от других алгоритмов заключается в ее структуре.

Как мы видим, нейронная сеть состоит из нейронов, сгруппированных в слои (layers), у нее есть входной слой (input layer), один или несколько скрытых слоев (hidden layers) и выходной слой (output layer). Каждый нейрон связан с нейронами предыдущего слоя через определенные веса.
Количество слоев и нейронов не ограничено. Эта особенность позволяет нейронной сети моделировать очень сложные закономерности, с которыми бы не справились, например, линейные модели.
Функционирует нейросеть следующим образом.
На первом этапе данные подаются в нейроны входного слоя (x и y) и умножаются на соответствующие веса (w1, w2, w3, w4). Полученные произведения складываются. К результату прибавляется смещение (bias, в данном случае b1 и b2).
$$ w_{1}cdot x + w_{3}cdot y + b_{1} $$
$$ w_{2}cdot x + w_{4}cdot y + b_{2} $$
Получившаяся сумма подаётся в функцию активации (activation function) для ограничения диапазона и стабилизации результата. Этот результат записывается в нейроны скрытого слоя (h1 и h2).
$$ h_{1} = actfun(w_{1}cdot x + w_{3}cdot y + b_{1}) $$
$$ h_{2} = actfun(w_{2}cdot x + w_{4}cdot y + b_{2}) $$
На втором этапе процесс повторяется для нейронов скрытого слоя (h1 и h2), весов (w5 и w6) и смещения (b3) до получения конечного результата (r).
$$ r = actfun(w_{5}cdot h_{1} + w_{6}cdot h_{2} + b_{3}) $$
Описанная выше нейронная сеть называется персептроном (perceptron). Эта модель стремится повторить восприятие информации человеческим мозгом и учитывает три этапа такого процесса:
- Восприятие информации через сенсоры (входной слой)
- Создание ассоциаций (скрытый слой)
- Реакцию (выходной слой)
Основы нейронных сетей на простом примере
Приведем пример очень простой нейронной сети, которая на входе получает рост и вес человека, а на выходе предсказывает пол. Скрытый слой в данном случае мы использовать не будем.

В качестве функции активации мы возьмём сигмоиду. Ее часто используют в задачах бинарной (состоящей из двух классов) классификации. Приведем формулу.
$$ f(x) = frac{mathrm{1} }{mathrm{1} + e^{-x}} $$
График сигмоиды выглядит следующим образом.

Эта функция преобразует любые значения в диапазон (или вероятность) от 0 до 1. В случае задачи классификации, если результат (вероятность) близок к нулю, мы отнесем наблюдение к одному классу, если к единице, то к другому. Граница двух классов пройдет на уровне 0,5.
Общее уравнение нейросети выглядит следующим образом.
$$ r = sigmoid(w_{1}cdot weight + w_{2}cdot height + bias) $$
Теперь предположим, что у нас есть следующие данные и параметры нейросети.
Откроем ноутбук к этому занятию⧉
|
# даны вес и рост трех человек # единицей мы обозначим мужской пол, а нулем — женский. data = { ‘Иван’: [84, 180, 1], ‘Мария’: [57, 165, 0], ‘Анна’: [62, 170, 0] } |
|
# и даны следующие веса и смещение w1, w2, b = 0.3, 0.1, —39 |
Пропустим первое наблюдение через нашу нейросеть. Следуя описанному выше процессу, вначале умножим данные на соответствующие веса и прибавим смещение.
|
r = w1 * data[‘Иван’][0] + w2 * data[‘Иван’][1] + b |
Теперь к полученному результату (r) применим сигмоиду.
|
np.round(1 / (1 + np.exp(—r)), 3) |
Результат близок к единице, значит пол мужской. Модель сделала верный прогноз. Повторим эти вычисления для каждого из наблюдений.
|
# пройдемся по ключам и значениям нашего словаря с помощью метода .items() for k, v in data.items(): # вначале умножим каждую строчку данных на веса и прибавим смещение r1 = w1 * v[0] + w2 * v[1] + b # затем применим сигмоиду r2 = 1 / (1 + np.exp(—r1)) # если результат больше 0,5, модель предскажет мужской пол if r2 > 0.5: print(k, np.round(r2, 3), ‘male’) # в противном случае, женский else: print(k, np.round(r2, 3), ‘female’) |
|
Иван 0.985 male Мария 0.004 female Анна 0.032 female |
Как мы видим, модель отработала верно.
Обучение нейронной сети
В примере выше был описан первый этап работы нейронной сети, называемый прямым распространением (forward propagation).
И кажется, что этого достаточно. Модель справилась с поставленной задачей. Однако, обратите внимание, веса были подобраны заранее и никаких дополнительных действий от нас не потребовалось.
В реальности начальные веса выбираются случайно и отклонение истинного результата от расчетного (т.е. ошибка) довольно велико.
Как и с обычными алгоритмами ML, для построения модели, нам нужно подобрать идеальные веса или заняться оптимизацией. Применительно к нейронным сетям этот процесс называется обратным распространением (back propagation).

В данном случае мы как бы двигаемся в обратную сторону и, уже зная результат (и уровень ошибки), с учётом имеющихся данных рассчитываем, как нам нужно изменить веса и смещения, чтобы уровень ошибки снизился.
Для того чтобы математически описать процесс оптимизации, нам не хватает знаний математического анализа (calculus) и, если говорить более точно, понятия производной (derivative).
Затем, уже с новыми весами, мы снова повторяем весь процесс forward propagation слева направо и снова рассчитываем ошибку. После этого мы вновь меняем веса в ходе back propagation.
Эти итерации повторяются до тех пор, пока ошибка не станет минимальной, а веса не будут подобраны идеально.
Создание нейросети в библиотеке Keras
Теперь давайте попрактикуемся в создании и обучении нейронной сети с помощью библиотеки Keras. В первую очередь установим необходимые модули и библиотеки.
|
# установим библиотеку tensorflow (через нее мы будем пользоваться keras) и модуль mnist !pip install tensorflow mnist |
И импортируем их.
|
# импортируем рукописные цифры import mnist # и библиотеку keras from tensorflow import keras |
1. Подготовка данных
Как вы вероятно уже поняли, сегодня мы снова будем использовать уже знакомый нам набор написанных от руки цифр MNIST (только на этот раз воспользуемся не библиотекой sklearn, а возьмем отдельный модуль).
В модуле MNIST содержатся чёрно-белые изображения цифр от 0 до 9 размером 28 х 28 пикселей. Каждый пиксель может принимать значения от 0 (черный) до 255 (белый).
Данные в этом модуле уже разбиты на тестовую и обучающую выборки. Посмотрим на обучающий набор данных.
|
# сохраним обучающую выборку и соответсвующую целевую переменную X_train = mnist.train_images() y_train = mnist.train_labels() # посмотрим на размерность print(X_train.shape) print(y_train.shape) |
Как мы видим, обучающая выборка содержит 60000 изображений и столько же значений целевой переменной. Теперь посмотрим на тестовые данные.
|
# сделаем то же самое с тестовыми данными X_test = mnist.test_images() y_test = mnist.test_labels() # и также посмотрим на размерность print(X_test.shape) print(y_test.shape) |
Таких изображений и целевых значений 10000.
Посмотрим на сами изображения.
|
# создадим пространство для четырех картинок в один ряд fig, axes = plt.subplots(1, 4, figsize = (10, 3)) # в цикле for создадим кортеж из трех объектов: id изображения (всего их будет 4), самого изображения и # того, что на нем представлено (целевой переменной) for ax, image, label in zip(axes, X_train, y_train): # на каждой итерации заполним соответствующее пространство картинкой ax.imshow(image, cmap = ‘gray’) # и укажем какой цифре соответствует изображение с помощью f форматирования ax.set_title(f‘Target: {label}’) |

Нейросети любят, когда диапазон входных значений ограничен (нормализован). В частности, мы можем преобразовать диапазон [0, 255] в диапазон от [–1, 1]. Сделать это можно по следующей формуле.
$$ x’ = 2 frac {x-min(x)}{max(x)-min(x)}-1 $$
Применим эту формулу к нашим данным.
|
# функция np.min() возвращает минимальное значение, # np.ptp() — разницу между максимальным и минимальным значениями (от англ. peak to peak) X_train = 2. * (X_train — np.min(X_train)) / np.ptp(X_train) — 1 X_test = 2. * (X_test — np.min(X_test)) / np.ptp(X_test) — 1 |
Посмотрим на новый диапазон.
|
# снова воспользуемся функцией np.ptp() np.ptp(X_train) |
Теперь нам необходимо «вытянуть» изображения и превратить массивы, содержащие три измерения, в двумерные матрицы. Мы уже делали это на занятии по компьютерному зрению.
Применим этот метод к нашим данным.
|
# «вытянем» (flatten) наши изображения, с помощью метода reshape # у нас будет 784 столбца (28 х 28), количество строк Питон посчитает сам (-1) X_train = X_train.reshape((—1, 784)) X_test = X_test.reshape((—1, 784)) # посмотрим на результат print(X_train.shape) print(X_test.shape) |
Посмотрим на получившиеся значения пикселей.
|
# выведем первое изображение [0], пиксели с 200 по 209 X_train[0][200:210] |
|
array([—1. , —1. , —1. , —0.61568627, 0.86666667, 0.98431373, 0.98431373, 0.98431373, 0.98431373, 0.98431373]) |
Наши данные готовы. Теперь нужно задать конфигурацию модели.
2. Конфигурация нейронной сети
Существует множество различных архитектур нейронных сетей. Пока что мы познакомились с персептроном или в более общем смысле нейросетями прямого распространения (Feed Forward Neural Network, FFNN), в которых данные (сигнал) поступают строго от входного слоя к выходному.
Такую же сеть мы и будем использовать для решения поставленной задачи. В частности, на входе мы будем одновременно подавать 784 значения, которые затем будут проходить через два скрытых слоя по 64 нейрона каждый и поступать в выходной слой из 10 нейронов (по одному для каждой из цифр или классов).

В первую очередь воспользуемся классом Sequential библиотеки Keras, который укажет, что мы задаём последовательно связанные между собой слои.
|
# импортируем класс Sequential from tensorflow.keras.models import Sequential # и создадим объект этого класса model = Sequential() |
Далее нам нужно прописать сами слои и связи между нейронами.
Тип слоя Dense, который мы будем использовать, получает данные со всех нейронов предыдущего слоя. Функцией активации для скрытых слоев будет уже известная нам сигмоида.
|
# импортируем класс Dense from tensorflow.keras.layers import Dense # и создадим первый скрытый слой (с указанием функции активации и размера входного слоя) model.add(Dense(64, activation = ‘sigmoid’, input_shape = (784,))) # затем второй скрытый слой model.add(Dense(64, activation = ‘sigmoid’)) # и наконец выходной слой model.add(Dense(10, activation = ‘softmax’)) |
Выходной слой будет состоять из 10 нейронов, по одному для каждого из классов (цифры от 0 до 9). В качестве функции активации будет использована новая для нас функция softmax (softmax function).
Если сигмоида подходит для бинарной классификации, то softmax применяется для задач многоклассовой классификации. Приведем формулу.
$$ text{softmax}(vec{z})_{i} = frac{e^{z_i}}{sum_{j=1}^K e^{z_i}} $$
Функция softmax на входе принимает вектор действительных чисел (z), применяет к каждому из элементов zi экспоненциальную функцию и нормализует результат через деление на сумму экспоненциальных значений каждого из элементов.
На выходе получается вероятностное распределение любого количества классов (K), причем каждое значение находится в диапазоне от 0 до 1, а сумма всех значений равна единице. Приведем пример для трех классов.

Очевидно, вероятность того, что это кошка, выше. Теперь, когда мы задали архитектуру сети, необходимо заняться ее настройками.
Работа над ошибками. Внимательный читатель безусловно обратил внимание, что вероятности на картинке не соответствуют приведенным в векторе значениям. Если подставить эти числа в формулу softmax вероятности будут иными.
|
z = ([1, 2, 0.5]) np.exp(z) / sum(np.exp(z)) |
|
array([0.2312239 , 0.62853172, 0.14024438]) |
Впрочем, алгоритм по-прежнему уверен, что речь идет о кошке.
3. Настройки
Настроек будет три:
- тип функции потерь (loss function) определяет, как мы будем считать отклонение прогнозного значения от истинного
- способ или алгоритм оптимизации этой функции (optimizer) поможет снизить потерю или ошибку и подобрать правильные веса в процессе back propagation
- метрика (metric) покажет, насколько точна наша модель
Функция потерь
В первую очередь, определимся с функцией потерь. Раньше, например, в задаче регрессии, мы использовали среднеквадратическую ошибку (MSE). Для задач классификации мы будем использовать функцию потерь, называемую перекрестной или кросс-энтропией (cross-entropy). Продолжим пример с собакой, кошкой и попугаем.

Функция перекрестной энтропии (D) показывает степень отличия прогнозного вероятностного распределения (которое мы получили на выходе функции softmax (S)) от истинного (наша целевая переменная (L)). Чем больше отличие, тем выше ошибка.
Также обратите внимание, наша целевая переменная закодирована, вместо слова «кошка» напротив соответсвующего класса стоит единица, а напротив остальных классов — нули. Такая запись называется унитарным кодом, хотя чаще используется анлийский термин one-hot encoding.
Когда мы будем обучать наш алгоритм, мы также применим эту кодировку к нашим данным. Например, если в целевой переменной содержится цифра пять, то ее запись в one-hot encoding будет следующей.

В дополнение замечу, что функция кросс-энтропии, в которой применяется one-hot encoding, называется категориальной кросс-энтропией (categorical cross-entropy).
Отлично! С тем как мы будем измерять уровень ошибки (качество обучения) нашей модели, мы определились. Теперь нужно понять, как мы эту ошибку будем минимизировать. Для этого существует несколько алгоритмов оптимизации.
Алгоритм оптимизации
Классическим алгоритмом является, так называемый, метод стохастического градиентного спуска (Stochastic Gradient Descent или SGD).
Если предположить для простоты, что наша функция потерь оптимизирует один вес исходной модели, и мы находимся изначально в точке А (с неидеальным случайным весом), то наша задача — оказаться в точке B, где ошибка (L) минимальна, а вес (w) оптимален.

Спускаться мы будем вдоль градиента, то есть по кратчайшему пути. Идею градиента проще увидеть на функции с двумя весами. Такая функция имеет уже три измерения (две независимых переменных, w1 и w2, и одну зависимую, L) и графически похожа на «холмистую местность», по которой мы будем спускаться по наиболее оптимальному маршруту.

Стохастичность (или случайность) этого алгоритма заключается в том, что мы берем не всю выборку для обновления весов модели, а лишь одно или несколько случайных наблюдений. Такой подход сильно сокращает время оптимизации.
Метрика
Остается определиться с метрикой качества. Здесь мы просто возьмём знакомую нам метрику accuracy, которая посчитает долю правильно сделанных прогнозов.
Посмотрим на используемый код.
|
model.compile( loss = ‘categorical_crossentropy’, optimizer = ‘sgd’, metrics = [‘accuracy’] ) |
4. Обучение модели
Теперь давайте соберём все описанные выше элементы и посмотрим на работу модели в динамике. Повторим ещё раз изученные выше шаги.
- Значения пикселей каждого изображения поступают в 784 нейрона входного слоя
- Далее они проходят через скрытые слои, где они умножаются на веса, складываются, смещаются и поступают в соответствующую функцию активации
- На выходе из функции softmax мы получаем вероятности для каждой из цифр
- После этого результат сравнивается с целевой переменной с помощью функции перекрестной энтропии (функции потерь); делается расчет ошибки
- На следующем шаге алгоритм оптимизации стремится уменьшить ошибку и соответствующим образом изменяет веса
- После этого процесс повторяется, но уже с новыми весами.
Давайте выполним все эти операции в библиотеке Keras.
|
# вначале импортируем функцию to_categorical, чтобы сделать one-hot encoding from tensorflow.keras.utils import to_categorical |
|
# обучаем модель model.fit( X_train, # указываем обучающую выборку to_categorical(y_train), # делаем one-hot encoding целевой переменной epochs = 10 # по сути, эпоха показывает сколько раз алгоритм пройдется по всем данным ) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Epoch 1/10 1875/1875 [==============================] — 4s 2ms/step — loss: 2.0324 — accuracy: 0.4785 Epoch 2/10 1875/1875 [==============================] — 3s 2ms/step — loss: 1.2322 — accuracy: 0.7494 Epoch 3/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.7617 — accuracy: 0.8326 Epoch 4/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.5651 — accuracy: 0.8663 Epoch 5/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.4681 — accuracy: 0.8827 Epoch 6/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.4121 — accuracy: 0.8923 Epoch 7/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.3751 — accuracy: 0.8995 Epoch 8/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.3487 — accuracy: 0.9045 Epoch 9/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.3285 — accuracy: 0.9090 Epoch 10/10 1875/1875 [==============================] — 3s 2ms/step — loss: 0.3118 — accuracy: 0.9129 <keras.callbacks.History at 0x7f36c3f09490> |
На обучающей выборке мы добились неплохого результата, 91.29%.
5. Оценка качества модели
На этом шаге нам нужно оценить качество модели на тестовых данных.
|
# для оценки модели воспользуемся методом .evaluate() model.evaluate( X_test, # который применим к тестовым данным to_categorical(y_test) # не забыв закодировать целевую переменную через one-hot encoding ) |
|
313/313 [==============================] — 1s 1ms/step — loss: 0.2972 — accuracy: 0.9173 [0.29716429114341736, 0.9172999858856201] |
Результат «на тесте» оказался даже чуть выше, 91,73%.
6. Прогноз
Теперь давайте в качестве упражнения сделаем прогноз.
|
# передадим модели последние 10 изображений тестовой выборки pred = model.predict(X_test[—10:]) # посмотрим на результат для первого изображения из десяти pred[0] |
|
array([1.0952151e-04, 2.4856537e-04, 1.5749732e-03, 7.4032680e-03, 6.2553445e-05, 8.7646207e-05, 9.4199123e-07, 9.7065586e-01, 5.3100550e-04, 1.9325638e-02], dtype=float32) |
Работа над ошибками. На видео я говорю про первые десять изображений. Разумеется, это неверно. Срез [-10:] выводит последние десять изображений.
В переменной pred содержится массив numpy с десятью вероятностями для каждого из десяти наблюдений. Нам нужно выбрать максимальную вероятность для каждого изображения и определить ее индекс (индекс и будет искомой цифрой). Все это можно сделать с помощью функции np.argmax(). Посмотрим на примере.

Теперь применим к нашим данным.
|
# для кажого изображения (то есть строки, axis = 1) # выведем индекс (максимальное значение), это и будет той цифрой, которую мы прогнозируем print(np.argmax(pred, axis = 1)) # остается сравнить с целевой переменной print(y_test[—10:]) |
|
[7 8 9 0 1 2 3 4 5 6] [7 8 9 0 1 2 3 4 5 6] |
Для первых десяти цифр модель сделала верный прогноз.
7. Пример улучшения алгоритма
Существует множество параметров модели, которые можно настроить. В качестве примера попробуем заменить алгоритм стохастического градиентного спуска на считающийся более эффективным алгоритм adam (суть этого алгоритма выходит за рамки сегодняшней лекции).
Посмотрим на результат на обучающей и тестовой выборке.
|
# снова укажем настройки модели model.compile( loss = ‘categorical_crossentropy’, optimizer = ‘adam’, # однако заменим алгоритм оптимизации metrics = [‘accuracy’] ) # обучаем модель методом .fit() model.fit( X_train, # указываем обучающую выборку to_categorical(y_train), # делаем one-hot encoding целевой переменной epochs = 10 # прописываем количество эпох ) |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Epoch 1/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.2572 — accuracy: 0.9252 Epoch 2/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.1738 — accuracy: 0.9497 Epoch 3/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.1392 — accuracy: 0.9588 Epoch 4/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.1196 — accuracy: 0.9647 Epoch 5/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.1062 — accuracy: 0.9685 Epoch 6/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.0960 — accuracy: 0.9708 Epoch 7/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.0883 — accuracy: 0.9732 Epoch 8/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.0826 — accuracy: 0.9747 Epoch 9/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.0766 — accuracy: 0.9766 Epoch 10/10 1875/1875 [==============================] — 4s 2ms/step — loss: 0.0699 — accuracy: 0.9780 <keras.callbacks.History at 0x7f36c3d74590> |
|
# и оцениваем результат «на тесте» model.evaluate( X_test, to_categorical(y_test) ) |
|
313/313 [==============================] — 1s 1ms/step — loss: 0.1160 — accuracy: 0.9647 [0.11602973937988281, 0.9646999835968018] |
Как вы видите, с помощью одного изменения мы повысили долю правильных прогнозов до 96,47%.
Более подходящие для работы с изображениями сверточные нейронные сети (convolutional neural network, CNN) достигают свыше 99% точности на этом наборе данных, как это видно в примере⧉ на официальном сайте библиотеки Keras.
Подведем итог
На сегодняшнем занятии изучили основы нейронных сетей. В частности, мы узнали, что такое нейронная сеть, какова ее структура и алгоритм функционирования. Многие шаги, например, оценка уровня ошибки через функцию кросс-энтропии или оптимизация методом стохастического градиентного спуска, разумеется, требуют отдельного занятия. Эти уроки еще впереди.
При этом, я надеюсь, у вас сложилось целостное представление о том, что значит создать и обучить нейросеть, и какие шаги для этого требуются.
Вопросы для закрепления
Перечислите типы слоев нейронной сети
Посмотреть правильный ответ
Ответ: обычно используется входной слой, один или несколько скрытых слоев и выходной слой.
Из каких двух этапов состоит обучение нейронной сети?
Посмотреть правильный ответ
Ответ: вначале (1) при forward propagation мы пропускаем данные от входного слоя к выходному, затем, рассчитав уровень ошибки, (2) начинается обратный процесс back propagation, при котором, мы улучшаем веса исходной модели.
Для чего используются сигмоида и функция softmax в выходном слое нейронной сети в задачах классификации?
Посмотреть правильный ответ
Ответ: сигмоида используется, когда нужно предсказать один из двух классов, если классов больше двух, применяется softmax.
Ответы на вопросы
Вопрос. Что означает число 1875 в результате работы модели?
Ответ. Я планировал рассказать об этом на курсе по оптимизации, но попробую дать общие определения уже сейчас. Как я уже сказал, при оптимизации методом градиентного спуска мы можем использовать (1) все данные, (2) часть данных или (3) одно наблюдение для каждого обновления весов. Это регулируется параметром batch_size (размер партии).
- в первом случае, количество наблюдений (batch, партия) равно размеру датасета, веса не обновляются пока мы не пройдемся по всем наблюдениям, это простой градиентный спуск
- во втором случае, мы берем часть наблюдений (mini-batch, мини-партия), и когда обработаем их, то обновляем веса; после этого мы обрабатываем следующую партию
- и наконец мы можем взять только одно наблюдение и сразу после его анализа обновить веса, это классический стохастический градиентный спуск (stochastic gradient descent), параметр batch_size = 1
В чем преимущество каждого из методов? Если мы берем всю партию и по результатам ее обработки обновляем веса, то двигаемся к минимуму функции потерь наиболее плавно. Минус в том, что на расчет требуется время и вычислительные мощности.
Если берем только одно наблюдение, то считаем все быстро, но расчет минимума функции потерь менее точен.
В библиотеке Keras (и нашей нейросети) по умолчанию используется второй подход и размер партии равный 32 наблюдениям (
batch_size = 32). С учетом того, что в обучающей выборке 60000 наблюдений, разделив 60000 на 32 мы получим 1875 итераций или обновлений весов в рамках одной эпохи. Отсюда и число 1875.
Повторим, алгоритм обрабатывает 32 наблюдения, обновляет веса и после этого переходит к следующей партии (batch) из 32-х наблюдений. Обработав таким образом 60000 изображений, алгоритм заканчивает первую эпоху и начинает вторую. Размер партии и количество эпох регулируется параметрами batch_size и epochs соответственно.
Введение в нейронные сети. Общая постановка задачи. Персептрон. Функции активации нейронов.
Общая постановка задачи
В общем случае задача программирования нейронной сети — это разработать такую нейронную сеть, которая по входу X, будет выдавать правильные ответы Y.
Входом в нейронную сеть могут быть:
- сырые данные, например, звук или фотография.
- либо уже заранее обработанные данные алгоритмом, которые по входу X выдаст признаки (feauture), которые будут передаваться нейронной сети. Данные признаки могут быть определены другой нейронной сетью.
- и т.п.
Выходом могут являться:
- Ответ да или нет.
- Номер категории, к которой принадлежат входные данные.
- Картинка, изображение, звук.
- и т.п.
Задача программиста:
- определить что будет считаться входом в нейронную сеть, а что выходом.
- в каком формате будет принимать нейронная сеть данные.
- структурировать и привести в единую форму входные и выходные данные.
- определить признаки данных, которые могут быть дополнительно поданы на вход в нейронную сеть.
- определить количество слоев нейронной сети.
- определить дополнительные алгоритмы в архитектуре нейронной сети, как отдельные слои.
- создать и разметить DataSet, на котором будет проходить обучение нейронная сеть.
- создать правильную архитектуру нейронной сети.
- обучить нейронную сеть и проверить ее на контрольной выборке.
- внедрить полученную нейронную сеть.
Размеченный DataSet ((D)) — это набор данных и известных ответов к ним. По этому датасету обучаются нейронные сети. При этом датасет делится на две части. Обучающий и контрольный. По обучающему датасету нейронная сеть учится, а по контрольному тестируется. Важно, чтобы данные контрольного датасета не попадали в обучающий, иначе нейронная сеть просто заучит правильные ответы.
Правильным результатом считается, когда нейронная сеть наименьше всего ошибается на обоих дата сетах. Берутся ответы нейронной сети и сравниваются с правильными. Чем меньше ошибка, тем лучше работает нейронная сеть.
Функцией ошибки ((Q)) называется разница между правильными ответами и ответами, которая выдает нейронная сеть на обучающем и контрольном датасете.
Обучение по размеченному датасету называется обучением с учителем. Есть также другие варианты обучения. Например, без учителя. В данном случае правильные ответы отсуствуют и нейронная сеть должна найти их сама. Эта задача хорошо подходит, например, для нахождения общих признаков на большом количестве данных.
Математикой обучения занимаются алгоритмы популярных библиотек TensorFlow, Keros.
Ахитектурой нейронной сети ((F)) — называется цепочка, последовательность слоев этой сети.
Архитектура нейронных сетей может быть разной формы и длины, состоять из нескольких последовательных или паралельных слоев или других цепочек.
Слой — это набор персептронов или определенный алгоритм, который преобразует, по некоторому принципу, входные сигналы p в выходные p’.
Создание архитектуры нейронной сети напоминает конструктор лего, где программист опытным путем подбирает правильный порядок слоев в архитектуре нейронной сети, чтобы она на выходе выдавала правильный результат и значение функии ошибки стремилось к нулю (Q(F, D) to 0)
Каждый слой выполняет определенную функцию. Слои могут отличаться друг от друга.
Примеры слоев:
- простой слой персептронов.
- сверточный слой.
- слой конвертации изображения из двухмерной картинки в одномерный вектор.
- нахождение максимума или минимума.
- фильтрация значения по критерию
- измененя яркости или контрастности.
- удаления или добавление шума.
- Max Pooling и Average Pooling.
- и т.п.
Архитектура нейронной сети может быть иерархической.
Математическое описание задачи обучения с учителем
Дано:
(X) — это входные тестовые данные. Вектор вида ((x_1, x_2, x_3, … , x_n))
(Y) — выходные тестовые данные. Вектор вида ((y_1, y_2, y_3, … , y_k))
(D) — это обучающая выборка, множество кортежей вида ((X_i,Y_i)), множество входных значений и ответов к ним (выходных значений), где для каждого (X_i) известно (Y_i).
(n) — длинна вектора (X)
(k) — длинна вектора (Y)
(m) — размер выборки, количество кортежей в множестве (D)
Требуется:
Найти функцию (F), которая (Y approx F(X))
Обозначим функцию потерь как:
(L(F,X_i)=|Y_i — F(X_i)|)
Эта функция означает, насколько ошибается функция (F) на конкретном примере ((X_i,Y_i)).
Функция (Q), будет называться функцией ошибки (F) на множестве (D) и определена как сумма всех значений функции (L)
(Q (F) = frac{ sum_{i=1}^{m} L(F,X_i) } {m})
Функция (F) и ее веса будут найдена при условии (Q(F) to 0)
Есть разные варианты формул ошибки:
Абсолютная ошибка:
(Q (F) = frac{ sum_{i=1}^{m} |Y_i — F(X_i)| } {m})
В Tenzorflow loss=’mean_absolute_error’
Среднеквадратическая ошибка:
(Q (F) = frac{ sqrt {sum_{i=1}^{m} (Y_i — F(X_i))^2} } {m})
В Tenzorflow loss=’mean_squared_error’
Математическая модель нейрона
Нейрон — это атом нейронной сети. У каждого нейрона есть несколько входов и один выход.
Ниже представлена математическая модель одного нейрона.
Основная задача нейрона проводить сигнал или гасить его в зависимости от входных значений.
Выходной сигнал нейрона считается как сумма входных значений, умноженная на их веса плюс базис, обработанная функцией активации.
(y = a(sum_{i=1}^{n} omega_i * x_i + beta))
(a(v)) — функция активации нейрона. Функция активации нейрона нужна, чтобы определить при каких входных значениях должен активироваться (включаться) нейрон, т.е. проводить сигнал. А при каких нет. Нейрон включается, если достигается нужный уровень сигнала, после этого нейрон передает сигнал дальше. Поэтому функция и называется функцией активации.
(omega_i) — вес нейронной связи. Задает какой входящий сигнал и с какой силой должен учитываться, а какой нет.
(beta) — смещение bias. Это пороговое значение, которое смещает аргумент активационной функции, потому что активация (включение) нейрона может происходит не в точке 0, а в какой-то другой точке. А т.к. функция активации работает в точке ноль, то аргумент нужно сместить по оси x на смещение bias.
Ниже отображена функция активациции со смещением bias. На графике видно, что нейрон будет включаться после аргумента функции больше 2, а не больше 0. Смещение bias в данном случае равно +2.
Смещение bias также является входом в нейронную сеть, для которого подбирается свой вес. Этот вес и является смещением. Обычно вес смещения является нулевым весом (omega_0), при входном сигнале равным 1. Получается само смещение вычисляется по формуле (beta = omega_0 *1)
Тогда формула активации нейрона примет вид:
(y = a(omega_0 + sum_{i=1}^{n} omega_i * x_i))
Это удобно, потому что в данном случае формула принимает одинаковый вид, и для обучения нейрона требуется подобрать кортеж весов ((omega_0, omega_1, omega_2, omega_3, … , omega_n))
Функция ошибки и активации являются важными параметрами архитектуры нейронной сети.
Однослойный персептрон
Архитектура нейронной сети состоит из последовательности слоев, которые соединены между собой.
Нейронная сеть состоящая только из входных и выходных слоев называется однослойным персептроном и обозначается упрощенно:
Данная нейронная сеть очень простая. Однослойный персептрон называют более простым термином полносвязный слой. В библиотеке Tensorflow полносвязный слой создается через класс Dense.
Многослойный персептрон
Данный вид нейронной сети имеет следующие названия:
- нейронная сеть с прямой связью
- Feed Forward neural network
- полносвязная сеть
- классификатор
Полносвязная сеть используется очень часто, и хорошо решают задачи на классификацию, например:
- Распознать какая цифра по ее изображению.
- Отличить кошку от собаки.
- Определить какой цветок, по его параметрам (цвет, форма цветка, длинна и т.д.)
- и т.п.
Во сверточных нейронных сетях, полносвязная сеть используется как классификатор на выходе. Сверточная сеть выделяет признаки по картинке и передает ее в полносвязную. А полносвязная уже квалифицирует и выдает ответ.
Многослойный персептрон (полносвязная сеть) — это последовательность полносвязных слоев однослойных персептронов. Основным отличием многослойного персептрона от одногослойного — в наличии одного или более скрытого слоя. Входные и выходные значения соединяются через скрытый слой, а не напрямую, как в однослойном персептроне.
Желтым обозначены входной слой X.
Красным — выходной слой нейронов Y.
Зеленый — это скрытый слой нейронов.
Каждый выход нейрона вычисляется по формуле:
(p’_j = a(omega_0 + sum_{i=1}^{n} omega_i * p_i)), где p — это входные значения, а p’ — это выходные значения нейрона.
В данной нейронной сети 3 слоя. Входной, скрытый и выходной слой. Данную нейронную сеть часто обозначают упрощенно:
Feed Forward neural network
Текстовая нотация Feed Forward:
ff = [
"Input",
"Dense",
"Output"
];
Многослойный персептрон с более чем одним скрытым слоем называют Deep Feed Forward.
Текстовая нотация Deep Feed Forward:
dff = [
"Input",
"Dense",
"Dense",
"Output"
];
Функции активации нейрона
Пороговая функция активации
(sign(x) = begin{cases} -1 & ,x < 0 \ 0 & ,x = 0 \ 1 &, x > 0 end{cases})
Сигмоида sigm
(sigm(x) = frac{1}{1+e^{-x}})
relu
(relu(x) = max(0,x) = begin{cases} 0 , x leq 0 \ x , x > 0 end{cases})
leaky relu
(lerelu(x) = begin{cases} 0.01x & ,x leq 0 \ x &, x > 0 end{cases})
Материалы
- Обучение многослойного персептрона операции XOR
- Материалы для самостоятельного изучения нейронных сетей
- Базы датасетов для обучения нейронных сетей
- AIML-4-1 Персептроны
- AIML-4-2 Метод обратного распространения ошибки
- Формулы обратного распространения
- Архитектуры нейронных сетей
- Сервис чтобы строить графики
- Ускорение обучения, начальные веса, стандартизация, подготовка выборки
- Переобучение — что это и как этого избежать, критерии останова обучения
- Функции активации, критерии качества работы НС
- Функции активации. Краткий обзор применений CNN и RNN.
- Playground Tensorflow

