Я младший инженер-программист, увлеченный обучением и ежедневным ростом как инженера и как личности.

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

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

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

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

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

Что делает нейронную сеть

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

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

Плотные слои и плотные нейронные сети

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

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

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

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

Взвешенная сумма всех входов

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

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

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

Итак, это то, что у нас есть на данный момент, множество нейронов, подобных приведенному ниже, которые принимают взвешенную сумму всех входных данных (X1*W1 + X2*W2 +… Xn*Wn) и производят некоторый результат.

Этот процесс получения взвешенной суммы всех входных данных математически выражается как…

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

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

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

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

Предвзятость

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

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

Выражаясь математически, все это выглядит так…

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

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

Я хотел бы отметить, что, как я уже упоминал выше, я написал это, чтобы помочь объяснить концепции как себе, так и другим. Если вы заметили что-то не так, пожалуйста, дайте мне знать! С учетом сказанного, спасибо за чтение :)