35 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как создать нейронную сеть?

Пишем нейросеть прямого распространения с нуля | Как создать свою нейросеть

Время чтения: 8 минут

Нейросети кажутся людям чем-то очень сложным и запутанным, однако это вовсе не так. Простую нейросеть можно написать менее чем за час с нуля. В нашей статье мы создадим нейронную сеть прямого распространения (также называемую многослойным перцептроном), используя лишь массивы, циклы и условные операторы, а значит этот код легко можно будет перенести на любой язык программирования, предоставляющий эти возможности. А если язык предоставляет библиотеку для матричных и векторных вычислений (как, например, numpy в языке Python, то написание займёт ещё меньше времени).

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

Согласно Википедии, искусственная нейронная сеть (ИНС) — математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма.

Более простыми словами, это некий чёрный ящик, который превращает входные данные в выходные, или, говоря более математическим языком, является отображением пространства входных признаков X в пространство выходных признаков Y: X → Y. То есть мы хотим найти какую-то функцию F, которая сможет выполнять это преобразование. Для начала этой информации нам будет достаточно. Для более подробного ознакомления рекомендуем ознакомиться с этой статьёй на хабре.

Коротко об искусственном нейроне

Чаще всего в подобных статьях начинают расписывать про устройство биологического нейрона, связь с его искусственной моделью и прочую лирику. Мы же этого делать не будем, а сразу перейдём к сути. Искусственный нейрон — это всего лишь взвешенная сумма значений входного вектора элементов, которая передаётся на нелинейную функцию активации f: z = f(y), где y = w·x + w1·x1 + . + wm – 1·xm – 1 . Здесь w, . wm – 1 — коэффициенты, веса каждого элемента вектора, x, . xm – 1 — значения входного вектора X, y — взвешенная сумма элементов X, а z — результат применения функции активации. Мы вернёмся к функции активации немного позднее, а пока давайте придумаем, как вместо одного выходного значения получить n.

Нейронный слой

Один нейрон способен входной вектор превратить в одну точку, однако по условию мы хотим получить несколько точек, так как выходной вектор Y может иметь произвольную размерность, определяемую лишь конкретной ситуацией (один выход для XOR, 10 выходов для определения принадлежности к одному из 10 классов и т.д.). Как же нам получить n точек, преобразуя элементы входного вектора X? Оказывается, всё довольно просто: для того, чтобы получить n выходных значений, необходимо использовать не один нейрон, а n. Тогда для каждого из элементов выходного вектора Y будет использовано ровно n различных взвешенных сумм от вектора X. То есть мы получаем, что zi = f(yi) = f(wi0·x + wi1·x1 + . + wim – 1·xm – 1)

Если внимательно посмотреть, то оказывается, что написанная выше формула является определением умножения матрицы на вектор. И действительно, если взять матрицу W размера n на m и умножить её на вектор X размерности m, то получится другой вектор размерности n, то есть ровно то, что нам и нужно. Таким образом, получение выходного вектора по входному для n нейронов можно записать в более удобной матричной форме: Y = W·X , где W — матрица весовых коэффициентов, X — входной вектор и Y — выходной вектор. Однако полученный вектор является неактивированным состоянием (промежуточным, невыходным) всех нейронов, а чтобы получить выходное значение,, необходимо каждое неактивированное значение подать на вход функции активации. Результат её применения и будет выходным значением слоя.

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

Функция активации

Функция активации — это функция, которая добавляет в сеть нелинейность, благодаря чему нейроны могут довольно точно имитировать любую функцию. Наиболее распространёнными функциями активации являются:

  • Сигмоида: f(x) = 1 / (1 + e -x )
  • Гиперболический тангенс: f(x) = tanh(x)
  • ReLU: f(x) = max(x,0)

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

Хватит бла бла, давайте писать код

Теперь нам достаточно знаний, чтобы написать код получения результата нейронной сети. Мы будем писать код на языке C#, однако, уверяем, код будет практически идентичным для других языков программирования. Давайте разберёмся, что нам потребуется для реализации сети прямого распространения:

  1. Вектор (входные, выходные);
  2. Матрица (каждый слой содержит матрицу весовых коэффициентов);
  3. Нейросеть.

