Многослойная нейронная сеть в среде 1С 8.3

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

Конфигурация «Однослойная линейная сеть. v. 1.0»

Конфигурация «Однослойная линейная сеть. v. 2.0»

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

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

У нас есть некая фирма 1С: Франчайзи, которая оказывает услуги по работе (программирование и/или консультирование) с различным программным обеспечением фирмы 1С («1С: Бухгалтерия», «1С: Управление торговлей», «1С: Зарплата и управление персоналом» и «1С: Комплексная конфигурация»).  Работы эти оказывают сотрудники фирмы, у которых могут быть различные сертификаты, которые показывают их компетентность.

Если у сотрудника имеется сертификат «Специалист по 1С: Бухгалтерия»  или  «Специалист по 1С: Управление торговлей» или  «Специалист по 1С: Зарплата и управление персоналом» — это значит, что сотрудник разбирается в соответствующей прикладной области (на среднем уровне) и может хорошо выполнить задачу по программированию соответствующего программного обеспечения.

Если у сотрудника имеется сертификат «Специалист по 1С: Бухгалтерия консультант»  или  «Специалист по 1С: Управление торговлей консультант» или  «Специалист по 1С: Зарплата и управление персоналом консультант» — это значит, значит, что сотрудник разбирается в соответствующей прикладной области (достаточно глубоко) и может хорошо проконсультировать пользователя  соответствующего программного обеспечения.

Если у сотрудника имеется сертификат «Специалист по 1С платформе», то это значит, что сотрудник очень хорошо разбирается в вопросах программирования, но достаточно посредственно (или даже плохо) знает прикладные программы.

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

Наша нейросеть будет состоять из трех слоев. Первый слой — входной, в этом слое будет шесть нейронов: четыре нейрона для каждого вида программного обеспечения (1С: Бухгалтерия», «1С: Управление торговлей», «1С: Зарплата и управление персоналом» и «1С: Комплексная конфигурация»), и два нейрона по виду работ (программирование и консультирование). Эти нейроны не будут ни чего вычислять, у них будет один вход и один выход.

Второй слой нейронов это компетенции специалистов или их сертификаты. Всего будет 7 нейронов: три сертификата по программированию прикладной области, три по консультированию прикладной области, и один по программированию в целом (специалист по 1С: Платформе). У каждого нейрона второго слоя будет 6 входов и один выход — это будут данные от первого входного слоя нейронов, т.е. сигнал каждого нейрона первого слоя пойдет на каждый нейрон второго слоя, таким образом, будет организована связь «все со всеми».  Сигналы входных нейронов будут умножены на веса соответствующих входов, полученные значения просуммируются, и мы получим выходной сигнал нейрона, который соответствует определенному сертификату.  Если будет сильный  положительный выходной сигнал, то это значит, что это сертификат очень подходит для выполнения работы с введенным на входе  программным обеспечением, а если будет сильный отрицательный выходной сигнал, то значит, что этот сертификат бесполезен для выполняемой задачи.

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

Наша сеть будет иметь следующую структуру.

Структура многослойной нейронной сети

Приступим к разработке 1С конфигурации, для реализации этой сети.  В нашей конфигурации будет точно такая же структура справочников, как и в конфигурациях предыдущих статей: «Виды входов сигналов» (иерархический), «Нейроны» (иерархический), «Нейронные сети», но мы добавим еще один справочник – «Уровни сети».

Справочники конфигурации многослойная нейронная сеть

У справочника «Уровни сети» будет три предопределенных элемента: «Уровень входа», «Уровень выхода» и «Первый».  Самый первый уровень нейронной сети это – «уровень входа», потом идет «Первый», а последний уровень это – уровень выхода.

 Предопределенные элементы справочника уровни сети]

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

Реквизит справочника Нейрон

И создадим непериодический регистр сведений «Структура нейронной сети», у которого будет следующая структура:

