高效的控制策略使工业公司能够通过最大化生产力、减少非计划停机时间和能源消耗来增加盈利能力。寻找最佳的控制策略是一项复杂的任务,因为物理系统(如化学反应器和风力发电机)往往难以建模,而过程动力学的漂移可能导致性能随时间的推移而恶化。离线强化学习是一种控制策略,它允许工业公司完全基于历史数据构建控制策略,而无需明确的过程模型。这种方法不需要在探索阶段直接与过程进行交互,这消除了强化学习在安全关键应用中采用的障碍之一。在本文中,我们将使用亚马逊SageMaker和Ray的RLlib库构建一个端到端的解决方案,仅使用历史数据来寻找最佳的控制策略。要了解更多关于强化学习的信息,请参阅在亚马逊SageMaker上使用强化学习。
应用案例
工业控制涉及管理复杂系统,如生产线、能源网络和化工厂,以确保高效和可靠的运行。许多传统的控制策略基于预定义的规则和模型,这些规则和模型通常需要手动优化。在某些行业中,监测性能并在设备开始退化或环境条件发生变化时调整控制策略是标准做法。重新调整可能需要几周的时间,并且可能需要向系统注入外部激励以记录其在试错方法中的响应。
强化学习已经成为过程控制中的一种新范式,通过与环境进行交互学习最佳控制策略。这个过程需要将数据分解成三个类别:1)来自物理系统的可用测量值,2)可以对系统采取的动作集合,以及3)设备性能的数值度量(奖励)。训练一个策略来找到在给定观察下可能产生最高未来奖励的动作。
在离线强化学习中,可以在历史数据上训练一个策略,然后将其部署到生产环境中。本博客文章中训练的算法称为“保守Q学习”(CQL)。CQL包含一个“actor”模型和一个“critic”模型,并且旨在保守地预测在采取建议的动作后的性能。在本文中,将使用一个说明性的平衡车杆控制问题来演示该过程。目标是训练一个代理程序在同时将车推向指定目标位置的同时平衡杆子。训练过程使用离线数据,允许代理程序从现有信息中学习。这个平衡车杆案例研究演示了训练过程及其在潜在实际应用中的有效性。
解决方案概述
本文介绍的解决方案自动化部署了一个针对历史数据的端到端的离线强化学习工作流。以下图表描述了此工作流中使用的架构。测量数据由一台工业设备(在这里由AWS Lambda函数模拟)在边缘产生。数据被放入Amazon Kinesis Data Firehose,将其存储在Amazon Simple Storage Service(Amazon S3)中。Amazon S3是一种耐用、高性能且低成本的存储解决方案,可以向机器学习训练过程提供大量的数据。
AWS Glue对数据进行目录化,并使用Amazon Athena使其可查询。Athena将测量数据转换为强化学习算法可以摄入的格式,然后将其重新加载到Amazon S3中。Amazon SageMaker将这些数据加载到训练作业中,并生成一个训练好的模型。然后,SageMaker在SageMaker端点中提供该模型。工业设备随后可以查询该端点以接收动作建议。

