Как нейронная сеть может учиться на тестировании выходных данных в зависимости от внешних условий, которые она не может контролировать напрямую?

Чтобы упростить вопрос и, надеюсь, ответ, я предоставлю несколько упрощенную версию того, что я пытаюсь сделать.

Установка фиксированных условий:

  • Максимальный допустимый объем кислорода в помещении = 100 000 единиц
  • Целевой объем кислорода для поддержания в комнате = 100 000 единиц
  • Максимальное количество циклов обработки воздуха в секунду == 3,0 цикла в секунду (минимум 0,3)
  • Энергия (ватт), используемая в секунду, определяется по следующей формуле: (100 Вт * циклы_в_секунду) КВАДРАТ
  • Максимальное добавление кислорода в воздух за «цикл» = 100 единиц (минимум 0 единиц)
  • 1 человек потребляет 10 единиц O2 в секунду
  • Максимальная вместимость номера 100 человек (минимум 1 человек)
  • входы обрабатываются каждый цикл, а выходы могут быть изменены в каждом цикле, однако, если выход подается обратно в качестве входа, это может повлиять только на следующий цикл.

Допустим, у меня есть эти входы:

  • A. Текущий кислород в помещении (диапазон: от 0 до 1000 единиц для простоты - можно нормализовать)
  • B. Текущая заполняемость помещения (от 0 до 100 человек при максимальной вместимости) ИЛИ/И можно изменить на общее количество O2, используемое всеми людьми в помещении в секунду (от 0 до 1000 единиц в секунду)
  • C. текущие циклы обработки воздуха в секунду (от 0,3 до 3,0 циклов в секунду)
  • D. Используемая текущая энергия (вышеуказанные текущие циклы в секунду * 100, а затем возведенные в квадрат)
  • E. Текущее количество кислорода, добавляемого в воздух за цикл (от 0 до 100 единиц)

(возможные выходные данные возвращаются в качестве входных данных?):

  • F. предыдущее изменение числа циклов в секунду (+ или - от 0,0 до 0,1 цикла в секунду)
  • G. Предыдущие циклы Добавление единиц O2 за цикл (от 0 до 100 единиц за цикл)
  • H. предыдущее изменение текущей максимальной вместимости (от 0 до 100 человек)

Вот действия (выходные данные), которые может выполнять моя программа:

  1. Изменение циклов в секунду путем увеличения/уменьшения (от 0,0 до 0,1 цикла в секунду)
  2. Изменение единиц O2, добавляемых за цикл (от 0 до 100 единиц за цикл)
  3. Изменить текущую максимальную занятость (от 0 до 100 человек) - (в основном позволяет принудительно уменьшить заполняемость, а затем позволяет нормализовать ее обратно до максимума)

ЦЕЛИ программы - поддерживать гомеостаз:

  • до 100 000 единиц O2 в помещении
  • никогда не позволяйте помещению опускаться до 0 единиц O2.
  • позволяет текущую вместимость до 100 человек в комнате как можно дольше без принудительного удаления людей (поскольку O2 в комнате со временем истощается и приближается к 0 единицам, люди должны быть удалены из комнаты до минимума, а затем дать максимальному восстановиться обратно) до 100, так как все больше и больше 02 добавляется обратно в комнату)
  • и в идеале использовать минимальную энергию (ватты), необходимую для поддержания двух вышеуказанных условий. Например, если в комнате было 90 000 единиц O2 и в настоящее время в комнате находится 10 человек (используя 100 единиц в секунду для 02), то вместо работы со скоростью 3,0 цикла в секунду (90 кВт) и 100 единиц в секунду для пополнить 300 единиц в секунду всего (избыток 200 единиц по сравнению со 100 потребляемыми) в течение 50 секунд, чтобы восполнить дефицит в 10 000 единиц на общую используемую мощность 4500 кВт. - было бы более идеально работать, скажем, со скоростью 2,0 цикла в секунду (40 кВт), которая производила бы 200 единиц в секунду (избыток 100 единиц над потребляемыми единицами) в течение 100 секунд, чтобы восполнить дефицит в 10 000 единиц и использовать в общей сложности Используется 4000 кВт.

