Я продолжаю рассказывать о нейронных сетях, применительно к среде разработке 1С 8.3. В предыдущей статье мы узнали, что такое нейрон и какие виды нейронов бывают (линейные и нелинейные), а также сделали простой линейный нейрон и поэкспериментировали с ним. Кто пропустил эту статью, рекомендую сначала ознакомиться с ней, а потом переходить к этой статье.
Линейный нейрон в среде 1С 8.3
В этой статье я расскажу Вам о нейронных сетях, а также мы сделаем простую нейронную сеть в среде разработки 1С 8.3.
Что такое нейронная сеть?
Прежде чем переходить к конструированию сети, разберемся кратко с теорией. Тем, кто хочет более основательно узнать о работе нейронных сетей, рекомендую книгу «Элементарное введение в технологию нейронных сетей с примерами программ», которая была написана польскими авторами Рышард Тадаусевич, Барбара Боровик, Томаш Гончаж и Бартош Леппер. Эта книга очень понятно и доступно дает основную теорию нейронных сетей, материал этой книги доступен очень широкому кругу читателей.
Искусственная нейронная сеть это структура, состоящая из нейронов, которые взаимодействуют между собой. На вход нейронной сети подается какая-то информация, данная информация обрабатывается нейронами этой сети, а на выходе мы имеем какие-то итоговые данные. Таким образом, основной признак нейронной сети это нейроны, из которых она состоит и, которые обмениваются между собой информацией. Мы уже знаем, что нейрон это объект (еще их называют процессорами), который имеет несколько входов и один выход. Каждый из входов нейрона имеет собственный вес, который может настраиваться. Настройка весов всех нейронов сети называется обучением. Обучение это тоже основная характеристика нейронной сети. Усложним наше определение: искусственная нейронная сеть это структура способная к обучению, состоящая из нейронов, которые взаимодействуют между собой.
И так, мы рассмотрели самое общее понятие искусственной нейронной сети (да-да, есть еще и биологические нейронные сети, которые у нас в голове), но пока у Вас еще, скорее всего, некоторый хаос в голове, поэтому чтобы его упорядочить, разберем небольшой умозрительный пример, на котором более основательно и познакомимся с нейронными сетями.
К примеру, у нас есть задача по виду животного определить, на каком континенте он обитает. В нашу нейронную сеть на вход подаются различные характеристики животного (вес, рост, цвет, количество ног и т.д), а на выходе мы должны иметь информацию, на каком континенте обитает это существо. Мы уже знаем, что нейрон принимает и возвращает числовые сигналы, т.е. наша нейронная сеть не может вернуть сигнал «Африка» или «Австралия», она может вернуть только какой-то определенный числовой сигнал. Поэтому, когда нейронная сеть должна вернуть какое-то перечисление («Африка», «Австралия», «Азия» и тд.), то делают просто для каждого значения перечисления свой выход, на который возвращается какой-то числовой сигнал (Отдельный выход «Африка», отдельный – «Азия» и т.д.). Пример такой сети приведен на рисунке ниже
В этой нейросети на входе мы имеем сигналы, которые характеризуют ту или иную характеристику этого животного, эти сигналы передаются на входные нейроны, входные нейроны, как правило, ни как сигналы не обрабатывают, а передают их на внутренний уровень нейронов. Причем каждый входной нейрон передает сигнал на каждый нейрон внутреннего слоя, такая связь называется «каждый с каждым». Внутренний слой нейронов передает сигналы на выходной слой, который формирует отклик сети, т.е. то, как наша сеть отреагировала на входящую информацию.
В приведенной выше сети всего три слоя: слой входных нейронов, внутренний слой нейронов и выходной слой нейронов. В реальных рабочих нейросетях слоев может быть больше, и их структура связей может быть более разнообразной.
В этой статье мы научимся работать с самым примитивным вариантом нейронной сети – однослойной линейной нейронной сетью. Эта сеть имеет следующую структуру.
В этой сети нейроны не соединены между собой, и у них есть только вход и выход. Как работает эта сеть? У каждого нейрона есть свой уникальный набор весов, поэтому, когда мы подаем на входы нейронов какой-то набор сигналов, то каждый нейрон вырабатывает независимо от других свой собственный выходной сигнал. Этот выходной сигнал может быть или сильным или слабым. Он может оказаться очень большим для одного нейрона и меньшим, или даже негативным, для других нейронов. Если мы сравним выходной сигнал нейрона «победителя» с другими нейронами, то сможем выяснить, насколько сеть «уверена» в своем решении: если сигнал «победитель» очень сильно отличается от других сигналов, то значит он единственно верный. Если же все (или некоторые) выходные сигналы примерно похожи, то значит сеть «сомневается» в текущем решении.
Однослойная линейная сеть в среде 1С 8.3
Реализуем эту простейшую нейронную сеть в среде 1С 8.3. Для этого решим следующую задачу: по определенным входящим сигналам (количество ног, живет в воде, может летать, покрыто перьями, откладывает яйца) будем определять, к какому из классов (Звери, Птицы, Рыбы) относится животное. У нашей нейросети будет всего три нейрона, по нейрону на каждый класс. На каждый нейрон будет подаваться значения всех пяти вышеперечисленных входящих данных, и возвращаться один выходной сигнал. В этой задачи я сразу настрою у нейронов следующие веса:
Звери:
Количество ног: 4
Живет в воде: 0.05 (некоторые живут в воде, например моржи)
Может летать: 0.01 (некоторые могут летать, например летучие мыши)
Покрыто перьями: — 1 (у зверей нет перьев)
Откладывает яйца: — 2 (звери живородящие)
Птицы
Количество ног: 2
Живет в воде: -1 (птицы в воде не живут)
Может летать: 2 (как правило, птицы умеют летать)
Покрыто перьями: 2.5 (птицы однозначно покрыты перьями, отличительная особенность)
Откладывает яйца: 2 (птицы однозначно откладывают яйца, их отличительная особенность)
Рыбы
Количество ног: -1 (у рыб нет ног)
Живет в воде: 3.5 (отличительная особенность рыб в том, что они живут в воде)
Может летать: 0.05 (как правило, рыбы не умеют летать, но есть некоторые виды на это способные)
Покрыто перьями: -3 (у рыб чешуя)
Откладывает яйца: 1.5 (икра это те же яйца)
Ниже я объясню, по какому принципу нужно работать с нашей нейросетью и Вы поймете, почему были выбраны такие параметры.
Однослойную линейную нейросеть на управляемой форме я реализую по следующему принципу: в таблице значений на форме в строках будут идти виды параметров входов в нейроны, каждая строка это отдельный параметр (количество ног, живет в воде и т.д.), у таблицы будут три колонки по количеству нейронов, в которых будут храниться веса нужных параметров (все веса и параметры заполнятся на этапе создания таблицы). Значения в этих колонках нельзя будет менять. И также будет еще одна колонка – «Входные данные», в которую пользователь будет вносить значения входных сигналов для каждого параметра. После ввода входных сигналов, нейронная сеть рассчитает выход для каждого нейрона и выведет в подвал таблицы.
Создадим однослойную линейную нейросеть на управляемой форме 1С внешней обработки 1С. Для этого на форму в качестве реквизита поместим таблицу значений, где будет одна колонка с видом сигнала (для удобства это будет тип строка), три колонки, в которых зададим веса нейронов, и одна колонка для входных данных. А также создадим команду «Рассчитать выход»
Создадим обработчик события формы «При создании на сервер», в котором заполним веса нейронов.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//веса для параметра «Количество ног»
НовСтрСети = НейроннаяСеть.Добавить();
НовСтрСети.ВидСигнала = «Количество ног»;
НовСтрСети.ВесЗвери = 4;
НовСтрСети.ВесПтицы = 2;
НовСтрСети.ВесРыбы = —1;
//веса для параметра «Живет в воде»
НовСтрСети = НейроннаяСеть.Добавить();
НовСтрСети.ВидСигнала = «Живет в воде»;
НовСтрСети.ВесЗвери = 0.01;
НовСтрСети.ВесПтицы = —1;
НовСтрСети.ВесРыбы = 3.5;
//веса для параметра «Может летать»
НовСтрСети = НейроннаяСеть.Добавить();
НовСтрСети.ВидСигнала = «Может летать»;
НовСтрСети.ВесЗвери = 0.01;
НовСтрСети.ВесПтицы = 2;
НовСтрСети.ВесРыбы = 0.05;
//веса для параметра «Количество ног»
НовСтрСети = НейроннаяСеть.Добавить();
НовСтрСети.ВидСигнала = «Покрыто перьями»;
НовСтрСети.ВесЗвери = —1;
НовСтрСети.ВесПтицы = 2.5;
НовСтрСети.ВесРыбы = —3;
//веса для параметра «Количество ног»
НовСтрСети = НейроннаяСеть.Добавить();
НовСтрСети.ВидСигнала = «Откладывает яйца»;
НовСтрСети.ВесЗвери = —2;
НовСтрСети.ВесПтицы = 2;
НовСтрСети.ВесРыбы = 1.5;
КонецПроцедуры
Теперь создадим обработчик выполнения команды «Рассчитать выход», где посчитаем выход для каждого нейрона и выведем значения выходов в подвал.
&НаКлиенте
Процедура РассчитатьВыход(Команда)
ВыходЗвери = 0;
ВыходПтицы = 0;
ВыходРыбы = 0;
Для н = 0 по НейроннаяСеть.Количество() — 1 Цикл
ВыходЗвери = ВыходЗвери + НейроннаяСеть[н].ВесЗвери * НейроннаяСеть[н].ВходныеДанные;
ВыходПтицы = ВыходПтицы + НейроннаяСеть[н].ВесПтицы * НейроннаяСеть[н].ВходныеДанные;
ВыходРыбы = ВыходРыбы + НейроннаяСеть[н].ВесРыбы * НейроннаяСеть[н].ВходныеДанные;
КонецЦикла;
//выводим в подвал таблицы значений
Элементы.НейроннаяСетьВидСигнала.ТекстПодвала = «Выходной сигнал»;
Элементы.НейроннаяСетьЗвери.ТекстПодвала = ВыходЗвери;
Элементы.НейроннаяСетьПтицы.ТекстПодвала = ВыходПтицы;
Элементы.НейроннаяСетьРыбы.ТекстПодвала = ВыходРыбы;
КонецПроцедуры
Все, наша сеть создана. Сохраним обработку и запустим её в «1С: Предприятии».
По какому принципу мы будем работать с этой нейросетью? Во-первых, логические типы (Истина-Ложь) в нейросетях задаются ни как в информатике (1 или 0), а задаются как 1 и -1. Поскольку 0 в нейросетях это отсутствие сигнала, а нам нужен именно обратный (инвертированный) сигнал. Во-вторых, если мы хотим усилить сигнал, то нужно задать заведомо более значение: однозначно карп живет в воде, т.е. нужно значении входного сигнала +4, а вот рыба летяга в воде живет не всегда, поэтом ей можно дать не очень уверенный сигнал +1. Или, к примеру, кошка однозначно сухопутное животное, поэтому сигнал «Живет в воде» у нее будет -4, а вот бобр какую-то часть своей жизни проводит под водой, поэтому я бы сигналу «Живет в воде» для бобра присвоил значение +0.5.
Испробуем нашу сеть. Введем данные о кошке:
Как видите, очень сильный выходной сигнал дал нейрон «Звери», значит, сеть однозначно определила нашу кошку, как зверя.
А теперь данные о попугае.
И данные о карпе.
Поэкспериментируйте сами с этой сетью, попробуйте ввести данные о дельфине, и посмотрите, что получится.
В следующей статье научимся реализовывать подобные линейные однослойные сети в конфигураторе 1С.
Конфигурация 1С 8.3 «Однослойная линейная нейронная сеть»
Многослойная нейронная сеть в среде 1С 8.3
Ждешь следующих статей? Поддержи проект!
Если же хотите более глубже и основательно изучить программирование в 1С, то я рекомендую Вам свои книги:
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
Откуда берется НейроннаяСеть.Количество() -ошибку выдает
Это притягивание ответа за уши.
Зверь это не тот, у кого 4 ноги. Зверь — это живородящие млекопитающее, и если определить вес «кормление молоком рожденных детенышей», то кошка со 100% определится как зверь, также как и кит, хотя у последнего нет ни ног, ни перьев, ни прочего.
Т.е. ответ заранее определяется теми весами и параметрами, которые программист заложит в эту модель. Здесь нет самообучения и коррекции базы знаний в зависимости от совокупности ошибок при получении ответов.
По логике вашей обработки, чем больше ног у существа, тем больше она зверь )