<p>任何序列(或iterable)都可以通过简单的赋值操作解压成变量。唯一的要求是变量的数量和结构与序列相匹配。例如:</p>
<pre><code>t = (2, 4)
x, y = t
</code></pre>
<p>在本例中,标准文档中的zip()是“zip(),生成一个迭代器,从每个iterables.返回一种元组迭代器,其中第i个元组包含每个参数序列或iterables的第i个元素。所以,你的案子</p>
<pre><code>for param, dparam, mem in zip([Wxh, Whh, Why, bh, by],
[dWxh, dWhh, dWhy, dbh, dby],
[mWxh, mWhh, mWhy, mbh, mby]):
mem += dparam * dparam
param += -learning_rate * dparam / np.sqrt(mem + 1e-8)
lets say:
iterable1 = [Wxh, Whh, Why, bh, by]
iterable2 = [dWxh, dWhh, dWhy, dbh, dby]
iterable3 = [mWxh, mWhh, mWhy, mbh, mby]
here zip() returns [(Wxh, dWxh, mWxh), (Whh, dWhh, mWhh), (Why, dWhy, mWhy), (bh, dbh, mbh), (by, dby, mby)]
on 1st iteration:
param, dparam, mem = (Wxh, dWxh, mWxh)
so,
param = Wxh
dparam = dWxh
mem = mWxh
mem = mem + (dparam * dparam) = mWxh + (dWxh * dWxh)
param = param + (-learning_rate * dparam / np.sqrt(mem + 1e-8)) = Wxh + (-learning_rate * dWxh / np.sqrt(mWxh + (dWxh * dWxh) + 1e-8)
on 2nd iteration:
param, dparam, mem = (Whh, dWhh, mWhh)
so,
param = Whh
dparam = dWhh
mem = mWhh
an so on.
</code></pre>