我正在努力让人工神经网络玩电子游戏,我希望能从这里的精彩社区获得一些帮助.
我已经确定了暗黑破坏神2.因此,游戏玩法是实时的,并且从等角度的角度来看,玩家控制着摄像机所在的单个化身.
为了使事情具体化,任务是获得你的角色x经验值,而不将其生命值降为0,通过杀死怪物获得经验值.以下是游戏玩法的示例:

现在,由于我希望网络仅根据屏幕上的像素获得的信息进行操作,因此必须学习非常丰富的表示以便有效地发挥作用,因为这可能需要它(至少隐含地)知道如何将游戏世界划分为对象以及如何与它们进行交互.
所有这些信息都必须以某种方式传授给网络.我不能为我的生活想到如何培养这件事.我唯一的想法就是有一个单独的程序从屏幕上直观地从游戏中提取一些好的/坏的东西(例如健康,黄金,经验),然后在强化学习过程中使用该属性.我认为这将是答案的一部分,但我认为这还不够; 从原始视觉输入到目标导向行为的抽象层次太多,这种有限的反馈在我的一生中训练网络.
所以,我的问题是:你还有什么其他的方法来训练网络至少完成这项任务的某些部分?最好不要制作数千个带标签的例子......
只是为了更多方向:我正在寻找其他一些强化学习来源和/或任何用于在此设置中提取有用信息的无监督方法.或者,如果您可以想到一种将标记数据从游戏世界中取出而无需手动标记的方法,则可以采用监督算法.
UPDATE(04/27/12):
奇怪的是,我仍然在努力,似乎正在取得进展.让ANN控制器工作的最大秘诀是使用适合该任务的最先进的ANN架构.因此,我一直在使用一个深层次的信念网络,这是由我用无人监督的方式训练的因素条件限制Boltzmann机器(在我玩游戏的视频中),然后使用时间差异反向传播进行微调(即用标准进行强化学习)前馈人工神经网络.
仍在寻找更有价值的输入,特别是关于实时动作选择的问题以及如何编码用于ANN处理的彩色图像:-)
UPDATE(15年10月21日):
记得我在今天回答了这个问题,我想应该提一下,这不再是一个疯狂的想法.自从我上次更新以来,DeepMind发布了他们的自然论文,用于通过视觉输入获取神经网络来玩atari游戏.事实上,唯一阻止我使用他们的架构来玩,暗黑2的有限子集是缺乏对底层游戏引擎的访问.渲染到屏幕然后将其重定向到网络的速度太慢,无法在合理的时间内进行训练.因此,我们可能不会很快看到这种机器人在玩暗黑破坏神2,但这只是因为它会播放某些东西,无论是开源还是对渲染目标的API访问.(也许是地震?)
machine-learning video-processing computer-vision reinforcement-learning neural-network
我知道SVM被认为是'ANN杀手',因为它们会自动选择表示复杂性并找到全局最优(这里有一些SVM称赞引用).
但这里我还不清楚 - 所有这些优势主张只针对2级决策问题的情况还是更进一步?(我认为它们适用于非线性可分类,否则没有人会关心)
所以我想要澄清一些案例的样本:
我不希望有人回答所有这些lil'子问题,而是在实践中给出SVM优于常见ANN等价物(例如FFBP,循环BP,Boltzmann机器,SOM等)的一般界限.并且优选地,理论上也是如此.
我正在尝试让代理人学习在强化学习环境中最好地执行某些任务所必需的鼠标移动(即奖励信号是学习的唯一反馈).
我希望使用Q学习技术,但是当我找到一种方法将这种方法扩展到连续状态空间时,我似乎无法弄清楚如何适应连续动作空间的问题.
我可以强迫所有鼠标移动到一定幅度并且只在一定数量的不同方向上移动,但是使动作离散的任何合理方式都会产生巨大的动作空间.由于标准Q学习需要代理评估所有可能的动作,因此这种近似并不能解决任何实际意义上的问题.
algorithm machine-learning reinforcement-learning q-learning
我一直在渲染我之前编写的一些matlab代码,在此过程中,matlab由于分段错误而开始崩溃.我将问题缩小为单一类型的计算:分配给多个结构属性.
例如,即使这种形式的自我分配最终会在执行数千次时导致seg错误:
[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;
我最初假设这必须是某种类型的内存泄漏,所以尝试在每次迭代后打印出java的可用内存,但这仍然是相当稳定的.
所以是的,现在完全不知道为什么会破坏: - /
更新:以下更改修复了seg faulting:
temp = [my_class_instance.my_struct_vector];
[temp.my_property] = temp.my_property;
[my_class_instance.my_struct_vector] = temp;
现在的问题是为什么这会解决任何问题.关于重复访问句柄类而不是结构列表的事情可能呢?
更新2:地图更厚
我终于复制了问题,并使用一个简单的虚拟程序来解决这里:
一个简单的类:
classdef test_class
properties
test_prop
end
end
Run Code Online (Sandbox Code Playgroud)
还有一个程序,它会对类进行一系列向量分配,并且总会崩溃.
test_instance = test_class();
test_instance.test_prop = struct('test_field',{1 1});
for i=1:10000
[test_instance.test_prop.test_field] = test_instance.test_prop.test_field;
end
Run Code Online (Sandbox Code Playgroud)
更新3:剧情薄弱
事实证明我发现了一个错误.根据Matlab技术支持,类属性的重复向量分配根本不适用于R2011a(可能在早期版本中).他告诉我它在R2012a中工作正常,然后提到了我发现的相同解决方法:使用临时变量.
是的...
非常肯定这个问题以支持票结束,但如果有任何大胆的人想要为这个错误存在的原因拍摄,我肯定仍然对这样的答案感兴趣.(学习很有趣!)
所以,我最近开始定期使用Matlab的内置分析器,我注意到虽然它通常很好地显示哪些线占用了最多的时间,但有时它会告诉我大量的时间正在循环end语句中使用for.
现在,看到这样一条线只是用来表示循环的结束,我无法想象它如何使用除了微不足道的处理之外的任何东西.
我已经在matlab中心看到了这个问题的特定版本,但似乎没有达成共识.
编辑:这是这个问题的最小例子:
for i =1:1000
x = 1;
x = [x 1];
% clear x;
end
Run Code Online (Sandbox Code Playgroud)
即使您取消注释clear,该end行仍然需要大量计算(大约20%),并且clear实际上增加了结束行执行的绝对计算量.
所以,一些背景:我正在使用一个名为cheat engine的内存扫描程序来获取非开源视频游戏中的游戏统计数据(例如hp,mana,exp)的实时值,我正在尝试制作机器人.
为了让我的机器人有效地使用这些信息,我需要及时从欺骗引擎(或具有类似功能的任何内存扫描程序)到我的机器人代码.
现在,一个显而易见的方法是将所有信息保存到文件中,然后在我的机器人代码中加载文件,但由于这些数据需要大约每半秒更新一次,这不是一个真正的解决方案.
我真正需要的是一个非常方便的内存扫描程序,它允许您在一些编程语言(最好是java,c或matlab)中使用您发现的信息作为一组变量,或者访问一个中找到的内存地址的方法上述语言
后一种选择应该是可行的,因为作弊引擎提供了内存地址,控制进程ID和数据类型.
我一直在尝试实现这里描述的算法,然后在同一篇论文中描述的"大动作任务"上测试它.
算法概述:

简而言之,该算法使用下面所示形式的RBM通过改变其权重来解决强化学习问题,使得网络配置的自由能等于为该状态动作对给出的奖励信号.
为了选择动作,算法在保持状态变量固定的同时执行gibbs采样.有足够的时间,这会产生具有最低自由能的动作,因此是给定状态的最高奖励.
大型行动任务概述:

作者的实施指南概述:
具有13个隐藏变量的受限Boltzmann机器在具有12位状态空间和40位动作空间的大动作任务的实例化上被训练.随机选择了13个关键状态.该网络运行了12000次,学习率从0.1到0.01,在整个培训过程中,温度从1.0到0.1呈指数级增长.每个迭代都以随机状态初始化.每个动作选择包括100次Gibbs采样迭代.
重要的遗漏细节:
我的实施:
我最初假设作者没有使用指南中描述的机制,所以我尝试在没有偏置单元的情况下训练网络.这导致了近乎机会的表现,这是我的第一个线索,即使用的某些机制必须被作者视为"显而易见",因此被省略.
我玩了上面提到的各种省略机制,并通过使用以下方式获得了我最好的结果:
但即使进行了所有这些修改,我在任务上的表现通常在12000次迭代后的平均奖励为28.
每次迭代的代码:
%%%%%%%%% START POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data = [batchdata(:,:,(batch)) rand(1,numactiondims)>.5];
poshidprobs = softmax(data*vishid + hidbiases);
%%%%%%%%% END OF POSITIVE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hidstates = softmax_sample(poshidprobs);
%%%%%%%%% START ACTION SELECTION PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if test
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,0);
else
[negaction poshidprobs] = choose_factored_action(data(1:numdims),hidstates,vishid,hidbiases,visbiases,cdsteps,temp);
end
data(numdims+1:end) = negaction > rand(numcases,numactiondims);
if mod(batch,100) == 1
disp(poshidprobs);
disp(min(~xor(repmat(correct_action(:,(batch)),1,size(key_actions,2)), key_actions(:,:))));
end
posprods …Run Code Online (Sandbox Code Playgroud) matlab artificial-intelligence machine-learning bayesian-networks reinforcement-learning
所以,我最近从Mathematica转换为Matlab,虽然Matlab具有Mathematica的大部分有用功能,但我无法弄清楚如何执行相当于Mathematica的延迟设置操作':=',它将变量赋值给a懒散的时尚.
例如,在Mathematica中:
y = 2;
x:= y;
y = 3;
X
将x的值赋予3,而我在Matlab中获得相同行为的唯一方法是:
y = 2;
x = @()(y);
y = 3;
X()
虽然在技术上回答了我的问题,但它是一个非常特别的工作,需要将x作为一个函数来处理.
那么有更自然的方法来做到这一点是Matlab吗?
编辑:
我的ad-hoc解决方案仅在y是句柄类的字段时才起作用,为了清楚起见,我把它留在了代码之外(它应该是someclass.y).我的问题的答案最好不会有这个限制,但如果确实如此,我仍然会接受.
matlab wolfram-mathematica lazy-evaluation delayed-execution
具体来说,我试图从游戏'小行星'的截图中提取所有相关的线段.我已经查看了各种边缘检测方法,但似乎没有一个方法适合我的问题有两个原因:
它们检测平滑的轮廓,而我只需要检测直线段,而只检测一定长度范围内的直线段.现在,这些约束应该使我的任务比一般情况更容易,但我不想只使用一个完整的边缘检测器,然后清除曲线的结果,因为这将是非常昂贵的.速度对我的目的至关重要.
它们输出修改后的图像,其中边缘是高光,而我想要一组像素坐标来描绘检测到的线段的端点.或者,每个段中包括的所有像素的列表也将起作用.
我有一个暗示,一个可能的解决方案将涉及霍夫变换,但我不知道如何使用它来获得线段的实际位置(即像素空间中的端点).虽然我做了,但我不知道这是否是最简单或最有效的做事方式,因此问题标题的一般措辞.
最后,这是一个示例图像:

请注意,所有主线的长度和密度都相似,并且整体图像对比度非常高.我希望我的问题的解决方案将利用这些功能,因为再次,效率是至关重要的.
需要注意的是:虽然这个上下文中的大多数线段都是多边形的一部分,但我不想要一个依赖于这个事实的解决方案.
image-processing feature-extraction computer-vision edge-detection
作为我正在处理的软件包的一部分,我需要为特定于应用程序的文本文件实现解析器.我已经在纸上指定了这些文件的语法,但我很难将其转换为易于阅读/可更新的代码(现在只需通过大量的switch语句传递每行).
那么,在Java风格的OO环境中实现解析器是否有任何好的设计模式?