<p>我发现文档很清楚,我将在这里粘贴伪代码算法:</p>
<p><strong>您的参数:</p>
<ul>
<li><code>learning_rate</code>:在1e-4和1e-2之间是标准的</li>
<li><code>beta1</code>:默认为0.9</li>
<li><code>beta2</code>:默认为0.999</li>
<li><code>epsilon</code>:默认为1e-08
<blockquote>
<p>The default value of 1e-8 for epsilon might not be a good default in general. For example, when training an Inception network on ImageNet a current good choice is 1.0 or 0.1.</p>
</blockquote></li>
</ul>
<hr/>
<p><strong>初始化:</strong></p>
<pre class="lang-py prettyprint-override"><code>m_0 <- 0 (Initialize initial 1st moment vector)
v_0 <- 0 (Initialize initial 2nd moment vector)
t <- 0 (Initialize timestep)
</code></pre>
<p><code>m_t</code>和<code>v_t</code>将跟踪每个网络参数的梯度及其平方的移动平均值。(因此,如果有1个参数,Adam将在内存中多保留2个参数)</p>
<hr/>
<p><strong>在每次迭代时{<cd7>},对于模型的每个参数:</p>
<pre class="lang-py prettyprint-override"><code>t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)
m_t <- beta1 * m_{t-1} + (1 - beta1) * gradient
v_t <- beta2 * v_{t-1} + (1 - beta2) * gradient ** 2
variable <- variable - lr_t * m_t / (sqrt(v_t) + epsilon)
</code></pre>
<hr/>
<p>这里<code>lr_t</code>与<code>learning_rate</code>有点不同,因为对于早期的迭代,移动平均值还没有收敛,所以我们必须通过乘以<code>sqrt(1 - beta2^t) / (1 - beta1^t)</code>来规范化。当<code>t</code>高(<code>t > 1./(1.-beta2)</code>)时,<code>lr_t</code>几乎等于<code>learning_rate</code></p>
<hr/>
<p>要回答你的问题,你只需要通过一个固定的学习率,保持<code>beta1</code>和<code>beta2</code>的默认值,也许修改<code>epsilon</code>,Adam就会变魔术:)</p>
<hr/>
<h3>链接RMSProp</h3>
<p>带<code>beta1=1</code>的Adam等价于带<code>momentum=0</code>的RMSProp。Adam的参数<code>beta2</code>和RMSProp的参数<code>decay</code>是相同的。</p>
<p>然而,RMSProp并没有保持梯度的移动平均值。但它可以保持势头,就像MomentumOptimizer一样。</p>
<h3>rmsprop的详细说明。</h3>
<ul>
<li>保持梯度平方的移动(贴现)平均值</li>
<li>用这个平均值的根除以梯度</li>
<li>(可以保持势头)</li>
</ul>
<hr/>
<p>下面是伪代码:</p>
<pre><code>v_t <- decay * v_{t-1} + (1-decay) * gradient ** 2
mom = momentum * mom{t-1} + learning_rate * gradient / sqrt(v_t + epsilon)
variable <- variable - mom
</code></pre>