Как Нейронная сеть может учиться на тестировании выходных данных по отношению к внешним условиям, которые она не может напрямую контролировать - PullRequest
1 голос
/ 07 мая 2019

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

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

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

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

  • A.текущий кислород в комнате (диапазон: от 0 до 1000 единиц для простоты - может быть нормализовано)
  • B.текущая занятость в комнате (от 0 до 100 человек при максимальной вместимости) ИЛИ / И может быть изменена на общее количество кислорода, используемого всеми людьми в комнате в секунду (от 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 секунд, чтобы восполнить дефицит в 10000 единиц на общую сумму 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

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

1 Ответ

2 голосов
/ 07 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...