强化算法的pythonic实现,使用起来很有趣
torchreinforce的Python项目详细描述
torchreinforce
强化算法的pythonic实现,使用起来非常有趣
安装
您可以像安装任何其他python包一样使用pip安装它
pip install torchreinforce
快速启动
为了在模型中使用增强算法,您只需要做两件事:
- 使用
ReinforceModule
类作为基类 - 用
@ReinforceModule.forward
装饰您的
forward
函数
就这样
classModel(ReinforceModule):def__init__(self,**kwargs):super(Model,self).__init__(**kwargs)self.net=torch.nn.Sequential(torch.nn.Linear(20,128),torch.nn.ReLU(),torch.nn.Linear(128,2),torch.nn.Softmax(dim=-1),)@ReinforceModule.forwarddefforward(self,x):returnself.net(x)
您的模型现在将输出ReinforceOutput
对象。
此对象有两个重要功能
get()
reward(value)
您可以使用output.get()
获取覆盖分布的实际示例,并使用output.reward(value)
设置特定输出的奖励。
作为net
您的模型,您必须做类似的事情
action=net(observation)observation,reward,done,info=env.step(action.get())action.reward(reward)
等等,你刚才说的是配送吗?
是的!当强化算法声明模型的输出将用作概率分布函数的参数时。
实际上,您可以使用您想要的任何概率分布,ReinforceModule
构造函数确实接受以下参数:
gamma
强化算法的gamma参数(默认值:Categorical
)distribution
每ReinforceDistribution
或pytorch.distributions
分布(默认值:0.99)
像那样
net=Model(distribution=torch.distributions.Beta,gamma=0.99)
请记住,修饰的forward(x)
输出的输出将用作distribution
的参数。如果distribution
需要多个参数,只需返回一个列表。
我为发行版增加了在testing中有deterministic行为的可能性,并且我只为Categorical
发行版实现了它,如果您想实现自己的确定性逻辑,请检查文件distributions/categorical.py
,这非常简单
例如,如果您想使用torch.distributions.Beta
发行版,则需要执行类似于
classModel(ReinforceModule):def__init__(self,**kwargs):super(Model,self).__init__(**kwargs)...@ReinforceModule.forwarddefforward(self,x):return[self.net1(x),self.net2(x)]# the Beta distribution accepts two parametersnet=Model(distribution=torch.distributions.Beta,gamma=0.99)action=net(inp)env.step(action.get())
很好!训练怎么样?
您可以通过调用ReinforceModule
的loss()
函数来计算加固损失,而不是像对待任何其他pytorch损失函数那样对待它
net=...optmizer=...whiletraining:net.reset()forsteps:....loss=net.loss(normalize=True)optimizer.zero_grad()loss.backward()optmizer.step()
你必须在每集开始前 完整的示例如下: 您可以在ReinforceModule
调用reset()
函数。如果要规范化奖励,还可以将参数normalize
传递给loss()
。
组合在一起
classModel(ReinforceModule):def__init__(self,**kwargs):super(Model,self).__init__(**kwargs)self.net=torch.nn.Sequential(torch.nn.Linear(4,128),torch.nn.ReLU(),torch.nn.Linear(128,2),torch.nn.Softmax(dim=-1),)@ReinforceModule.forwarddefforward(self,x):returnself.net(x)env=gym.make('CartPole-v0')net=Model()optimizer=torch.optim.Adam(net.parameters(),lr=0.001)foriinrange(EPISODES):done=Falsenet.reset()observation=env.reset()whilenotdone:action=net(torch.tensor(observation,dtype=torch.float32))observation,reward,done,info=env.step(action.get())action.reward(reward)loss=net.loss(normalize=False)optimizer.zero_grad()loss.backward()optimizer.step()
examples/
文件夹中找到一个正在运行的示例。推荐PyPI第三方库