Измерения

  • Нейронная сеть
  • Уровень
  • Нейрон
  • Входы нейрона

Ресурсы

  • Веса входов нейрона

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

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

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

Сохраним конфигурацию, и введем элементы справочников «Нейронная сеть», «Нейроны» и «Виды входов» (для удобства я сделал два последних справочника иерархическими). У справочника «Нейронная сеть» будет один элемент – «Подбор сотрудников».

У справочника «Виды входов» будет следующий набор элементов.

Справочник виды входов нейрона

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

Теперь создадим нейроны, и укажем для каждого нейрона вид выхода.

Справочник нейроны

Теперь осталось задать связь нейронов, входов и весов для входов. Делать мы этой будем в регистре сведений «Структура нейронной сети», но перед этим я поясню принцип её заполнения.

На каждый нейрон входного уровня будет подаваться только один вход, который соответствует выходу.

На каждый нейрон первого уровня будут подаваться все выходы нейронов входного уровня, а на каждый нейрон выходного уровня будут подаваться все выходы нейронов первого уровня.

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

Для входного уровня получится следующая структура.

Структура нейронов входного уровня

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

Зададим структуру и веса для нейрона «Сертификат 1С: Бухгалтерия»

Структура нейрона Сертификат 1С: Бухгалтерия

Здесь вход по прикладному решению 1С: Бухгалтерия будет усиливаться (+3), по решениям 1С: УТ и 1С: ЗУП он будет инвертироваться, т.к. обладатель данного сертификата может не знать, как работают эти прикладные решения. Сигнал по входу «1С: Комплексная» будет усиливаться, но не так сильно как по 1С: Бухгалтерии, т.к. в этой конфигурации имеется подсистема, функционирование, которой похоже на 1С: Бухгалтерию, но также имеются и другие подсистемы, функционирование, которых похоже на 1С: УТ или 1С: ЗУП. Вход по программированию будет усиливаться (+3), вход по консультированию будет ослабевать (+0,5), предполагаем, что обладатель этим сертификатом,  хоть и знает прикладную область, но не сильно глубоко.

Теперь создадим структуру для нейрона «Сертификат 1С: Бухгалтерия консультант » (сертификаты для 1С: УТ и 1С: ЗУП будут заполнены аналогично).

Структура нейрона Сертификат 1С: Бухгалтерия консультант

В этом случае, мы также усиливаем вход по 1С: Бухгалтерии, инвертируем входы по 1С: УТ и 1С: ЗУП, но по Консультированию мы усиливаем вход существенно, а по программированию инвертируем, т.к. консультанты обычно не умеют программировать.

И покажем входы для нейрона «Сертификат 1С  Платформа»

Структура нейрона Сертификат 1С  Платформа

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

Теперь настроем веса для нейронов выходного уровня. У нас четыре нейрона выходного уровня: Иванов, Петров, Сидоров и Васильева.

Иванов несколько раз пытался сдать на экзамен по 1С: Бухгалтерии, но провалил, мы ему усилим сигнал по входу «Сертификат 1С: Бухгалтерия», но не сильно (+1,5), а остальные сильно инвертируем.  Но поскольку он программист, и что-то умеет программировать, то мы не будем инвертировать сигнал по входу «Сертификат 1С: Платформа», а просто его ослабим (+0.5).

Структура выходного нейрона

Петров сдал на сертификат по 1С: УТ. Вход по этому сертификату мы очень сильно усилим (+3), вход по сертификату по «1С: УТ Консультант» мы не будем инвертировать, но и усиливать также не будем. Мы его ослабим (+0,5).  Вход по сертификату «1С: Платформа» ослабим (+0.5), т.к. Петров программист, но не достаточно сильный, чтобы сдать на платформу. Остальные входы инвертируем.

Структура выходного нейрона

