Нейронные сети в среде 1С 8.3. Линейный нейрон.

В последнее время мне стала интересна тема искусственного интеллекта в общности и нейронных сетей, как инструмента для искусственного интеллекта в частности.
Мое знакомство с нейронными сетями началось с книги «Элементарное введение в технологию нейронных сетей с примерами программ», которая была написана польскими авторами Рышард Тадаусевич, Барбара Боровик, Томаш Гончаж и Бартош Леппер. Эта книга очень понятно и доступно дает основную теорию нейронных сетей, материал этой книги доступен очень широкому кругу читателей. Поэтому тем, кто хочет глубоко и основательно изучить теорию нейронных сетей, но не знает с какого края к ним поступить, рекомендую эту книгу. В сети Интернет она ищется без проблем. Но основной для меня «изъян» этой книги был в том, что все программы с примерами были написаны на языке С++, которым я, к своему стыду, не очень хорошо владею. Поэтому какие-то интересные программы я стал реализовывать в среде разработке 1С, поскольку основная моя профессия программист (разработчик) 1С. Но кроме программирования в 1С, я увлекаюсь преподаванием, поэтому я решил написать цикл статей, по разработке нейронных сетей в 1С 8.3, где я часть примеров из книги реализую в среде 1С 8.3., немного разбавляя все это теорией, чтобы было понятно, что к чему.

Нейрон как элемент нейронной сети

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

Нейрон: входящие числовые сигналы

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

Линейный нейрон

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

Нейрон с функцией активации

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

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

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

Практический пример нейрона в 1С 8.3

Рассмотрим реализацию линейного нейрона в среде разработки 1С. Создадим следующий  нейрон: этот нейрон будет определять свое предпочтения к яблокам. Для этого у него будет три входа: Размер, Цвет, Вкус. На эти входы должны подаваться числовые значения, относительно какой-то средней величины. Например, 0 – это какой-то средний размер яблока, соответственно +5, это яблоки большие относительно среднего размера, а -5 – маленькие яблоки относительно среднего размера.  Также и с остальными параметрами. Цвет – 0 это какой-то, к примеру зеленый цвет, а +5 это ярко красные яблоки, а -5 тусклые белые яблоки.  Вкус, 0 – безвкусные яблоки, -5 – кислые, а +5 – сладкие.

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

  • Цвет: -2
  • Вкус: +3
  • Размер: -3

Когда мы нашему нейрону будем показывать различные яблоки (при помощи входных сигналов), то на выходе мы будем иметь или сильный положительный сигнал. Это значит, нашему нейрону нравятся эти яблоки. Или сильный отрицательный сигнал, это значит, что нашему нейрону не нравятся эти яблоки. Или нейтральный сигнал (близкий к 0), значит он к ним равнодушен.  Сделаем такой нейрон.

Для этого на управляемой форме я создам шесть реквизитов – три реквизита веса входов, а три реквизита входы нейрона, и размещу их в качестве элементов этой формы. Также создам реквизит ВыходНейрона и команду «Расчет».

Входы и веса нейрона на управляемой форме 1С

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

&НаКлиенте
Процедура Расчитать(Команда)
   
РасчетВыходаНейрона();
КонецПроцедуры
&НаКлиенте
Процедура  РасчетВыходаНейрона()
   
ВыходНейрона = ЦветВес * Цвет + РазмерВес * Размер + ВкусВес * Вкус;
КонецПроцедуры

И всё, наш линейный нейрон создан.

Проверим его работу. Зададим, как было сказано выше следующие веса:

  • Размер: -3
  • Цвет: -2
  • Вкус: +3

Значит, нашему нейрону нравятся блекло-зеленые небольшие немного сладкие яблоки. Если мы нашему нейрону покажем очень маленькие (Размер -5), очень зеленые (Цвет -5) и очень сладкие яблоки (вкус +5), то на выходе получим очень сильный положительный выходной сигнал. Это значит, что нашему нейрону такие яблочки весьма по душе.

Веса нейрона, входные сигналы и сильный положительный выходной сигнал

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

 Веса нейрона, входные сигналы и сильный отрицательный выходной сигнал

Если же мы нейрону покажем яблоко чуть меньше среднего (-0.5), немного желтоватое (+1) и чуть-чуть сладковатое (0,5), то обнаружим весьма слабый положительный сигнал, это значит, что нашему нейрону эти яблоки не особо и нравятся, но и не испытывает к ним сильную неприязнь. Чуть выше нейтрального.

 Веса нейрона, входные сигналы и слабый положительный выходной сигнал

Таким образом, можно сформулировать следующие правила:

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

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

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

Таблица значений на управляемой форме 1С

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

&НаКлиенте
Процедура КоличествоВходовПриИзменении(Элемент)
    Если
КоличествоВходов = 0 Тогда
        Возврат;
    КонецЕсли;
   
Нейрон.Очистить();
    Для
н = 1 по КоличествоВходов Цикл
       
НовСтр = Нейрон.Добавить();
    КонецЦикла;
КонецПроцедуры

Нам осталось отработать обработку команду РассчитатьВыход.

&НаКлиенте
Процедура РассчитатьВыход(Команда)
    Если
Нейрон.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
   
РасчетВыходаНейрона();
КонецПроцедуры
&НаКлиенте
Процедура РасчетВыходаНейрона()
   
ВыходнойСигнал = 0;
    Для
н = 0 по Нейрон.Количество() — 1 Цикл
       
Вес = Нейрон[н].Вес;
       
Сигнал = Нейрон[н].Сигнал;
       
ВыходнойСигнал = ВыходнойСигнал + Вес*Сигнал;
    КонецЦикла;
КонецПроцедуры

Теперь Вы сможете проверить работу линейного нейрона с многими входами.Линейный нейрон с многим входами

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

Однослойные линейные нейронные сети

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

Хотите поддержать мой проект? На этой странице Вы узнаете, как это можно осуществить!

Если же хотите более глубже и основательно изучить программирование в 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

3 Replies to “Нейронные сети в среде 1С 8.3. Линейный нейрон.”

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

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

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