我是靠谱客的博主 含蓄小丸子,这篇文章主要介绍MAML-RL Pytorch 代码解读 (14) -- maml_rl/baseline.pyMAML-RL Pytorch 代码解读 (14) – maml_rl/baseline.py,现在分享给大家,希望可以做个参考。

MAML-RL Pytorch 代码解读 (14) – maml_rl/baseline.py

文章目录

  • MAML-RL Pytorch 代码解读 (14) -- maml_rl/baseline.py
      • 基本介绍
        • 源码链接
        • 文件路径
      • `import` 包
      • `LinearFeatureBaseline()` 类

基本介绍

在网上看到的元学习 MAML 的代码大多是跟图像相关的,强化学习这边的代码比较少。

因为自己的思路跟 MAML-RL 相关,所以打算读一些源码。

MAML 的原始代码是基于 tensorflow 的,在 Github 上找到了基于 Pytorch 源码包,学习这个包。

源码链接

https://github.com/dragen1860/MAML-Pytorch-RL

文件路径

./maml_rl/baseline.py

import

复制代码
1
2
3
import torch import torch.nn as nn

LinearFeatureBaseline()

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class LinearFeatureBaseline(nn.Module): #### 这个类描述的是采用人类手工提取特征方法的baseline """ Linear baseline based on handcrafted features, as described in [1] (Supplementary Material 2). [1] Yan Duan, Xi Chen, Rein Houthooft, John Schulman, Pieter Abbeel, "Benchmarking Deep Reinforcement Learning for Continuous Control", 2016 (https://arxiv.org/abs/1604.06778) """ #### 声明继承了nn.Module()类,赋值输入信息的大小、_reg_coeff(含义目前未知),一个线性网络(输入大小是特征大小,输出是1维度,说明这本质是一个向量),对这个向量赋值全0的初始化。 def __init__(self, input_size, reg_coeff=1e-5): super(LinearFeatureBaseline, self).__init__() self.input_size = input_size self._reg_coeff = reg_coeff self.linear = nn.Linear(self.feature_size, 1, bias=False) self.linear.weight.data.zero_() #### 定义了一个特征大小的函数,输出的特征是两倍的输入特征加上4。 @property def feature_size(self): return 2 * self.input_size + 4 #### 做人工的特征处理。得到的是观测、观测的平方、三个与al变量相关的特征还有一个ones变量。 def _feature(self, episodes): ones = episodes.mask.unsqueeze(2) observations = episodes.observations * ones cum_sum = torch.cumsum(ones, dim=0) * ones al = cum_sum / 100.0 return torch.cat([observations, observations ** 2, al, al ** 2, al ** 3, ones], dim=2) def fit(self, episodes): #### 将一批数据里面的所有episode内容,整合成 “序列长度 x 特征大小” 这样的格式。“特征大小”实际上就是上一个函数的观测、观测的平方、三个与al变量相关的特征还有一个ones变量。具体意义暂时不明确。 # sequence_length * batch_size x feature_size featmat = self._feature(episodes).view(-1, self.feature_size) #### 将奖励转化成一维度的列向量。 # sequence_length * batch_size x 1 returns = episodes.returns.view(-1, 1) #### 赋值reg_coeff然后再设置一个单位矩阵eye。 reg_coeff = self._reg_coeff eye = torch.eye(self.feature_size, dtype=torch.float32, device=self.linear.weight.device) #### PyTorch中的函数torch.lstsq()实现了最小二乘法。这个函数有两个参数,分别对应了MSE里的张量Y和X。这个函数有两个返回值,前一个返回值包括了所有的权重值,后一个返回值是QR分解的结果。torch.matmul作用是两个张量的矩阵乘积。这里使用torch.lstsq()方法主要是用最小二乘法获得一个网络的权重。那么这个二乘法的Y变量是“ 特征变量的转置 × 回报序列 ”,X变量是“ 特征变量的转置 × 特征变量 + 基于参数的对角阵 ”。获得的是这个“ 网络 ”的系数。 for _ in range(5): #### 采用try结果是将报错(算不出来)的时候 reg_coeff 在原本基础上增加 10 以实现继续迭代 try: coeffs, _ = torch.lstsq( torch.matmul(featmat.t(), returns), torch.matmul(featmat.t(), featmat) + reg_coeff * eye ) break except RuntimeError: reg_coeff += 10 #### 否则就报错。 else: raise RuntimeError('Unable to solve the normal equations in ' '`LinearFeatureBaseline`. The matrix X^T*X (with X the design ' 'matrix) is not full-rank, regardless of the regularization ' '(maximum regularization: {0}).'.format(reg_coeff)) #### 最后将二乘法的转置赋值给线性网络的变量 self.linear.weight.data = coeffs.data.t() #### 类似与神经网络一样的前馈函数。 def forward(self, episodes): features = self._feature(episodes) return self.linear(features)

最后

以上就是含蓄小丸子最近收集整理的关于MAML-RL Pytorch 代码解读 (14) -- maml_rl/baseline.pyMAML-RL Pytorch 代码解读 (14) – maml_rl/baseline.py的全部内容,更多相关MAML-RL内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部