Практика применения на примере создания корпоративного проекта NaukaLabs
Обилие рабочих задач не мешает увлечённым профессионалам стремиться к развитию. Создание корпоративного проекта NaukaLabs – тому подтверждение. Наши исследования будут направлены на выявление идей с высоким потенциалом для бизнеса и освоение прогрессивных технологий. Первой ласточкой стала нейронная сеть.
Материалов по нейросетям слишком много, чтобы углубляться в объяснение технологии без повтора всем известных фактов. Поэтому расскажем о ней буквально в двух словах.
Структура нейронной сети пришла в мир программирования из биологии:
В мозге человека находятся миллионы нейронов, передающих информацию в виде импульсов. Нейронная сеть — это последовательность нейронов, соединенных между собой синапсами, которые могут усиливать или ослаблять проходящий по ним электрический сигнал. Это ключевой момент, используемый в концепции искусственных нейронных сетей: по принципу функционирования биологических нейронных сетей – нервных клеток живого организма – и строится математическая модель. Реализация искусственной нейросети в виде программы обретает способность анализировать и даже запоминать информацию.
Для изучения процессов, протекающих в мозге, и при попытке их моделирования возникло понятие искусственного нейрона. Роль синапсов играют весовые коэффициенты, корректирующие значение входящих в нейрон данных. Сравнение суммы всех взвешенных сигналов со значением функции активации даёт на выходе тот или иной результат.
Совокупности нейронов могут образовывать нейронные сети, содержащие один или несколько слоёв. Картинка ниже – для самого простого случая: кружками обозначен входной слой, который не считается слоем нейронной сети, а справа расположен слой обычных нейронов. В однослойных нейронных сетях сигналы с входного слоя сразу подаются на выходной слой. Он производит необходимые вычисления, результаты которых сразу подаются на выходы.
Более сложная структура – многослойная нейросеть. Работу скрытых слоев нейронов можно сравнить с крупным производством. Продукт – выходной сигнал – на заводе собирается по стадиям. После каждого станка получается некий промежуточный результат. Скрытые слои таким же образом превращают входные сигналы в те или иные промежуточные результаты.
Особый интерес представляют сети с обратными связями. С помощью рекуррентных сетей можно восстанавливать или дополнять сигналы. Другими словами, такие нейросети имеют свойства кратковременной памяти, как у человека.
Перечислим основные типы задач:
Прежде чем использовать нейросеть, её необходимо обучить. Этот процесс сводится к поиску такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной. Существуют два основных способа:
Перечислим основные причины обращения:
Разделим задачу создания нейросети на этапы решения:
На момент написания статьи NAUKA воплотила в жизнь первый шаг – сортировку на основе текста. Эта задача также выполнялась поэтапно:
Остановимся подробнее на каждой стадии.
Словарь – это весь массив имеющих смысловую нагрузку слов, что содержатся в выборке обучаемой модели. Не каждое слово, встреченное в тексте, является значимым, поэтому массив необходимо обработать.
Предлоги, междометия и слова из чёрного списка («здравствуйте», «спасибо» и др.) следует исключить из словаря. Также необходимо удалить слова, содержащие цифры, а прочие слова – нормализовать. В этом нам помог Стеммер Портера – алгоритм, позволяющий отсечь окончания и суффиксы, основываясь на особенностях языка. Слова, встреченные менее чем в четырёх сообщениях, исключаем, а каждому оставшемуся слову ставим в соответствие номер входной переменной.
В результате получилось 1111 значимых слов. Однако нейронная сеть не умеет работать непосредственно со словами, поэтому текст сообщения необходимо превратить в массив числовых значений.
На входе текст сообщения разбиваем на слова, нормализуем и проверяем его наличие в словаре. Если слово присутствует, переменной с соответствующим номером присваиваем значение 1. На выходе получаем массив длиной 1111 элементов, состоящий из нулей и единиц:
(1, 0, 0, 1, … , 0, 1, 0)
Делать с нуля слишком долго, так что мы решили использовать библиотеку Encog 3.3 – бесплатный API-интерфейс нейронной сети с открытым исходным кодом для Java и .Net. Используем сеть прямого распространения, т.е. от входа к выходу. Не хочется грузить читателей математикой, поэтому лишь упомянем для тех, кому это важно, что в качестве функции активации была выбрала сигмоидальная функция.
Специалисты NAUKA исследовали 3 варианта нейросети – с двумя скрытыми слоями нейронов, с одним скрытым слоем и без скрытых слоёв.
Как было указано выше, в качестве тестовой выборки мы использовали 3416 сообщений, присланных в службу поддержки NAUKA за последние полгода. 75% этих данных мы направили на обучение нейросети, остальные 25% оставили для проверки.
Выполняем обучение с уровнем допустимой ошибки в 1%, используя алгоритм обучения Resilient Propagation (RProp). В отличие от других алгоритмов, также основанных на методе градиентного спуска, RProp использует знаки частных производных, а не их значения.
Проверка показала, что из поданных в обученную сеть сообщений верно классифицированы только 55%. Возможно ли улучшить этот показатель?
Переобучение – явление, когда построенная модель хорошо объясняет примеры из обучающей выборки, но относительно плохо работает на примерах, не участвовавших в обучении. При минимальной ошибке в процессе обучения сети она становится менее вариативной к данным, не участвующим в обучении.
Обучаем нейронную сеть до ошибки в 8% (в реальности оказалось максимум 7,2%). Проверка дала более удачный результат в 65% сообщений, классифицированных корректно. На этом этапе было замечено, что на одни и те же модули идут преимущественно сообщения одного содержания. Расширяем словарь, добавив сигнатуры модулей. Результат составил 68,6%.
Стоит отметить, что и многослойные, и однослойные нейросети дали одинаковый результат при проверке. Это говорит о линейной разделимости множества исходных данных. Значит, на практике допустимо использовать нейронную сеть без скрытых слоёв.
И всё же – можно ли улучшить прогноз? Можно, если учесть скрытые зависимости, которые не удалось отследить нашим программистам. А с этой задачей хорошо справится сама нейросеть, решающая задачу кластеризации. Для этого попробуем отойти от сетей прямого распространения. На сей раз используем нейронную сеть Кохонена – этот класс сетей, как правило, обучается без учителя и успешно применяется в задачах распознавания.
Выбрав алгоритм обучения Neighborhood Competitive Training, мы исследовали сети с числом кластеров, равным 10, 20, 40, 60, 80, 100. Остановились на 80 кластерах – проверка показала точность прогноза, равную 64,98%. Таким образом, кластеризация дала результаты, схожие с обучающей выборкой.
Текста сообщения недостаточно, чтобы уверенно прогнозировать его тип. Прогноз может быть неточным из-за того, что сообщения с идентичным текстом могут относиться к разным темам. Следовательно, проекту NaukaLabs есть куда развиваться – нас ждут задачи создания нейросети, классифицирующей на основе ошибки в логе, нейронной сети, анализирующей картинку, и сочетания этих технологий.
Перспективы применения таких программ весьма обширны – даже в рамках лишь одного из наших проектов. К примеру, нейросеть может рассматривать любые тексты от пользователей сайта на предмет запрещённых материалов – продажи сомнительных препаратов, нецензурной лексики, экстремизма и т.п. Она способна помочь службе поддержки в формировании возможных ответов на обращения. Технология упростит поиск людей по фото и анализ изображений для выявления порнографии. И это лишь малая толика возможностей нейронных сетей. Будем пробовать их на себе и обязательно поделимся новыми кейсами с вами!