尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

PyTorch强化学习实战——用预训练语言模型和ChatGPT玩转文本游戏

PyTorch强化学习实战——用预训练语言模型和ChatGPT玩转文本游戏 PyTorch强化学习实战——用预训练语言模型和ChatGPT玩转文本游戏0. 前言1. Transformers2. ChatGPT2.1 设置2.2 交互模式2.3 ChatGPT API相关链接0. 前言文本互动小说 (interactive fiction) 是强化学习研究中一个独特而富有挑战性的领域。与图形丰富的街机游戏不同这类游戏通过纯文本描述呈现状态要求智能体理解自然语言、进行长期规划并在复杂的语义空间中决策。我们已经以微软 TextWorld 为实验平台学习了如何使用自然语言处理 (Natural Language Processing,NLP) 工具处理复杂的文本数据并在交互式小说游戏环境中进行实验在本节中我们将借助Hugging Face预训练Transformer和ChatGPT API展现大语言模型在文本游戏中的强大能力。通过从手工特征到预训练模型的演进我们将见证深度NLP技术如何赋能强化学习智能体。1. Transformers接下来我们将尝试使用预训练语言模型这已成为现代自然语言处理领域的事实标准。得益于 Hugging Face Hub 等公共模型库我们无需承担从零训练模型的高昂成本只需将预训练模型接入现有架构并对网络的一小部分进行微调以适应我们的数据集。现有模型种类繁多——尺寸规格、预训练数据集、训练技术等各不相同。但所有模型都采用统一API接口因此可以简单直接地集成到代码中。首先需要安装相关库。针对我们的任务需手动安装sentence-transformers包。安装完成后即可使用该库计算任意字符串句子的嵌入向量from sentence_transformersimportSentenceTransformertrSentenceTransformer(sentence-transformers/all-MiniLM-L6-v2)tr.get_sentence_embedding_dimension()384rtr.encode(You’re standing in an ordinary boring room)type(r)class ’numpy.ndarray’r.shape(384,)r2tr.encode([sentence 1,sentence 2],convert_to_tensorTrue)type(r2)class ’torch.Tensor’r2.shape torch.Size([2,384])在本节中我们使用了all-MiniLM-L6-v2模型它相对较小——有2200万个参数训练数据为12亿个词元。在本节中我们将使用高级接口直接输入字符串语句由库和模型完成所有转换工作。但该方案在需要时仍能提供充分的灵活性。preproc.TransformerPreprocessor类实现了与原有 Preprocessor 类(使用长短期记忆 (Long Short-Term Memory,LSTM) 进行嵌入)相同的接口。要使用Transformers训练智能体需要运行train_tr.py模块。在训练过程中Transformer模型的处理速度较慢这是因为Transformer模型比LSTM模型复杂得多但在20个和200个游戏上的训练动态表现更优。对比Transformer和基准模型的训练奖励和回合步数基准版本需要1000回合才能达到15步而Transformer模型只需要400回合。但在20个游戏的验证中奖励低于基准版本(最高分为2)。在200个游戏上的训练也呈现相同情况——智能体学习效率更高(以游戏数量衡量)但验证效果不佳。这可能是因为 Transformer 模型的容量要大得多——其生成的嵌入向量维度几乎是基线模型的20倍(384维对比20维)导致智能体更容易直接记忆正确的步骤序列而非尝试寻找高层次通用观测特征到动作的映射关系。2. ChatGPT为了完成对TextWorld的讨论我们继续尝试另一种方法——使用大语言模型 (Large Language Model,LLM)。自从2022年底公开发布后ChatGPT迅速流行起来彻底改变了聊天机器人和文本助手领域。接下来我们尝试将这项技术应用于解决TextWorld游戏问题。2.1 设置首先需要注册 OpenAI 账号。我们将从基于网页的交互式聊天开始实验但后续示例将使用ChatGPT API这需要在 https://platform.openai.com 生成API密钥。创建密钥后需将其设置到所用shell环境的OPENAI_API_KEY变量中。同时我们将使用langchain库与ChatGPT进行通信通过以下命令安装$ pipinstalllangchain langchain-openai2.2 交互模式在第一个示例中我们将使用基于网页的ChatGPT界面要求其根据房间描述和游戏目标生成游戏指令。代码位于chatgpt_interactive.py主要实现以下功能启动命令行指定游戏ID的TextWorld环境为ChatGPT创建包含操作说明、游戏目标和房间描述的提示词将提示词输出至控制台从控制台读取待执行的指令在环境中执行该指令重复步骤2-5直至达到步数限制或游戏通关。所以我们的任务是将生成的提示词复制并粘贴到 https://chat.openai.com 网页界面中ChatGPT将生成需要输入控制台的指令。(1)完整代码非常简洁仅包含一个执行游戏循环的play_game函数env_idregister_game(gamefilefgames/{args.game}{index}.ulx,request_infosEnvInfos(descriptionTrue,objectiveTrue),)envgym.make(env_id)在创建环境时我们仅要求获取两个额外信息房间描述和游戏目标。原则上这些信息都包含在自由文本观察值中因此可通过解析文本获取。但为方便起见我们直接要求TextWorld显式提供这些信息。(2)在play_game函数的开始部分我们重置环境并生成初始提示词defplay_game(env,max_steps:int20)-bool:commands[]obs,infoenv.reset()print(textwrap.dedent(\ Youre playing the interactive fiction game. Here is the game objective: %s Here is the room description: %s What command do you want to execute next? Reply with just a command in lowercase and nothing else. )%(info[objective],info[description]))print( Send this to chat.openai.com and type the reply...)为了避免ChatGPT输出冗长的内容我们可以要求其仅回复可输入游戏的指令。(2)随后我们执行循环直至游戏通关或达到步数限制whilelen(commands)max_steps:cmdinput( )commands.append(cmd)obs,r,is_done,infoenv.step(cmd)ifis_done:print(fYou won in{len(commands)}steps! fDont forget to congratulate ChatGPT!)returnTrueprint(textwrap.dedent(\ Last command result: %s Room description: %s Whats the next command? )%(obs,info[description]))print( Send this to chat.openai.com and type the reply...)print(fWasnt able to solve after{max_steps}steps, commands:{commands})returnFalse后续提示词更为简洁——我们只需提供获得的观察结果(即指令执行结果)和新的房间描述。由于网页界面会保持对话上下文无需重复传递游戏目标聊天机器人能记住之前的指令。(3)查看一个游戏测试(使用种子1)$ python3 chatgpt_interactive.py1可以看到大语言模型能够完美解决这个任务。同时整体任务难度实际上更高——我们要求其生成指令而非像本节前文那样从可用指令列表中做出选择。2.3 ChatGPT API由于复制粘贴操作繁琐乏味接下来我们使用ChatGPT API实现智能体自动化。我们将采用 langchain 库该库提供了足够的灵活性和控制力来发挥大语言模型的功能。(1)完整的代码位于文件chatgpt_auto.py中。接下来我们介绍核心函数play_game()fromlangchain_openaiimportChatOpenAIfromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderdefplay_game(env,max_steps:int20)-bool:prompt_initChatPromptTemplate.from_messages([(system,Youre playing the interactive fiction game. Reply with just a command in lowercase and nothing else),(system,Game objective: {objective}),(user,Room description: {description}),(user,What command you want to execute next?),])llmChatOpenAI()output_parserStrOutputParser()初始提示词与之前相同——向聊天机器人说明游戏类型并要求其仅回复可输入游戏的指令。(2)接着重置环境并生成第一条消息传递来自TextWorld的信息commands[]obs,infoenv.reset()init_msgprompt_init.invoke({objective:info[objective],description:info[description],})contextinit_msg.to_messages()ai_msgllm.invoke(init_msg)context.append(ai_msg)cmdoutput_parser.invoke(ai_msg)变量context至关重要它包含当前对话中的所有消息记录(包括用户和聊天机器人的消息)。我们将这些消息传递给聊天机器人以保持游戏进程的连续性。这是必要的因为游戏目标仅显示一次且不会重复。若没有历史记录智能体将缺乏足够信息来执行所需操作序列。另一方面传递大量文本可能导致成本上升(ChatGPT API按处理token数量计费)。我们的游戏流程较短(5-7步即可完成任务)因此不是主要问题但对于更复杂的游戏可能需要优化历史记录。(3)随后进入游戏循环其逻辑与交互版本非常相似只是无需控制台交互prompt_nextChatPromptTemplate.from_messages([MessagesPlaceholder(variable_namechat_history),(user,Last command result: {result}),(user,Room description: {description}),(user,What command you want to execute next?),])for_inrange(max_steps):commands.append(cmd)print(,cmd)obs,r,is_done,infoenv.step(cmd)ifis_done:print(fI won in{len(commands)}steps!)returnTrueuser_msgsprompt_next.invoke({chat_history:context,result:obs.strip(),description:info[description],})contextuser_msgs.to_messages()ai_msgllm.invoke(user_msgs)context.append(ai_msg)cmdoutput_parser.invoke(ai_msg)在后续提示中我们传递对话历史、上条指令的执行结果、当前房间描述并请求下一条指令。(4)同时我们设置了步数限制以防止智能体陷入循环(这种情况时有发生)。若游戏在20步内未能解决则退出循环print(fWasnt able to solve after{max_steps}steps, commands:{commands})returnFalse在20个TextWorld游戏(种子1-20)上对上述代码进行了测试成功解决了其中9个游戏。多数失败情况是由于智能体陷入循环——生成未被TextWorld正确解析的错误指令(例如使用 “take the key” 而非 “take the key from the box”)或在导航过程中卡住。有两个游戏中ChatGPT因生成 “exit” 指令而失败该指令会立即终止TextWorld进程。若能检测该指令或在提示中禁止其生成很可能提高通关率。但即便如此智能体未经任何预先训练就能解决9个游戏已是相当优异的结果。相关链接PyTorch强化学习实战1——强化学习Reinforcement LearningRL详解PyTorch强化学习实战2——强化学习环境库GymnasiumPyTorch强化学习实战3——Gymnasium API扩展功能PyTorch强化学习实战4——PyTorch基础PyTorch强化学习实战5——PyTorch Ignite 事件驱动机制与实践PyTorch强化学习实战6——交叉熵方法详解与实现PyTorch强化学习实战7——表格学习与贝尔曼方程PyTorch强化学习实战8——Q学习详解与实现PyTorch强化学习实战9——深度Q学习PyTorch强化学习实战10——强化学习高级组件PyTorch强化学习实战11——N步DQNN-step DQNPyTorch强化学习实战12——Double DQNDDQNPyTorch强化学习实战13——噪声网络NoisyNet-DQNPyTorch强化学习实战14——优先经验回放机制PyTorch强化学习实战15——Dueling DQNPyTorch强化学习实战16——Categorical DQNPyTorch强化学习实战17——强化学习训练加速PyTorch强化学习实战18——基于DQN处理股票交易问题PyTorch强化学习实战19——策略梯度法PyTorch强化学习实战20——优势演员-评论家Advantage Actor-Critic, A2CPyTorch强化学习实战21——异步优势演员-评论家Asynchronous Advantage Actor-Critic, A3CPyTorch强化学习实战22——将强化学习应用于TextWorld互动小说游戏
返回列表