Нейронные сети в среде разработки 1С 8.3. Часть 1. Линейный нейрон.

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


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

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

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

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

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

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

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

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

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

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

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

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

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

Цвет: -2

Вкус: +3

Размер: -3

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

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

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

&НаКлиенте Процедура Расчитать(Команда)     РасчетВыходаНейрона(); КонецПроцедуры

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

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

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

Размер: -3

Цвет: -2

Вкус: +3

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

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

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

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

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

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

3) А если на вход подаются противоположные весам сигналы, то нейрон показывает отвращение – сильный отрицательный сигнал.

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

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

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

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

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

&НаКлиенте Процедура РассчитатьВыход(Команда) 	Если Нейрон.Количество() = 0 Тогда  		Возврат; 	КонецЕсли; 	РасчетВыходаНейрона(); КонецПроцедуры

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

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

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


Источник: m.vk.com

Комментарии: