junxiaosong / AlphaZero_Gomoku

An implementation of the AlphaZero algorithm for Gomoku (also called Gobang or Five in a Row)
MIT License
3.23k stars 962 forks source link

关于pytorch训练无法收敛的问题 #130

Open hxb123622 opened 1 year ago

hxb123622 commented 1 year ago

作者您好,非常感谢您提供的这个非常棒的alpha go zero算法工程!感谢您能够百忙之中抽看去看我的问题:我使用pytroch去训练,发现loss值始终下降不下去,一直在6-7左右徘徊,不知到您是否有遇到过类似的问题?有什么解决的办法吗?(您在先前问题提到的explain_val=0的问题我也遇到过,但大部分情况都是有值的)

根据您往期的回答,您貌似是只在theano上完整训练过网络,我在使用该网络后得到了和您类似的loss曲线,所以我猜测是pytorch和theano的差异导致pytorch训练无法收敛。我将Theano训练出来的权重生成pytorch的权重文件拿来使用后,得到的结果仍然不理想,所以,是不是因为两者在前向传播的过程当中就存在不同? 我目前使用的版本是pytorch==1.12.0,cpu和gpu都试过,我还在pytroch==0.4.1上尝试过,但是还是没能解决问题。调试超参数貌似也不能很好的解决这个问题

hxb123622 commented 1 year ago

我在比对了pytorch版本和numpy版本的函数之后,我发现pytorch版本在出概率数组前的最后一个运算公式是log_softmax,而numpy版本则是softmax,这可能是pytroch版本无法使用的一个重要原因。

ljn114514 commented 1 year ago

您好,请问您的问题解决了吗,使用pytorch能否可以正常训练

hxb123622 commented 1 year ago

我目前可以训练的最好结果就是和模拟1000次的纯MCTS算法对战胜负为8:2,loss值从8下降到了3.9左右。和作者对战模拟5000次纯MCTS算法胜负9:1还有很大的差距,实际对战之后也确实发现算法不能用。但是我把作者训练好的theano权重转换成pytorch权重格式之后发现算法是可以正常使用的,和numpy版本和theano版本的下子格式是一样的。

唯二的改动就是把pytorch中的logsoftmax换成softmax以及将全连接层中的数组倒序排列(这个你看神经网络的中间特征图就能明白)。

如果你想训练自己的权重的话我建议你把pytorch中的logsoftmax换成softmax试试,记得把训练的公式也改一下(因为原公式默认输出的结果是经过了log运算的)

ljn114514 commented 1 year ago

感谢回复,您说的算法不能用是指和人类对战的效果很差吗,转换theano权重可以正常使用是和人类可以正常对战的意思吗

hxb123622 commented 1 year ago

感谢回复,您说的算法不能用是指和人类对战的效果很差吗,转换theano权重可以正常使用是和人类可以正常对战的意思吗

是的

ljn114514 commented 1 year ago

我目前可以训练的最好结果就是和模拟1000次的纯MCTS算法对战胜负为8:2,loss值从8下降到了3.9左右。和作者对战模拟5000次纯MCTS算法胜负9:1还有很大的差距,实际对战之后也确实发现算法不能用。但是我把作者训练好的theano权重转换成pytorch权重格式之后发现算法是可以正常使用的,和numpy版本和theano版本的下子格式是一样的。

唯二的改动就是把pytorch中的logsoftmax换成softmax以及将全连接层中的数组倒序排列(这个你看神经网络的中间特征图就能明白)。

如果你想训练自己的权重的话我建议你把pytorch中的logsoftmax换成softmax试试,记得把训练的公式也改一下(因为原公式默认输出的结果是经过了log运算的)

您好,想再问一下“全连接层中的数组倒序排列”是需要改动哪一行