1. Вектор:

  • Вектор можно создавать из количества элементов (длины);
  • Вектор можно создавать из перечисления вещественных чисел;
  • Можно получать значения по индексу i.
  • Можно изменять значения по индексу i.

2. Матрица:

  • Матрицу можно создавать из числа строк, столбцов и генератора случайных чисел для заполнения случайными значениями;
  • Можно получать значения по индексам i и j;
  • Можно изменять значения по индексам i и j;

3. Сама нейросеть:

Сеть есть, но её ответы случайны. Как обучать?

На данный момент мы имеем случайную (необученную) нейронную сеть, которая может по входному вектору input выдать случайный ответ, однако нам требуется ответы, удовлетворяющие конкретной задаче. Чтобы добиться этого нашу сеть необходимо обучить. Для этого нам необходима база тренировочных примеров, то есть множество пар векторов X – Y, на которых будет обучаться сеть. Обучать нейросеть мы будем с помощью алгоритма обратного распространения ошибки. Если кратко, то он работает следующим образом:

  • Подать на вход сети обучающий пример (один входной вектор)
  • Распространить сигнал по сети вперёд (получить выход сети)
  • Вычислить ошибку (разница получившегося и ожидаемого векторов)
  • Распространить ошибку на предыдущие слои
  • Обновить весовые коэффициенты для уменьшения ошибки

Сам же алгоритм обучения выглядит так:

Обучаем нейронную сеть

Для обратного распространения ошибки нам потребуется знать значения входов, выходов и значения производных функции активации сети на каждом из слоёв, поэтому создадим структуру LayerT, в которой будет 3 вектора: x — вход слоя, z — выход слоя, df — производная функции активации. Также для каждого слоя потребуются векторы дельт, поэтому добавим в наш класс ещё и их. С учётом вышесказанного наш класс станет выглядеть так:

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

Перейдём к обратному распространению ошибки. В качестве функции оценки сети E(W) возьмём среднее квадратичное отклонение: E = 0.5 · Σ(y1i – y2i) 2 . Чтобы найти значение ошибки E, нам нужно найти сумму квадратов разности значений вектора, который выдала сеть в качестве ответа, и вектора, который мы ожидаем увидеть при обучении. Также нам потребуется найти дельту для каждого слоя, причём для последнего слоя она будет равна вектору разности полученного и ожидаемого векторов, умноженному (покомпонентно) на вектор значений производных последнего слоя: δlast = (zlast – d)·f’last , где zlast — выход последнего слоя сети, d — ожидаемый вектор сети, f’last — вектор значений производной функции активации последнего слоя.

Теперь, зная дельту последнего слоя, мы можем найти дельты всех предыдущих слоёв. Для этого нужно умножить транспонированную матрицы текущего слоя на дельту текущего слоя и затем умножить полученный вектор на вектор производных функции активации предыдущего слоя: δk-1 = W T k·δk·f’k .

Что ж, давайте реализуем это в коде:

Изменение весов

Для того, чтобы уменьшить ошибку сети нужно изменить весовые коэффициенты каждого слоя. Как же именно нужно менять весовые коэффициенты матриц на каждом слое? Оказывается, всё довольно просто. Для этого используется метод градиентного спуска, а значит нам необходимо вычислить градиент по весам и сделать шаг в отрицательную сторону от этого градиента. На этапе прямого распространения мы зачем-то запоминали входные сигналы, а при обратном распространении ошибки мы вычисляли дельты в каждом слое. Именно их мы и будем сейчас использовать для нахождения градиента! Градиент по весам равен перемножению входного вектора и вектора дельт (не покомпонентно). Поэтому, чтобы обновить весовые коэффициенты и уменьшить тем самым ошибку сети нужно всего лишь вычесть из матрицы весов результат перемножения дельт и входных векторов, умноженный на скорость обучения. Это можно записать в таком виде: Wt+1 = Wt – η·δ·X , где Wt+1 — новая матрица весов, Wt — текущая матрица весов, X — входное значение слоя, δ — дельта этого слоя. Почему именно так с математической точки зрения хорошо описано в этой статье.

