Анатомия IT: нейронные сети и генетические алгоритмы
Меню

Анатомия IT: нейронные сети и генетические алгоритмы

Содержание статьи
  1. Что мы имеем в виду под нейронной сетью?
  2. Инструменты для построения нейросети
  3. Matlab-нейросеть-1С
  4. Нейросеть в 1С
  5. Что такое генетический алгоритм?

Руководитель управления информационных технологий Олег Филиппов в рамках INFOSTART EVENT 2017 COMMUNITY рассказал, какие задачи можно решить с помощью нейронных сетей и генетических алгоритмов в 1С, а также как собрать такую сеть или алгоритм в 1С – что написать в коде и как это потом применить.

Присоединяйтесь к нам на конференции этого года INFOSTART EVENT 2019

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

Что мы имеем в виду под нейронной сетью?

Нейронную сеть можно представить в виде структурной модели, характеризующейся наличием входов и выходов, при этом можно «обучить» – задать некое соответствие данных, которые поступают на вход, и данных, которые должны получиться на выходе, чтобы в дальнейшем получать последние уже автоматически. «Начинка» системы – нейроны, имеют связи разного веса, а при обучении происходит подстройка этих весов. От веса (большего или меньшего) связи нейронов в модели зависит их «поведение» – импульс, который его характеризует большей или меньшей «возбужденностью». При этом система не содержит в себе алгоритма, позволяя без анализа закономерностей «подстроиться» под статистические данные.

Если говорить образно, это позволяет не тратить время на решение задачи, а просто использовать статистические данные для получения результата: не требуется детально разбираться в вопросе, строить полноценную математическую модель – это шанс решить задачу, не разбираясь в том, как она решается.

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

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

Приведем пример «из жизни»

Есть некая розничной сети, руководство которой поставило задачу узнать, где, несмотря на большое количество посетителей, мало продаж. Для выполнения этой задачи нужен, как минимум, аналитик, чтобы описать программисту задачу и составить ТЗ, и сам программист. Но если использовать нейросеть, то получится, что никакой задачи нет, а есть данные, сопоставив которые, можно получить желаемый отчет (вход: количество посетителей в магазинах, выход: продажи по магазинам).

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

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

ВХОДЫ:

  • количество посетителей в магазинах;
  • наличие в магазинах акций;
  • дни недели;
  • месяцы.

Всего получается четыре колонки.

ВЫХОДЫ:

  • продажи по магазинам.

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

Инструменты для построения нейросети

  • 1С характеризуется медленной работой и длительным обучением – от нескольких часов до нескольких дней, что немного компенсирует простота разработки, но писать все равно придется вручную, при этом к написанию будет доступен только простейший перцептрон.
  • Matlab – самый популярный инструмент с готовыми средствами визуальной разработки и основной (не самой последней, но все-таки) функциональностью по созданию нейросети (20 видов нейронных сетей).
  • Языки высокого уровня – C++, R для математических вычислений и Python для сложной алгоритмики. Лидируют по функциональности, поскольку используют специализированные библиотеки, что не исключает необходимость писать руками. Обеспечивают самую быструю работу нейросети, но и Matlab, за счет использования компилируемой библиотеки, позволяет очень быстро получить результат.

Matlab-нейросеть-1С

Если описать процесс в двух словах, получится – Matlab генерирует библиотеку на .NET, которая далее используется в 1С. Опишем процесс поподробнее:

  • По кнопке Import Data производим импорт. Для него подходят файлы любого формата (текстовые, csv, xls). После того как файлы разобраны на колонки, выбираем нужные и жмем «Записать» – выбираем, что импортировать в воркспейс.
  • Далее в командной строке нужно написать «nftool», что запустит мастер создания, работа с которым не должна вызвать сложностей.

Шаг1-Шаг2
Шаг1-Шаг2
  • Выбираем из воркспейса, куда были импортированы данные: Входы/Data, на которых будет происходить обучение (в примере это количество посетителей, месяц, день и наличие акции), и итоговые величины, выходы/target, соответствующие продаже магазина.
  • Нажатие Train запускает обучение. Можно выбрать метод обучения, но лучше оставить подобранный автоматически. Процесс обучения займет 5-10 минут.

