我是靠谱客的博主 含蓄小丸子,最近开发中收集的这篇文章主要介绍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
包
import torch
import torch.nn as nn
LinearFeatureBaseline()
类
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 Pytorch 代码解读 (14) -- maml_rl/baseline.pyMAML-RL Pytorch 代码解读 (14) – maml_rl/baseline.py所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复