Обучение сети

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

Сеть готова. Давайте же её чему-нибудь научим!

Тренируем нейросеть на функции XOR

Почему функция XOR так интересна? Просто потому, что её невозможно получить одним нейроном: 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0. Однако она легко получается увеличением числа нейронов. Мы же попробуем выполнить обучение сети с 3 нейронами в скрытом слое и 1 выходным (так как выход у нас всего один). Для этого нам необходимо создать массив векторов X и Y с обучающими данными и саму нейросеть:

После чего запустим обучение со следующими параметрами: скорость обучения – 0.5, число эпох – 100000, величина ошибки – 1e-7:

После обучения посмотрим на результаты выполнив прямой проход для всех элементов:

В результате вывод может быть таким:

Проверять результаты на тренировочной же выборке довольно скучно, ведь как никак на ней мы сеть обучали, но, увы, для XOR проблемы ничего другого не остаётся. В качестве более серьёзного примера рекомендуем выполнить задачу распознавания картинок с рукописными цифрами MNIST. Это база содержит 60000 картинок написанных от руки цифр размером 28 на 28 пикселей и используется как один из основных датасетов для начала изучения машинного обучения. Не смотря на простоту нашей сети, при грамотном выборе параметров (число нейронов, число слоёв, скорость обучения, число эпох. ) можно получить точность распознавания до 98%! Проверить свою сеть вы можете, поучаствовав в соревновании на сайте Kaggle. Нашей команде удалось достичь точности в 98.171%! А вы сможете больше? 🙂

В заключение

Мы написали с вами нейронную сеть прямого распространения и даже обучили её функции XOR. При этом мы позаботились об универсальности, благодаря чему нейросеть может быть обучена на любых данных, главное только подготовить два массива обучающих векторов X и Y, подобрать параметры обучения и запустить само обучение, после чего наблюдать за процессом. Важно помнить, что при использовании сигмоидальной функции активации, выходные значения сети не будут превышать 1, а значит, для обучения данным, которые значительно больше 1 необходимо отнормировать их, то есть привести к отрезку [0, 1].

Программист, сооснователь programforyou.ru, в постоянном поиске новых задач и алгоритмов

Студент МГУ им. М.В. Ломоносова

Программист, соосновательница programforyou.ru, рукодельница, всегда готова придти на помощь и помочь во всём разобраться

Студентка МГТУ им. Н.Э. Баумана

А Вы знаете, что мы пишем программы на C, C++, C#, Pascal и Python?

Так что если Вам нужно написать программу на C/C++, C#, Pascal или Python — мы с радостью поможем с этим!

Читать еще:  Сигналы материнской платы при загрузке

В том числе мы занимаемся репетиторством по информатике и программированию, а также готовим к ОГЭ и ЕГЭ!

Почему именно мы?

  • Более 1800 выполненных заказов;
  • Более 170 отзывов;
  • Качественное решение
  • Короткие сроки и привлекательные цены
  • Различные акции и скидки

Как с нами связаться?

  • группа Вконтакте: vk.com/programforyou
  • наша почта: order@programforyou.ru

Programforyou — позвольте нам писать код для вас и вы получите качественное решение в короткие сроки по привлекательной цене!

Нейросети. Самый полный гайд. Часть 1 для чего нужны нейросети

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

Первая часть. Для чего нужны нейросети.

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

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

2. Формализация. Т.е. запись на каком либо формальном языке процесса превращения исходных данных в результат. Чаще всего это язык математики или формальной логики.

3. Создание алгоритма.

4. Запись алгоритма, на каком либо компьютерном языке.

5. Тестирование и отладка.

6. Проведение расчетов и анализ результатов.

Как видим, три первых пункта вообще никоим образом не относятся к компьютеру. А 6-й пункт уже относиться не столько к программированию, сколько к практике. Теперь и вы наглядно можете видеть, что большая часть программирования – это не столько нажимание на кнопочки, сколько размышления над тем или иным алгоритмом, которые довольно часто сливаются в размышления над смыслом жизни. Так же понятно, что удачные алгоритмы можно создавать и вовсе не знаю ни одного языка программирования. На практике это означает что человеку, который освоил создание программ на одном языке программирования, будет гораздо проще освоить другой язык, чем человеку, который вообще не сведущ в программировании.

