- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是强化学习的新手。我最近学习了近似 q 学习,或基于特征的 q 学习,其中您通过特征描述状态以节省空间。我试图在一个简单的网格游戏中实现这一点。在这里,代理应该学会不进入火坑(由 f 发出信号),而是尽可能多地吃掉点。这是使用的网格:
...一个
.f.f
.f.f
...f
此处 A 表示代理的起始位置。现在,在实现时,我设置了两个功能。一个是 1/((到最近点的距离)^2),另一个是 (到火坑的距离) + 1。当代理进入火坑时,程序返回 -100 的奖励。如果它到达一个已经被访问过的非火坑位置(因此没有点可以被吃掉),奖励是 -50。如果它到达一个未访问的点,则奖励为 +500。在上面的网格中,无论初始权重是多少,程序永远不会学习到正确的权重值。具体来说,在输出中,第一个训练类(class)获得的分数(它吃了多少点)为 3,但对于所有其他训练类(class),分数仅为 1,权重收敛到错误的值 -125,权重为 1(到火坑的距离)和权重 2 的 25(到未访问点的距离)。是我的代码有什么特别的错误,还是我对近似 q 学习的理解不正确?
我曾尝试使用环境给予的奖励以及初始权重。这些都没有解决问题。这是整个程序的链接:https://repl.it/repls/WrongCheeryInterface
这是主循环中发生的事情:
while(points != NUMPOINTS){
bool playerDied = false;
if(!start){
if(!atFirepit()){
r = 0;
if(visited[player.x][player.y] == 0){
points += 1;
r += 500;
}else{
r += -50;
}
}else{
playerDied = true;
r = -100;
}
}
//Update visited
visited[player.x][player.y] = 1;
if(!start){
//This is based off the q learning update formula
pairPoint qAndA = getMaxQAndAction();
double maxQValue = qAndA.q;
double sample = r;
if(!playerDied && points != NUMPOINTS)
sample = r + (gamma2 * maxQValue);
double diff = sample - qVal;
updateWeights(player, diff);
}
// checking end game condition
if(playerDied || points == NUMPOINTS) break;
pairPoint qAndA = getMaxQAndAction();
qVal = qAndA.q;
int bestAction = qAndA.a;
//update player and q value
player.x += dx[bestAction];
player.y += dy[bestAction];
start = false;
}
我希望这两个权重仍然是正的,但其中一个是负的(那个给出了到火坑的距离)。
我还希望程序随着时间的推移学习到进入火坑是不好的,去一个未访问过的点也是不好的,但没有那么糟糕。
最佳答案
可能不是您想听到的答案,但是:
在近似 Q 学习之前,您是否尝试过实现更简单的表格 Q 学习?在您的设置中,只需几个状态和 Action ,它就会完美地工作。如果您正在学习,我强烈建议您从更简单的案例开始,以便更好地理解/直觉强化学习的工作原理。
您知道使用逼近器而不是学习确切的 Q 函数的含义吗?在某些情况下,由于问题的复杂性(例如,当状态空间是连续的时),您应该近似 Q 函数(或策略,取决于算法),但这可能会引入一些收敛问题。此外,在您的情况下,您正在尝试手动挑选一些特征,这通常需要对问题(即环境)和学习算法有深入的了解。
你了解超参数alpha 和gamma 的含义吗?你不能随意选择它们。有时它们对于获得预期结果至关重要,但并非总是如此,这在很大程度上取决于问题和学习算法。在您的情况下,查看您权重的收敛曲线,很明显您使用的 alpha 值太高了。正如您所指出的,在第一次训练后,您的体重保持不变。
因此,实用建议:
在尝试更复杂的事情之前,请务必使用表格 Q 学习算法解决您的网格游戏。
尝试不同的 alpha、gamma 和奖励值。
深入阅读有关近似 RL 的更多信息。一本非常好的易读的书(从零知识开始)是经典的萨顿和巴托的书:Reinforcement Learning: An Introduction ,您可以免费获取并于 2018 年更新。
关于c++ - 实现近似(基于特征)q 学习的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55545051/
所以我必须用以下方法来近似 Pi:4*(1-1/3+1/5-1/7+1/9-...)。它也应该基于迭代次数。所以函数应该是这样的: >>> piApprox(1) 4.0 >>> piApprox(1
输入:图 G 输出:多个独立集,使得一个节点对所有独立集的成员资格是唯一的。因此,节点与它自己的集合中的任何节点都没有连接。这是一个示例路径。 由于这里需要澄清,因此再次改写: 将给定的图划分为多个集
我已经使用查找表和低阶多项式近似实现了定点 log2 函数,但对整个 32 位定点范围 [-1,+1) 的准确度不太满意。输入格式为 s0.31,输出格式为 s15.16。 我在这里发布这个问题,以便
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
我的目标是近似二项式变量总和的分布。我使用以下纸张The Distribution of a Sum of Binomial Random Variables作者:肯·巴特勒和迈克尔·斯蒂芬斯。 我想
我知道有方法 approximate cubic Bezier curves ( this page 也是一个很好的引用),但是有没有更快的方法来逼近 N 次贝塞尔曲线?还是只能使用下面的概括? 来自
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它有助于我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注意
我是 C++ 和编码本身的初学者,所以请原谅任何词汇错误。我找不到这个具体问题,但在互联网上找到了类似的问题,但我仍然很难获得我需要的结果。 所以我使用莱布尼茨公式来近似 pi,即: pi = 4 ·
有多种方法可以通过显示名称查找联系人。例如这个答案Android - Find a contact by display name 但是我需要找到模糊匹配的联系人。例如如果找不到“Kim”,我需要返回
我一直在尝试使用以下代码使用级数表示来近似 e 以获得尽可能多的精度数字,但无论我计算多少项,精度数字的数量似乎都保持不变。即: 2.718281984329223632812500000000000
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
我做了很多随机的数学程序来帮助我完成作业(合成除法是最有趣的),现在我想反转一个激进的表达式。 例如,在我方便的 TI 计算器中我得到 .2360679775 好吧,我想将该数字转换为等效的无理数表达
我可以通过 CPU 分析器看到,compute_variances() 是我项目的瓶颈。 % cumulative self self total
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的可扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它
这是迄今为止我的代码, from math import * def main(): sides = eval(input("Enter the number of sides:"))
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它,
我是一名优秀的程序员,十分优秀!