图1:架构图显示了端到端强化学习工作流。
在本文中,我们将按以下步骤分解工作流:
- 制定问题。确定可以采取的动作,基于哪些测量进行建议,并确定每个动作的表现如何。
- 准备数据。将测量表转换为机器学习算法可以消耗的格式。
- 在该数据上训练算法。
- 根据训练指标选择最佳训练运行。
- 将模型部署到SageMaker端点。
- 评估模型在生产中的性能。
先决条件
要完成本教程,您需要一个AWS账户和一个已安装AWS SAM的命令行界面。按照以下步骤部署AWS SAM模板以运行此工作流并生成训练数据:
-
使用以下命令下载代码存储库
git clone https://github.com/aws-samples/sagemaker-offline-reinforcement-learning-ray-cql -
切换到存储库目录:
cd sagemaker-offline-reinforcement-learning-ray-cql -
构建存储库:
sam build --use-container -
部署存储库:
sam deploy --guided --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND -
使用以下命令调用一个bash脚本,该脚本使用AWS Lambda函数生成模拟数据。
sudo yum install jqcd utilssh generate_mock_data.sh
解决方案步骤
问题描述
本博文中的系统是一个带有平衡在顶部的杆的手推车。当杆直立且手推车位置接近目标位置时,系统表现良好。在先决步骤中,我们从该系统中生成了历史数据。
下表显示了从系统中收集的历史数据。
| 手推车位置 | 手推车速度 | 杆角度 | 杆角速度 | 目标位置 | 外部力 | 奖励 | 时间 |
|---|---|---|---|---|---|---|---|
| 0.53 | -0.79 | -0.08 | 0.16 | 0.50 | -0.04 | 11.5 | 5:37:54 PM |
| 0.51 | -0.82 | -0.07 | 0.17 | 0.50 | -0.04 | 11.9 | 5:37:55 PM |
| 0.50 | -0.84 | -0.07 | 0.18 | 0.50 | -0.03 | 12.2 | 5:37:56 PM |
| 0.48 | -0.85 | -0.07 | 0.18 | 0.50 | -0.03 | 10.5 | 5:37:57 PM |
| 0.46 | -0.87 | -0.06 | 0.19 | 0.50 | -0.03 | 10.3 | 5:37:58 PM |
您可以使用Amazon Athena查询历史系统信息,查询语句如下:
SELECT *
FROM "AWS CloudFormation Stack Name_glue_db"."measurements_table"
ORDER BY episode_id, epoch_time ASC
limit 10;
该系统的状态由车辆位置、车辆速度、杆的角度、杆的角速度和目标位置定义。每个时间步骤采取的动作是施加在车上的外力。模拟环境输出的奖励值在车辆离目标位置更近且杆更直立时较高。
准备数据
为了将系统信息呈现给强化学习模型,将其转化为具有将值分类为状态(也称为观察值)、动作和奖励类别的键的JSON对象。将这些对象存储在Amazon S3中。以下是从前面表格的时间步骤中生成的JSON对象的示例。
| {“obs”:[[0.53,-0.79,-0.08,0.16,0.5]], “action”:[[-0.04]], “reward”:[11.5] ,“next_obs”:[[0.51,-0.82,-0.07,0.17,0.5]]} |
| {“obs”:[[0.51,-0.82,-0.07,0.17,0.5]], “action”:[[-0.04]], “reward”:[11.9], “next_obs”:[[0.50,-0.84,-0.07,0.18,0.5]]} |
| {“obs”:[[0.50,-0.84,-0.07,0.18,0.5]], “action”:[[-0.03]], “reward”:[12.2], “next_obs”:[[0.48,-0.85,-0.07,0.18,0.5]]} |
AWS CloudFormation stack包含一个名为AthenaQueryToCreateJsonFormatedData的输出。在Amazon Athena中运行此查询以执行转换,并将JSON对象存储在Amazon S3中。强化学习算法使用这些JSON对象的结构来理解基于哪些值进行推荐以及在历史数据中采取行动的结果。
训练代理
现在我们可以开始训练作为推荐动作的模型。Amazon SageMaker允许您快速启动多个训练作业,以查看不同配置对生成的训练模型的影响。调用名为TuningJobLauncherFunction的Lambda函数来启动一个超参数调整作业,该作业在训练算法时使用四组不同的超参数。
选择最佳训练运行
要找出哪个训练作业生成了最佳模型,请检查训练过程中生成的损失曲线。CQL的评论家模型估计了演员在采取推荐动作后的表现(称为Q值)。评论家的损失函数的一部分包括时间差错误。此指标衡量了评论家Q值的准确性。寻找平均Q值高且时间差错误低的训练运行。论文《离线无模型机器人强化学习工作流程》详细介绍了如何选择最佳训练运行。代码存储库中有一个名为/utils/investigate_training.py的文件,它创建了一个plotly html图,描述了最新的训练作业。运行此文件并使用输出选择最佳训练运行。
我们可以使用平均Q值来预测训练模型的性能。Q值被训练为保守地预测折扣未来奖励值的总和。对于长时间运行的过程,我们可以通过将Q值乘以(1-“折扣率”)将该数字转换为指数加权平均值。在此集合中,最佳训练运行的平均Q值为539。我们的折扣率为0.99,因此该模型预测每个时间步骤至少为5.39的平均奖励。您可以将此值与历史系统性能进行比较,以判断新模型是否能超越历史控制策略。在此实验中,历史数据的每个时间步骤的平均奖励为4.3,因此CQL模型预测的性能比系统历史记录高出25%。
部署模型
Amazon SageMaker端点可以以多种不同方式提供机器学习模型,以满足各种用例。在本文中,我们将使用无服务器端点类型,以便我们的端点在需求增加时自动扩展,并且只有在端点生成推理时才支付计算使用费用。要部署无服务器端点,请在SageMaker端点配置的生产变体中包含一个ProductionVariantServerlessConfig。以下代码片段展示了如何使用Python的Amazon SageMaker软件开发工具包部署此示例中的无服务器端点。在sagemaker-offline-reinforcement-learning-ray-cql中找到用于部署模型的示例代码。
predictor = model.deploy(
serverless_inference_config=ServerlessInferenceConfig(
memory_size_in_mb=2048,
max_concurrency=200
),
<…>
)
训练好的模型文件位于每个训练运行的S3模型工件中。要部署机器学习模型,请找到最佳训练运行的模型文件,并调用名为“ModelDeployerFunction”的Lambda函数,其中包含此模型数据的事件。Lambda函数将启动一个SageMaker无服务器端点来提供训练好的模型。调用“ModelDeployerFunction”时使用的示例事件:
{ "DescribeTrainingJob":
{ "ModelArtifacts":
{ "S3ModelArtifacts": "s3://your-bucket/training/my-training-job/output/model.tar.gz"}
}
}
评估训练好的模型性能
现在是时候看看我们训练好的模型在生产中的表现了!要检查新模型的性能,请使用事件调用名为“RunPhysicsSimulationFunction”的Lambda函数,并在事件中指定SageMaker端点名称。这将使用端点推荐的操作运行模拟。调用RunPhysicsSimulatorFunction时使用的示例事件:
{"random_action_fraction": 0.0, "inference_endpoint_name": "sagemaker-endpoint-name"}
使用以下Athena查询来比较训练好的模型与历史系统性能:
WITH
sum_reward_by_episode AS (
SELECT SUM(reward) as sum_reward, m_temp.action_source
FROM "<AWS CloudFormation Stack Name>_glue_db"."measurements_table" m_temp
GROUP BY m_temp.episode_id, m_temp.action_source
)
SELECT sre.action_source, AVG(sre.sum_reward) as avg_total_reward_per_episode
FROM sum_reward_by_episode sre
GROUP BY sre.action_source
ORDER BY avg_total_reward_per_episode DESC
下面是一个示例结果表。我们可以看到训练好的模型的奖励是历史数据的2.5倍!此外,模型的真实性能比保守性能预测要好2倍。
| 操作来源 | 每个时间步骤的平均奖励 |
trained_model |
10.8 |
historic_data |
4.3 |
以下动画展示了训练数据中的一个样本回合与使用训练好的模型选择行动的回合之间的差异。在动画中,蓝色框是小车,蓝色线是杆子,绿色矩形是目标位置。红色箭头显示每个时间步骤对小车施加的力。训练数据中的红色箭头来回跳动,因为数据是使用50%的专家行动和50%的随机行动生成的。训练好的模型通过观察非专家演示完全学习了一个控制策略,可以快速将小车移动到目标位置并保持稳定。
![]() |
![]() |
清理
要删除此工作流程中使用的资源,请导航到Amazon CloudFormation堆栈的资源部分,并删除S3存储桶和IAM角色。然后删除CloudFormation堆栈本身。
结论
离线强化学习可以帮助工业公司利用历史数据自动化搜索最优策略,同时确保安全性。要在您的操作中实施这种方法,首先需要确定构成状态确定系统的测量值、您可以控制的动作以及指示所需性能的度量标准。然后,访问此GitHub存储库,了解使用Ray和Amazon SageMaker实现自动端到端解决方案的具体实现。
本文只是浅尝辄止,Amazon SageMaker RL的功能远不止于此。请尝试一下,并请通过Amazon SageMaker讨论论坛或您通常的AWS联系人向我们发送反馈意见。

