<p>我正在尝试实现<a href="http://arxiv.org/abs/1406.2661">Adversarial NN</a>,这需要在交替训练小批量期间“冻结”图形的一部分或另一部分。一、 有两个子网:G和D</p>
<pre><code>G( Z ) -> Xz
D( X ) -> Y
</code></pre>
<p>其中<code>G</code>的损失函数依赖于<code>D[G(Z)], D[X]</code>。</p>
<p>首先需要训练D中所有G参数固定的参数,然后训练G中所有G参数固定的参数。第一种情况下的损失函数在第二种情况下为负损失函数,更新必须应用于第一子网还是第二子网的参数。</p>
<p>我看到tensorflow有<code>tf.stop_gradient</code>函数。为了训练D(下游)子网,我可以使用此函数来阻止梯度流</p>
<pre><code> Z -> [ G ] -> tf.stop_gradient(Xz) -> [ D ] -> Y
</code></pre>
<p><code>tf.stop_gradient</code>的注释非常简洁,没有内联示例(示例<code>seq2seq.py</code>太长,不太容易阅读),但看起来它必须在图形创建期间调用。<strong>这是否意味着,如果要以交替批处理方式阻止/取消阻止渐变流,则需要重新创建并重新初始化图形模型?</strong></p>
<p>似乎也不能用<code>tf.stop_gradient</code>来阻止通过G(上游)网络的梯度,对吧?</strong></p>
<p>作为替代方案,我看到可以将变量列表作为<code>opt_op = opt.minimize(cost, <list of variables>)</code>传递给优化器调用,如果可以获得每个子网范围内的所有变量,这将是一个简单的解决方案。<strong>对于tf.scope,可以得到一个<code><list of variables></code>?</strong></p>