У Сидорова есть два сертификата по 1С: Бухгалтерия и 1С: ЗУП, поэтому усилим соответствующие входы, ослабим входы для соответствующих консультантов (+0.5), и сделаем положительно -нейтральный вход по платформе (+1). Поскольку это хороший программист, но еще не сдал на сертификат по платформе (иначе бы очень сильно усилили этот вход).

Структура выходного нейрона

А вот Васильева консультант по ЗУПу и 1С: Бухгалтерии, у нее будут следующие веса.

Структура выходного нейрона

Ещё раз обращаю внимание, что когда мы начнем обучать нашу нейронную сеть, то веса  всех слоев (кроме входного), могут измениться в какую-либо сторону.

Теперь создадим обработку, где будут выводиться результаты работы нейросети. Эту обработку я назову «Обработка подбора персонала» и на её форме размещу две таблицы значении: «Входные сигналы» и «Выходные сигналы»; реквизит формы «Нейросеть», а также команду «Подобрать».

Форма обработки подбора персонала

Для поля «Нейронная сеть» создадим обработчик для события при изменении. В этом обработчике будем заполнять таблицу значений «Входные сигналы»

&НаСервере
Процедура НейросетьПриИзмененииНаСервере()
   
//очищаем таблицы
   
ВходныеСигналы.Очистить();
   
ВыходныеСигналы.Очистить();
   
//получем входы уровня входов
   
Запрос = Новый Запрос;
   
Запрос.Текст = «ВЫБРАТЬ
                   |    СтруктураНейроннойСети.ВходыНейрона КАК ВидВхода,
                   |    0 КАК Сигнал
                   |ИЗ
                   |    РегистрСведений.СтруктураНейроннойСети КАК СтруктураНейроннойСети
                   |ГДЕ
                   |    СтруктураНейроннойСети.НейроннаяСеть = &НейроннаяСеть
                   |    И СтруктураНейроннойСети.Уровень = ЗНАЧЕНИЕ(Справочник.УровниСети.УровеньВхода)»
;
   
Запрос.УстановитьПараметр(«НейроннаяСеть»,Нейросеть);
   
Выборка = Запрос.Выполнить().Выбрать();
    Пока
Выборка.Следующий() Цикл
       
НовСтр = ВходныеСигналы.Добавить();
       
ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
    КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура НейросетьПриИзменении(Элемент)
   
НейросетьПриИзмененииНаСервере();
КонецПроцедуры

В обработчике команды «Подобрать» выполним запрос, в котором рассчитаем нашу нейросеть. Для линейной сети весь расчет можно сделать в одном запросе, а для нелинейной сети, это не получится – не каждую функцию активации можно реализовать в запросе.

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

&НаСервере
Процедура ПодобратьНаСервере()
   
//очистим тз выходных сигналов
   
ВыходныеСигналы.Очистить();
   
//получим тз выходных сигналов
   
ТЗВходов = ВходныеСигналы.Выгрузить();
   
//запрос
   
Запрос = Новый Запрос;
   
