具体实施方式
下面结合附图和实施例详细说明本发明的实施方式。
本发明为一种基于因式分解机进行棋牌游戏行为克隆的方法,利用神经元相关技术,并使用因式分解机进行训练获取神经元之间的关联对结果影响的强弱,以此决定所构建神经网络的连接结构,然后通过将因式分解机自动生成的人工神经网络结构与其他模型结合进行最终训练实现行为克隆,可实现着重关注输入特征的重要组合,得到更好的克隆效果。参考图1,本发明主要包括如下步骤:
步骤1,选择离散输入特征作为输入,离散输入特征通过神经元是否激活的二元状态进行表示;其中,离散输入特征指取值为真假的输入特征或者表示类别的输入特征,输入特征指在棋牌游戏中,AI需要做决策时能够获取到的数据特征;对于每个取值为真假的输入特征,使用一个神经元进行表示,当输入特征取值为真时,用于表示该输入特征的神经元激活,计算时可用数字1表示,当输入特征取值为假时,用于表示该输入特征的神经元不激活,计算时可用数字0表示;对于每个表示类别的输入特征,更改为c个取值为真假的输入特征,分别表示是否输入c个类别的输入特征,其中c表示输入特征的类别数。
步骤2,训练因式分解机模型,通过更改模型并重新计算损失函数进行排序选取m组输入特征对进行组合,得到新增加的m个输入特征,该m个输入特征仍然各使用一个神经元进行表示,当其取值为真时,用于表示该输入特征的神经元激活,计算时可用数字1表示,当其取值为假时,用于表示该输入特征的神经元不激活,计算时可用数字0表示,其中m是一个超参数,根据具体的棋牌游戏特性进行调节。通过获取来自不同玩家的棋牌游戏历史记录并进行预处理,得到如步骤1中所述的神经元激活状态的表示,作为训练样本。
具体地,本步骤包括:
步骤2.1,构建一个隐向量长度为k的不指定输入特征数量的因式分解机模型,定义因式分解机隐向量权重为V、一次项权重为W、截距为B,并进行训练,使用SoftMax激活函数和交叉熵损失函数,从而使得V为一个三阶张量,形状是(k,t,r),其中t表示在每次进行此步骤构建时神经元的数量,r表示AI可以进行的动作的数量,W为一个矩阵,形状是(t,r),B为一个向量,得到因式分解机模型的计算公式如下:
其中k是一个超参数,根据具体的棋牌游戏特性进行调节;
步骤2.2,对于任意的两个神经元的组合构成的一对神经元i、j,将输入向量即全部输入特征的一次取值构成的向量记为x,将因式分解机模型的计算公式分别减去:
得到三个新模型,并分别重新评估损失函数的值,计算三个损失函数的最小值l,记录使l最大的前m对神经元,其中:
表示隐向量权重中神经元i和神经元j的组合对结果造成的影响,在实际运用中,其可预先计算以提高运行速度。由于V是一个三阶张量,因此Vf,i和Vf,j是两个向量,xi和xj分别表示输入向量中神经元i和神经元j对应的分量,因此xi和xj是两个表示真或假的数字,依据习惯,可将真表示为1,假表示为0;
步骤2.3,将所述m对神经元进行组合形成新的神经元作为新增的输入特征,组合方式为一一对应新增加m个神经元,m个神经元的激活条件为当且仅当使其生成的一对神经元都激活,即,m对神经元中的每对对应新增加的m个神经元中的一个,当某一对神经元都激活的时候,则其对应的神经元激活,否则其对应的神经元不激活,此处神经元之间的依赖关系即神经元之间的连接,也即自动生成了神经元连接。截止到最后一次执行后所得到的全部神经元即最终组合后的输入特征。
步骤3,重复进行步骤2,直至神经元数量大于设定的值l,其中l是一个超参数,根据具体的棋牌游戏特性进行调节。
步骤4,将最终组合后的输入特征连接一个模型重新训练。
具体地,本步骤包括:
步骤4.1,准备最终训练样本,最终训练样本与步骤2中所用训练样本相同,或与步骤2中所用训练样本不同,且数量少于步骤2中使用的训练样本数;相同时,没有单独的个性化的能力,不同时,如果是来自单个玩家的样本则可以实现个性化。例如,获取来自特定个体玩家或特定群体玩家的棋牌游戏历史记录并进行预处理,得到如步骤1中所述的神经元激活状态的表示,作为最终训练样本,则可以使最终得到的AI更加符合该特定个体玩家或特定群体玩家的习惯而不是一般玩家的习惯。
步骤4.2,以最终增加后的输入特征为输入特征,使用单个全连接层为模型,使用最终训练样本进行训练得到最终的棋牌AI。
每次神经元数量增加后,使用有向无环图的拓扑排序对神经元激活条件之间的关系进行预处理得到拓扑序,每次作为因式分解机和全连接层的输入时(也即每次进行步骤2.1和步骤4.2时),根据拓扑序依次计算神经元是否激活。
以下是本发明的两个具体实施例。
实施例1
以斗地主游戏出牌行为克隆部分监督学习和迁移学习人类样本为例,具体说明本发明的步骤与效果。
斗地主样本分为不同玩家产生的混合样本和单个玩家产生的少量特定样本,学习目标为学习出两个模型,分别是只根据混合玩家样本监督学习出的行为克隆大多数玩家的斗地主出牌AI-1和根据混合玩家样本进行预训练然后根据单个玩家样本迁移行为克隆单个玩家出牌习惯的斗地主出牌AI-2。
将完整的一局游戏进行预先处理,以获得玩家每次选择出牌行为时的输入特征和玩家选择的出牌行为,这里的出牌行为指的是玩家出的牌的牌型及是否不出牌,此处的不出牌指的是斗地主游戏中的“过”。
对于斗地主游戏决策来说,输入特征包括两部分,一部分来自智能体在当前场上可观测到的瞬时状态,一部分来自本局的历史信息。
其中瞬时状态表示为如下部分:
1、自己当前手牌的牌型;
2、最后被打出的牌,即当前智能体需要决定是否应该管上的牌的牌型;
3、最后被打出的牌的出牌人,即智能体需要决定当前是否应该管上的牌的出牌人;
4、敌人可能存在的牌的牌型,其中敌人可能存在的牌指的是不在自己手中且场上尚未被打出的牌;
5、上下家分别剩余的手牌的数量;
6、自己与地主的位置关系。
上述的牌型指的是一次可以打出的,可比较大小的牌,与花色无关。即3334和333K表示的是同一牌型,因为它们在斗地主中大小完全相等。因此牌型共有308种。
历史信息表示为如下部分:
1、对于上下家两位置来说,他们各自要不起的单牌的最小大小;
2、对于上下家两位置来说,他们各自剩余1张手牌的时候要不起的单牌的最小大小;
3、对于上下家两位置来说,他们各自剩余2张手牌的时候要不起的对牌的最小大小;
4、对于上下家两位置来说,他们各自剩余3张手牌的时候要不起的三牌的最小大小。
将上述所有信息各表示为c个取值为真假的输入特征,分别表示是否输入c个类别的输入特征,其中c表示输入特征的类别数,比如对于对于自己当前手牌的牌型,由于牌型的类别数是308,因此此信息可以用308个取值为真假的输入特征表示,取值为真时对应神经元激活,取值为假时对应神经元不激活,最终得到一组离散化输入特征,值为1时表示神经元激活,值为0时表示神经元不激活。
重复进行如下操作,直到神经元数量即输入特征数量达到1500:
1、构建一个隐向量长度为64的不指定输入特征数量的因式分解机模型,输出为样本中所出的牌型或不出牌经过规则过滤后的概率,使用SoftMax激活函数和交叉熵损失函数,使用混合玩家样本训练,得到权重三阶张量V形状是(k,t,r)、权重矩阵W形状是(t,r)和权重向量即截距B,长度是r,其中k即为隐向量长度,在此按照如上所述设置为64,t表示当前的神经元数量即输入特征数量,r表示斗地主出牌模型可以进行的动作的数量,由于斗地主出牌除了308种出牌牌型之外还包括不出牌,因此r为309。注意训练时添加V的L2正则化;具体的网络结构搭建中,把SoftMax激活函数与FM层相分离,把根据规则过滤输出插入到两者之间。
因式分解机计算公式如下:
2、对于任意的两个神经元的组合构成的一对神经元i、j,更改得到三个新模型,将输入向量即全部输入特征的一次取值构成的向量记为x,这三个新模型对于每个输入向量x,将因式分解机模型的计算公式分别减去:
对于得到的三个新模型重新评估损失函数的值,取三个损失函数的最小值l,取使l最大的前10组输入特征对;其中:
表示隐向量权重中神经元i和神经元j的组合对所出的牌造成的影响。可预先对其计算以提高运行速度。并且原本的因式分解机公式计算出的结果也事先进行保存,使得对于不同的i、j不进行冗余的计算。在计算中将真表示为1,假表示为0。
3、将这10组输入特征对进行组合形成新的输入特征,组合方式为一一对应新增加10个神经元,这10个神经元的激活条件为当且仅当使其生成的对应输入特征对中的两个神经元都激活,即,这10对神经元中的每对对应新增加的10个神经元中的一个,当某一对神经元都激活的时候,则其对应的神经元激活,否则其对应的神经元不激活,此处神经元之间的依赖关系即神经元之间的连接,也即自动生成了神经元连接。截止到最后一次执行后所得到的全部神经元即最终组合后的输入特征。
构建一个这1500余个神经元即最终组合后的输入特征为输入,样本中所出的牌型或不出牌经过规则过滤后的概率为输出的全连接层,使用SoftMax激活函数和交叉熵损失函数。
1、使用混合玩家样本训练,得到根据混合玩家样本监督学习出的行为克隆大多数玩家的斗地主出牌AI-1。
2、使用单个玩家样本训练,得到根据单个玩家样本迁移学习行为克隆单个玩家出牌习惯的斗地主出牌AI-2。
对于本实施例中提到的因式分解机和全连接层的输入特征,除原始的输入特征外,每次神经元数量增加后,使用有向无环图的拓扑排序对神经元激活条件之间的关系进行预处理得到拓扑序,每次作为因式分解机和全连接层的输入时根据拓扑序依次计算神经元是否激活。
以图2中所示的神经元的激活关系图为例,将神经元看作有向无环图中的节点,将神经元之间的连接看作有向无环图的边,然后对这个有向无环图进行拓扑排序得到P1,P2,P3,P4,P5,P6,P7,P8,P9这个拓扑序,注意拓扑排序可以得到多种拓扑序,只需要取其中任意一种即可,作为因式分解机和全连接层的输入时因为已知了P1到P5的激活状态,于是可以按照这个拓扑序依次计算P6,P7,P8,P9。从拓扑序的定义可知在计算每个节点是否激活时,这个节点所依赖的节点事先均已经得知是否激活。
实施例2
以黑白棋游戏行为克隆部分监督学习和迁移学习人类样本为例,具体说明本发明的步骤与效果。
黑白棋样本分为不同玩家产生的混合样本和单个玩家产生的少量特定样本,学习目标为学习出两个模型,分别是只根据混合玩家样本监督学习出的模仿大多数玩家的黑白棋AI和根据混合玩家样本进行预训练然后根据单个玩家样本迁移学习单个玩家落子习惯的黑白棋AI。
将完整的一局游戏进行预先处理,以获得玩家每次选择落子行为时的输入特征和玩家选择的落子行为,这里的落子行为指的是玩家落子的位置。
以黑白棋的64个位置是否为己方落子、是否为敌方落子、是否为空白位置为输入特征,共192个取值为真假的输入特征,即使用192个神经元表示。
重复进行如下操作,直到输入特征数量达到2000:
1、使用混合玩家样本训练一个隐向量长度为32的不指定输入特征数量的因式分解机模型,输出为样本中落子位置经过规则过滤后的概率,使用SoftMax激活函数和交叉熵损失函数,得到权重三阶张量V、权重矩阵W和权重向量B,注意训练时添加V的L2正则化;
2、对于任意的两个神经元的组合构成的一对神经元i、j,更改得到三个新模型,这三个新模型对于每个输入向量x,将因式分解机模型的计算公式分别减去:
对于得到的三个新模型重新评估损失函数的值,取三个损失函数的最小值l,取使l最大的前5组输入特征对;
3、将这5组输入特征对进行组合形成新的输入特征,组合方式为一一对应新增加5个神经元,这5个神经元的激活条件为当且仅当使其生成的对应输入特征对中的两个神经元都激活,该5个输入特征仍然各使用一个神经元进行表示,当其取值为真时,用于表示该输入特征的神经元激活,计算时用数字1表示,当其取值为假时,用于表示该输入特征的神经元不激活,计算时用数字0表示。
构建一个这2000余个神经元为输入,样本中落子位置经过规则过滤后的概率为输出的全连接层,使用SoftMax激活函数和交叉熵损失函数。
1、使用混合玩家样本训练,得到根据混合玩家样本监督学习出的行为克隆大多数玩家的黑白棋AI-1。
2、使用单个玩家样本训练,得到根据单个玩家样本迁移学习行为克隆单个玩家落子习惯的黑白棋AI-2。
对于本例中提到的因式分解机和全连接层的输入特征,除原始的输入特征外,每次神经元数量增加后,使用有向无环图的拓扑排序对神经元激活条件之间的关系进行预处理得到拓扑序,每次作为因式分解机和全连接层的输入时根据拓扑序依次计算神经元是否激活。