我正在尝试实现汉明纠错码,为此我需要获取一个布尔向量(数据)并将其与布尔矩阵(汉明生成器矩阵)相乘,执行异或运算(而不是像 OR 那样) Eigen 的默认 bool 行为)。在这个简单的教程中可以找到我正在做的一个例子:http : //michael.dipperstein.com/hamming/
我不一定必须使用 Eigen,所以如果您有解决方案,请随时提出 Eigen 以外的其他建议。
因此,例如一些编译的 C++ 代码,但不能以正确的方式工作:
#include <Eigen/Dense>
#include <iostream>
using namespace std;
using namespace Eigen;
typedef Eigen::Matrix<bool, 4, 7> Matrix4by7Bool;
typedef Eigen::Matrix<bool, 1, 4> Vector4Bool;
int main()
{
Matrix4by7Bool gm;
gm << 0,1,1,1,0,0,0,
1,0,1,0,1,0,0,
1,1,0,0,0,1,0,
1,1,1,0,0,0,1;
Vector4Bool dm;
dm << 1,0,1,0;
cout << dm * gm;
}
Run Code Online (Sandbox Code Playgroud)
当前结果: 1 1 1 1 0 1 0
但我需要: 1 0 1 1 0 1 0
不同之处在于默认行为是先进行乘法运算,然后对每次乘法进行 OR 运算。由于我需要 XOR 而不是 …
问题是关于普通的非批量强化学习。基本上是被定义在这里在萨顿的书。我的模型训练,(呜呜!)虽然有一个元素让我感到困惑。
背景:
在持续时间得到奖励的环境中(如极点平衡),我们每一步有(比如)1 个奖励。在一集之后,在将这个 1 数组发送到训练步骤之前,我们进行标准折扣和标准化以获得回报:
returns = self.discount_rewards(rewards)
returns = (returns - np.mean(returns)) / (np.std(returns) + 1e-10) // usual normalization
Run Code Online (Sandbox Code Playgroud)
折扣奖励是常用的方法,但如果好奇,这里是要点。
所以奖励数组 [1,1,1,1,1,1,1,1,1] 变成了回报数组 [1.539, 1.160, 0.777, 0.392, 0.006, -0.382, -0.773, -1.164, - 1.556]。
鉴于基本背景,我可以问我的问题:
如果强制执行正回报,不鼓励负回报(在优化步骤中),那么无论情节的长度如何,大约前半部分的行动将被鼓励,后半部分将被阻止。这是真的,还是我误解了什么?
如果它不是真的,很想了解我做错了什么。
如果这是真的,那么我不明白为什么模型会训练,因为即使是表现良好的剧集也会阻止其后半部分的动作。
重申一下,这是非批量学习(因此回报与训练步骤中另一个情节的回报无关)。每一集之后,模型都会训练,而且训练得很好:)
希望这是有道理的,并且足够短,感觉像是一个适当的明确问题。