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

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

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

Базовая настройка

Реализацию нашей простой архитектуры можно найти в прилагаемом репозитории GitHub. В то время как мы объясним основные части через мгновение, не стесняйтесь клонировать его прямо сейчас, поэкспериментировать и отправить любую проблему, которая может возникнуть. Если вы используете IDE, например IntelliJ, вы сможете запустить программу, щелкнув зеленую стрелку в файле Main.kt.

Почему именно Котлин?

Python на сегодняшний день является наиболее часто используемым языком в области машинного обучения (ML). Я считаю, что это просто, и существует множество библиотек для математических вычислений. Однако мы решили использовать Kotlin из-за некоторых его функций:

  • Совместимость с Java: вы можете использовать любую существующую библиотеку Java и несколько новых в мире машинного обучения.
  • статическая типизация: несмотря на то, что Python строго типизирован, мне трудно читать сложные архитектуры без помощи системы статических типов.
  • Именованные параметры и параметры по умолчанию: вы заметите, что мы вызываем функции, используя именованные параметры, а иногда и сочетание позиционных и именованных параметров. Я думаю, что этот стиль помогает с удобочитаемостью, когда одних типов недостаточно.
  • Расширения функции: эта функция позволит нам контролировать объем некоторых функций и добавлять функциональные возможности в существующие библиотеки.
  • встроенные функции, которые снижают стоимость вызовов функций во время выполнения.
  • деконструирование объявлений: мы будем использовать эту функцию, чтобы повысить удобочитаемость за счет сокращения стандартного кода.

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

Архитектура

Проще говоря, наша нейронная сеть состоит из трех частей:

  1. набор «нейронов», то есть узлов сети, организованных по слоям и несущих значение, то есть одно или несколько чисел с плавающей запятой;
  2. набор весов, которые являются матрицами и соединяют один слой нейронов со следующим;
  3. набор функций, которые принимают значения на одном слое нейронов и соответствующие веса и дают значения на следующем слое.

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

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

Реализация нашей нейронной сети

Нам нужно выполнить три основных шага:

  1. подготовка набора входных данных;
  2. обучение нашей нейронной сети;
  3. тестирование процесса обучения нейронной сети.

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

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

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

Поскольку наша установка очень проста, прогнозы не могут быть точными на 100%. Вам предстоит еще многое узнать!