Neural network 让一个ANN学会在一场吃水游戏中识别有利状态?

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之间变化,较高的值表示对玩家有利的

作为大学的家庭作业,我们的任务是创建一个简单的人工智能,它可以使用带有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)
一个三层网络(1个隐藏、1个输入、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,因为它是从 其他玩家的观点。)
  • 使用您选择的移动更新板