Введение
В ХХ веке начался очень важный исторический процесс - переход общества от индустриального этапа к постиндустриальному, или же, как ещё говорят, к информационному. Но в чём же основные различия между этими двумя этапами развития человечества? В индустриальном обществе преобладающей отраслью национальной экономики является промышленность, а в информационном большинство рабочих заняты производством, хранением, переработкой и реализацией информации.
Изобретённые тогда ЭВМ многократно ускорили процессы, связанные с обработкой информации, потому что их вычислительная мощность превосходила человеческую в миллионы и более раз и при этом росла с каждым годом экспоненциально. Однако, компьютеры в одном очень сильно уступали человеку: они не могли думать. Машина следует программе, т. е. выполняет инструкции, расположенные в чётком порядке, но если возникает ситуация, не предусмотренная программой, то она прекращает свою работу и сообщает об ошибке. И ведь для некоторых вещей составить программу просто невозможно. Например, как составить программу для распознавания различных букв? Или как составить программу, отличающую разных людей друг от друга по фотографиям?
Обо всём этом учёные задумались ещё на заре становления ЭВМ. И они создали принцип работы искусственных нейронных сетей (далее ИНС), основываясь на работе нашего человеческого мозга. Эту технологию я и буду подробно разбирать в данной исследовательской работе.
Сейчас нейросети плотно проникли в нашу жизнь. Они создают ленту новостей в наших социальных сетях, рекомендуют нам музыку, отвечают нам, когда мы звоним в тех. поддержку различных сервисов, распознают лица и выполняют множество полезных функций.
Проблема
Очень много людей ничего не знают о нейросетях, принципах их работы и предназначении. Также мало осведомлены о нейросетевых технологиях и мои одноклассники.
Актуальность
Область применения ИНС уже давно не ограничивается лишь сферой IT. Нейросети используют в своей работе врачи для анализа сотен и тысяч снимков МРТ, дизайнеры для создания неповторимых и концептуально новых продуктов, инженеры в области автомобилестроения для создания автопилотов и представители множества других профессий. Таким образом, данная исследовательская работа будет актуальна и в будущем, ведь технология ИНС активно развивается и находит применение во всём большем количестве различных областей человеческой деятельности.
Объект исследования - различные источники информации в сети интернет: научные статьи, бесплатные курсы по созданию ИНС, видео- и аудиоматериалы.
Предмет исследования - история, принцип работы, применение и создание нейронных сетей.
Цель работы - изучить принцип работы нейронных сетей, создать её простейший экземпляр для демонстрации возможного функционала
Задачи:
Изучить теоретический материал из источников информации, описанных в объекте исследования.
Написать теоретическую часть работы с историей и математическим обоснованием работы нейронных сетей.
Написать простую ИНС на языке Python, используя готовую библиотеку Tensor Flow, содержащую множество компонентов для работы в сфере машинного обучения и Data Science.
Сделать выводы о проделанной работе.
История технологии
Предпосылки создания
Пожалуй, местом начала становления технологии ИНС можно назвать древние империи Рима и Греции. Конечно, это утверждение может вполне справедливо показаться вам странным. Однако, стоит вспомнить, что принцип устройства ИНС не был придуман с самого нуля, а был создан на основе устройства нашего мозга. И именно древние философы начали задумываться над природой нашего интеллекта, его устройства и принципа работы. На протяжении тысячелетий спорили теологи и философы, физики и анатомы над природой разума, но эти споры особых плодов не принесли, т. к. и по сей день человеку не удаётся осознать всю схему функционирования мозга, понять суть интеллекта и то, как он появился.
Однако, пусть метод научного анализа не дал плодов в понятии сути интеллекта, но благодаря трудам сотен нейробиологов и нейроанатомов мы смогли узнать точную структуру мозга и базовые принципы его функционирования, что в последующем легло в основу ИНС.
Теоретическое обоснование
Понятие нейронных сетей формализовали в 1943 году американский нейропсихолог, нейрофизиолог Уоррен Мак-Каллок и американский нейролингвист и математик Уолтер Питтс. В 1943 году ими была разработана компьютерная модель ИНС на основе математических алгоритмов и теории деятельности головного мозга. Они выдвинули предположение, что нейроны можно упрощённо рассматривать как логические устройства, обрабатывающие двоичные числа. Учёные представили свою конструкцию из подобных нейронов и доказали, что она может выполнять все арифметические и логические операции путём точной настройки. Также они выдвинули гипотезу, что подобная сеть даже способна обучаться, распознавать образы, группировать информацию, в общем, обладать всеми чертами привычного интеллекта.
В 1949 году психолог и физиолог Дональд Хебб выдвинул гипотезу об участии нейронов в обучении. Согласно ей, между нейронами находятся некоторые каналы связи, и при частом использовании этих каналов связь укрепляется. Это и легло в основу первого алгоритма обучения нейронных сетей.
Главные проблемы
Однако такого не случилось. Было обнаружено большое количество проблем в развитии ИНС, которые в 1969 году Марвин Минский и Сеймур Пейперт разобрали в своей статье «Персептроны». Было две основных проблемы:
Вычислительная мощность машин тех времён не позволяла нейронным сетям обрабатывать большое количество информации, необходимое для обучения.
Одного слоя нейронов было недостаточно для осуществления логической операции «исключающее ИЛИ», а как сделать 2 и более слоёв, тогда не знали.
После этой публикации интерес к нейросетям резко угас и технологию, так сказать, убрали в дальний ящик до тех пор, пока вычислительные мощности не выросли до нужного уровня.
Решение проблем
В 1975 году Полом Вербосом был изобретён метод обратного распространения ошибки, что позволило решить задачу эффективного обучения многослойных сетей и решить проблему логической операции «исключающее ИЛИ». В этом же году Кунихико Фукусимо изобрёл неокогнитрон, который стал одной из первых многослойных нейросетей, способных к обучению. В 1986 г. метод обратного распространения ошибки был существенно развит Дэвидом Румельхартом.
В 1988 году французский информатик Ян Лекун предложил устройство так называемой свёрточной нейронной сети, которая заточена и оптимизирована под распознавание различных образов и изображений.
Современное развитие
К началу 90х годов уже были изобретены многие алгоритмы реализации нейронных сетей. С этого момента совокупность этих алгоритмов и методов обучения стали называть машинным обучением. Термин «искусственный интеллект» к этому моменту себя уже дискредитировал и новый пришёл ему на замену.
Хоть процесс создания новых алгоритмов и замедлился, однако рост производительности вычислительной техники с каждым годом лишь набирал обороты. Стали распространяться так называемые GPU - дискретные графические процессоры, которые позволяли одновременно обрабатывать большие объёмы информации, что идеально подходило для работы ИНС. Благодаря их развитию в 2010 году произошёл огромный скачок в области нейросетей. Были заложены основы так называемого глубокого обучения. Это комплекс методов и алгоритмов, позволяющих создавать и обучать ИНС с огромным количеством слоёв (вплоть до нескольких сотен). После этого машинное обучение стало всё чаще и чаще применяться для создания различных программ, предназначенных для массового использования.
Работа нейронных сетей
А-элементы R-элементы
(ассоциативные) (реагирующие)
S-элементы
(сенсоры,
рецепторы)
Рисунок 1. Общая схема ИНС
2.1. Общее строение ИНС
В общем виде большинство нейросетей состоят из трёх слоёв: входного, вычислительного (скрытого) и выходного. По своим функциям эти слои сходны с таковыми в обычной биологической нервной системе. Входной слой получает определенную информацию. Например, на входы нейросети, умеющей играть в шахматы, может поступать информация о количестве фигур, их типах и расположении. Далее сигнал обрабатывается в скрытом слое, а результат попадает в выходной слой, нейроны которого в зависимости от полученного результата выполняют те или иные действия. В той же шахматной нейросети нейроны выходного слоя делают ход.
Теперь давайте разберёмся, как работает скрытый слой. Для этого стоит подробнее рассмотреть строение отдельного нейрона.
Строение нейрона
Рисунок 2. Схема нейрона
Он состоит из двух основных частей: входной (input data) и выходной (output data). Ко входной части нейронов скрытого в выходного слоев подходят синапсы (места соединения) от других нейронов, а за входные данные считается сумма значений, подходящих по этим синапсам. Важно отметить, что все нейроны оперируют действительными числами в диапазоне [-1, 1] или [0, 1] в зависимости от строения нейросети. Но что же делать, если на вход поступает сумма чисел, выходящая из этого промежутка? Для этого во всех ИНС присутствует так называемая функция нормализации. Есть различные её виды, но останавливаться подробно я на этом не буду. Чаще всего это деление единицы на эту сумму.
Рассмотрим процесс передачи входного сигнала. Как говорилось ранее, ко входной части нейрона подходит множество синапсов от других нейронов. В ИНС синапсы имеют лишь одну характеристику - вес (w). Это значение, на которое умножается выходной сигнал нейрона. Собственно, весь процесс обучения нейросети основывается на подборе правильных весов для каждого синапса, чтобы в итоге выходил правильный результат.
Обучение ИНС
При инициализации (создании) ИНС в первый раз значения весов указываются случайным образом. Для последующей тренировки понадобится так называемый датасет (dataset) - набор входных значений и соответствующих им правильных выходных значений. Проход нейросетью одного тренировочного сета называется итерацией, а проход всех датасетов называется эпохой.
В самом начале нейросеть будет выдавать ответы, очень далёкие от правильных, ведь весы будут выставлены совершенно случайно. Но как же они будут изменяться? Ведь в совершении конечной ошибки виновато отнюдь не одно ребро, а ещё и все, что шли до него. Специально для решения этой проблемы и был создан метод обратного распространения ошибки, о котором я говорил в истории развития технологии. Заключается он в следующем: нейросеть смотрит на выходной нейрон, из-за ошибочного значения в котором вышел неправильный ответ. Далее просматриваются все синапсы, ведущие в этот нейрон, и их веса изменяются пропорционально тому, какова степень их участия в создании конечной ошибки. Далее этот процесс повторяется с теми нейронами, из которых выходили эти синапсы и так этот процесс рекурсивно изменяет веса всех синапсов, которые привели к конечной ошибке.
Вот очень примитивный пример. В совершении конечной ошибки (е = 0.984) наибольшее участие принял синапс w1, поэтому его вес изменился заметно больше, чем вес синапса w2. В итоге после процесса обратного распространения ошибки итоговый ответ становится заметно более приближенным к правильному.
Конечно, есть большое количество других типов нейросетей с заметно отличающимся строением, есть различные функции нормализации и различные методы распространения ошибки, но в общем они либо основываются, либо схожи с тем, что я показал в данной работе, поэтому данного материала вполне достаточно для общего понимания принципа работы и обучения ИНС.
Перейдём к практическому этапу. Сразу уточним, что создавать нейросеть с нуля мы не будем, т.к. это очень сложно, да и к тому же ненужно, т.к. специально для ускорения процесса разработки программисты и учёные сферы data-science создали большое количество готовых быстрых и удобных библиотек для создания ИНС. В качестве языка идеально подойдёт Python, т.к. он довольно прост и современен. В качестве библиотеки я выбрал Tensor Flow от компании Goggle.
Что же наша ИНС будет делать? Она будет отличать фотографии кошек от фотографий собак. Конечно, практической ценности данный пример не несёт, но зато он наглядно покажет принцип работы нейросети. А для того, чтобы она научилась распознавать образы этих животных, её нужно обучить на специальном датасете, который мы возьмем из открытых источников интернета.
Прежде чем начать писать непосредственно сам код, нужно определиться со средой разработки (программой) для его написания. Очень удобным для моей показательной ИНС будет онлайн среда разработки Google Colab. Её удобство заключается в том, что нам совершенно ничего не надо скачивать, ведь все средства разработки и даже библиотеки для работы в сфере машинного обучения предоставляются нам с серверов Goggle. К тому же наш компьютер почти не будет нагружаться, так как все вычислительные операции будут выполняться на тех же серверах.
Для начала сделаем импорт основных библиотек, которые пригодятся нам для создания нейросети.
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
from tensorflow.keras.preprocessing.image import load_img,
img to array
from tensorflow.keras.layers import Dense, GlobalAveragePoo ling2D, Dropout
import matplotlib.pyplot as plt
from google.colab import files
Теперь загрузим пакет изображений для тренировки ИНС.
train, _ = tfds.load('cats_vs_dogs', split=['train[:100%]'] , with_info=True, as_supervised=True)
train - это переменная, хранящая сами данные, 'cats_vs_dogs' - название пакета, 'train[:100%]' означает, что для тренировки будет использовано 100% содержимого пакета.
Давайте ради интереса выведем изображения и сопутствующие им подписи из этого набора данных с помощью следуюущего цикла:
for img, label in train[0].take(10):
plt.figure()
plt.imshow(img)
print(label)
Заранее скажем, что все изображения в наборе данных имеют разное разрешение. Это не очень хорошо скажется на результатах обучения, поэтому стоит задать универсальный размер, к которому будут приводится все картинки. Пусть он будет равен 224 на 224 пикселя. Запишем его в глобальной переменной SIZE и сделаем функцию для изменения размера.
SIZE = 224
def resize_image(img, label):
img = tf.cast(img, tf.float32)
img = tf.image.resize(img, (SIZE, SIZE))
img = img / 255.0
return img, label
Применим данную функцию к имеющимся картинкам.
train_resized = train[0].map(resize_image)
train_batches = train_resized.shuffle(1000).batch(16)
Чтобы наша нейросеть быстрее обучалась, возьмём небольшой фрагмент уже обученной нейросети.
base_layers = tf.keras.applications.MobileNetV2(input_shape =(SIZE, SIZE, 3), include_top=False)
base_layers.trainable = False
Всё обучение заняло порядка 15 минут. При этом конечная точность определения образа достигла 96%, что очень и очень неплохо. Осталось лишь написать код для загрузки и анализа изображений (их будет 5) и посмотреть результат нашей работы.
files.upload()
for i in range(5):
img = load_img(f'{i+1}.jpg')
img_array = img_to_array(img)
img_resized, _ = resize_image(img_array, _)
img_expended = np.expand_dims(img_resized, axis=0)
prediction = model.predict(img_expended)[0][0]
result = tf.sigmoid(prediction)
pred_label = 'КОТ' if result < 0.5 else 'СОБАКА'
plt.figure()
plt.imshow(img)
plt.title(f'{pred_label} {result}')
Как мы видим, нейросеть абсолютно верно различает котов и собак различных пород и возраста, поэтому практический этап нашей исследовательской работы можно считать успешно выполненным.
Заключение
Мы исследовали историю, принцип работы ИНС и создали её рабочий экземпляр, демонстрирующий её некоторые способности. В связи с этим сделали следующие выводы:
Нейросети обладают удивительными возможностями, которые раньше казались человечеству фантастикой.
Нейросети обладают заметно большим функционал по сравнению с обычными программами.
На данный момент существует разнообразное программное обеспечение и множество открытых библиотек, предназначенных для создания нейросетей.
В своей основе нейросети обладают достаточно простым математическим аппаратом.
Нейросети не сильно требовательны к вычислительной мощности.
Создать свою нейросеть может почти каждый, обладающий базовыми знаниями информатики и языка программирования.
Наука о нейросетях и больших данных (data science) активно развивается и будет очень актуальна в будущем, о чём свидетельствует тот факт, что направление машинного обучения уже существует в крупнейших ВУЗах страны.
Список литературы
1. Аксенов С. В. Организация и использование нейронных сетей (методы и технологии) [Текст] / С. В. Аксенов, В. Б. Новосельцев. – Томск: НТЛ 2006. – 128 с.
2. Богославский С. Н. Область применения искусственных нейронных сетей и перспективы их развития [Электронный ресурс]. – Режим доступа: URL: https://cyberleninka.ru/article/v/oblast-primeneniya-iskusstvennyh-neyronnyh-setey-i-perspektivy-ih-razvitiya (02.12.2017)
3. Горбачевская Е. Н., Краснов С. С. История развития нейронных сетей [Электронный ресурс]. – Режим доступа: URL: https://cyberleninka.ru/article/v/istoriya-razvitiya-neyronnyh-setey (01.12.2017)
4. Евменов, В. П. Интеллектуальные системы управления [Текст]: Учебное пособие / В. П. Евменов. – М.: Книжный дом «ЛИБРОКОМ», 2009. – 304 с.
5. Каллан, Роберт. Основные концепции нейронных сетей [Текст]: Пер с англ. / Роберт Каллан. – М.: Издательский дом «Вильямс», 2001. – 287 с.
6. Козадаев А. С. Техническая реализация искусственного нейрона и искусственной нейронной сети [Электронный ресурс]. – Режим доступа: URL: https://cyberleninka.ru/article/v/tehnicheskaya-realizatsiya-iskusstvennogo-neyrona-i-iskusstvennoy-neyronnoy-seti (03.12.2017)
7. Люггер, Джордж, Ф. Искусственный интеллект: стратегии и методы решения сложных проблем [Текст], 4-е издание., Пер. с англ. / Джордж Ф. Люггер. – М.: Издательский дом «Вильямс», 2003 –
8. Хлебников, А. А. Информационные технологии [Текст]: учебник / А. А. Хлебников. – М.: КНОРУС, 2016. – 466 с.
9. Ясницкий, Л. Н. Введение в искусственный интеллект [Текст]: учеб. пособие для студ. высш. учеб. заведений / Л. Н. Ясницкий. – 2-е изд., испр. – М.: Издательский центр «Академия», 2008. – 176 с.