В машинном обучении алгоритм хорош настолько, насколько хороши данные, на которых он обучался. Обучение на собственном опыте — это своего рода смысл машинного обучения. Без машинного обучения мы бы вручную программировали множество условий «если» и «если-иначе», чтобы компьютер понял, является ли объект автомобилем или человеком. А градиентный спуск — один из самых популярных инструментов, используемых в машинном обучении. Но чтобы понять градиентный спуск, давайте разберемся, как работают искусственные нейронные сети.

Что такое искусственные нейронные сети или ИНС?

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

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

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

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

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

Теперь одно из эмпирических правил о том, как формируются эти связи, гласит: «нейроны, которые возбуждаются вместе, соединяются вместе». Давайте посмотрим на старый пример собаки Павлова, чтобы понять это.

Собака Павлова и дрессировка

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

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

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

Как нейронные сети решают проблему

Мозг одинаково решает все проблемы. Например, рассмотрим ситуацию, когда вашему мозгу предъявляют картинку и просят определить, собака ли это. Есть много факторов, которые могут указать, является ли собака. Например, если у него 4 ноги, скорее всего, это собака, но есть и другие животные с 4 ногами. У собак обычно есть шерсть, но не всегда. У собаки два глаза, но у большинства животных два глаза. Как видите, все это корреляции, и все вместе они могут помочь кому-то прийти к выводу, что это изображение собаки.

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

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

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

Как работают искусственные нейронные сети?

«Напряженность» или «сила» связей между нейронами в мозге представлена ​​или, скорее, соответствует весам в искусственной нейронной сети. Давайте сделаем это проще.

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

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

Предположим, что входные нейроны, представляющие четыре ноги, дают ввод, скажем, 1, и нейрон, представляющий густую шерсть, дает такой же ввод. Теперь входные данные от густой шерсти могут быть умножены, скажем, на 4, а входные данные от четырехлапого нейрона могут быть умножены на 2. наличие 4 ножек). Таким образом, общее количество входных данных теперь равно 6.

Порог. Или предвзятость

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

А когда дело доходит до ИНС, порог называется смещением. (технически отрицательное значение порогового значения называется смещением. То есть, если порог равен 4, смещение равно -4)

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

Активационная функция нейронной сети

Функция активации — это то, как рассчитывается выходной сигнал нейрона. Имейте в виду, что некоторые аспекты этого не совсем соответствуют естественному нейрону.

Как правило, чтобы вычислить функцию активации, вы умножаете веса на соответствующие входные данные и вычитаете смещение. Если бы x1, x2, x3, … были входными данными, а w1, w2, w3 — соответствующими весами, а B — смещением, функция активации была бы

y = x1w1 + x2w2 + x3w3……. — B

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

Y = x1w1 + x2w2 + x3w3……. — B

y = 1, if Y>0

y = 0, if Y<0

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

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

Нейронная сеть хороша настолько, насколько хороша ее подготовка и данные, используемые для ее обучения. Мы знаем, что в естественном нейроне мозг учится на опыте; он формирует новые связи, а старые связи становятся сильнее или слабее по мере получения новой информации. Как мы делаем это в искусственной нейронной сети?

Это то, что мы делаем с данными. Если вы хотите разработать нейронную сеть, которая может определить, есть ли на картинке собака, вам понадобится много изображений как с собаками, так и без них. Это будет набор обучающих данных. Итак, в качестве входных данных мы будем передавать эти изображения в нашу сеть. Но во время обучения мы также предоставим ожидаемый результат. Например, когда мы подаем изображение с собакой в ​​качестве входных данных, на выходе будет «Обнаружена собака». Или в более математическом смысле, 1 или 0.

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

Y = x1w1 + x2w2 + x3w3 + ….. B

Теперь, если вы знаете x1, x2, x3,…… и знаете Y, это похоже на решение уравнения. Но поскольку у нас слишком много переменных, процесс усложняется. Конечно, мы можем попробовать все возможные комбинации весов и смещений, но это потребует много времени и вычислительных ресурсов.

Но чтобы определить оптимальное решение, мы должны определить, насколько оно идеально.

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

Например, допустим, мы пытаемся разработать алгоритм, который предсказывает зарплату человека на основе его возраста и опыта. А для обучения у нас есть данные примерно на 10 000 человек. Для каждого отдельного примера в этом наборе данных мы будем знать ввод и вывод. Чтобы оптимизировать алгоритм, нам нужно знать разницу между фактическим выходом и выходом.

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

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

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

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

Функция потерь = фактический результат — прогнозируемый результат

И функция стоимости может быть средним значением всех этих ошибок для всех данных в наборе обучающих данных. Это называется средней ошибкой или ME. Но, как вы понимаете, некоторые из этих ошибок могут быть отрицательными. Например, в приведенном выше случае, если для обучающего примера фактическая зарплата составляла 10 000 долларов США, но если сеть предсказала зарплату в размере 9 000 долларов США, ошибка будет отрицательной. А когда приходят отрицательные ошибки, средняя ошибка может оказаться равной нулю.