Весь этот список, более менее понятен любому человеку. Кроме, быть может, третьего пункта. Если не знать что такое алгоритм нельзя и понять что требуется. Хотя всем нам на интуитивном уровне ясно, что это, но даже немногие программисты знают, что в информатике у этого слова есть довольно чёткое определение.

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

Пример: «сделай мне бутер», это не детерминированная команда.

«Отрежь хлеб», «отрежь колбасу», «положи колбасу на хлеб» – уже гораздо более детерминированные команды. Ведь согласитесь, бутер можно сделать и без колбасы или с колбасой и маслом.

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

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

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

1. Исходные данные и результат.

Исходные данные: Робот – 1 штука. Ноги – 6 штук. Суставы на ногах – 3 штуки на каждой. Степени свободы у каждого сустава – по одной. Начальные координаты каждой ноги и сустава. Начальные углы в суставах робота. Начальная координата центра робота.

Результат: робот сместился на Х метров в указанном направлении.

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

3. Написание Алгоритма.

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

4. Превратим всё это в строчки кода.

5. Зальём в голову микрочип робота.

6. Отправим робота на прогулку.

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

Ну не беда, теперь вы знаете что в начальные данные нужно внести массу, и все вычисления переписать с учётом нового параметра и заодно внести правки в алгоритм. Ок, сделано. Снова робот отправляется на прогулку. И ему случайно отстреливают правую переднюю ногу, это же боевой робот. Средняя правая нога ждёт результата от передней. Ведь она должна шевелиться после неё. Но от неё нет результата, у нас больше НЕТ правой передней ноги. Приехали, дальше робот не пойдёт. Теперь нужно переписать алгоритм, чтобы он работал без передней правой ноги. И конечно, без передней левой, и без средней задней. И без второй фаланги задней левой. И для каждого из этих случаев нам нужен НОВЫЙ алгоритм. Пускай и не радикально другой, но всё же новый. Итого нужно написать 100500 алгоритмов, и если какой то забыли, то это всплывёт в самый неподходящий момент.

Разумеется возникла идея создать такой алгоритм который мог бы подстроится к изменениям прям на ходу. Ведь паук в природе как то передвигается если ему оторвать ногу. Это и было зарождением нейросетей. По сути нейросеть – это такой алгоритм, который не нужно записывать в привычном понимании. Мы строим некую логическую конструкцию с начальными параметрами, а дальше она сама обучается, по каким-нибудь правилам, и принимает решение в каждом конкретном случае самостоятельно, исходя из старого опыта. История возникновения нейросетей отправляет нас прямиком к 1943 год, т.е. нейросети придумали сразу, как только появились ЭВМ. Но вот беда, в те времени один нейрон был размером с холодильник, а для серьёзных задач нейронов требовались сотни и даже тысячи. Почесав затылки, тогдашние программисты и инженеры сказали что мы и так всё сделаем без ваших нейросетей и отринули данную идею. Вновь к нейросетям вернулись только через 30 лет, за это время компьютеры шагнули невероятно далеко, на целых 4 поколения. В 71-м как вы помните, изобрели первый процессор. А в 75-м на этих крутейших по тем временам компам японский программист Кунихико Фукусима создал так называемый когнитрон – нейронную сеть умеющую выполнять логическую операцию «или». Вдумайтесь 30 лет от задумки да простейшей реализации.

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

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

