Что такое веса в нейросети

nastroenie dozhd raznoe kapyushon devochka rebenok 54128 1280x720 Вес тела

Нейронные сети. (Machine learning #1)

Что такое нейронная сеть и как она работает? Разбираем популярную технологию на простых примерах!
Сайту исполняется год и в честь этого я решил написать небольшой пост о том, чем я сейчас занимаюсь 🙂
Однажды, гуляя по просторам YouTube, я наткнулся на очень классный канал, посвященный математике, физике и многим другим интересным вещам (даже радиоэлектронике!) На канале было очень много всего, чего я не успел пока посмотреть, но я обратил внимание на ролик, посвященный работе нейронных сетей. Так как я давно уже слышал о нейронных сетях и похожих вещах (вроде генетических алгоритмов), но при этом не понимал толком, о чём идёт речь, я очень заинтересовался. Это цикл из 4х видео, которые, по сути, являются визуализацией статьи Michael Nielsen.

Здесь я хочу дать краткое и простое описание работы нейронной сети на примере классической задачи распознавания нарисованных от руки цифр.
Итак, представьте, что перед вами встала задача распознать цифры:

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

Понятие нейрона, веса и смещения

Давайте рассмотрим простую нейронную сеть:

Запишем сумму со всех нейронов из входного слоя:

$$
z = \sum\limits_^<3> \qquad (1)
$$
Получившийся результат может быть любым вещественным числом. Нам нужно преобразовать его в число от 0 до 1, которое мы и присвоим нейрону.
Сделать это можно, например, так:

Видно, что рост функции от нуля до единицы происходит в окрестности нуля. Но часто активационный барьер необходимо сместить. Поэтому к числу \(z \) в (1) нужно прибавить число \(b \), которое называется смещением (bias). То есть

$$
z = \sum\limits_^ + b \qquad (3)
$$
Для всего слоя (в матричном виде):

Как происходит обучение?

Картинка \(28*28 \) содержит \(784 \) пикселя, именно столько и будет нейронов в входном слое.
В выходном слое будет 10 нейронов, каждый из которых указывает на цифру от \(0\) до \(9\). Для упрощения понимания изобразим лишь один скрытый слой. По выходному слою мы будем судить о том, как отработал алгоритм.

Как и было сказано ранее, работа алгоритма полностью определяется входными данными и взаимосвязями нейронов. Когда алгоритм не натренирован, то, скорее всего, он не сможет дать правильный ответ, так как взаимосвязи между нейронами (веса нейронов и смещения) настроены неправильно. Именно в подборе этих параметров и заключается обучение нейронной сети.
Теперь дадим нашей сети группу картинок с написанными цифрами для тренировки и после каждого завершения алгоритма будем проверять то, насколько точно она «угадала» цифру.
Для того, чтобы оценить эффективность работы алгоритма, введём так называемую функцию расходимости (cost function) следующим образом:

Чем ближе результат работы алгоритма к требуемому результату, тем меньше становится функция расхождения. То есть задача обучения на данном этапе сводится к уменьшению функции расхождения.
Как нужно изменять все \(w\) и \(b\), чтобы максимально быстро уменьшить функцию расхождения?
Нужно найти вектор-градиент функции и идти в противоположную сторону. Если бы наша сеть имела только одно смещение \(b\) и один вес \(w\), то данный процесс можно было бы проиллюстрировать мячом, скатывающимся в самую нижнюю точку ямки:

$$
\frac<\partial C(w, b)> <\partial y_t>= \frac<1><2l>2y_t = \frac
$$
А производная
$$
\frac<\partial y_t(x_, w, b)><\partial w_i>
$$
легко считается, так как у нас есть явный вид функции \(y_t\) от \(w_i\) в (5).
Теперь разберёмся с производными \(С(w, b)\) по смещениям \(b\). Расчёт производится аналогично:

В принципе, это все! Весь процесс обучения взял на себя компьютер, который считает частные производные функции расхождения и с их помощью правильно корректирует параметры связей нейронов.
Однако, как я понял, чаще всего вычисляют не все частные производные (в нашем случае их \(12719\)), а только часть, разделяя параметры на небольшие группы. Такой подход называется stochastic gradient descent, и он быстрее приводит к нужному результату, так как на вычисление всех частных производных тратится большее время.

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

Отдельная благодарность моей сестре Соне (отличному репетитору по русскому языку) за час смеха и мучения при правке статьи!

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

Источник

Вот так выглядит нейросеть без фреймворков

image loader

Чтобы лучше понять глубокое обучение, Data Scientist из Hewleet Packard написал нейросеть только при помощи NumPy. Знать свои инструменты необходимо любому специалисту, поэтому наш курс по науке о данных включает раздел «Математика для Data Science». Под катом вы найдёте не только реализацию нейронной сети. Статья начинается со знакомства с книгой автора, которая, по его словам, будет полезна, если вы хотите создать достойное портфолио Machine Learning.

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

Что такое нейросеть?

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

Произвольное число скрытых слоёв.

Множество весов и смещений между всеми слоями — W и b.

Выбираемой нами функция активации для каждого слоя — σ. Здесь воспользуемся сигмоидной функцией потерь.

Обратите внимание: входной слой не учитывается в подсчёте количества слоёв.

image loaderАрхитектура двухслойной нейронной сети

Создать класс нейросети на Python просто:

Обучаем сеть

Вот её вывод в виде формулы:

image loader

Веса W и смещения b — это только переменные, которые влияют на вывод — ŷ. Естественно, правильность значений и весов предопределяется предсказательной силой. Процесс тонкой настройки весов и смещений на основании входных данных известен как обучение нейронной сети. Каждая итерация обучения состоит из:

Расчёта спрогнозированного вывода ŷ, известного как прямое распространение.

Обновления весов и смещений, известного как обратное распространение.

Диаграмма ниже иллюстрирует обучение:

image loader

Прямое распространение

Как мы видим, прямое распространение — это просто. Вывод нашей нейросети будет таким:

image loader

Добавим прямое распространение в код. Для простоты возьмём смещение, равное нулю:

​Однако мы по-прежнему нуждаемся в оценке точности предсказаний. Именно в этом поможет функция потерь.

Функция потерь

Функций потерь множество: диктовать её выбор должна природа проблемы. Здесь задействуем функцию суммы квадратов ошибок.

image loader

Это просто разница между каждым спрогнозированным и реальным значениями. Она возводится в квадрат, чтобы получить абсолютное значение. Цель обучения — найти лучшее множество значение весов и смещений, которое минимизирует функцию потерь.

Обратное распространение

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

image loaderАлгоритм градиентного спуска

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

image loader

Правило цепочки для вычисления производной относительно весов и смещений.

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

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

​Чтобы лучше понять приложение интегрального исчисления и правило цепочки в обратном распространении, я настоятельно рекомендую это учебное руководство от 3Blue1Brown:

Соберём всё воедино

У нас есть код обратного и прямого распространений. Посмотрим, как работает нейросеть. Вот набор данных:

image loader

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

image loader

Посмотрим на вывод:

image loaderПрогнозы после полутора тысяч итераций

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

Что дальше?

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

Какие функции активации, кроме сигмоидной, можно использовать?

Как работать со скоростью обучения нейросетей?

Как при помощи CNN классифицировать изображения?

Продолжить изучение Machine Learning и Data Science вы сможете на наших курсах. Также вы можете узнать, как мы готовим специалистов в других направлениях.

image loader

Data Science и Machine Learning

Источник

Нейросеть с нуля своими руками. Часть 1. Теория

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

Более подробная информация разбросана кусками по всему интернету. Поэтому я постарался собрать ее воедино и изложить в этой статье. Сразу оговорюсь, что я не являюсь специалистом в области ML или биологии, поэтому местами могу быть не точным. В таком случае буду рад вашим комментариям.

Пока я писал эту статью я понял, что у меня получается довольно объемный лонгрид, поэтому решил разбить ее на несколько частей. В первой части мы поговорим о теории, во второй напишем собственную нейросеть с нуля без использования каких-либо библиотек, в третьей попробуем применить ее на практике.

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

Для чего нужны нейросети

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

На выходе этой сети находятся мышцы, отвечающие за расширение или сужение зрачка, и приводят эти механизмы в действие в зависимости от сигнала, полученного из нейросети. И таких механизмов огромное количество в теле любого живого существа, обладающего нервной системой.

Устройство нейрона

5d92ab94d625978d7e646db91a675617

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

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

fdca5e1eb962ff0c220203a12be2bdc3

Нейросети в IT

Что же, раз механизм нам понятен, почему бы нам не попробовать воспроизвести его с помощью информационных технологий?

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

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

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

image loader

Такой простейший вариант нейронной сети называется перцептрон, и именно его мы с вами и попробуем воссоздать.

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

Но в таком случае, получается, что все нейроны любого слоя будут получать одинаковый сигнал, и отдавать одинаковое значение. Таким образом мы могли бы заменить всю нашу сеть на один нейрон. Чтобы устранить эту проблему, мы присвоим входу каждого нейрона определенный вес. Этот вес будет обозначать насколько важен для каждого конкретного нейрона сигнал, получаемый от другого нейрона. И тут мы подходим к самому интересному.

То есть мы подаем на вход нейросети определенные данные, для которых мы знаем, каким должен быть результат. Далее мы сравниваем результат, который нам выдала нейросеть с ожидаемым результатом, вычисляем ошибку, и корректируем веса нейронов таким образом, чтобы эту ошибку минимизировать. И повторяем это действие большое количество раз для большого количества наборов входных и выходных данных, чтобы сеть поняла какие сигналы на каком нейроне ей важны больше, а какие меньше. Чем больше и разнообразнее будет набор данных для обучения, тем лучше нейросеть сможет обучиться и впоследствии давать правильный результат. Этот процесс называется обучением с учителем.

Добавим немного математики.

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

ee70b0d82071d89a9e8c9321ecfb2576

Таким образом сумма входных значений первого нейрона скрытого слоя будет равна

Передав это значение в активационную функцию, мы получим значение, которое наш нейрон передаст далее по сети в следующий слой.

sigmoid(0,22) = 1 / (1 + e^-0,22) = 0,55

Аналогичные операции произведём для второго нейрона скрытого слоя и получим значение 0,60.

И, наконец, повторим эти операции для единственного нейрона в выходном слое нашей нейросети и получим значение 0,60, что мы условились считать как истину.

image loader

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

Первым делом рассчитаем ошибку на выходе сети. Делается это довольно просто, нам просто нужно получить разницу полученного значения и ожидаемого.

Чтобы узнать насколько нам надо изменить веса нашего нейрона, нам нужно величину ошибки умножить на производную от нашей активационной функции в этой точке. К счастью, производная от сигмоиды довольно проста.

c3adc62f46a94935d8d2ec502ace83f4

Таким образом наша дельта весов будет равна

Новый вес для входа нейрона рассчитывается по формуле

Аналогичным образом рассчитаем новый вес для второго входа выходного нейрона:

image loader

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

error = 0.18 * 0.24 = 0.04

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

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

Источник

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

Дата публикации Apr 3, 2019

Я хотел бы пригласить вас присоединиться ко мне в исследовании различных подходов к инициализации весов слоев в нейронных сетях. Шаг за шагом, через различные короткие эксперименты и мыслительные упражнения, мы узнаем, почему адекватная инициализация веса так важна для тренировки глубоких нейронных сетей. По пути мы рассмотрим различные подходы, предложенные исследователями на протяжении многих лет, и, наконец, подробно рассмотрим, что лучше всего подходит для современных сетевых архитектур, с которыми вы, скорее всего, будете работать.

Примеры для подражания взяты из моего собственногоповторное внедрениеиз набора тетрадей, которыеДжереми Ховардпокрыты вПоследняя версиякурса Deep.ai Deep Learning Part II, в настоящее времяпроводится весной 2019 года в Институте данных USF,

Зачем инициализировать веса

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

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

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

0 852843 668715

Давайте также притворимся, что у нас есть простая 100-слойная сеть без активаций, и что каждый слой имеет матрицу который содержит веса слоя. Чтобы завершить один прямой проход, нам нужно будет выполнить матричное умножение между входами слоев и весами на каждом из ста слоев, что в итоге составит100последовательные матричные умножения.

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

0 631322 312624

Вау! Где-то во время этих 100 умножений выходные данные слоя стали настолько большими, что даже компьютер не смог распознать их стандартное отклонение и среднее значение в виде чисел. На самом деле мы можем точно видеть, как долго это происходило.

0 448914 423981

Выходы активации взорвались в 29 слоях нашей сети. Мы четко инициализировали наши веса, чтобы быть слишком большими.

0 415152 609210

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

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

Как мы можем найти сладкое место?

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

0 92586 562148

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

0 924387 128657

0 194056 294750

Из этого следует, чтосуммаиз этих 512 продуктов будет иметь среднее значение 0, дисперсию 512 и, следовательно, стандартное отклонение √512.

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

Если мы сначала масштабируем весовую матрицу путем деления всех случайно выбранных значений на √512, поэлементное умножение, которое заполняет один элемент выходныхYтеперь, в среднем, будет иметь дисперсию всего 1 / √512.

0 147817 91831

0 299673 996720

Теперь давайте снова запустим нашу быструю и грязную 100-слойную сеть. Как и прежде, мы сначала выбираем веса слоев случайным образом из стандартного нормального распределения внутри [-1,1], но на этот раз мы масштабируем эти веса на 1 / √N, гдеNколичество сетевых входных подключений на уровне, которое в нашем примере составляет 512

0 331515 925706

Успех! Наши выходные данные слоя не взорвались и не исчезли, даже после 100 наших гипотетических слоев.

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

Xavier Initialization

Еще несколько лет назад наиболее часто используемые функции активации были симметричны относительно заданного значения и имели диапазоны, которые асимптотически приближались к значениям, которые были плюс / минус на некотором расстоянии от этой средней точки. Функции гиперболического тангенса и мягкого знака иллюстрируют этот класс активаций.

0 125737 363055

Мы добавим функцию активации гиперболического тангенса после каждого слоя нашей гипотетической 100-слойной сети, а затем посмотрим, что произойдет, когда мы используем нашу собственную схему инициализации веса, где веса слоя масштабируются на 1 / √п.

0 801006 889751

Стандартное отклонение выходов активации 100-го уровня составляет около 0,06. Это определенно мало, но, по крайней мере, активации не исчезли полностью!

Насколько интуитивно понятным может показаться, что путь к открытию нашей собственной стратегии инициации веса теперь выглядит ретроспективно, вы можете быть удивлены, узнав, что совсем недавно, в 2010 году, это не был традиционный подход для инициализации слоев веса.

Когда Ксавье Глорот и Йошуа Бенжио опубликовали свою знаменательную статью под названиемПонимание сложности обучения глубоких нейронных сетей с прямой связью«обычно используемая эвристика», с которой они сравнивали свои эксперименты, заключалась в инициализации весов изединообразныйраспределение в [-1,1], а затем масштабирование на 1 / √N,

Оказывается, этот «стандартный» подход не очень хорошо работает.

0 325705 99058

Эта низкая производительность на самом деле побудила Глорот и Бенжио предложить свою собственную стратегию инициализации веса, которую они назвали «нормализованной инициализацией» в своей статье, и которая сейчас широко известна как «инициализация Ксавье».

Инициализация Xavier устанавливает вес слоя для значений, выбранных из случайного равномерного распределения, которое ограничено

0 908461 682395

гдеnᵢколичество входящих сетевых подключений, или «разветвление», к уровню, иnᵢ₊₁это количество исходящих сетевых подключений из этого уровня, также называемое «разветвлением».

Глорот и Бенжио полагали, что инициализация веса Ксавье будет поддерживать дисперсию активаций и градиенты с обратным распространением на всем протяжении вверх или вниз по слоям сети. В своих экспериментах они обнаружили, что инициализация Ксавье позволила пятислойной сети поддерживать почти одинаковые отклонения ее градиентов веса по слоям.

0 837732 951081

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

0 438868 735078

Чтобы продемонстрировать это, Глорот и Бенжио продемонстрировали, что сети, инициализированные с помощью Xavier, достигли значительно более быстрой конвергенции и более высокой точности наЗадача классификации изображений CIFAR-10,

Давайте еще раз запустим нашу 100-слойную сеть, на этот раз с помощью инициализации Xavier:

0 981411 960197

В нашей экспериментальной сети инициализация Xavier выполняется практически идентично самодельному методу, который мы вывели ранее, где мы выбирали значения из случайного нормального распределения и масштабировали по квадратному корню из числа входящих сетевых подключений,N,

Kaiming Initialization

Концептуально, имеет смысл, что при использовании функций активации, которые симметричны относительно нуля и имеют выходы внутри [-1,1], такие как softsign и tanh, мы бы хотели, чтобы выходы активации каждого слоя имели среднее значение 0 и стандартное отклонение в среднем около 1. Это как раз то, что позволяют наш доморощенный метод и Ксавье.

Но что, если мы используем функции активации ReLU? Будет ли еще иметь смысл масштабировать случайные начальные значения веса таким же образом?

0 476143 570543

Чтобы увидеть, что произойдет, давайте использовать активацию ReLU вместо tanh в одном из слоев нашей гипотетической сети и понаблюдаем за ожидаемым стандартным отклонением ее выходных данных.

0 83666 298253

Оказывается, что при использовании активации ReLU один слой в среднем будет иметь стандартное отклонение, которое очень близко к квадратному корню из числа входных соединений,делится на квадратный корень из двухили √512 / √2 в нашем примере.

0 130638 847692

Масштабирование значений весовой матрицы это число приведет к тому, что каждый отдельный уровень ReLU будет иметь стандартное отклонение в среднем 1.

0 259767 623539

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

Это исследование того, как наилучшим образом инициализировать весовые коэффициенты в сетях с активациями, подобными ReLU, послужило мотивацией Kaiming He et. и др. впредложить собственную схему инициализацииэто предназначено для глубоких нейронных сетей, которые используют эти виды асимметричных, нелинейных активаций.

В своей статье 2015 года He et. и др. продемонстрировали, что глубокие сети (например, 22-слойный CNN) будут сходиться намного раньше, если используется следующая стратегия инициализации входного веса:

0 522330 114316

В качестве окончательного сравнения, вот что произойдет, если мы вместо этого будем использовать инициализацию Xavier.

0 789335 972750

Ой! При использовании Xavier для инициализации весов, выходы активации почти полностью исчезли к 100-му слою!

Между прочим, когда они обучали даже более глубокие сети, которые использовали ReLU, He et. и др. обнаружил, что 30-слойный CNN, использующий инициализацию Xavier, полностью застопорился и не научился вообще Однако, когда одна и та же сеть была инициализирована в соответствии с трехэтапной процедурой, описанной выше, она имела значительно большую конвергенцию.

0 83401 534267

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

Да, вы тоже можете быть исследователем

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

Но я думаю, что путешествие, которое мы совершили, показало нам, что этот откровенный ответ чувства запугивания, хотя он и вполне понятен, отнюдь не неизбежен. Хотя в статьях Кайминга и (особенно) Ксавье действительно содержится значительная доля математики, мы воочию убедились, что экспериментов, эмпирических наблюдений и некоторого простого здравого смысла было достаточно, чтобы вывести основной набор принципов, лежащих в основе того, что в настоящее время является наиболее широко распространенным. используется схема инициализации веса.

Поочередно поставь: если сомневаешься, будь смелым, попробуй и посмотри, что получится!

Источник

Комфорт
Adblock
detector