勾配降下党青年局

万国のグラーディエントよ、降下せよ!

Euler vs DDIM

ComfyUI上でDDIMの実装が見たくて探していたのですが、こんな感じでした。あれ・・・Eulerを呼び出してるだけ・・・?というわけで確認していきます。

以下の記事を前提とする。
さんぷらーについて - 勾配降下党青年局


DDIMのデフォルト設定(\eta=0)のとき時刻t\to t-1の更新式は、
 
\begin{eqnarray}
x_{t-1} &=& \sqrt{\bar{\alpha}_{t-1}}\frac{1}{\sqrt{\bar{\alpha}_t}}(x_t - \sqrt{1-\bar{\alpha}_t}\epsilon_\theta(x_t, t))+\sqrt{1-\bar{\alpha}_{t-1}}\epsilon_\theta(x_t, t) \\
&=& \frac{1}{\sqrt{\alpha_t}}(x_t - \sqrt{1-\bar{\alpha}_t}\epsilon_\theta(x_t, t))+\sqrt{1-\bar{\alpha}_{t-1}}\epsilon_\theta(x_t, t) \\
&=&  \frac{x_t}{\sqrt{\alpha_t}} - \frac{\sqrt{1-\bar{\alpha}_t}}{\sqrt{\alpha_t}}\epsilon_\theta(x_t, t)+\sqrt{1-\bar{\alpha}_{t-1}}\epsilon_\theta(x_t, t) \\
&=&  \frac{x_t}{\sqrt{\alpha_t}} +(\sqrt{1-\bar{\alpha}_{t-1}} - \frac{\sqrt{1-\bar{\alpha}_t}}{\sqrt{\alpha_t}})\epsilon_\theta(x_t, t) \\
\end{eqnarray}

一方Eulerはx'_tを分散発散型の変数とすると、
 
\begin{eqnarray}
x'_{t-1} &=& x'_t + (\sigma_{t-1} - \sigma_{t})\epsilon_\theta(x_t, t) \\
&=& x'_t + (\frac{\sqrt{1-\bar{\alpha}_{t-1}}}{\sqrt{\bar{\alpha}_{t-1}}} - \frac{\sqrt{1-\bar{\alpha}_t}}{\sqrt{\bar{\alpha}_t}})\epsilon_\theta(x_t, t) \\
\end{eqnarray}
となります。ここで上記記事にあるように分散発散型を分散保存型に変換x_t = \sqrt{\bar{\alpha}_t}x'_tすると、
 
\begin{eqnarray}
\frac{x_{t-1}}{\sqrt{\bar{\alpha}_{t-1}}} &=& \frac{1}{\sqrt{\bar{\alpha}_t}}x_t + (\frac{\sqrt{1-\bar{\alpha}_{t-1}}}{\sqrt{\bar{\alpha}_{t-1}}} - \frac{\sqrt{1-\bar{\alpha}_t}}{\sqrt{\bar{\alpha}_t}})\epsilon_\theta(x_t, t) \\
&=& \frac{x_t}{\sqrt{\alpha_t}} +(\sqrt{1-\bar{\alpha}_{t-1}} - \frac{\sqrt{1-\bar{\alpha}_t}}{\sqrt{\alpha_t}})\epsilon_\theta(x_t, t)  \\
\end{eqnarray}

同じなんですね。全然知りませんでした。