Создание искусственного интеллекта – тоже пример использования нейросетей. Голова у Яндекс Алисы, или эпловской Сири, не из классических алгоритмов состоит, а из множества нейрончиков. Именно нейросети распознают вашу речь когда вы спрашиваете что то у гугла, и делают подборку песен, которая вам скорее всего понравиться. А ещё они всё больше вытесняет работников техподдержки, заставляя нас кричать в трубку: «Я хочу поговорить с человеком!». Если честно, всего 6 лет назад когда я смотрел фильм «Элизиум: Рай не на Земле», я и представить не мог себя в ситуации когда я буду спорить с роботом, и просить его переключить на человека. Но я думаю что с подобной проблемой сталкивались уже многие. Сейчас способности ИИ, оставляют желать лучшего, но скорость развития этих гомункулов поражает. И спустя те же 6 лет, человек в тех поддержке будет такой же редкостью, как сегодня использование DVD-дисков.

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

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

Главным трендом последних нескольких лет, безусловно, можно назвать нейросети, машинное обучение и все, что с ними связано. И на то есть серьезные причины, ведь в последнее время нейронные сети удивляют своими умениями. Мало того, что нейросеть уже может нарисовать портреты людей по одним только их голосам и «оживлять» портреты Достоевского и Мэрилин Монро, так она еще способна показать, как вы будете выглядеть через 20, 30 и даже 50 лет! Конечно, все это делает не одна нейросеть — в мире существует множество подобных разработок, которыми занимаются специалисты по Data Science.

Научиться обучать нейросети гораздо проще, чем кажется

Как появились нейросети

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

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

Читать еще:  Как устроена локальная сеть?

Как нейросеть генерирует новые фото

Из чего состоят нейросети

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

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

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

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

Одна из моделей машинного обучения

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

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

Можно ли самому научиться работать с нейросетями

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

Как им стать? Самостоятельно сделать это почти невозможно. Это серьезная специализация, которая требует взаимодействия с теми, кто уже работает в данной области. Поэтому школа данных SkillFactory открывает новый набор на полный курс по Data Science. В рамках курса профессионалы отрасли, в том числе сотрудники Яндекса и NVIDIA, обучают тонкостям работы, о которых не пишут в учебниках.

Все преподаватели — специалисты в области Data Science

С помощью этого курса можно освоить науку по работе с данными с нуля, даже если вы ни разу в жизни не занимались программированием. Он позволяет получить все навыки, необходимые специалисту по Data Science — от программирования на Python, в том числе углубленного изучения Pandas для анализа данных, до машинного обучения, глубинного обучения и исследования данных. Курс состоит примерно из 20% теории и 80% практики, поскольку только на реальных примерах возможность стать профи в этой области.

Программа курса рассчитана на 12 месяцев

В процессе обучения вы сможете создавать свои проекты в сфере распознавания изображений, NLP и скоринга. Вместе с преподавателями и менторами разберетесь в деталях работы и получите необходимую обратную связь. Кроме того, в SkillFactory помогают с трудоустройством и рекомендуют к стажировке в крупных компаниях. Например, выпускники получают возможность работать в «Альфа-Банке», Bayer, Henkel, «Сбербанке» и других ведущих организациях.

По окончании обучения выдается сертификат

Присоединяйтесь к курсу уже сейчас и получите скидку 15% на обучение по промокоду Hi-news (действует до 15.02.2020). Набор совсем скоро закончится, поэтому времени на раздумья не так много.

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

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

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

Изучаем нейронные сети за четыре шага

Изучаем нейронные сети за четыре шага

    Переводы , 7 августа 2016 в 23:21

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

Шаг 1. Нейроны и метод прямого распространения

Так что же такое «нейронная сеть»? Давайте подождём с этим и сперва разберёмся с одним нейроном.

Нейрон похож на функцию: он принимает на вход несколько значений и возвращает одно.

Круг ниже обозначает искусственный нейрон. Он получает 5 и возвращает 1. Ввод — это сумма трёх соединённых с нейроном синапсов (три стрелки слева).

В левой части картинки мы видим 2 входных значения (зелёного цвета) и смещение (выделено коричневым цветом).

4 – 29 мая , онлайн, беcплатно

Входные данные могут быть численными представлениями двух разных свойств. Например, при создании спам-фильтра они могли бы означать наличие более чем одного слова, написанного ЗАГЛАВНЫМИ БУКВАМИ, и наличие слова «виагра».

Входные значения умножаются на свои так называемые «веса», 7 и 3 (выделено синим).