В этой ситуации берется либо среднеквадратическая ошибка (MSE или среднее квадратов всех ошибок), либо средняя абсолютная ошибка (среднее значение абсолютных ошибок для всех обучающих данных).

Но что, если на выходе будет только 0 или 1? Или когда на выходе не может быть никакого числа?

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

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

Скажем, например, мы даем изображение в качестве входных данных, модель выдает выходные данные, говорящие, что с вероятностью 23% это будет рыба, с вероятностью 57% это будет собака и с вероятностью 20% это кошка (т. за классификацию будет взята с наибольшей вероятностью, в данном примере это собака).

Мы выражаем это как

Y = [.23, .57, .20]

Теперь ожидаемый результат будет

Y’ = [0, 1, 0]

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

Для изображения рыбы это будет

Y’ = [1, 0, 0]

А для фото кота это будет

Y’ = [0, 0, 1]

Теперь у нас есть ожидаемый результат и фактический результат.

Теперь мы можем рассчитать функцию потерь как расстояние между двумя распределениями вероятностей.

Будьте готовы к матричной математике (это достаточно просто).

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

[y1, y2, y3]

В приведенном выше примере это будет [0, 1, 0]

И мы пишем фактическое распределение вероятностей после снятия их логов

[logP1,

logP2,

logP3]

В приведенном выше примере обучения это будет

[лог.23,

журнал .57,

журнал .20]

Чтобы получить функцию потерь, мы перемножаем эти две матрицы.

[y1, y2, y3] * [logP1,

logP2,

logP3]

Потеря = y1*logP1 + y2*logP2 + y3*logP3

Взяв приведенный выше пример, это будет

0*лог.23 + 1*лог.57 + 0*лог.20

Как вы понимаете, чем больше классов, тем длиннее будет это уравнение.

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

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

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

Здесь мы используем градиентный спуск.

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

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

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

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

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

Градиентный спуск: немного математики

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

Допустим, наша функция затрат

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

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

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

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

2x — 1

При x = 9 наклон вышеуказанной функции равен

17.

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

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

Здесь мы применяем формулу градиентного спуска.

X1 = x0 — скорость обучения (градиент)

Итак, x0 — это начальное значение x, т. е. 9. А градиент — это наклон функции (17, при x = 9).

Скорость обучения

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

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

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

Назад к проблеме

Итак, теперь мы корректируем значение x с помощью

X1 = 9 — (.1 * 17 )

Здесь мы выбираем 0,1 в качестве скорости обучения

X1 = 7.3

Подстановка в функции стоимости

= 46.99

Как видите, ошибка небольшая, но не нулевая.
Итак, повторяем процесс еще раз

Наклон =

2 * 7.3–1

13.6

Регулировка Х

X2 = X1 — .1 * 13.6

X2 = 7.3–1.36

= 5.94

Расходы

= 30.3436

Как видите, ошибка уменьшается.

Теперь возникает вопрос, а почему бы нам просто не пошевелиться? Зачем делать все эти расчеты, чтобы увидеть, насколько мы должны изменить x, почему бы нам не сделать предположение?

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

Но что, если у нас есть более одной переменной? Что, если нам нужно настроить более одного веса, как в случае с нейронными сетями?

Рассмотрим функцию стоимости

В этом случае график немного сложнее. Мы можем изобразить это как трехмерный график, где X и Y определяют значения Z.

Или мы можем изобразить это как горный хребет на плоской плоскости XY. Теперь мы можем разделить это на оси x и y, а высоту — на ось z.

Чтобы определить наименьшее значение Z, мы должны использовать частные производные.

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

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

Если вы не поняли всего вышеперечисленного, не беспокойтесь

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

Итак, если мы возьмем предыдущую функцию f(x, y) = x 2+ y 2

Частная производная по x

d f(x,y)/dx = 2x

И частная производная по y

d f(x,y)/dy = 2y

Теперь давайте посмотрим, как мы собираемся обновлять веса.

У нас есть два веса для обновления сейчас

Итак, для обновления x

x1 = x0 + скорость обучения * частная производная по x

И для тебя

y1 = y0 + скорость обучения * частная производная по x

Допустим, изначально мы сохранили веса как x = 5 и y = 10.

Таким образом, функция стоимости будет

= 25 + 100 = 125

Обновление х

X1 = 5 — (.1 * 10)

= 5–1

= 4

Обновление г

Y1 = 10 — (.1 * 20)

= 10–2

= 8

Стоимость = 16 + 64

= 80

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

Как насчет того, когда в нейронных сетях больше весов?

Что ж, как мы обсуждали ранее, в среднем нейронные сети могут иметь более 1000 весов. Так как бы вы их рассчитали?

Точно так же, как мы сделали с ситуацией с двумя весами.

Мы случайным образом назначаем веса

Вычислить функцию стоимости

Обновите веса (та же формула для остальных весов, которые мы хорошо

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

Несколько слов перед уходом

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

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

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

Первоначально опубликовано на https://blog.nuventure.in 29 декабря 2021 г.