ПРИМЕЧАНИЕ: заполняемость может колебаться от секунды к секунде в зависимости от внешних факторов, которые невозможно контролировать (скажем, люди свободно входят и входят в комнату). Единственный контроль, который имеет система, — это принудительное удаление людей из комнаты и/или предотвращение входа новых людей в комнату путем изменения максимальной вместимости, разрешенной в следующем цикле времени (скажем так, система может это сделать). Мы не хотим, чтобы система навязывала постоянное снижение производительности только потому, что она может поддерживать производство достаточного количества O2 в секунду только для 30 человек, работающих на полной мощности. У нас есть большой объем доступного O2, и потребуется некоторое время, прежде чем он будет исчерпан до опасного уровня, и потребуется, чтобы система принудительно уменьшила мощность.

Мой вопрос:

Может ли кто-нибудь объяснить мне, как я могу настроить эту нейронную сеть, чтобы она могла учиться на каждом действии (цикле), которое она предпринимает, отслеживая желаемые результаты. Моя проблема здесь заключается в том, что большинство статей, которые я нахожу по этой теме, предполагают, что вы знаете правильный выходной ответ (например: я знаю, что все входы A, B, C, D, E являются определенным значением, тогда выход 1 должен увеличиться на 0,1 цикла). в секунду).

Но чего я хочу, так это выполнить условия, которые я изложил в ЦЕЛЯХ выше. Таким образом, каждый раз, когда программа выполняет цикл и, скажем, решает попытаться увеличить количество циклов в секунду, и в результате доступный O2 либо уменьшается на меньшую величину, чем в предыдущем цикле, либо теперь снова увеличивается до 100 000, тогда этот вывод можно было бы считать более правильным, чем сокращение циклов в секунду или сохранение текущих циклов в секунду. Я упрощаю здесь, поскольку есть несколько переменных, которые могли бы создать «идеальный» результат, но я думаю, что понял, к чему стремлюсь.

Код:

Для этого тестового упражнения я использую библиотеку Swift под названием Swift-AI (в частности, ее модуль NeuralNet: https://github.com/Swift-AI/NeuralNet

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

У вас может быть несколько неизвестных параметров в этой модели, которые вам нужно изучить «онлайн». Но простой ПИД-регулятор уже может допускать и компенсировать некоторую неопределенность. И гораздо проще настроить несколько параметров, чем изучать общую причинно-следственную структуру с нуля. Это можно сделать, но для этого нужно попробовать все возможные действия. Насколько известно вашему алгоритму, лучшее действие может состоять в том, чтобы навсегда сократить количество потребителей кислорода до нуля, убив их, а затем получить огромную награду за поддержание уровня кислорода с небольшими затратами энергии. Когда алгоритм ничего не знает о проблеме, ему придется перепробовать все, чтобы обнаружить эффект.

Спасибо. Так что в основном я пытаюсь использовать молоток, чтобы забить шуруп. Я мог бы это сделать, но на самом деле это не лучший инструмент для работы. Так что, возможно, мой вопрос больше о том, когда лучше использовать нейронную сеть, а когда — модель машинного обучения. Верны ли эти утверждения: 1. NN- Если вывод является прогнозом, основанным на входных данных, а неизвестным является алгоритм для получения прогноза. (для обучения требуется некоторое количество известных входных данных с правильными выходными данными). 2. ML - есть ли действия, основанные на состоянии и изменении, которые известны, но цель состоит в том, чтобы улучшить их в сторону оптимизации с помощью переменной ctrl?

Hunter 07.05.2019 18:57

Еще одно продолжение: если мы возьмем, например, человеческое тело. Если бы я хотел заменить определенные системы искусственным интеллектом, я бы использовал что-то похожее на обучение с подкреплением, скажем, для дыхательной системы, если бы основной целью было поддержание O2 в кровотоке и на него влияли внешние системы, такие как ЧСС, частота дыхания и O2 в воздухе. легкие и т. д. Но я бы использовал нейронную сеть, чтобы, возможно, попытаться определить, было ли то, что я собирался съесть, ядовитым или нет. И, возможно, использовать backprop для обратной связи в зависимости от того, приведет ли это к рвоте, тошноте и т. д.?

Hunter 07.05.2019 19:32

1. Это описывает контролируемое обучение. NN хороши в этом, но у вас есть и другие отличные варианты, такие как классификатор случайного леса, который проще в использовании. Кроме того, по-прежнему можно использовать NN именно так, как вы хотели. Вам просто нужно как-то найти его веса. Если вы определяете функцию потерь (например, разница с целевым уровнем кислорода плюс потребление энергии за 2 часа), вы можете просто попробовать случайные веса и выбрать те, которые дают хорошие результаты (или использовать GA или стратегию развития). Но это будет на много медленнее, чем обратное распространение от меток.

maxy 07.05.2019 19:48

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

maxy 07.05.2019 20:27

Другие вопросы по теме