Czytaj książkę: «Нейронные сети. Эволюция»
Пролог
Технология искусственных нейронных сетей
С течением времени, по сегодняшний день, человечество сделало не мало для того чтоб приспособится самому и приспособить окружающий мир под себя. Было сделано немало научных открытий, инженерных изобретений, на основе которых создавались целые отрасли промышленности (машиностроение, энергетика, цифровые технологии и т.д.), которые значительно облегчили жизнь людей.
Но двигаясь вперед, все более актуален вопрос эффективного управления созданным хозяйством. Сегодня, для того чтобы человечеству хватило ресурса для освоения нового и развития уже созданного, требуется новые технологии, которые могли бы справиться с поставленной задачей более эффективно, значительно облегчая и даже заменяя труд людей.
Одной из таких технологий призвана стать – технология искусственных нейронных сетей, идея которой заключается в том, чтобы максимально близко смоделировать работу человеческой нейронной системы, так же эффективно обучаться и исправлять ошибки. Можно сказать, что главная особенность ИНС – способность самостоятельно обучаться и действуя на основании предыдущего опыта, с каждым разом делать все меньше ошибок.
Как пример применения ИНС, можно привести сферу охранного видеонаблюдения – где система искусственных нейронных сетей распознаёт присутствие людей в ненадлежащих зонах, забытые вещи, идентифицируя по лицу личность человека, отпечаткам пальцев и т.д. Ну а об автопилоте в автомобиле думаю наслышаны все, уже сегодня они колесят на просторах дорог в разных странах, пускай хоть и пока в качестве эксперимента, но это уже реальность! Конечно же, это далеко не всё чем ограничиваются искусственные нейронные сети. Их возможности поистине безграничны. Многие эксперты в сфере технологий, называют технологию ИНС – одной из ключевых технологий будущего.
Введение
Цель книги. Для кого она предназначена
Цель книги – объяснить, как устроены и работают нейронные сети, на простом и понятном, даже для школьника старших классов, языке!
Эта книга предназначена для всех, кто хочет разобраться в том, как устроены нейронные сети. Для тех читателей, кто хочет сам научиться программировать нейронные сети, без использования специализированных библиотек машинного обучения.
Книга предоставляет возможность с нуля разобраться в сути работы искусственных нейронов и нейронных сетей, математических идей, лежащих в их основе, где от вас не требуется никаких специальных знаний в области математики, не выходящих за пределы школьного курса.
Для улучшения восприятия информации, в книге сознательно избегается терминология, как например – персептроны, конволюция и так далее, так как приоритетом в данной книге является понимание принципа работы искусственных нейронных сетей, а не заучивание терминов.
Что мы будем делать
Самым разумным подходом для понимания развития технологии искусственных нейронных сетей, будет её биологическая интерпретация. Которая конечно же, в этой книге, не будет претендовать на историческую достоверность.
Мы будем представлять рождение и изменение искусственных нейронов и их взаимодействие между собой – по аналогии с эволюцией биологических видов. Как и в природе, движение от простейших организмов к более сложным, мы начнем с рождения простейшего искусственного нейрона (с одним входом и выходом), используя для его работы (жизнедеятельности), простейший математический аппарат.
В дальнейшем, задачи, которые должен решать искусственный нейрон, будут становится сложнее. Для их решения нам потребуется эволюционировать наш созданный нейрон. Добавляя новые входы, или убирая ненужные, наподобие того, как это происходит в живой природе (например – отрастание или отмирание некоторых частей тела), вместе с тем модифицируя его математический аппарат.
Вносить изменения будем не кардинальные, опираясь на старые компоненты, будем постепенно, лишь слегка их модифицировать. Тем самым, действуя похожим образом как в реальных условиях, сама природа.
В процессе такой эволюции, созданные нами нейроны, научатся взаимодействовать между собой, объединяясь в сети.
Как мы будем это делать
Все сказанное будет подкрепляться теорией. Сначала на простейших принципах линейной функции, создадим наш первый искусственный нейрон. Подтвердим практически его работу – на языке Python выполним задачу по классификации, обучим наш нейрон, в результате чего, он самостоятельно проанализирует данные и классифицирует их. Тем самым максимально автоматизируя процесс классификации. Более того, подавая на вход обученного нейрона новые данные, которые он еще не видел, получим на выходе – верный ответ. Это будет наш первый искусственный интеллект!
Цифровой мир и живая природа очень многообразна. Для выживания в ней, необходима наилучшая приспособляемость к окружающей среде. В живой природе виды эволюционируют, в результате чего приобретают новые навыки и способности для выживания. Так же, когда нашему нейрону потребуется решать задачи, на решение которых, на текущем этапе своей эволюции, он не способен, то для его выживания в цифровом мире, ему тоже будут необходимы новые навыки. Осваивая новые математические принципы, лежащую в основе работы нашего будущего нейрона, мы будем на их основе его немного модифицировать.
Ну и конечно же, подкрепим всё практикой. Разработанные нами алгоритмы, будем применят на языке программирования – Python. Так как, новые математические алгоритмы – модификация предыдущих, то и здесь пойдем по пути постепенного изменения кода. В следствие внесения необходимых изменений в предыдущую программу на Python, и выполнив её, убедимся, что наш нейрон стал еще лучше выполнять предыдущие задачи, или вовсе приобрел способности к выполнению новых. В результате выполнения одной из таких программ, наш обученный нейрон сможет распознавать рукописные цифры! А это уже серьезно!
Все примеры, которые будут реализованы в Python, можно без труда скачать по следующей ссылке:
https://github.com/CaniaCan/neuralmaster
В дальнейшем, мы не раз повторим процесс эволюции к нашему искусственному нейрону. Добавим к нему множество входов и выходов, попутно добавим в его структуру условие – функцию активации. Соответственно узнаем, что такое функции активации, реализуем самые распространённые из них, такие как – единичная функция, сигмоида, RELU, гиперболический тангенс, Softmax.
Следующим этапом нашей эволюции, будет взаимодействие нейронов. Научим их общаться между собой. Или говоря иными словами – объединим в сети. Что в свою очередь, потребует новых навыков и знаний. Словом, теперь мы станем называть нейроны участвующие в её “жизнедеятельности”, нейронной сетью.
На основе таких сетей, на Puthon, напишем программу, способную распознавать рукописные цифры из большой базы данных – 60000 примеров рукописных цифр.
И наконец, мы создадим свёрточную нейронную сеть, и научим её, на той же базе, распознавать рукописные цифры.
ГЛАВА 1
Основа для создания искусственного нейрона
Где используются нейронные сети
Современные вычислительные машины выполняют математические операции с огромной скоростью. Решения различных арифметических и логических операций с числами – суть работы любого компьютера.
Сложение чисел с очень большой скоростью – это огромное преимущество компьютера над мозгом человека. Сложение больших чисел у человека вызывает затруднение, не говоря о скорости их вычисления.
Но есть задачи, с которыми наш мозг справляется куда эффективнее любого компьютера. Если мы взглянем на изображение ниже, то легко можем распознать что на нем изображено:
Вы без труда узнаете, что изображено на картинке, так как наш мозг идеальное средство для анализа изображения и его классификации. А вот компьютеру, напротив, очень трудно решать подобные задачи.
Но мы можем использовать вычислительные ресурсы современных компьютеров для моделирования работы мозга человека – искусственной нейронной сети.
Как устроены биологические нейронные сети
Что такое биологический нейрон и нейронные сети? У нас с вами и многих животных есть мозг. Мозг в свою очередь представляет собой сложную биологическую нейронную сеть, которая принимает информацию от органов чувств и обрабатывает её (распознавание слуховой и зрительной информации, распознавание вкуса, тактильных ощущений и т.д.).
Строение биологического нейрона:
Собственно, эту биологическую модель нейрона мы и будем моделировать. А точнее нам понадобится смоделировать некую структуру, которая принимает на вход сигнал (дендрит), преобразовать этот сигнал по типу – как это происходит в биологическом нейроне, и передать преобразованный сигнал на выход (аксон).
Искусственный нейрон – математическая модель биологического нейрона.
Модель искусственного нейрона (слева – биологический нейрон, справа – искусственный):
Наш мозг, как и любая биологическая нейронная сеть, состоит из множества нейронов.
В человеческом головном мозге насчитывается более 80 миллиардов нейронов, у каждого из который тысячи входов и выходов, и каждый из них соединен с входами других нейронов. И такую модель, в ограниченных объёмах, мы тоже с успехом можем упростить.
Переход к модели искусственных нейронных сетей:
Уровень вычислительной мощности для моделирования ИНС
Мы уже знаем, что в мозге человека более 80 миллиардов нейронов, у каждого из который тысячи входов и каждый из них соединен с выходами других нейронов.
Смоделировать такой объём нейронов и количество их связей, мы на сегодняшний день не сможем. Но, мы можем упростить модель работы мозга, правда в гораздо меньших объёмах. Уровень вычислительной мощности современных компьютеров, при моделировании биологических нейронных сетей, как можно видеть на слайде ниже, немногим выше обычной пиявки.
Насколько сильно мы уменьшаем количество нейронов и связей по сравнению с человеческим мозгом:
Как видите, до человека еще достаточно далеко. Но и этого объёма, что будет доступен, будет вполне достаточно для наших задач.
Почему работают нейронные сети
Весь секрет работы нейронных сетей заключается в работе синапсов, которые вы можете видеть на изображении биологического нейрона:
Синапсы – место стыка выхода одного нейрона и входа другого, где происходит усиление и ослабление сигнала. В усилении и ослаблении сигнала и происходит вся суть работы и обучения нейронных сетей. Если при обучении правильно подобрать параметры в синапсах, то входной сигнал, после прохода через нейронную сеть, будет преобразовываться в верный сигнал на выходе.
Все выше сказанное сейчас для вас представляется, лишь теоретической абстракцией и без практики очень трудным к осмыслению, но мы все разберем по полочкам – всю суть работы этого механизма. Действительно, на данном этапе невозможно понять, как работает нейрон, в чем смысл ослабления и усиления сигналов в синапсах, но информация, которую мы получили поможет нам в будущем, когда будем разбираться, что же всё-таки происходит внутри нейрона и нейронных сетях.
Как автоматизировать работу
Наверняка, многим из нас, порой до чёртиков, надоедало повторять одни и те же действия на работе или учёбе. В этот момент кажется, что ничего не может быть хуже каждодневной рутины.
Давайте включим воображение и представим себя офисным работником. Суть нашей работы – классификация данных на два вида. Каждый день, нам приходит список с данными, где может содержаться более 1000 позиций, которые мы самостоятельно должны отделить друг от друга, на основании чего сказать – какой из двух видов стоит за определенной позицией.
Итак, мы пришли на работу и видим на столе очередной список с данными, которые мы должны как можно быстрей классифицировать. А браться за работу, ох как неохота. Эх, если бы работа умела сама себя делать…
А ведь это мысль! Что если создать такую программу, которая многое из наших вакантных обязанностей, брала на себя. Сама с большой точностью, классифицировала загружаемые в неё данные.
Всё это кажется фантастикой, но всё же реализуемо.
Логичней всего в первую очередь подумать, как это сделать с точки зрения математики. Ведь используя строгую математическую логику, мы поймём, как нам действовать, и добьёмся точных данных на выходе программы.
Ну как в любом начинании, нужно начать с самого простого.
Когда то, в младших классах, на уроке математики мы проходили линейную функцию:
y = Ax + b
Что если сделать так, что на числовых координатах, все данные которые будут находится выше линейной функции, будут принадлежать к одному классу, а ниже к другому. То есть функция прямой будет служить нам как классификатор.
Давайте покажем вышесказанное на слайде:
Отлично! Теперь осталось вспомнить что представляет из себя линейная функция.
Линейная классификация
Вспоминая школьный курс математики, из которого нам должно быть известно, что коэффициент А, в уравнении прямой, отвечает за её наклон. Чем больше значение коэффициента А, тем больше крутизна наклона линии. А коэффициент b – отвечает за точку начала координат по оси Y, через которую проходит прямая.
Раз мы еще толком не знаем, как будем действовать, давайте максимально всё упрощать. Будем считать, что прямая проходит через начало координат и соответственно параметр прямой b, обратим в ноль: b = 0. Тогда окончательное выражение нашей разделительной линии, станет еще более простым:
y = Ax
Пусть нашим заданием будет – классифицировать два вида животных, определенной возрастной группы, в два дня от роду, по размеру их тела – высоте и длине.
Для начала, подберем всего две выборки, которые разительно отличаются друг от друга:
Примем за х – значение длины, а за y – значения высоты. Визуализируем эти данные на числовой прямой:
Нужно придумать как разделить эти два вида линейной функцией. Попробуем мыслить последовательно.
Для начала, попробуем разделить наши данные случайной разделительной линией. Для этого примем значение коэффициента крутизны любым случайным числом, пусть А = 0,4. Тогда наше уравнение разделительной линии примет вид – y = 0,4x.
Как следует из графика, линия – y = 0,4x, не отделяет один вид от другого. Для выполнения условия, её необходимо поднять выше. Для этого нам потребуется выработать последовательность команд и математические правила. Говоря иными словами, проработать алгоритм, когда при подаче данных из нашей таблицы (длины и ширины видов животных), в конечном итоге разделительная линия будет четко разделять эти два вида.
Теперь давайте протестируем нашу функцию на первом тренировочном примере, соответствующему виду крокодила, где: высота крокодила – 20, длина – 40. Не важно в чем будем измерять, в какой метрической системе. Самое близкое по условию это сантиметры. Но будем считать, что измеряем в условных единицах. Возьмём пример, где х=40 (длинна=40), и подставив в него значение нашего коэффициента А = 0,4, получим следующий результат:
y = Ax = (0,4) * (40) =16
На выходе получили значение высоты y = 16, а верный ответ y =20.
Для того чтоб исправить положение и приподнять нашу линию, введем понятие ошибки Е, с помощью следующей формулы:
Е = целевое значение из таблицы – фактический результат
Следуя этой формуле:
Е = 20 – 16 = 4
Теперь давайте приподнимем нашу линию на 4 пункта выше и отобразим это на графике:
Ну и тут, как мы можем наблюдать, наша линия проходит через точку определяющую вид – крокодил, а нам надо чтобы линия лежала выше.
Решается эта проблема очень легко, давайте примем наши целевые значение чуть больше, положим высоту у = 21, вместо у = 20. И снова пересчитаем ошибку с новыми параметрами:
Е = 21 – 16 = 5
Отобразим новый результат на координатах:
В итоге имеем новую прямую с новым значением коэффициента крутизны. Найдя этот коэффициент, мы как раз и сможем построить нужную нам прямую, на всех значениях оси x (длины).
Для этого нам необходимо через наше значение ошибки Е, найти искомое изменения коэффициента А. Чтоб это сделать, нам нужно знать, как эти две величины связаны между собой, тогда мы бы знали, как изменение одной величины влияет на другую.
Начнем с линейной функции:
y = Ax
Обозначим переменной T – целевое значение (наше значение из таблицы). Если ввести в искомый коэффициент А, такую поправку как: А+∆А = искомое А.
Тогда целевое значение можно определить, как:
T = (А + ∆А) х
Отобразим последнее соотношение на графике:
Подставим эти значения в формулу ошибки Е = T – у:
Е = T – у = (А + ∆А) х – Ах = Ax + (∆А) х – Ах = (∆А)х
Е = (∆А)х
Теперь зная, как ошибка Е связана с ∆А, нетрудно выяснить что:
∆А = Е / х
Отлично! Теперь мы можем использовать ошибку Е для изменения наклона классифицирующей линии на величину ∆А в нужную сторону.
Давайте сделаем это! При x = 40 и коэффициенте А = 0,4, ошибка E = 5, попробуем найти величину ∆А:
∆А = Е/х = 5 / 40 = 0,125
Обновим наше начальное значение А:
А = А+∆А = 0,4 +0,125 = 0,525
Получается новое, улучшенное, значение коэффициента А = 0,525. Можно проверить это утверждение, найдя расчетное значение у с новыми параметрами:
y = А х = 0,525 * 40 = 21
В точку!
Теперь давайте узнаем на сколько надо изменить коэффициент А, чтоб найти верный ответ, для второй выборки из таблицы видов – жираф.
Целевые значения жирафа – высота y = 40, длина x = 20. Для того чтобы, разделительная линия не проходила через точку с параметрами жирафа, нам необходимо уменьшить целевое значение на единицу – y = 39.
Подставляем x = 20 в линейную функцию, в которой теперь используется обновленное значение А=0,525:
у = Ax = 0,525 * 20 = 10,5
Значение – у = 10,5, далеко от значения y = 39.
Ну и давайте снова предпримем все те действия, что делали для нахождения параметров разделяющей линии в первом примере, только уже для второго значения из нашей таблицы.
Е = T – y = 39 – 10,5 = 28,5
Теперь параметр ∆А примет следующее значение:
∆А = Е/х = 28,5 / 20 = 1,425
Обновим коэффициент крутизны А:
А = А+∆А = 0,525 +1,425 = 1,95
Получим обновленный ответ:
y = А х = 1,95 * 20 = 39
То есть, при x = 20, A = 1,95 и ∆А = 1,425 – функция возвращает в качестве ответа значение 39, которое и является желаемым целевым значением.
Представим все наши действия на графике:
Теперь мы наблюдаем, что линия разделила два вида, исходя из табличных значений. Но полученная нами разделяющая линия лежит гораздо выше её воображаемого центра, к которому мы стремимся:
Но и это легко поправимо. Мы добьемся желаемого результата сглаживая обновления, через специальный коэффициент сглаживания – L, который часто называют как – скорость обучения.
Суть идеи: что каждый раз обновляя А, мы будем использовать лишь некоторую долю этого обновления. За счет чего, с каждым тренировочным примером, мы мелкими шагами будем двигаться в нужную нам сторону, и в конечном результате остановимся около воображаемой прямой по центру.
Давайте сделаем такой перерасчет:
∆А = L * (Е / X)
Выберем L=0,5 в качестве начального приближения. То есть, мы будем использовать поправку вдвое меньшей величины, чем без сглаживания.
Повторим все расчеты, используя начальное значение А=0,4. Первый тренировочный пример дает нам у = Ax = О,4 * 40 = 16. При x = 40 и коэффициенте А = 0,4, ошибка E = T – y = 21 – 16 = 5. Чтобы график прямой, не проходил через точку с нашими координатами, а проходил выше её, то принимаем целевое значение – T = 21.
Рассчитаем поправку: ∆А = L (Е / х) = 0,5*(5 / 40) = 0,0625. Обновленное значение: А = A + ∆А = 0,4 + 0,0625= 0,4625.
Сглаженное уточнение: y = Ax = 0,4625 * 40 = 18,5.
Теперь перейдем к расчетам следующего тренировочного примера.
Используя обновлённое на первом прогоне значение А, для второго тренировочного примера у = Ax = О,4625 * 20 = 9,25.
Значение, у = 9,25 – всё так же далеки от значения y = 39, но мы все равно движемся в нужном направлении, но уже с меньшой скоростью.
При x = 20 и коэффициенте А = 0, 4625, ошибка E = T – y = 39 – 9,25 = 29,75. Так как мы хотим, чтобы график прямой, не проходил через точку с нашими координатами, а проходил ниже её, то принимаем целевое значение – T = 39. Рассчитаем поправку ∆А = L (Е / х) = 0,5*(29,75 / 20) = 0,74375. Обновлённое значение А = A + ∆А = 0,4625+ 0,74375 = 1,20625.
Сглаженное уточнение y = = Ax = 1,20625 * 20 = 24,125.
Теперь еще раз отобразим на координатной диаграмме, начальный, улучшенный и окончательный варианты разделительной линии:
Можно убедиться в том, что сглаживание обновлений приводит к более удовлетворительному расположению разделительной линии.
Если еще уменьшить скорость обучения L и повторить расчеты с первым и вторым обучающим примером, то в итоге наша разделительная линия окажется очень близко к воображаемой линии.
Применяя способ уменьшение величины обновлений с помощью коэффициента скорости обучения, ни один из пройденных тренировочных примеров, не будет доминировать в процессе обучения.