`set_list_marker(—,;,.)`
`set_list_digit({counter}. ,.,;)`
`work_interval(12.02.2025, 30.05.2025)`
# **Аннотация
**ФИО автора**: Геворкян Артём Арзикович.
**Название работы**: Модульная нейронная сеть с плавающим влиянием на вывод.
Направление: 09.03.04 Программная инженерия.
Номинация: программный документ.
Год выполнения работы: 2025 г.
Объём работы: 88 страниц.
Количество приложений (страниц): 6 (страниц — 48).
Количество иллюстраций: `count_images`.
Количество таблиц: `count_tables`.
Количество использованных источников: `count_sources`.
Характеристика работы: данная работа имеет практическое решение в виде программного обеспечения по декомпозиции больших нейронных
сетей на меньшие по размеру модули.
Актуальность работы: повышение эффективности обучения и поддержания сложных нейронных сетей.
Цель разработки (научной работы): проектирование и разработка модульной архитектуры для восприятия сложной динамической
системы.
Основные результаты: упрощён процесс создания нейронных сетей под сложные среды.
Практическая ценность: новый подход к решению проблем взаимодействия со сложной системой при большом количестве компонентов среды.
Ключевые слова: модульность, сложные динамические системы, обучение с подкреплением, модульная нейронная сеть, Pytorch, Python.
# **Содержание
`table_of_contents`
# **Список используемых сокращений
- **МНС** — модульная нейронная сеть;
- **МОВ** — модуль оценки важности;
- **CUDA** (Compute Unified Device Architecture) — это архитектура, которая позволяет использовать графический процессор (GPU) для повышения производительности параллельных вычислений.
# **Введение
В настоящей работе решается задача оптимизации нейронных сетей путём распределения вычислений на отдельных менее затратных целостных моделях.
Решение, выдвинутое в данной работе, предусматривает возможность отключения отдельных модулей с целью уменьшения нагрузки на вычислительные мощности, а также уменьшение влияние отдельных модулей на конечный результат, что позволяет использовать нужные нейронные сети в зависимости от контекста сложной системы.
Во введении обоснована актуальность выбранной темы, определены объект и предмет исследования.
Современные большие нейронные сети используют огромное количество вычислительной мощи лишь для одного запроса, а обучаются ещё дольше. По информации на сайте Reddit, предположительное время обучения чат-бота ChatGPT-4 составляет от 3 до 4 месяцев, и с каждой модель от OpenAI это время увеличивается. Появление мощных моделей связано с улучшением архитектуры и увеличением количества весов, поэтому оптимизация уже существующих решений и нахождение путей для оптимизации ускоряет обучение нейронных сетей.
В настоящее время существуют большие нейронные сети общего назначения, вроде *ChatGPT*, *Llama*, *Mixtral*, *Claude*. Однако универсальность нейронным сетям не всегда нужна, порой обучение таких нейронных сетей может вызвать лишь создание ненужных весов, которые не имеют важного влияния на конечный результат в нейронной сети в целом, поэтому в настоящей работе предлагается разбивать одну большую нейронную сеть на некоторое количество модулей. Для связывания модулей между собой предлагается создать нейронную сеть оценки важности модулей на основе контекста окружения агента.
`store_var(цель): разработка модульной архитектуры для восприятия сложной динамической системы`
Целью данной выпускной квалификационной работы является `var(цель)`.
Объектом исследования выпускной квалификационной работы являются модульность нейронной сети.
Предметами исследования – неглубокие нейронные сети, методы анализа и обработки значений на выходе нейронных сетей, обучение с подкреплением, градиентный спуск, сложные динамические системы.
Настоящая ВКР решает следующие современные проблемы:
- невозможность обучения нейронных сетей частично, без подключения всей нейронной сети (не включая дообучение: оно требует загрузки всей нейронной сети);
- трудности обучения больших моделей;
- трудности адаптации нейронных сетей под сложные системы.
Особенно это важно во времена написания настоящей ВКР: тенденция увеличения весов моделей для улучшения показателей нейронной сети всё ещё актуальна в настоящий момент, поэтому появление способа декомпозиции больших моделей создаст новый подход к создания нейронных сетей.
В исследовательском разделе `store_var_return(исследовательский_раздел): анализируется предметная область, существующие решения, устанавливаются цели, задачи и техническое задание.`
В аналитическом разделе `store_var_return(аналитический_раздел): описываются свойства сложной динамической системы, анализируется потоки данных и требования к отдельным модулям.`
В технологическом разделе `store_var_return(технологический_раздел): описывается реализация модулей, МОВ, связи модулей и МОВ и проводится тестирование решения.`
В экономическом разделе `store_var_return(экономический_раздел): описывается организация и планирование работ, расчёт затрат на проведение работа.`
В Приложении Е представлен графический материал (презентация) выпускной квалификационной работы.
В процессе написания выпускной квалификационной работы руководствовался следующими нормативными актами:
1. «О защите населения и территории от чрезвычайных ситуаций природного и техногенного характера» от 21.12.1994 № 68-ФЗ.
2. «Об основах охраны здоровья граждан в Российской Федерации» от 21.11.2011 № 323-ФЗ.
3. «О гражданской обороне» от 12.02.1998 № 28-ФЗ.
4. Приказ Минздравсоцразвития РФ от 04.05.2012 № 477н «Об утверждении перечня состояний, при которых оказывается первая помощь, и перечня мероприятий по оказанию первой помощи».
5. Трудовой кодекс Российской Федерации от 30.12.2001 № 197-ФЗ (ред. 07.04.2025).
6. СанПин — 2.2.2/542-96 «Гигиенические требования к видеодисплейным терминалам, персональным электронно-вычислительным машинам и организации работы».
# **Литературный обзор
В процессе изучения предметной области способствовали следующие литературные издания:
1. **Машинная теория разума** [[Машинная теория разума]](https://arxiv.org/abs/1802.07740). Здесь рассматривается обучение машин теории разума через нейросеть, использующую мета-обучение для предсказания психических состояний агентов. Эксперименты подтверждают эффективность подхода для многопользовательских ИИ систем.
2. **MIND-Stack для навигации** [[MIND-Stack]](https://arxiv.org/abs/2505.21734). Предложен модульный стек MIND-Stack, сочетающий сеть локализации и контроллер Стэнли для навигации автомобилей. Обеспечивает интерпретируемость и дифференцируемость, снижая ошибки управления. Планируется расширение функционала для реальных автономных систем.
3. **Универсальный алгоритм модульного сложения** [[Universal Abstract Algorithm for Modular Addition]](https://arxiv.org/abs/2505.18266). Гипотеза: нейросети (перцептроны, трансформеры) используют общий алгоритм — приближенную теорему об остатках. Эксперименты показывают, что для решения достаточно O(log n) признаков. Открывает путь к изучению группового умножения.
4. **Модульная нейросеть с переключением** [[Switch-Based Multi-Part Neural Network]](https://arxiv.org/abs/2504.18241). Децентрализованный фреймворк с динамической активацией нейронов для специализации на данных. Поддерживает федеративное обучение, что полезно для распределённых и периферийных вычислений.
# Исследовательский раздел
В данном разделе `var(исследовательский_раздел)`
## Анализ предметной области
Неглубокие нейронные сети обладают малым количеством слоёв, обеспечивая высокую производительность. Они склонны к быстрому обучению, и высокую интерпретируемость по сравнению с глубокими архитектурами. Их результаты просто оценить, что повышает точность обучения. Так как настоящая работа предполагает создание простых модулей, неглубокие нейронные сети представляются лучшим выбором.
Обучение с подкреплением, как парадигма, где агент учится через взаимодействие со средой, активно использует нейронные сети для представления стратегий. Ключевой проблемой является нестабильность градиентов и переоценка Q-значений, что решается модификацией алгоритмов, например, ограничением на обновления политик. Динамические системы, являющиеся типичной областью применения обучения с подкреплением, добавляют дополнительные сложности из-за нелинейности и хаотичности поведения. Здесь неглубокие нейронные системы могут служить инструментом предсказания состояний системы или синтеза управляющих воздействий, но их эффективность зависит от способности адаптироваться к изменяющимся условиям. В настоящем решение данная проблема решается абстрагированием, вычленением компонентов системы и обучения модулей. Хотя данное решение неполное, так как полностью вычленить компонент из системы не представляется возможным, модули всё равно имеют возможность обучаться в данном контексте.
Градиентный спуск и его адаптивные варианты (Adam, RMSprop) остаются основой оптимизации параметров неглубоких нейронных сетей, но в условиях высокой дисперсии данных, характерных для обучения с подкреплением, требуют точной настройки. В динамических системах, где требуется быстрое реагирование, компромисс между скоростью и точностью становится особенно важным, что актуализирует исследование настоящей ВКР.
Таким образом, исследование лежит на пересечении машинного обучения, теории оптимизации и анализа динамических систем, предлагая подходы к повышению надежности решений на основе неглубоких сетей в условиях неопределенности при использовании обучения с подкреплением.
Сайт [[TIOBE]](https://www.tiobe.com/tiobe-index/) предоставляет список самых популярных языков программирования на основе количества запросов в поисковых системах [[TIOBE_Definition]](https://www.tiobe.com/tiobe-index/programminglanguages_definition/). Самым популярным языком программирования на май 2025 года является Python с отрывом в ~15% [[TIOBE]](https://www.tiobe.com/tiobe-index/). Далее идут языки в следующем порядке: C++, C, Java, C# и другие. Подробный график популярности языков со временем представлен на рисунке `mention(only_number): Популярность языков программирования во времени`.

Лучшими языками для программирования являются Python, Java, C++, C# [[]](https://tproger.ru/articles/5-luchwih-yazykov-programmirovaniya-dlya-sozdaniya-nejrosetej-253661) [[]](https://rb.ru/story/kakie-yazyki-programmirovaniya-uchit-dlya-raboty-s-ai/) [[]](https://vc.ru/id1651755/686392-samye-populyarnye-yazyki-programmirovaniya-v-sfere-neirosetei) [[]](https://knewit.kz/2025/05/20/top-5-yazykov-programmirovaniya-dlya-iskusstvennogo-intellekta/). Разберём их по-отдельности.
**Python** имеет большое количество библиотек для работы с нейронными сетями (TensorFlow, PyTorch, Keras, Scikit-learn), инструменты предобработки (NumPy, Pandas), а также обширное сообщество [[]](https://www.slashdata.co/post/59-of-developers-use-ai-tools-25-2m-javascript-users). Также присутствие высокого уровня абстракции, динамической типизации и интерактивности позволяет просто написать код. Поддержка CUDA библиотеками PyTorch и Tensorflow позволяет обучать нейронные сети на GPU. Из минусов стоит отметить более медленная работа по сравнению с C++ и C#, однако основной код библиотек PyTorch и Tensorflow оригинально написан на компилируемых языках программирования, что даёт прирост к производительности. GIL (глобальная блокировка интерпретатора) — способ синхронизации потоков, который используется в Python. Это ограничивает параллельность многопоточности, что не позволит в данной работе проверить скорость вычислений многопоточности.
Вторым языков является **C++**. Самым главным преимуществом данного языка является производительность. C++ имеет прямой доступ к железу и оптимизация под CPU/GPU и не имеет падения производительности как в managed-языках, вроде C#, Java. Популярные библиотеки TensorFlow и PyTorch имеют C++ API, а сам язык подходит для интеграции и встраивания в высоконагруженные системы. Есть управление памятью и многопоточностью, что одновременно и преимущество и недостаток. Точная настройка памяти важна для пользовательских архитектур, однако это сильно усложняет разработку. Также недостатком C++ является меньшее количество библиотек по сравнению с Python для разработки нейронных сетей.
Третьим языком в сравнении является **C#**. Данный язык имеет фреймворк для машинной обучения ML.NET, а также биндинги (связь с C++ библиотекой) TensorFlow.NET и TorchSharp. Имеет большую производительность чем Python, но менее быстрый по сравнению с C++. Большим плюсом является хорошая интеграция с Windows. Количество библиотек намного меньше чем во всех представленных выше языках.
Итог разбора языков приведён в таблице `mention(only_number): Сравнение языков программирования для машинного обучения`.
`table_name: Сравнение языков программирования для машинного обучения`
| Критерий | Python | Java | C++ | C# |
|-------------------|--------|------|-----|----|
| Простота | 5 | 3 | 2 | 4 |
| Производит. | 2 | 4 | 5 | 4 |
| Библиотеки | 5 | 4 | 3 | 3 |
| Глубокое обучение | 5 | 3 | 4 | 2 |
| Enterprise | 3 | 5 | 4 | 5 |
| Исследования | 5 | 2 | 1 | 2 |
| MLOps | 5 | 4 | 3 | 3 |
## Анализ среды обучения нейронной сети
Предполагается, что модульная нейронная сеть с модулем оценки важности используется для задач, которые решить неглубокие, простые нейронные сети не в силах. К таким задачам относятся предсказание изменений среды на основе действий агента, когда система слишком сложная и/или имеет разные компоненты, которые, взаимодействуя, создают тяжело предсказуемые ситуации.
Для тонкой настройки нейронных сетей, их связи и обучения будет использоваться библиотека Torch [[PyTorchSite]](https://pytorch.org). *Torch* — библиотека для построения и обучения нейронных сетей на языке Python. Она позволяет совершать операции вроде умножения, сложения, возведения в степень, объединения, разъединения без потери градиента, что позволит обучить нейронные сети МОВ и модулей.
## Постановка цели и задачи исследования
Целью данной выпускной квалификационной работы является `var(цель)`.
Для данной цели следует решить следующие задачи:
- написать техническое задание на модульную нейронную сеть;
- реализовать модульную нейронную сеть;
- обучить нейронные сети на примерной задаче;
- изменить или подкорректировать структуру нейронных сетей по необходимости.
## Техническое задание
В этом разделе будут описаны назначение и цели разработки клиента как отдельной системы. Требования к интерфейсу, вид принимаемых и отправляемых данных.
### Этапы разработки
1. Проектирование архитектуры — выбор и настройка архитектуры системы в целом, отдельных модулей, МОВ, слоя объединения выходов;
1. Реализация базовых модулей — написание различных модулей под конкретную среду (используемую в тестировании);
1. Разработка слоя динамического взвешивания — написание МОВ;
1. Реализация слоя объединения результатов — написание алгоритма по объединению выходов модулей на основе выхода МОВ;
1. Тестирование и отладка — тестирование системы в реальных условиях;
1. Оптимизация производительности — дообучение модулей или МОВ, доработка модулей простых алгоритмов;
1. Документирование — написание документации по использованию модульной нейронной сети.
### Основные требования
В модульной архитектуре представляются требования как к отдельным модулям, так и к системе в целом:
1. **Модульность** — архитектура должна поддерживать подключение произвольного числа модулей (алгоритмов или нейронных сетей) c переобучением МОВ.
2. **Динамическое взвешивание** — для каждого входного контекста система должна определять степень влияния каждого модуля на итоговый вывод.
3. **Объединение результатов** — система должна комбинировать результаты работы модулей с учетом их весов.
4. **Масштабируемость** — архитектура должна быть легко расширяемой для добавления новых модулей.
5. **Интерпретируемость** — должна быть возможность анализа весов модулей для понимания их вклада в итоговый вывод;
### Описание архитектуры
Архитектура модульной нейронной сеть с плавающим влиянием на вывод должна состоять из нескольких ключевых компонентов, которые взаимодействуют друг с другом для получения итогового результата. Рассмотрим каждый компонент подробно.
1. Входной слой: прием и предварительная обработка входных данных.
- Входные данные могут быть любого типа: изображения, тексты, числовые данные и так далее;
- Данные передаются всем подключенным модулям для дальнейшей обработки;
- При необходимости выполняется предварительная обработка данных (нормализация, токенизация, аугментация и другое).
2. Модули (подсети или алгоритмы): обработка входных данных и генерация промежуточных результатов.
- Каждый модуль представляет собой независимую/зависимую нейронную сеть или алгоритм, который специализируется на решении определенной задачи;
- Модули могут быть разнородными: например, один модуль — свёрточная нейронная сеть (CNN), другой — рекуррентная нейронная сеть (RNN), третий — алгоритм машинного обучения (например, SVM или случайный лес). Также модули могут быть обычными алгоритмами;
- Каждый модуль записывает результат в список выходов всех модулей.
3. Слой динамического взвешивания: определение важности каждого модуля для текущего контекста системы.
- На основе входных данных вычисляется вес каждого модуля, который отражает его важность для итогового результата;
- Для вычисления весов используется дополнительная нейронная сеть или алгоритм (например, полносвязная сеть);
- Веса нормализуются (например, с помощью функции softmax), чтобы их сумма равнялась 1;
- Веса могут изменяться в зависимости от контекста входных данных (например, для одних данных важнее один модуль, для других — другой).
4. Слой объединения результатов: комбинирование результатов работы модулей с учетом их весов.
- Результаты работы модулей объединяются с использованием весов, полученных на слое динамического взвешивания;
- Методы объединения могут быть разными: взвешенная сумма, конкатенация, усреднение, другие;
- После объединения может быть добавлен дополнительный слой (например, полносвязный) для финальной обработки.
5. Выходной слой: возврат итогового результата.
- Выходной слой возвращает итоговый результат в зависимости от задачи (например, класс, вероятность, регрессионное значение);
- Для классификации может использоваться функция softmax, для регрессии — линейная активация;
- Возвращает итоговый результат на основе объединенных данных.
В общем архитектура модульной нейронной сеть с плавающим влиянием на вывод предоставляет возможность объединять большой количество модулей, взвешивать их важность в контексте и объединять их выводы по определённому алгоритму.
### Функциональные требования
1. **Обучение**: возможность обучения как отдельных модулей, так и всей системы в целом.
- Каждый модуль может обучаться независимо;
- Слой динамического взвешивания и слой объединения результатов обучаются совместно с использованием обратного распространения ошибки;
- Поддержка передачи градиентов от выходного слоя к модулям для их тонкой настройки.
2. **Интерфейс**: API для добавления новых модулей и анализа их вклада.
- Методы для добавления и удаления модулей;
- Методы для получения весов модулей и анализа их вклада в итоговый результат;
- Возможность сохранения и загрузки модели.
3. **Динамическое взвешивание**: веса модулей должны вычисляться на основе контекста входных данных.
- Использование дополнительной нейронной сети для вычисления весов;
- Нормализация весов с помощью функции softmax.
4. **Комбинирование весов**: результаты модулей должны комбинироваться с учетом их весов.
- Поддержка различных методов объединения (взвешенная сумма, конкатенация, усреднение);
- Возможность выбора метода объединения в зависимости от задачи.
Решение настоящей работы должно позволять обучать отдельные модули и сам МОВ.
### Нефункциональные требования
1. **Производительность**:
- Минимизация времени обработки данных;
- Поддержка работы на GPU для ускорения вычислений.
2. **Масштабируемость**:
- Возможность работы с большим количеством модулей;
- Возможность сохранять МОВ с определённым количество модулей.
3. **Надежность**:
- Устойчивость к ошибкам в работе отдельных модулей.
4. **Удобство**:
- Простота в использовании конечному программисту;
- Меньшее количество действий для выполнения сложных операций;
- Возможность получить справку по функциям.
# Аналитический раздел
В данном разделе `var(аналитический_раздел)`
## Описание свойств сложной динамической системы
Для того чтобы дать определение системе, нужно знать определение слова «система».
**Система** — совокупность элементов, находящихся в отношениях и связях друг с другом, которая образует определённую целостность, единство [2].
Теперь, понимая смысл слова «система», можно дать определение сложной динамической системе:
**Сложная динамическая система** — это система, в которой происходят частые и непредсказуемые изменения, которые сложно описать с помощью простых алгоритмов или математических моделей.
Сложная динамическая система отличается от обычной следующими особенностями:
- Нелинейность — небольшие изменения в начальных условиях могут приводить к большим изменениям в поведении системы;
- Многокомпонентность — система состоит из множества __взаимодействующих__ элементов, которые по-разному влияют на агента;
- Непредсказуемость — поведение системы трудно предсказать в долгосрочной перспективе.
В качестве примера таких систем можно привести экономические системы: Экономика формируется взаимодействием множества агентов — потребителей, производителей, инвесторов и государственных учреждений, что делает её сложной и непредсказуемой [[kak-novosti-vliiaiut-na-rynok]](https://bcs-express.ru/novosti-i-analitika/kak-novosti-vliiaiut-na-rynok "Как новости влияют на рынок").
Такие системы описываются сложными, большими нейронными сетями, но они достаточно требовательные [[ChatGPTConsumption]](https://epoch.ai/gradient-updates/how-much-energy-does-chatgpt-use "Потребление ChatGPT"), что повышает цену на каждый цикл работы нейронной сети.
Так как настоящая работа предполагает модульность, необходимо обсудить эмерджентность системы.
Эмердженти́зм (англ. emergent - неожиданно появляющийся) — совокупность теорий в философии сознания, допускающих появление у системы новых свойств, не присущих её элементам в отдельности, а также принимающих автономность и несводимость свойств системы к совокупности суммы свойств её элементов [[Эмерджентизм]](https://bigenc.ru/c/emerdzhentizm-2a3346).
Эмерджéнтность — наличие у системы свойств целостности, то есть таких свойств, которые не присущи составляющим элементам [[Определение эмерджентности]](https://dic.academic.ru/dic.nsf/dic_fwords/712/ЭМЕРДЖЕНТНОСТЬ).
Поведение сложной системы можно считать эмерджентным, если его нельзя заранее предсказать только на основании свойств ее частей [[Загадки эмерджентности]](https://ideanomics.ru/articles/33110). Благодаря эмерджентности, большие языковые модели могут генерировать новые ответы, не присущие данным её обучения.
Эмерджентность в настоящей работе появляется в больших модулях, выполняющие какую-либо комплексную работу. Например, при применении модульной системы для самоуправляемых (беспилотных) автомобилей, таким комплексным модулем будет отслеживание опасностей. Алгоритмы и маленькие модели нейронных сетей не будут иметь свойство эмерджентности, что не позволит всесторонне обучить предсказание опасностей.
Также эмерджентность появляется в модуле оценки важности. Так как модуль оценки важности по своей сути управляет влиянием модулей, МОВ выполняет роль объединителя модулей, или, если упростить, контролера модулей. При соединении выводов модулей и появляется эмерджентность: хотя модули имеют разные цели, их объединение позволит системе генерировать новые действия на основе контекста среды. Например, если роботу с колёсами настроить модули для езды по ровной поверхности и по лестнице, то, езда в горку будет являться смежной областью этих двух модулей, что в некоторых случаях позволит забираться роботу в горку на основе выводов двух связанных модулей. Целью МОВ и является определение контекста для работы модулей. Таким образом, наличие модуля оценки важности, который динамически управляет влиянием модулей создаёт условия для возникновения эмерджентных свойств в рамках всей системы.
## Анализ потоков данных
Поток данных в модульной системе представлен на `mention: Поток данных модульной системы`.

Предполагается, что система является динамической и сложной, посему работа в ней осуществляется через агента, который получает полное или ограниченное количество информации о среде вокруг него.
Абстрагированная схема, содержащая поток данных лишь для модулей представлено на рисунке `mention(only_number): Поток данных в модулях`.

## Анализ требований к модулям
К модулям представляются *функциональные* и *нефункциональные* требования.
**Функциональные** требования:
- Обучение модуля как отдельной нейронной сети;
- Запуск (подключение, включение возможности получения выхода на основе входа) модуля как отдельной нейронной сети;
- Возможность временной приостановки работы модуля с его выгрузкой из памяти;
- *Совместимость* — модуль не должен конфликтовать с другими модулями;
- *Отказоустойчивость* — во время выполнения модуль не должен выдавать неестественные значения в ответ на естественные значения входа.
**Нефункциональные** требования:
- *Производительность* — низкое потребление мощностей системы;
- *Масштабируемость* — возможность улучшения модели без изменения количества/типов входов и выходов;
- *Уникальность* — у каждого модуля должна быть своя уникальная задача, которую решает модуль.
Если **каждое** из функциональных и нефункциональных требований выполнено для **каждого** модуля, тогда и только тогда обучение МОВ становится возможным.
# Технологический раздел
В данном разделе `var(технологический_раздел)`
В качестве инструментов реализации работы используется язык [[Python]](https://www.python.org/about/). Он позволяет быстро реализовать необходимый функционал, имеет понятную документацию и множество библиотек, упрощающие программирование.
В качестве основной библиотеки по обучению нейронных сетей используется torch [[PyTorchSite]](https://pytorch.org). Она позволяет гибко управлять тензорами без необходимости управления памяти с помощью аргумента **requires_grad* [[requires_grad]](https://docs.pytorch.org/docs/2.7/notes/autograd.html#setting-requires-grad), представленный в каждой функции и тензоре torch.
Всю реализацию можно разделить на 4 этапа:
1. Реализация интерфейсов для создания отдельных модулей и их обучения.
2. Реализация МОВ.
3. Связь МОВ с системой для автоматического включение/отключение модулей во время работы.
4. Полное тестирование системы с обученными модулями.
Сохранение модульной нейронной сети происходит путём создания папки с названиями модулей, в которую сохраняются модули и МОВ. Пример форматирования представлен в таблице.
Ниже представлена реализация каждого этапа.
## Реализация модулей
Для понимания реализации модулей, их базовых классов надо понимать какие существуют виды модулей.
### Виды модулей
По принципу работы существует 2 типа модулей:
- Простые алгоритмы — выполняемый код;
- Нейронные сети (и глубокое обучение) — целые нейронные сети на Torch.
Сравнение простых алгоритмов и нейронных сетей представлен в `mention: Виды модулей по принципу работы`.
`table_name: Виды модулей по принципу работы`
| Название | Простые алгоритмы | Нейронные сети |
|---------------------------------|-------------------|----------------|
| Скорость подключения/отключения | O(1) | O(n) |
| Занимаемая память | O(1) | O(n) |
| Адаптивность | Отсутствует | Присутствует |
| Сложность настройки под задачу | Низкая | Высокая |
| Требуется обучение | Нет | Да |
По влиянию на конечный результат модули разделяются на два типа:
- Основные — модули напрямую влияют на вывод из модульной нейронной сети;
- Вспомогательные — результатами вывода модуля пользуются другие модули.
Возьмём в качестве примера автопилот автомобиля. Автомобиль едет по дороге, а параллельно ей идут пешеходы. Впереди пешеходный переход. Основная сеть вводит автомобиль, когда вспомогательная может просчитывать вероятность перехода. Данный подход позволяет не создавать сложнообучаемые, большие нейронные сети, а декомпозировать обучение. Более подробное описание представлено в `mention: Виды модулей по влиянию на конечный результат`.
`table_name: Виды модулей по влиянию на конечный результат`
| Вид модуля | Основной | Вспомогательный |
|---|---|---|
| Напрямую влияет на вывод | Всегда | Никогда |
| Косвенно влияет на вывод | Если используется в качестве вспомогательного | Всегда |
| Входит в расчёт модулем МОВ | Всегда | Никогда |
| Включается ... | Модулем МОВ или другими модулями в качестве вспомогательного | По цепочке зависимостей основными модулями |
Модули могут как включаться и отключаться, так и загружаться и выгружаться. Изначально модуль выключен и выгружен. Если в какой-то момент модуль оценки важности считает, что модуль может понадобится, даётся запрос на загрузку модуля. Загрузка предполагает собой долгую операцию (для больших моделей нейронных сетей) по загрузке весов в оперативную память (видеопамять). Когда модуль загружен, его можно включать и отключать. Включение и отключение влияет лишь на математические операции, проводимые внутри системы: если важность модуля слишком низкая, его значениями можно пренебречь и повысить производительность системы в целом. Если модуль продолжительное время отключён, есть смысл выгрузить его из памяти для сбережения оперативной памяти. Упрощённое представление вышеописанных состояний представлено в таблице `mention(only_number): Состояния модулей`.
`table_name: Состояния модулей`
| | Включённый | Выключенный |
|---|---|---|
| Загруженный | Работает | Пока что значения данного модуля не требуются, но скоро могут понадобится, что делает выгрузку модуля нецелесообразным |
| Выгруженный | Не происходит | Для текущего состояния среды модуль не требуется |
В перспективе настоящая работа предполагает создание модульной нейронной сети с плавающим влиянием для динамический сред с количество модулей, превышающих доступную оперативную память (видеопамять) оборудования в несколько раз.
### Реализация в коде
В реализации модули разделяются только по принципу работы, так как простые алгоритмы необучаемые и подключаются/отключаются за время O(1) (в виду отсутствия какой-либо загрузки/выгрузки данных из оперативной памяти или диска). Разделения на основные и вспомогательные осуществляется созданием переменной, сообщающая о зависимостях некоторого модули. При включении определённого модуля система проверяет, включены ли его зависимости.
Управление всеми модулями осуществляется контроллером, представленным на `mention: Контроллер модулей`. В нём реализованы функции включение и отключения модулей, загрузки и выгрузки, а также функция для изменения влияния модуля.
Модули сохраняются с помощью функции *torch.save()*.
## Реализация нейронной сети оценки важности модулей
Сам модуль оценки важности представляет собой обычную нейронную с некоторым количество линейных слоёв. В зависимости от сложности ситуации использования модулей допускается усложнение архитектуры нейронной сети МОВ.
На вход МОВ поступает состояние системы, а на выходе ожидается тензор со значениями плавающей точки от 0 до 1. Размер входа зависит от переменных, получаемой от среды, а размер выхода зависит от количества модулей, используемые в обучении/использовании.
При изменении размера данных требуется переобучать или обучать новую МОВ. Решение настоящей ВКР требует указания названия модулей для начала обучения/использования с целью различать модули и удобства использования. Пример представлен в листинге `mention(only_number): Пример структуры сохранения` ниже.
`listing(Пример структуры сохранения): ./Tech/info.txt`
Для обучения модуля оценки важности используется алгоритм TD3 (Twin Delayed DDPG) [[TD3]](https://github.com/DLR-RM/stable-baselines3).
## Реализация связи модуля оценки важности и модулей
Прямой связи между МОВ и модулями нет. Выходом МОВ является тензор, содержащей числа с плавающей точки, преимущественно в пределах от 0 до 1. Данный тензор конвертируется в массив *numpy*, который потом используется в функции *numpy.average* для вычисления средневзвешенного значения по одной переменной действия агента. Реализация данного алгоритма приведена в Приложении Б. Формула нахождения среднего значения с весами представлена на формуле `mention(only_number): Нахождение средневзвешенного в numpy.average`.
`formula(Нахождение средневзвешенного в numpy.average): v=\frac{\sum{}x_{i}p_{i}}{\sum{p}_{i}}`
`formula_describe(v — среднее значение, x — отдельное значение, з — вес значения)`
Если взять в качестве примера два числа 0.25 и 0.75, и уменьшать/увеличивать вес каждого соответственно, получится линейный график (см. `mention: Функции нахождения среднего`).

Функция применена в классе ModulesOutputMapping (см. `mention: Структуры данных системы`).
`TODO: Руководства пользователя в ВКР нет! (по крайней мере в задании)`
Решение предусматривает использование разработчиками нейронных сетей, что требует адаптации кода для своей среды и агента. Для этого требуется изменить константы входов и выходов, определённые в файле со структурами данных, представленные в Приложении Г. Для корректной работы следует определить:
1. Входные данные — переопределение константы *STATE_KEYS*. В ней описаны все переменные, которые должны быть в *ModulesOutputMapping* в начале каждой итерации.
2. Выходные данные — переопределение константы *CONTROLS_KEYS*. В ней описаны все переменные, которые должны быть в *ModulesOutputMapping* в конце каждой итерации.
Когда входные и выходные данные определены, нужно заменить все существующие модули на необходимые для работы в новой среде. Все модули определяются в *src\mai\ai\networks*, и должны наследоваться от класса:
- **ModuleBase**, если модуль является простым алгоритмом. Требуется переопределение классового метода *inference(ModulesOutputMapping, requires_grad: bool = False)*;
- **NNModuleBase**, если модуль является обучаемой нейронной сетью. Требуется переопределение классового метода *_create()*.
Каждый класс содержит в себе абстрактные методы, необходимые для переопределения, включая обязательные классовые переменные *output_types* и *input_types*, содержащие информацию о входных и выходных данных модуля.
Пример класса представлен на листинге `mention: Пример модуля`.
`listing(Пример модуля): ./Tech/module.py`
Разберём каждый метод по отдельности:
1. *load*() — Метод вызывается, когда важность модуля превышает пороговое значение и скоро он понадобится для работы. Операции загрузки выполняются в отдельном потоке, что позволяет функционал загрузки не влиять на главный поток. Метод может быть блокирующим.
2. *inference*(ModulesOutputMapping, bool = False) — Основной алгоритм модуля. в словаре *tensor_dict* обязательно присутствуют значения из классовой переменной *input_types*, а также алгоритм обязательно должен добавлять в него значения, перечисленные в *output_types*.
3. *requires*() -> set[str] — если модуль требует выходные данные какого-то другого модуля, их названия данный метод должен вернуть.
## Тестирование
`store_var(capn): *Cap’n Proto*`
В качестве тестирования будет использоваться среда компьютерной игры [[]](https://store.epicgames.com/ru/p/rocket-league "Описание игры Rocket League"). Rocket League — 3D игра сочетания аркадного футбола автомобилями и простого управления, основанных на законах физики.
Для этой игры создан плагин [[BakkesMod]](https://bakkesmod.com), позволяющий выполнять код C++ внутри игры. С его помощью можно, как и получать информация о среде внутри игры, так и эмулировать ввод.
Данная среда позволяет в полном объёме обучить нейронную сеть по модулям и сравнить её с существующими решениями. В ней существует возможность создавать пользовательские тренировки с разными сценариями, а также уже существуют некоторые версии ботов на основе как алгоритмов, так и нейронных сетей, обученных с помощью обучения с подкреплением.
Поток данных в приложении представлен на `mention: Поток данных в тестировании`.

`TODO: Дать комментарии по архитектуре`
Кадр из обучения модуля оценки важности представлен на `mention: Пример обучения МОВ`.

В примере окно компьютерной игры на весь экран, поверх него слева направо:
1. Окно графиков наград — на нём представлены награды за разные достижения агентов в среде. В данном случае:
- *Ball Shoot Speed* — скорость полёта меча после касания (быстрее — лучше);
- *Car Velocity* — скорость автомобиля (быстрее — лучше);
- *Closing To Ball* — скорость сближения автомобиля с мячом (быстрее — лучше);
- *Constant Distance To Ball* — дистанция от автомобиля до мяча (ближе — лучше);
- *Constant Reward Distance to Ball* — постоянная награда при приближении к мячу (низкое влияние в примере);
- *Constant Velocity To Ball* — Постоянная награда за скорость автомобиля по отношению к мячу (чем больше вектор скорости автомобиля направлен к мячу — тем лучше).
2. Основное окно системы. В данной примере в окне отображаются параметры обучения. Здесь можно увидеть:
- условия перезапуска цикла обучения (смена эпохи);
- шанс случайных шагов (для обучения модулей);
- тип состояние системы (игра, тренировка, специальная тренировка).
3. Гистограмма влияния модулей на вывод. В данном примере используется только вывод модуля *reachCenterFloor*. В обучение используются три: *reachBallAir*, *reachBallFloor*. *reachCenterFloor*.
## Расчёт надёжности
Расчёт надёжности произведён по модели Миллса. В систему было искусственно внесено 10 ошибок. После модульного тестирования было обнаружено 6 внесённых ошибок и 2 собственных:
- ошибка в обнаружении модулей нейронной сети;
- ошибки при получении сообщений от сервера;
- ошибки в расчётах клиента при конвертации данных.
Тогда первоначальное число ошибок в программе N можно оценить по формуле модели Миллса (`mention: число ошибок`).
`formula(число ошибок): N=n\frac{S}{v}`
`formula_describe(n — найденные собственные ошибки, S — всего внесённых ошибок, v — найденные внесённые ошибки)`
`formula(*число ошибок2): N=2\frac{10}{6}=3,(6)`
где S – количество искусственно внесённых ошибок. Таким образом, делается предположение о количестве необнаруженных ошибок, (`mention: число необнаруженных ошибок`).
`formula(число необнаруженных ошибок): (N-n)=3,6-2=1,6`
Тогда по формуле соотношения (`mention: формула соотношения`):
`formula(формула соотношения): p=\frac{1,6}{1,6+K+1}=\frac{5}{5+0+1}=0,615`
Можно сказать с вероятностью 0,615, что в программе только две первоначальные ошибки.
Внесённые и обнаруженные первоначальные ошибки исправлены по окончанию тестирования.
## Вывод по разделу
В данном разделе проведена разработка системы в целом, адаптирована под тестовую среду, получены результаты по возможности реализации модульной нейронной нейронной сети на явном примере.
# Экономический раздел
В данном разделе `var(экономический_раздел)`
Схема взаимодействия состава задействованных в работе лиц представлена на рисунке `mention(only_number): Состав задействованных в работе`.

## Организация и планирование работ
Участники работы представлены в таблице `mention(only_number): Участники работы`:
`table_name: Участники работы`
| Роль | Должность | ФИО | Деятельность |
|---|---|---|---|
| Разработчик | Студент | Геворкян Артём Арзикович | Реализация продукта, написание кода |
| Консультант | Старший преподаватель кафедры экономики | Потрясаева Елена Александровна | Консультации по экономической части работы |
| Руководитель | кандидат технических наук доцент кафедры вычислительной техники | Штрекер Евгений Николаевич | Организация и контроль исполнения, давать указания по реализации продукта разработчику |
Всего есть 5 главных этапов, разделённые на различные этапы более низкого уровня. Их названия, исполнители, трудоёмкость и продолжительность работ представлены в таблице `mention(only_number): Этапы и исполнители с продолжительностью`.
`table_name: Этапы и исполнители с продолжительностью`
№ |
Название этапа |
Исполнитель |
Трудоёмкость, чел/дни |
Продолжительность работ, дни |
1 |
Разработка и утверждение технического задания |
Руководитель |
5 |
5 |
|
|
Консультант |
1 |
|
|
|
Разработчик |
5 |
|
2 |
Технические предложения |
Руководитель |
7 |
7 |
|
|
Разработчик |
7 |
|
3 |
Эскизный проект: |
|
|
16 |
3.1 |
Анализ исходных данных и требований |
Разработчик |
9 |
|
3.2 |
Постановка задачи и цели |
Консультант |
1 |
|
3.3 |
Разработка описания основного алгоритма |
Руководитель |
2 |
|
|
|
Разработчик |
7 |
|
4 |
Технический проект: |
|
|
15 |
4.1 |
Определение типов входных и выходных данных |
Руководитель |
2 |
|
|
|
Разработчик |
5 |
|
4.2 |
Разработка структуры программы и логической структуры базы данных |
Руководитель |
2 |
|
|
|
Разработчик |
10 |
|
5 |
Рабочий проект: |
|
|
47 |
5.1 |
Программирование и отладка программы |
Разработчик |
24 |
|
5.2 |
Испытание программы |
Разработчик |
4 |
|
5.3 |
Корректировка программы по результатам испытаний |
Разработчик |
5 |
|
5.4 |
Подготовка технической документации на программный продукт |
Консультант |
1 |
|
|
|
Разработчик |
7 |
|
5.5 |
Сдача готового продукта и внедрение |
Руководитель |
2 |
|
|
|
Разработчик |
7 |
|
Итого |
|
|
|
90 |
Календарный график исполнения работы, который соответствует таблице `mention(only_number): Этапы и исполнители с продолжительностью`, представлен на рисунке `mention(only_number): Календарный график выполнения работ`. Из рисунка `mention(only_number): Календарный график выполнения работ` так же видно, что общий срок разработки составит 90 дней.

## Расчёт затрат на проведение работ
Себестоимость проектирования и разработки ИТ-решения складывается из затрат по следующим статьям:
1. Сырье и материалы.
2. Основная заработная плата.
3. Дополнительная заработная плата.
4. Страховые взносы.
5. Амортизация.
6. Прочие расходы.
Рассмотрим каждую статью по-отдельности.
### Статья 1. Сырьё и материалы
Расчёт затрат на сырьё и материалы представлен в `mention: Сырьё и материалы`:
`table_name: Сырьё и материалы`
№ пп |
Наименование материала |
Единицы измерения |
Количество |
Цена за единицу (руб) |
Стоимость (руб) |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
Ручка |
шт |
5 |
30 |
150 |
2 |
Карандаш |
шт |
5 |
20 |
100 |
3 |
Ластик |
шт |
5 |
40 |
200 |
4 |
Блокнот 24 листа |
шт |
5 |
415 |
2075 |
5 |
Бумага A4 |
пачка |
2 |
500 |
1000 |
Итого материалов |
|
|
|
|
3525 |
Транспортно-заготовительные расходы |
|
|
|
|
177 |
Итого |
|
|
|
|
3702 |
Таким образом общая сумма затрат по статье «Сырье и материалы» составит 3 702 рублей (три тысячи семьсот два рубля).
### Статья 2. Основная заработная плата
К статье «Основная заработная плата» относится оплата труда непосредственно занятых выполнением конкретной работы в проекте, включая внештатный состав. Расчёт заработной платы проводится на основе трудоёмкости исполняемых ими работ.
Проект будет создаваться при шестидневной рабочей неделе. Согласно Производственному календарю 2025 года [[Производственный календарь на 2025 год]](https://nalog-nalog.ru/proizvodstvennyj_kalendar/2025-6/) к годовой фонд рабочего времени составляет 299 дней.
Заработная плата рассчитывается по формуле `mention(only_number): Формула расчёта дневной тарифной ставки для месячного оклада`.
`formula(Формула расчёта дневной тарифной ставки для месячного оклада): ТС=\frac{ОК\times12}{НРВ}=\frac{ОК\times12}{299}руб./д.`
`formula_describe(ОК — месячный оклад работника, НРВ — годовой фонд рабочего времени)`
В `mention: Расчёт основной заработанной платы` приведён результат расчётов заработной платы исполнителей. Количество рабочих дней приведён в `mention: Этапы и исполнители с продолжительностью`.
`table_name: Расчёт основной заработанной платы`
№ пп |
Наименование этапа |
Должность (исполнитель) |
Месячный оклад (руб) |
Трудоёмкость (чел/дни) |
Оплата за день (руб) |
Оплата за этап (руб) |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
Техническое задание |
Руководитель |
141 000 |
5 |
5659 |
28295 |
|
|
Консультант |
112 000 |
1 |
4495 |
4495 |
|
|
Разработчик |
0 |
5 |
0 |
0 |
2 |
Технические предложения |
Руководитель |
141 000 |
7 |
5659 |
39613 |
|
|
Разработчик |
0 |
7 |
0 |
0 |
3 |
Эскизный проект |
Руководитель |
141 000 |
2 |
5659 |
11318 |
|
|
Консультант |
112 000 |
1 |
4495 |
4495 |
|
|
Разработчик |
0 |
16 |
0 |
0 |
4 |
Технический проект |
Руководитель |
141 000 |
4 |
5659 |
22636 |
|
|
Разработчик |
0 |
15 |
0 |
0 |
5 |
Рабочий проект |
Руководитель |
141 000 |
2 |
5659 |
11318 |
|
|
Консультант |
112 000 |
1 |
4495 |
4495 |
|
|
Разработчик |
0 |
47 |
0 |
0 |
Итого |
|
|
|
|
|
122615 |
### Статья 3. Дополнительная заработная плата
Дополнительной заработной считают выплаты, выдаваемые за неотработанные по уважительным причинам время. Рассчитываются они по формуле `mention(only_number): Формула расчёта дополнительной заработной платы`:
`formula(Формула расчёта дополнительной заработной платы): ДЗП=(20...30)\%\timesОЗП`
`formula_describe(ДЗП — дополнительная заработная плата, ОЗП — основная заработная плата)`
Учитывая основную заработную плату, описанную в статье 2, получаем следующий результат:
`formula(Расчёт дополнительной заработной платы): ДЗП=(20...30)\%\timesОЗП=0,25\times122615 = 30653,75 руб.`
Дополнительная заработная плата составляет 30653,75 рублей.
### Статья 4. Страховые взносы
Для расчёта взносов используется фонд оплаты труда (ФОТ), состоящий из основной и дополнительной заработной платы.
`formula(ФОТ): ФОТ=ОЗП+ДЗП=122615+30653,75=153 268,75руб.`
`formula_describe(ФОТ — фонд оплаты труда, ОЗП — основная заработная плата, ДЗП — дополнительная заработная плата)`
В расчёт страховых взносов входит настоящей ВКР:
1. Единый тариф страховых взносов 30% [[cons_doc_LAW_93256_97a8d65271700b79d87a7edf33832b5f3ce0fd18/]](https://www.consultant.ru/document/cons_doc_LAW_93256/97a8d65271700b79d87a7edf33832b5f3ce0fd18/).
2. Травматизм, ставка которого в РТУ МИРЭА составляет *0,2%* [[cons_doc_LAW_211247]](https://www.consultant.ru/document/cons_doc_LAW_211247/).
Учитывая вышеперечисленное, ставка выплат составляет *30,2* процентов от ФОТ. Посчитаем страховые взносы (см. `mention: СВ`):
`formula(СВ): СВ=0,302\times153 268,75=46 287,16 руб.`
С учётом ставки и фонда оплаты труда, страховые взносы составляют 46 287,16 рублей (сорок шесть тысяч двести восемьдесят семь рублей шестнадцать копеек).
### Статья 5. Амортизация
Амортизация — отчисления части стоимости основных фондов (например, стоимости оборудования) для возмещения их износа. Амортизация включается в издержки производства. Размер амортизационных отчислений определяется на основе установленных норм и балансовой стоимости основных фондов, на которые начисляется амортизация [[cons_doc_LAW_28165_df53ee1751d3e93dbf8c0d34076675da18a2fd06/]](https://www.consultant.ru/document/cons_doc_LAW_28165/df53ee1751d3e93dbf8c0d34076675da18a2fd06/).
`formula(Формула расчёта амортизационные отчисления оборудования): A=\frac{C}{T}`
`formula_describe(А — месячная сумма амортизационных отчислений, С — первоначальная стоимость объекта, Т — срок полезного использования в месяцах)`
`table_name: Амортизационные отчисления`
| Наименование оборудования | Первоначальная стоимость, руб | Срок полезного использования, мес. | Месячная сумма амортизационных отчислений | Период эксплуатации в месяцах | Сумма, руб. |
|---------|---------|----|----------|---|----------|
| Ноутбук | 144 999 | 36 | 4 027,75 | 3 | 12083,25 |
В итоге сумма амортизационных отчислений составляет 120 083,25 рублей (сто двадцать тысяч восемьдесят три рубля двадцать пять копеек).
### Статья 6. Прочие расходы
К прочим расходам прежде всего отнесены накладные расходы. Это расходы на содержание и ремонт зданий, сооружений, оборудования, инвентаря. Это затраты, сопутствующие основному производству, но не связанные с ним напрямую, не входящие в стоимость труда и материалов.
Сумма данных расходов определяется процентом от суммы основной заработной платы (ОЗП) и на разных предприятиях, в зависимости от их структуры, технологического процесса и системы управления находится в широком диапазоне — от 100 до 130 процентов. В настоящей работе используется 100%, так как вся работа проходит в ноутбуке, где легко найти альтернативы продуктам. В формуле `mention(only_number): Формула расчёта прочих расходов` представлен расчёт:
`formula(Формула расчёта прочих расходов): НР=110\%\timesОЗП=110\%\times122 615=134 876,5 руб.`
`formula_describe(НР — накладные расходы, ОЗП — основная заработная плата)`
В итоге сумма прочих расходов составляет 134 876,5 рублей (сто тридцать четыре тысячи восемьсот семьдесят шесть рублей пятьдесят копеек).
### Итог
Вышеперечисленные статьи затрат и результаты расчётов по ним обобщаются в таблице `mention(only_number): Структура затрат в таблице`
`table_name: Структура затрат в таблице`
| № пп | Номенклатура статей расходов | Затраты (руб.) | Доля затрат, % |
|------|---------------------------------|----------------|----------------|
| 1 | 2 | 3 | 4 |
| 1 | Сырьё и материалы | 3 702 | 1,1 |
| 2 | Основная заработная плата | 122 615 | 35,0 |
| 3 | Дополнительная заработная плата | 30 653,75 | 8,8 |
| 4 | Страховые взносы | 46 287,16 | 13,2 |
| 5 | Амортизация | 12 083,25 | 3,5 |
| 6 | Прочие расходы | 134 875,5 | 38,4 |
| | Итого | 350 216,66 | 100,0 |
Полученные результаты работы будут использоваться внутри университета (организации), поэтому расчет договорной цены не целесообразен.
Для визуализации долевого состава статей затрат в общей себестоимости представим круговую диаграмму на рисунке `mention(only_number): Структура затрат на диаграмме`.

## Вывод по разделу
В рамках данного экономического раздела было выполнено планирование работ по теме, был проведен расчет стоимости затрат.
# **Заключение
Разработка модульной нейронной сети с плавающим влиянием на вывод представляет собой современный и актуальный подход к решению сложных задач в области искусственного интеллекта и машинного обучения. Такая архитектура позволяет эффективно комбинировать результаты работы нескольких моделей или алгоритмов, учитывая их важность в зависимости от контекста задачи. Это особенно важно в условиях, когда среда является сложной, но позволяет изучать отдельные ситуации обособленно.
В настоящей работе предложено актуальное решение насущных проблем больших моделей нейронных сетей, позволяющая декомпозировать сложную системы на компоненты и адаптировать поведение агента на основе динамически меняющегося контекста. В перспективе данный подход позволит увеличивать сложность нейронных моделей не в размерах, а в количестве и точности (целенаправленность) нейронных сетей, то есть модулей.
The development of a modular neural network with floating influence on inference is a modern and relevant approach to solving complex problems in the field of artificial intelligence and machine learning. This architecture allows you to effectively combine the results of several models or algorithms, taking into account their importance depending on the context of the task. This is especially important in conditions where the environment is complex, but allows you to study individual situations in isolation.
In this paper, we propose an urgent solution to the pressing problems of large neural network models, which makes it possible to decompose a complex system into components and adapt agent behavior based on a dynamically changing context. In the future, this approach will increase the complexity of neural models not in size, but in the number and accuracy (focus) of neural networks, that is, modules.
# **Список использованных источников
1. ГОСТ 34.602-89 «Автоматизированные системы. Требования к содержанию и оформлению документов» [Электронный ресурс]. – Режим доступа: https://docs.cntd.ru/document/9018363, свободный.
2. Берталанфи Л. фон. Общая теория систем – критический обзор // Исследования по общей теории систем: Сборник переводов / Общ. ред. и вступ. ст. В. Н. Садовского и Э. Г. Юдина. – М.: Прогресс, 1969. – 520 с.
`sources(3)`
# **Приложения
Приложение А - Реализация модуля оценки важности
Приложение Б - Контроллер модулей
Приложение В - Классы обучения нейронных сетей
Приложение Г - Структуры данных, используемые системой
Приложение Д - Достижения
Приложение Е - Презентационный материал
`page_break`
## **Приложение А - Реализация модуля оценки важности
`listing(Реализация модуля оценки важности): D:/Temp/Diploma/Client/src/mai/ai/mai_model.py`
`page_break`
## **Приложение Б - Контроллер модулей
`listing(Контроллер модулей): D:/Temp/Diploma/Client/src/mai/ai/controller.py`
`page_break`
## **Приложение В - Классы обучения нейронных сетей
`listing(Классы обучения нейронных сетей): D:/Temp/Diploma/Client/src/mai/ai/trainer.py`
`page_break`
## **Приложение Г - Структуры данных, используемые системой
`listing(Структуры данных системы): D:/Temp/Diploma/Client/src/mai/capnp/data_classes.py`
`page_break`
## **Приложение Д - Достижения
`page_break`
## **Приложение Е - Презентационный материал
s