Шаг 3-4
Шаг 3-4
  • После этого появится окошко с кнопкой для генерации Matlab Function – функции на языке Matlab.
  • Далее в консоли пишем deploytool, чтобы сделать саму dll. Здесь выбираем функцию, которую нужно превратить в dll, называете ее, указываем, что это будет .NET Assembly (сборка .NET). Обратите внимание, что версии Matlab бывают x86 и x64. Если dll предназначена для использования на сервере, нужна x64, а если на клиенте, то – x86.

Финал процесса
Финал процесса

Нейросеть в 1С

Заметим, что Matlab плохо работает с COM-объектами, генерируя «кривую» COM-библиотеку, которая должна на входе получать дополнительные параметры, а с такой библиотекой 1С работать не умеет. Поэтому в 1С лучше использовать .NET сборки.

  • Создаем объект-обертку NetObjetToIDispatch45.
  • Загружаем сборку dll, сгенерированную в Matlab. При этом ее даже не надо регистрировать, что позволяет создавать любое количество нейросетей, а потом в коде просто менять одну строку и загружать благодаря этому любую из них (на иллюстрации представлен СКД-отчет, в котором, когда пользователь выбирал вариант отчета, подгружались разные варианты dll, а сам код отчета оставался неизменным).

Код
Код
  • Задаем тип нейросети (когда деплоили функцию, указывали класс и название самой библиотеки – их и нужно сюда вписать).
  • Создаем массив данных – объект нейросети. Обратите внимание, Matlab работает только со своими массивами – MWArray, для которых существуют отдельные сборки. Когда Matlab создает сборку dll для деплоя, рядом помещается библиотека MWArray.dll. Здась важно, что ее также необходимо загрузить, чтобы получить тип матлабовского массива.
  • Наш массив создается на основе обычного массива COMSaveArray, поскольку массив передается в COM-объект и 1С-массив тут не подходит (единички – это количество строк и колонок). Передаем массив внутрь нейросети и видим результат.

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

Что такое генетический алгоритм?

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

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

Чтобы выбрать лучшую особь в 1С, нужно использовать логику, заложенную в 1С, то есть использовать наш алгоритм непосредственно в 1С-решении. При этом код 1С будет у каждого особый, но логика действий одна и та же.

Генетический алгоритм
Генетический алгоритм
  • Создание начальной популяции: генерация порядка точек случайным образом – точка 1, 2, 3, 4, 5, 6 и т.д.
  • Скрещивание: меняется порядок точек 3, 2, 1, 6, 5, 4 и т.д. Или мутация – замена одного параметра на любой другой для появления абсолютно новых особей, а не выбора из существующих.

Скрещивание
Скрещивание

Наборы параметров перемешиваются, получая новые: вариант объезда a и b скрещивают – берут что-то из одного, а что-то из другого.

  • Селекция – выбор лучшей особи из двух имеющихся. Эту задачу алгоритм не решит: нужно самостоятельно просчитать целевые функции по набору параметров и сравнить их между собой. Этот этап занимает, как правило, до 99% времени выполнения алгоритма.
  • Формирование нового поколения из отобранных особей.
  • Осуществляется проверка – достигнута цель или нет.

В нашем примере не только поиск оптимального маршрута может считаться результатом. Например, результатом будет считаться наиболее подходящий с точки зрения системы вариант, выбранный ею за установленное нами время, поскольку весь поиск займет 4 часа, а нам нужно решение за 10 минут. В этом случае маршрут, который нам подберет система за 10 минут – это и есть результат. Или в качестве условия можно задать стоимость проезда меньше N рублей. И так далее… В любом случае, результирующая популяция, которую мы получим при достижении заданного условия, будет содержать в себе окончательную особь – результат поиска.

В заключении обратим внимание: генетический алгоритм не гарантирует, что он выберет лучшее решение. И если после 4 часов работы найдено какое-то решение, не факт, что оно – лучшее. Если говорить о примере – возможно, найдется и более скоростной маршрут объезда. Генетический алгоритм гарантирует только то, что это решение лучше, чем другие, при выборе данных в определенной последовательности.

  • Рассказать друзьям
    Предыдущая статья статья
    ClickHouse+1С=..?
    Следующая статья статья
    1С:Управление торговлей 8 версия 11.5: обзор возможностей
    Комментарии