Теперь мы складываем полученные значения со смещением и получаем число, в нашем случае 5 (выделено красным). Это — ввод нашего искусственного нейрона.

Потом нейрон производит какое-то вычисление и выдает выходное значение. Мы получили 1, т.к. округлённое значение сигмоиды в точке 5 равно 1 (более подробно об этой функции поговорим позже).

Если бы это был спам-фильтр, факт вывода 1 означал бы то, что текст был помечен нейроном как спам.

Иллюстрация нейронной сети с Википедии.

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

Я очень рекомендую посмотреть серию видео от Welch Labs для улучшения понимания процесса.

Шаг 2. Сигмоида

После того, как вы посмотрели уроки от Welch Labs, хорошей идеей было бы ознакомиться с четвертой неделей курса по машинному обучению от Coursera, посвящённой нейронным сетям — она поможет разобраться в принципах их работы. Курс сильно углубляется в математику и основан на Octave, а я предпочитаю Python. Из-за этого я пропустил упражнения и почерпнул все необходимые знания из видео.

Сигмоида просто-напросто отображает ваше значение (по горизонтальной оси) на отрезок от 0 до 1.

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

Но на одних видео далеко не уедешь. Для полного понимания я решил закодить её самостоятельно. Поэтому я начал писать реализацию алгоритма логистической регрессии (который использует сигмоиду).

Это заняло целый день, и вряд ли результат получился удовлетворительным. Но это неважно, ведь я разобрался, как всё работает. Код можно увидеть здесь.

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

Шаг 3. Метод обратного распространения ошибки

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

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

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

Скриншот из руководства Мэтта Мазура по методу обратного распространения ошибки.

Вот три источника, которые помогли мне разобраться в этом методе:

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

Шаг 4. Создание своей нейронной сети

При прочтении различных статей и руководств вы так или иначе будете писать маленькие нейронные сети. Рекомендую именно так и делать, поскольку это — очень эффективный метод обучения.

Ещё одной полезной статьёй оказалась A Neural Network in 11 lines of Python от IAmTrask. В ней содержится удивительное количество знаний, сжатых до 11 строк кода.

Скриншот руководства от IAmTrask

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

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

После этого можно ознакомиться с руководством Wild ML от Denny Britz, в котором разбираются нейронные сети посложнее.

Скриншот из руководства WildML

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

Для поиска хороших наборов данных можете посетить мой сайт Datasets.co и выбрать там подходящий.

Так или иначе, теперь вам лучше начать свои эксперименты, чем слушать мои советы. Лично я сейчас изучаю Python-библиотеки для программирования нейронных сетей, такие как Theano, Lasagne и nolearn.

Читать еще:  Как задействовать всю оперативную память?

Как создать собственную нейронную сеть с нуля на языке Python

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

Мотивация: ориентируясь на личный опыт в изучении глубокого обучения, я решил создать нейронную сеть с нуля без сложной учебной библиотеки, такой как, например, TensorFlow. Я считаю, что для начинающего Data Scientist-а важно понимание внутренней структуры нейронной сети.

Эта статья содержит то, что я усвоил, и, надеюсь, она будет полезна и для вас! Другие полезные статьи по теме:

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

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

Нейронные сети состоят из следующих компонентов:

  • входной слой, x
  • произвольное количество скрытых слоев
  • выходной слой, ŷ
  • набор весов и смещений между каждым слоем Wи b
  • выбор функции активации для каждого скрытого слоя σ; в этой работе мы будем использовать функцию активации Sigmoid

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

Создание класса Neural Network на Python выглядит просто:

Обучение нейронной сети

Выход ŷ простой двухслойной нейронной сети:

В приведенном выше уравнении, веса W и смещения b являются единственными переменными, которые влияют на выход ŷ.

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

Каждая итерация обучающего процесса состоит из следующих шагов

  • вычисление прогнозируемого выхода ŷ, называемого прямым распространением
  • обновление весов и смещений, называемых обратным распространением

Последовательный график ниже иллюстрирует процесс:

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

