【发布时间】:2018-09-17 00:52:01
【问题描述】:
我基本上是在玩复制 AlphaZero。它适用于一些小型游戏,但我正在尝试将其扩大到适用于更复杂的游戏。但是,现在我的网络经过 2-1000 万次移动训练后将充满 NaN。不幸的是,由于它不是确定性的,并且故障点发生在如此广泛的范围内,因此使用调试器并不是很有效。当我让 tfdbg 检查“has_inf_or_nan”时,训练 12000 个动作大约需要 5 分钟。所以调试器没有为我做任何事情,因为它需要很长时间才能遇到错误。
在这篇文章的最底部,我将描述模型的外观。
以下是我如何使用某些常见的 NaN 来源:
损失函数(具有 2 个输出的单一网络:策略(选择移动的几率)和价值(活跃玩家的棋盘位置质量)):
注意:move_result_placeholder 填充了一批移动,这些移动是蒙特卡洛树搜索的输出。由于大多数移动位置都是无效的,它通常充满 0 和 5-10,它们是代表选择该移动的几率的浮点数。我有一个断言,验证它们的总和为 1。在运行训练时,我也有断言验证没有一个输入是 NaN。在填充批次时,我从最后 1,000,000 个(棋盘状态、移动、奖励)的集合中随机选择。然后我将棋盘状态、动作和奖励输入到训练步骤中。
self.loss_policy = tf.losses.softmax_cross_entropy(self.move_result_placeholder, out_dense)
self.loss_value =
tf.losses.mean_squared_error(self.value_result_placeholder,
tf.reshape(self.out_value_layer, shape=[-1,]))
self.total_loss = self.loss_policy + self.loss_value
优化器(学习率 1e-4):
self.train_step = tf.train.AdamOptimizer(learning_rate=self.learning_rate_placeholder).minimize(self.total_loss, name="optimizer")
Softmax:
self.out_policy_layer = tf.nn.softmax(out_dense, name="out_policy_layer")
Batch Normalization(is_training 是一个占位符,训练时为 1,玩游戏时为 0)batch_norm_decay 为 .999:
input_bn = tf.contrib.layers.batch_norm(input_conv, center=True, scale=True, is_training=self.is_training, decay=self._config.batch_norm_decay)
正则化(层中所有权重的 L2 为 1e-4):
initializer=tf.contrib.layers.xavier_initializer()
if use_regularizer:
regularizer = tf.contrib.layers.l2_regularizer(scale=self._config.l2_regularizer_scale)
weights = tf.get_variable(name, shape=shape, initializer=initializer, regularizer=regularizer)
型号说明:
该模型是在 tensorflow 中创建的,包含一个 4x8x3 的输入层(批量大小为 1024)。这捕获了 4x8 棋盘的状态,以及自从玩家得分以来已经进行了多少次移动,以及在特定游戏中该棋盘状态出现了多少次。这会输入内核大小为 3x3 且 strides=1 的 conv2d 层。然后我应用 BatchNormalization tf.contrib.layers.batch_norm(input_conv, center=True, scale=True, is_training=self.is_training, decay=self._config.batch_norm_decay) 和 relu。在输入 relu 的末尾,大小为 4x8x64。
之后有 5 个残差块。在残差块之后,它一分为二。第一个是策略网络输出,它通过另一个卷积层运行,内核大小为 1x1,步长为 1,并进行批量归一化和 ReLU。此时它是 4x8x2,它被展平并穿过一个密集层,然后到一个 softmax 以输出 256 个输出,这些输出代表它将选择任何给定动作的几率。 256 个输出映射到 4x8 板,平面用于棋子移动的方向。所以第一个 4x8 会告诉你选择一块并将其移动到西北的几率。第二个会告诉你选择一块并将其移动到东北等的几率。
分割的另一边是值输出。在那一侧,它穿过一个卷积层,然后它被展平并穿过一个密集层,最后穿过一个 TanH,因此它输出一个值,告诉我们该板状态的质量。
所有层的权重都使用 L2 正则化 (1e-4)。
损失是策略方面的交叉熵和价值方面的均方误差,我正在使用 Adam 优化器。
【问题讨论】:
标签: python tensorflow machine-learning deep-learning