Как создать простейший ИИ с помощью нейронных сетей

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

В этой статье я расскажу вам о том, как нейронные сети помогают нам заменить тонны традиционного кода условными операторами if-else и несколькими строками кода, которые используют вашу сеть. Я также дам вам знать, как ваша сеть спасет вас, если вы не запрограммировали заранее какие-то определенные условия.

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

План

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

Сводка по нейронной сети

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

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

Набор данных

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

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

Во-первых, давайте определим столбцы, описывающие ситуацию:

  • «рядом враг» - в строках будут числовые значения: 1 - истина, 0 - ложь.
  • «есть боеприпасы» - 1 или 0
  • «уровень здоровья» - значение от 0 до 100.

… И столбцы, определяющие действия:

  • «бежать» - нужно бежать, 1 - правда, 0 - ложь
  • «атака» - 1 верно, 0 неверно

Затем давайте определим три ситуации:

  1. Рядом находится враг, а у нашего персонажа есть боеприпасы и полное здоровье. Персонаж должен атаковать врага.
  2. Рядом враг, патроны закончились, но уровень здоровья полный. Персонаж должен сбежать.
  3. Если поблизости нет врага, а у персонажа есть боеприпасы и низкий уровень здоровья, он должен бежать.
enemyNearby,hasAmmo,health,run,attack
1,1,100,0,1
1,0,100,1,0
0,1,10,1,0

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

Прежде чем мы начнем

Из технического стека мы собираемся использовать Python, Keras и несколько других библиотек, которые помогут нам в будущем.

Определите константы, которые сообщают нам, сколько типов входных данных (например, враг поблизости, боеприпасы, здоровье) и сколько типов выходных данных (например, бег, атака) у нас есть.

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

Подготовить данные

В этом примере мы будем использовать pandas для чтения нашего CSV-файла. Мы будем читать входные (train_data) и выходные данные (target_data) отдельно.

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

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

Создайте нейронную сеть

На следующем шаге мы создадим простую модель нейронной сети.

( Да вы можете прочитать больше о различных архитектурах нейронных сетей здесь)

Наш модуль будет состоять из:

  • Входной слой - количество нейронов на этом слое будет равно количеству входных данных. В нашем случае это три (3).
  • Скрытый слой. Здесь должно быть шестнадцать (16) нейронов. Этого будет достаточно для такого небольшого количества обучающих данных. На данный момент предположим, что мы вычислили это количество нейронов путем экспериментов. (Вы можете поиграть с визуализацией здесь)
  • Выходной слой - количество нейронов здесь равно количеству возможных действий. В нашем случае это два (2).

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

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

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

Модель поезда

Отлично, наша модель готова чему-то обучать! Давайте скармливаем модели наш обучающий набор данных (например, train_x и target_x).

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

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

Проверьте нашу модель

Самое сложное осталось позади. Пришло время использовать нашу обученную нейронную сеть.

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

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

Затем создайте массив входных данных из этого входа и подготовьте его для нашего модуля.

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

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

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

Затем найдите действие с наибольшей вероятностью.

Автоматическая оценка

Другой вариант - оценить модель с набором данных и проверить точность результата.

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

test_train_data и test_target_data - вы можете загрузить из файла CSV так же, как мы загружали набор обучающих данных ранее.

Полный код

Готовый код и набор данных можно найти здесь