Как мы видели на графике выше, прямое распространение — это просто несложное вычисление, а для базовой 2-слойной нейронной сети вывод нейронной сети дается формулой:

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

Однако нужен способ оценить «добротность» наших прогнозов, то есть насколько далеки наши прогнозы). Функция потери как раз позволяет нам сделать это.

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

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

Сумма квадратов ошибок — это среднее значение разницы между каждым прогнозируемым и фактическим значением.

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

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

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

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

Напомним из анализа, что производная функции — это тангенс угла наклона функции.

Если у нас есть производная, то мы можем просто обновить веса и смещения, увеличив/уменьшив их (см. диаграмму выше). Это называется градиентным спуском.

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

Фух! Это было громоздко, но позволило получить то, что нам нужно — производную (наклон) функции потерь по отношению к весам. Теперь мы можем соответствующим образом регулировать веса.

Добавим функцию backpropagation (обратного распространения) в наш код на Python-е:

Проверка работы нейросети

Теперь, когда у нас есть наш полный код на Python-е для выполнения прямого и обратного распространения, давайте рассмотрим нашу нейронную сеть на примере и посмотрим, как это работает.

Идеальный набор весов

Наша нейронная сеть должна изучить идеальный набор весов для представления этой функции.

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

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

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

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

Финальные размышления

Я многому научился в процессе написания с нуля своей собственной нейронной сети. Хотя библиотеки глубинного обучения, такие как TensorFlow и Keras, допускают создание глубоких сетей без полного понимания внутренней работы нейронной сети, я нахожу, что начинающим Data Scientist-ам полезно получить более глубокое их понимание.

Я инвестировал много своего личного времени в данную работу, и я надеюсь, что она будет полезной для вас!

Как построить свою собственную нейронную сеть с нуля в Python

Опубликовано Шамаев Иван в 11.09.2019 11.09.2019

Руководство для начинающих, чтобы понять внутреннюю работу глубокого обучения

Beginner’s Guide of Deep Learning

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

Эта статья содержит то, что я узнал, и, надеюсь, это будет полезно и для вас!

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

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

Нейронные сети состоят из следующих компонентов

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

На диаграмме ниже показана архитектура двухслойной нейронной сети ( обратите внимание, что входной слой обычно исключается при подсчете количества слоев в нейронной сети )

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

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

Обучение нейронной сети

Выход ŷ простой двухслойной нейронной сети:

Вы можете заметить, что в приведенном выше уравнении весовые коэффициенты W и смещения b являются единственными переменными, которые влияют на результат ŷ.

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

Каждая итерация учебного процесса состоит из следующих шагов:

  • Расчет прогнозируемого выхода known , известный как прямаясвязь
  • Обновление весов и уклонов, известных как обратное распространение

Последовательный график ниже иллюстрирует процесс.

прогнозирование

Как мы видели на приведенном выше последовательном графике, прямая связь — это просто простое исчисление, и для базовой двухслойной нейронной сети результат работы нейронной сети:

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

Однако нам все еще нужен способ оценить «доброту» наших прогнозов (т. Е. Насколько далеки наши прогнозы)? Функция потерь позволяет нам делать именно это.

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

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

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

Наша цель в обучении — найти лучший набор весов и смещений, который минимизирует функцию потерь.

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

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

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

Напомним из исчисления, что производная функции — это просто наклон функции.

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

Если у нас есть производная, мы можем просто обновить веса и смещения, увеличивая / уменьшая ее (см. Диаграмму выше). Это известно как градиентный спуск .

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

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

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

Для более глубокого понимания применения исчисления и правила цепочки в обратном распространении я настоятельно рекомендую этот урок от 3Blue1Brown.

Собираем все вместе

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

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

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

Давайте посмотрим на окончательный прогноз (выход) из нейронной сети после 1500 итераций.

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

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

Что дальше?

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

  • Какую другую функцию активации мы можем использовать, кроме функции Sigmoid?
  • Использование скорости обучения при обучении нейронной сети
  • Использование сверток для задач классификации изображений

Я скоро напишу больше на эти темы, так что следите за мной на Medium и следите за ними!

Последние мысли

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

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

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: