Чтобы упростить вопрос и, надеюсь, ответ, я предоставлю несколько упрощенную версию того, что я пытаюсь сделать.
Установка фиксированных условий:
Допустим, у меня есть эти входы:
(возможные выходные данные возвращаются в качестве входных данных?):
Вот действия (выходные данные), которые может выполнять моя программа:
ЦЕЛИ программы - поддерживать гомеостаз:
ПРИМЕЧАНИЕ: заполняемость может колебаться от секунды к секунде в зависимости от внешних факторов, которые невозможно контролировать (скажем, люди свободно входят и входят в комнату). Единственный контроль, который имеет система, — это принудительное удаление людей из комнаты и/или предотвращение входа новых людей в комнату путем изменения максимальной вместимости, разрешенной в следующем цикле времени (скажем так, система может это сделать). Мы не хотим, чтобы система навязывала постоянное снижение производительности только потому, что она может поддерживать производство достаточного количества O2 в секунду только для 30 человек, работающих на полной мощности. У нас есть большой объем доступного O2, и потребуется некоторое время, прежде чем он будет исчерпан до опасного уровня, и потребуется, чтобы система принудительно уменьшила мощность.
Мой вопрос:
Может ли кто-нибудь объяснить мне, как я могу настроить эту нейронную сеть, чтобы она могла учиться на каждом действии (цикле), которое она предпринимает, отслеживая желаемые результаты. Моя проблема здесь заключается в том, что большинство статей, которые я нахожу по этой теме, предполагают, что вы знаете правильный выходной ответ (например: я знаю, что все входы A, B, C, D, E являются определенным значением, тогда выход 1 должен увеличиться на 0,1 цикла). в секунду).
Но чего я хочу, так это выполнить условия, которые я изложил в ЦЕЛЯХ выше. Таким образом, каждый раз, когда программа выполняет цикл и, скажем, решает попытаться увеличить количество циклов в секунду, и в результате доступный O2 либо уменьшается на меньшую величину, чем в предыдущем цикле, либо теперь снова увеличивается до 100 000, тогда этот вывод можно было бы считать более правильным, чем сокращение циклов в секунду или сохранение текущих циклов в секунду. Я упрощаю здесь, поскольку есть несколько переменных, которые могли бы создать «идеальный» результат, но я думаю, что понял, к чему стремлюсь.
Код:
Для этого тестового упражнения я использую библиотеку Swift под названием Swift-AI (в частности, ее модуль NeuralNet: https://github.com/Swift-AI/NeuralNet
Поэтому, если вы хотите адаптировать свой ответ в отношении этой библиотеки, это будет полезно, но не обязательно. Я больше просто ищу логику того, как настроить сеть, а затем настроить ее для первоначального и итеративного повторного обучения на основе тех условий, которые я перечислил выше. Я бы предположил, что в какой-то момент после достаточного количества циклов и различных условий у него будут соответствующие настройки весов, чтобы справиться с любыми будущими условиями, и переобучение будет становиться все менее и менее эффективным.
Это проблема управления, а не проблема прогнозирования, поэтому вы не можете просто использовать алгоритм обучения с учителем. (Как вы заметили, у вас нет целевых значений для обучения напрямую через обратное распространение.) Вы все еще можете использовать нейронную сеть (если вы действительно настаиваете). Посмотрите на обучение с подкреплением. Но если вы уже знаете, что происходит с уровнем кислорода, когда вы предпринимаете такое действие, как вытеснение людей, зачем вам узнавать такие простые факты путем миллионов оценок методом проб и ошибок, вместо того, чтобы кодировать их в модели?
Предлагаю посмотреть на модель прогнозирующего управления. Если ничего другого, вы должны изучить, как проблема оформлена там. Или, может быть, даже просто старый добрый ПИД-регулятор. Кажется очень простым сделать хорошую динамическую модель этого процесса с несколькими переменными состояния.
У вас может быть несколько неизвестных параметров в этой модели, которые вам нужно изучить «онлайн». Но простой ПИД-регулятор уже может допускать и компенсировать некоторую неопределенность. И гораздо проще настроить несколько параметров, чем изучать общую причинно-следственную структуру с нуля. Это можно сделать, но для этого нужно попробовать все возможные действия. Насколько известно вашему алгоритму, лучшее действие может состоять в том, чтобы навсегда сократить количество потребителей кислорода до нуля, убив их, а затем получить огромную награду за поддержание уровня кислорода с небольшими затратами энергии. Когда алгоритм ничего не знает о проблеме, ему придется перепробовать все, чтобы обнаружить эффект.
Еще одно продолжение: если мы возьмем, например, человеческое тело. Если бы я хотел заменить определенные системы искусственным интеллектом, я бы использовал что-то похожее на обучение с подкреплением, скажем, для дыхательной системы, если бы основной целью было поддержание O2 в кровотоке и на него влияли внешние системы, такие как ЧСС, частота дыхания и O2 в воздухе. легкие и т. д. Но я бы использовал нейронную сеть, чтобы, возможно, попытаться определить, было ли то, что я собирался съесть, ядовитым или нет. И, возможно, использовать backprop для обратной связи в зависимости от того, приведет ли это к рвоте, тошноте и т. д.?
1. Это описывает контролируемое обучение. NN хороши в этом, но у вас есть и другие отличные варианты, такие как классификатор случайного леса, который проще в использовании. Кроме того, по-прежнему можно использовать NN именно так, как вы хотели. Вам просто нужно как-то найти его веса. Если вы определяете функцию потерь (например, разница с целевым уровнем кислорода плюс потребление энергии за 2 часа), вы можете просто попробовать случайные веса и выбрать те, которые дают хорошие результаты (или использовать GA или стратегию развития). Но это будет на много медленнее, чем обратное распространение от меток.
2. (ML — это любой вид машинного обучения. Это больше похоже на... теорию управления?) Ваши действия влияют на следующее состояние, и цель — оптимизировать некоторую функцию стоимости. Решение (с обучением или без) зависит от того, как много вы знаете о процессе, например. знаете ли вы переходы состояний или нет.
Спасибо. Так что в основном я пытаюсь использовать молоток, чтобы забить шуруп. Я мог бы это сделать, но на самом деле это не лучший инструмент для работы. Так что, возможно, мой вопрос больше о том, когда лучше использовать нейронную сеть, а когда — модель машинного обучения. Верны ли эти утверждения: 1. NN- Если вывод является прогнозом, основанным на входных данных, а неизвестным является алгоритм для получения прогноза. (для обучения требуется некоторое количество известных входных данных с правильными выходными данными). 2. ML - есть ли действия, основанные на состоянии и изменении, которые известны, но цель состоит в том, чтобы улучшить их в сторону оптимизации с помощью переменной ctrl?