Neural network 让一个ANN学会在一场吃水游戏中识别有利状态?
作为大学的家庭作业,我们的任务是创建一个简单的人工智能,它可以使用带有alpha-beta修剪的minimax算法玩一个绘图游戏。我们使用的其他技术取决于我们 在我们小组中,我们决定使用人工神经网络作为评估函数(主要是为了好玩),这样,随着时间的推移,它将学会识别对AI有利或不利的董事会状态。这确实意味着,在人工智能方面,我们是傻瓜 这是一个相当简单的前馈神经网络,有50个输入神经元(50个方格的棋盘),25个隐藏神经元在一层,还有1个输出神经元 输出在-1和1之间变化,较高的值表示对玩家有利的状态,较低的值表示不好的状态。它使用Neural network 让一个ANN学会在一场吃水游戏中识别有利状态?,neural-network,artificial-intelligence,reinforcement-learning,Neural Network,Artificial Intelligence,Reinforcement Learning,作为大学的家庭作业,我们的任务是创建一个简单的人工智能,它可以使用带有alpha-beta修剪的minimax算法玩一个绘图游戏。我们使用的其他技术取决于我们 在我们小组中,我们决定使用人工神经网络作为评估函数(主要是为了好玩),这样,随着时间的推移,它将学会识别对AI有利或不利的董事会状态。这确实意味着,在人工智能方面,我们是傻瓜 这是一个相当简单的前馈神经网络,有50个输入神经元(50个方格的棋盘),25个隐藏神经元在一层,还有1个输出神经元 输出在-1和1之间变化,较高的值表示对玩家有利的
tanh
作为激活功能
我们使用反向传播算法使其学习
通过反复展示一组输入和期望的输出,它实际上很好地学习了模式
我们首先进行一些初始训练,生成随机棋盘状态,并将目标值设置为“你的”棋子与“对手”棋子的比率,始终限制为[-1,1]。ANN似乎也很好地理解了这个模式
然而,我们也希望它从经验中学习,我们可以让它打几百场比赛,让它从中学习。因此,首先,我们进行了“初始训练”,然后,在每一场比赛之后,用伪代码,我们这样做:
learnRate = 0.05;
if ( the game was won ) {
desireability_adjust = 0.1f;
} else {
desireability_adjust = -0.1f;
}
foreach boardState in (board states recorded during play in reverse order) {
currentOutput = neuralnet.evaluate(boardState)
targetOutput = currentOutput + desireability_adjust * (1 - abs(currentOutput))
neuralnet.learn(boardState, targetOuput, learnRate)
// Decrease the desireability_adjust for every step
desireability_adjust *= 0.9;
}
这产生了非常复杂的结果。“有经验”的玩家经常输给刚从初始训练中出来的玩家,而经典的minimax玩家只是简单地计算棋子,却简单地屠杀了NN驱动的棋子
您建议对这种方法进行哪些更改,让NN学习游戏?让网络更大或更深会有什么作用?赛后学习算法有什么明显的缺点吗
编辑:
我将赛后算法改为此,而不是上面提出的“调整”方法:
learnRate = 0.1f;
if (win) {
resultValue = 0.95 // Not 1 because tanh cannot reach 1 or -1
} else {
resultValue = -0.95
}
// 0-based index is assumed
recordedstates = (list of states recorded during the game, in order)
for (index from recordedstates.length - 1 to 0) { {
t = (index / recordedstates.length - 1);
targetOutput = t * resultValue;
nn.learn(recordedstates[index], targetOutput, learnRate)
}
直觉是,目标值表示“向结果的进展”,其中值接近0表示游戏接近初始状态,-0.95和0.95分别表示接近输赢
家庭作业主要是关于minimax和alpha-beta,我们将举办一场比赛,看看谁创造了最好的人工智能。我们可能会输得很惨,但这可能会产生大量非常强大的对手球员进行训练。神经网络让我着迷,所以我可能会继续研究它
我还注意到,一些失去联系的网络经常变得“沮丧”,他们几乎会报告任何消极状态。希望上述新的学习方法能减少很多
EDIT:2我还添加了一些单元测试用例。最值得注意的是:
int[] hitPositionNearWin = {0,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, BLACKPIECE, EMPTY, EMPTY,
EMPTY, EMPTY, WHITEPIECE, EMPTY, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
};
我所期望的是,从黑人和白人玩家的角度来看,神经网络都会返回1,因为董事会总是从将要采取行动的玩家的角度进行评估,而在这里采取行动的人将获胜
目前,神经网络给出:
- 白色单打获胜:-0.04490412(预计接近1)
- 黑人单打获胜:0.08066118(预计接近1)
只剩下一块,分数就接近极限,因为这是一个获胜的位置,这是正确的。这听起来像是一项强化学习技巧的任务。看看时差学习。请看Tesauro的TD gammon文章。请注意,您可能需要在培训时使用探索节点。(双陆棋不需要探索,因为它可以从掷骰子中获得变化。) 有关强化学习的最佳介绍,请阅读 编辑:我认为你可以通过向前训练来学习(而不是你建议的向后训练)。让我用一些(受C启发的)伪代码来详细说明:
/* First initialize your neural net with random weights */
for( int i = 0; i < N_TRAINING_GAMES; i++ ){
board b = board_of_initial_state;
do {
movelist ml = find_all_legal_moves( b );
/* evaluate and score each move in the list of legal moves */
for(each move m in ml){
board b_tmp = do_move( b, m );
if (b_tmp == won_game_state)
m.score = +1.0;
else if (b_tmp == lost_game_state)
m.score = -1.0;
else
m.score = neuralnet_forward_calculate( b_tmp );
}
move m = pick_a_move_for_movelist( ml ); /* do not be greedy all time. Maybe use softmax. See Sutton & Barto Ch. 2 */
neuralnet_backpropagation( b, m.score );
b = do_move( b, m ); /* Update the board state */
} while( game_is_not_over( b ) );
}
/*首先使用随机权重初始化神经网络*/
对于(int i=0;i
我还没有在Drughts上测试过这段代码,但我想它会在几千场游戏后收敛。请告诉我你进展如何,因为这对我来说真的很有趣
另一个编辑:我在代码中指定了一些细节。希望这是清楚的。因此,在每次训练游戏中:
- 您在每次合法移动后评估董事会状态
- 然后你选择其中一个动作——以最高概率得分最高的动作。(使用softmax拾取)
- 然后在神经网络上进行反向传播 以原始板状态作为模式,然后选择下一个板 州的分数。(我想你必须多乘-1,因为它是从 其他玩家的观点。)
- 使用您选择的移动更新板