Запрос.Текст = «ВЫБРАТЬ
                   |    ТЗВходныхСигналов.ВидВхода КАК ВидВхода,
                   |    ТЗВходныхСигналов.Сигнал КАК Сигнал
                   |ПОМЕСТИТЬ ВходныеСигналы
                   |ИЗ
                   |    &ТЗВходныхСигналов КАК ТЗВходныхСигналов
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    ВидВхода
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    СтруктураНейроннойСети.Нейрон.ВыходНейрона КАК ВыходНейрона,
                   |    СтруктураНейроннойСети.ВесаВходовНейрона * ВходныеСигналы.Сигнал КАК СигналНейрона
                   |ПОМЕСТИТЬ ВходнойУровень
                   |ИЗ
                   |    РегистрСведений.СтруктураНейроннойСети КАК СтруктураНейроннойСети
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВходныеСигналы КАК ВходныеСигналы
                   |        ПО СтруктураНейроннойСети.ВходыНейрона = ВходныеСигналы.ВидВхода
                   |ГДЕ
                   |    СтруктураНейроннойСети.НейроннаяСеть = &НейроннаяСеть
                   |    И СтруктураНейроннойСети.Уровень = ЗНАЧЕНИЕ(Справочник.УровниСети.УровеньВхода)
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    ВыходНейрона
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    СУММА(СтруктураНейроннойСети.ВесаВходовНейрона * ВходнойУровень.СигналНейрона) КАК СигналНейрона,
                   |    СтруктураНейроннойСети.Нейрон.ВыходНейрона КАК ВыходНейрона
                   |ПОМЕСТИТЬ ПервыйУровень
                   |ИЗ
                   |    РегистрСведений.СтруктураНейроннойСети КАК СтруктураНейроннойСети
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВходнойУровень КАК ВходнойУровень
                   |        ПО СтруктураНейроннойСети.ВходыНейрона = ВходнойУровень.ВыходНейрона
                   |ГДЕ
                   |    СтруктураНейроннойСети.НейроннаяСеть = &НейроннаяСеть
                   |    И СтруктураНейроннойСети.Уровень = ЗНАЧЕНИЕ(Справочник.УровниСети.Первый)
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    СтруктураНейроннойСети.Нейрон.ВыходНейрона
                   |
                   |ИНДЕКСИРОВАТЬ ПО
                   |    ВыходНейрона
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    СтруктураНейроннойСети.Нейрон.ВыходНейрона КАК ВыходНейрона,
                   |    СУММА(СтруктураНейроннойСети.ВесаВходовНейрона * ПервыйУровень.СигналНейрона) КАК Сигнал
                   |ИЗ
                   |    ПервыйУровень КАК ПервыйУровень
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СтруктураНейроннойСети КАК СтруктураНейроннойСети
                   |        ПО ПервыйУровень.ВыходНейрона = СтруктураНейроннойСети.ВходыНейрона
                   |ГДЕ
                   |    СтруктураНейроннойСети.НейроннаяСеть = &НейроннаяСеть
                   |    И СтруктураНейроннойСети.Уровень = ЗНАЧЕНИЕ(Справочник.УровниСети.УровеньВыхода)
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    СтруктураНейроннойСети.Нейрон.ВыходНейрона»
;
   
Запрос.УстановитьПараметр(«ТЗВходныхСигналов»,ТЗВходов);
   
Запрос.УстановитьПараметр(«НейроннаяСеть»,Нейросеть);
   
Выборка = Запрос.Выполнить().Выбрать();
    Пока
Выборка.Следующий() Цикл
       
НовСтр = ВыходныеСигналы.Добавить();
       
ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
    КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура Подобрать(Команда)
   
ПодобратьНаСервере();
КонецПроцедуры

Теперь проверим, как считает наша нейронная сеть.

Я не буду делать юзабилити этой конфигурации, т.к. это не входит тему этой статьи, поэтому если клиенту нужно что-то сделать с конфигурацией, оператор ставит +3, если ни чего не надо (для всех остальных), ставит -3, если нужна консультация, то на входе «Консультация»: +3, если нет, то на входе: -3. Для программирования аналогично.

Пусть нашему клиенту нужна консультация по 1С: Бухгалтерии. Тогда будет следующий набор сигналов.

Входные сигналы нейронной сети

Посмотрим, кого предложит нам нейросеть.

Результат работы нейронной сети

Нейросеть нам предложила Васильеву.

А теперь посмотрим, если с консультированием нужны еще и работы по программированию.

Результат работы нейронной сети

В этот раз сильные сигналы у Сидорова и Иванова.

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

Ждешь новых статей по нейронным сетям в среде разработке 1С? Поддержи проект!

Если же хотите более глубже и основательно изучить программирование в 1С, то я рекомендую Вам свои книги:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

Книга «Основы разработки в 1С: Такси»

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

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

18 − 12 =