雑記: 積の微分公式の話

おかしい点がありましたらご指摘いただけますと幸いです。用語の定義は参考文献 3. に倣っていますが別の文献では異なる可能性があります。参考文献 3. を参考にしていますが解釈の誤りは筆者に帰属します。極限の定義に不明瞭なところがあると思います。
参考文献

  1. 積の微分公式とその証明の味わい | 高校数学の美しい物語
  2. 関数の連続性と微分可能性の意味と関係 | 高校数学の美しい物語
  3. Amazon | Matrix Differential Calculus with Applications in Statistics and Econometrics (Wiley Series in Probability and Statistics: Texts and References Section) | Jan R. Magnus, Heinz Neudecker | Calculus

※ キャラクターは架空のものです。

f:id:cookie-box:20190101155733p:plain:w60

積の微分公式ってありますよね。

f:id:cookie-box:20190101155733p:plain:w60

それはそうなんですが、まさにその記事で重要なテクニックとされている、「扱いにくいので以下のように二つの和に分解する」というのが素直な発想ではない気がしませんか? そこに気が付かないと詰んでしまいますよね?

f:id:cookie-box:20190101160814p:plain:w60

そ、そうかな…(この前多様体の接ベクトルを求めたときにもそのテクニックを使ったんだけど…)。

f:id:cookie-box:20190101155733p:plain:w60

そうです。そもそも微分ってよく以下のように説明されると思うのですけど、

 \phi(x)x=c微分可能  \, \overset{\rm def}{\Leftrightarrow} \; \displaystyle a \equiv \lim_{u \to 0} \frac{\phi(c + u) - \phi(c)}{u} が存在する
この定義の形だと、a とは何なのかわかりにくいですし、あと入出力をベクトルや行列に拡張しにくいですよね。だからなのかはわからないですが、行列の微分を扱う参考文献 3. ではこちらの形です。
 \phi(x)x=c微分可能  \, \overset{\rm def}{\Leftrightarrow} \; \exists a \in \mathbb{R} \quad {\rm s.t.} \quad  \phi(c+u) = \phi(c) + au + \mathcal{o}(u), \; \forall u \in \mathbb{R}
ここで、\mathcal{o}(\cdot)ランダウ記号のスモールオーで、関数 r(u) \displaystyle \lim_{u \to 0} \frac{r(u)}{u} = 0 であるときに r(u)\mathcal{o}(u) とかきかえて、「r(u)u よりも速く 0 に収束する」などといいますね。もちろん色々な関数が  \mathcal{o}(u) にかきかえられるので、一度 \mathcal{o}(u) にかきかえると元々の関数は復元できない、収束の速さにだけ注目した丸め記法といったところでしょうか。…こちらの定義の方がテイラー展開の形をしていて近似めいたことをしようとしているのだとわかりやすいでしょう? 無論このような a が存在したら前者の定義の式で求めることになるので前者の定義の式はつかうのですけど。

f:id:cookie-box:20190101160814p:plain:w60

テイラー展開がわかりやすいって人は既に微分の知識があるんじゃ…。

f:id:cookie-box:20190101155733p:plain:w60

それで、 d \phi(c;u) \equiv au のことを「起点 c における増分 u についての微分」と呼ぶそうです。微分係数 a \phi '(c) ともかき、起点 c の関数であることを意識すると導関数と呼ばれますね。本題に戻ると、いま積の微分 d(fg)(c;u) を知りたいというか、df(c;u), \; dg(c;u) との関係を知りたいわけです(参考文献 1. の記事では積の導関数  (fg)'(c) で考えていますが、導関数は増分 u によりませんから u をかけた d(fg)(c;u) を考えても同じ関係が得られるはずです)。テイラー展開形式の定義に基づいて示してみますね。

fg微分可能な起点 c を考えます。そこで共通の増分 u について以下が成り立ちますね。r_f(u)r_g(u)u よりも速く 0 に収束する残差です。
f(c+u) = f(c) + df(c;u) + r_f(u)
g(c+u) = g(c) + dg(c;u) + r_g(u)
これらの各辺どうしをかけ合わせるとこうなります。
 \begin{split} f(c+u)g(c+u) =& f(c)g(c) + f(c)dg(c;u) + g(c)df(c;u) \\ &+ f(c)r_g(u) + g(c)r_f(u) \\ &+ \bigl( df(c;u) + r_f(u) \bigr) \bigl( dg(c;u) + r_g(u) \bigr) \end{split}
ここで、f(c)g(c)u によりませんから、f(c)r_g(u) g(c)r_f(u)\mathcal{o}(u) にかきかえられます。また、
 \begin{split} \bigl( df(c;u) + r_f(u) \bigr) \bigl( dg(c;u) + r_g(u) \bigr) &= \bigl( f'(c)u + r_f(u) \bigr) \bigl( g'(c)u + r_g(u) \bigr) \\ &= f'(c)g'(c)u^2 + f'(c) r_g(u) u + g'(c) r_f(u) u + r_f(u) r_g(u) \end{split}
であり、この各項は u よりも速く 0 に収束するのでやはり \mathcal{o}(u) とかきかえられ、結局、
 f(c+u)g(c+u) = f(c)g(c) + f(c)dg(c;u) + g(c)df(c;u) + \mathcal{o}(u)
となりますが、これはテイラー展開の形式です。つまり、d(fg)(c;u) = f(c)dg(c;u) + g(c)df(c;u) であるといっていることに他なりません。
\square
ほら、テクニックを用いずに積の微分公式を示せたでしょう?

f:id:cookie-box:20190101160814p:plain:w60

テクニックが要らなくなった一方でちょいちょいランダウ記号に関する定理が前提とされているような…それに、テクニックを回避できたのはテイラー展開形式の定義にしたのが要因じゃないんじゃない? テクニックが回避できたのは、その証明が「(fg)(c+u) の一次近似は f(c+u) の一次近似と g(c+u) の一次近似の積からつくることができるはずだ」っていうあまり明らかじゃない出発点から始まっているからだと思う。だって、テイラー展開形式の定義にするにしても、素直に出発するなら、

 \begin{split} (fg)(c + u) &= (fg)(c) + d(fg)(c;u) + r_{fg}(u) \\ \Rightarrow d(fg)(c;u) &= (fg)(c + u) - (fg)(c) - r_{fg}(u) \\  &= f(c + u)g(c+u) - f(c)g(c) - r_{fg}(u) \\ &= f(c+u)g(c+u) - f(c)g(c+u) + f(c)g(c+u) -f(c)g(c) - r_{fg}(u)\\ &= g(c+u)df(c;u) + f(c)dg(c;u) + g(c+u)r_f(u) + f(c)r_g(u) - r_{fg}(u) \end{split}
ここまでは任意の u について成り立つ。残差部分が邪魔だから両辺を u で割ってから u \to 0 とすると、 (fg)'(c) = g(c)f'(c) + f(c)g'(c) を得る(∵ 積の極限は極限の積)。
\square
…こうするとやっぱり例のテクニックをつかう。上の3行目から4行目の式変形がそうだね。

f:id:cookie-box:20190101155733p:plain:w60

あれ、そういわれるとそんな気も…。

f:id:cookie-box:20190101160814p:plain:w60

それに、微分係数形式の定義でも「f'(c)g'(c) の積をとってみよう」という発想から出発するなら例のテクニックを回避できる気がするな。

 \begin{split} f'(c)g'(c) &= \displaystyle \left( \lim_{u \to 0} \frac{f(c + u) - f(c)}{u} \right) \left( \lim_{u \to 0} \frac{g(c + u) - g(c)}{u} \right) \\  &= \lim_{u \to 0} \frac{f(c + u) - f(c)}{u} \cdot \frac{g(c + u) - g(c)}{u} \\  &= \lim_{u \to 0} \frac{1}{u} \cdot \frac{f(c + u)g(c+u) - f(c+u)g(c) - f(c)g(c+u) + f(c)g(c)}{u} \\ &= \lim_{u \to 0} \frac{1}{u} \left( \frac{f(c + u)g(c+u) - f(c)g(c)}{u} \right. \\ & \qquad \qquad \quad \left. - \frac{f(c + u)g(c) - f(c)g(c)}{u} - \frac{f(c)g(c+u) - f(c)g(c)}{u} \right) \end{split}
上式が有限の値に収束しなければならないので、カッコ内は u \to 00 に収束しなければならない。であれば、 (fg)'(c) = g(c)f'(c) + f(c)g'(c) でなければならない。
\square
…どうだろう。例のテクニックっぽいっちゃぽいけど、例のテクニックと違って「経由点を差し挟む」という操作はせずに済む。

f:id:cookie-box:20190101155733p:plain:w60

え、えっと、なんかもう何が素直で何が素直でないのかわからなくなってきました…。

f:id:cookie-box:20190101160814p:plain:w60

「この証明の仕方は素直である」の真偽を問いたければこれを数学の言葉で定義しないといけないね。骨が折れそうだ。…そういえば、さっき「入出力をベクトルや行列に拡張」っていってたのは?

f:id:cookie-box:20190101155733p:plain:w60

あ、はい、ここまではスカラー変数をとるスカラー値関数の微分を考えていましたが、テイラー展開形式の定義はベクトル変数をとるベクトル値関数にも拡張できます。面倒なので文字を使い回します。\phi : \mathbb{R}^n \to \mathbb{R}^m として、

 \phi(x)x=c微分可能  \, \overset{\rm def}{\Leftrightarrow} \; \; \exists A \in \mathbb{R}^{m \times n} \;\; {\rm s.t.} \;\;  \phi(c+u) = \phi(c) + Au + \mathcal{o}(u), \;\; \forall u \in \mathbb{R}^n
です。ここで、\mathcal{o}(u) は入出力がベクトルのときは  \displaystyle \lim_{u \to \vec{0}} \frac{r(u)}{||u||} = \vec{0} を満たす関数 r(u) をかきかえたものとしてください。そして、A がどのような行列か知るには上の式の i 番目の成分をとります。
 \displaystyle \phi_i(c+u) = \phi_i(c) + \sum_{j=1}^m a_{ij}u_j + \mathcal{o}(u), \; \forall u \in \mathbb{R}^n
 \phi(x)x=c微分可能ならば上の a_{i1}, \cdots, a_{im} は存在しますが、他方、上の u u = t e_j t \in \mathbb{R}e_j \in \mathbb{R}^nj 番目の成分のみ 1 でその他の成分が 0 )とすると、a_{ij} は以下だったことがわかります。
 \displaystyle \phi_i(c+ t e_j) = \phi_i(c) + a_{ij} t + \mathcal{o}(t) \; \Leftrightarrow \; a_{ij} = \lim_{t \to 0} \frac{\phi_i(c + t e_j) - \phi_i(c)}{t}
上の  a_{ij} のことを  D_j \phi_i(c) とか \displaystyle \frac{\partial \phi_i(c)}{\partial x_j} などとかくということです。なお、各 a_{ij} が存在しても  \phi(x)x=c微分可能であるとは限りません。 \phi(x)x=c微分可能であるならば各 a_{ij} は存在し上式で求まるということです。この a_{ij} を各成分にもつ微分係数行列 A のことを D \phi(c) とかいてヤコビ行列ともよびます。d\phi(c;u) \equiv Auc における u についての微分になります。

f:id:cookie-box:20190101160814p:plain:w60

ヤコビ行列の行列式ヤコビアン)は確率変数を変換するときによくつかうね。

f:id:cookie-box:20190101155733p:plain:w60

はい。それで、\phi : \mathbb{R}^n \to \mathbb{R} のときに積の微分公式がどうなるかを考えてみます。このときヤコビ行列は  A \in \mathbb{R}^{1 \times n} で、形としては横ベクトルです。上の3つの証明のうち1番上の証明で考えますが、前半部分(「また、」の直前まで)は  c, u \in \mathbb{R}^n だろうと変わりません。その後が、

 \begin{split} \bigl( df(c;u) + r_f(u) \bigr) \bigl( dg(c;u) &+ r_g(u) \bigr) = \bigl( Df(c)u + r_f(u) \bigr) \bigl( Dg(c)u + r_g(u) \bigr) \\ &= Df(c)u \cdot Dg(c)u + D f(c)u \cdot r_g(u) + Dg(c)u \cdot r_f(u) + r_f(u) r_g(u) \end{split}
こうなりますが、これらが ||u|| で割っても u \to \vec{0}0 に収束するかを確認しなければなりません。しかし、これは大丈夫です。第1項から第3項には u が含まれているので(第1項は2つ含まれているうちのどちらでもいいですが)、||u|| で割ると単位ベクトルが残り、そこは u の長さに依存しなくなります。しかし、それでももう1つの ur_g(u)r_f(u) が残りますので u \to \vec{0}0 に収束します。第4項も ||u|| で割ってもなお u \to \vec{0}0 に収束します。なので、f,g がベクトル値をとるスカラー関数であっても積の微分公式 d(fg)(c;u) = f(c)dg(c;u) + g(c)df(c;u) は成立します。
\square

f:id:cookie-box:20190101160814p:plain:w60

なるほど。微分係数行列の定義に基づいてやるとこうかな。

 \begin{split} d(fg)(c;u) &= D(fg)(c)u = \displaystyle \sum_{j = 1}^{n} D_j(fg)(c)u_j = \sum_{j = 1}^{n} \left( \lim_{t \to 0} \frac{(fg)(c + t e_j) - (fg)(c)}{t} \right) u_j \\ &= \sum_{j = 1}^{n} \left( \lim_{t \to 0} \frac{f(c + t e_j)g(c + t e_j) - f(c)g(c + t e_j) + f(c)g(c + t e_j) - f(c)g(c)}{t} \right) u_j \\ &= \sum_{j = 1}^{n} \Bigl( g(c)D_jf(c) + f(c)D_jg(c) \Bigr) u_j  = f(c)dg(c;u) + g(c)df(c;u) \end{split}
\square
テイラー展開式で定義から出発するなら、以下の式変形まではスカラー変数のときと変わらないね。
 \begin{split} d(fg)(c;u) = g(c+u)df(c;u) + f(c)dg(c;u) + g(c+u)r_f(u) + f(c)r_g(u) - r_{fg}(u) \end{split}
ここまでは任意の u について成り立つ。残差部分が邪魔だから両辺を ||u|| で割ってから u \to \vec{0} とすると、 D(fg)(c) \hat{u} = g(c)Df(c) \hat{u} + f(c)Dg(c) \hat{u} を得る( \hat{u}u 方向の単位ベクトル)。任意の方向  \hat{u} についてこれが成り立つので結局  D(fg)(c) = g(c)Df(c) + f(c)Dg(c) が成り立つ。
\square
最後に、微分係数うしの積から出発する場合だけど、微分係数行列どうしはサイズ的にそのまま積が定義できないね。アダマール積を取らないといけないな。
 \begin{split} D_jf(c)D_jg(c) &= \displaystyle \left( \lim_{t \to 0} \frac{f(c + t e_j) - f(c)}{t} \right) \left( \lim_{t \to 0} \frac{g(c + t e_j) - g(c)}{t} \right) \\  &= \lim_{t \to 0} \frac{f(c + t e_j) - f(c)}{t} \cdot \frac{g(c + t e_j) - g(c)}{t} \\  &= \lim_{t \to 0} \frac{1}{t} \cdot \frac{f(c + t e_j)g(c+t e_j) - f(c+t e_j)g(c) - f(c)g(c+t e_j) + f(c)g(c)}{t} \\ &= \lim_{t \to 0} \frac{1}{t} \left( \frac{f(c + t e_j)g(c+t e_j) - f(c)g(c)}{t} \right. \\ & \qquad \qquad \quad \left. - \frac{f(c + t e_j)g(c) - f(c)g(c)}{t} - \frac{f(c)g(c+t e_j) - f(c)g(c)}{t} \right) \end{split}
上式が有限の値に収束しなければならないので、カッコ内は t \to 00 に収束しなければならない。 であれば、 D_j(fg)(c) = g(c)D_jf(c) + f(c)D_jg(c) でなければならない。任意の j = 1, \cdots, n についてこれが成り立つので結局  D(fg)(c) = g(c)Df(c) + f(c)Dg(c) でなければならない。
\square
じゃあベクトル値をとるスカラー関数じゃなくて、ベクトル値をとるベクトル関数どうしの積の微分はどうなるかっていうと…これも次元をそろえて片方を転置でもしないと関数どうしの積が定義できないね。

f:id:cookie-box:20190101155733p:plain:w60

結論からいえばそれも積が定義できる形にしてあれば同様の積の微分公式が成り立ちます。ただ、それを考えるならば微分の定義を行列を変数にとる行列関数の微分にまで拡張した方がもっと一般化して考えられます。行列を変数にとる行列関数の微分の定義は、F : \mathbb{R}^{n \times q} \to \mathbb{R}^{m \times p} として、

 F(X)X=C微分可能  \, \overset{\rm def}{\Leftrightarrow} \; \; \exists A \in \mathbb{R}^{mp \times nq} \;\; {\rm s.t.} \;\;  {\rm vec}F(C+U) = {\rm vec}F(C) + A{\rm vec}U + \mathcal{o}(U), \;\; \forall U \in \mathbb{R}^{n \times q}
です。\mathcal{o}(U) は入出力が行列のときは  \displaystyle \lim_{U \to O} \frac{R(U)}{||U||} = O を満たす関数 R(U) をかきかえたものとしてください。また、 ||U|| \equiv ( {\rm tr} \, U^{\top} U)^{1/2} です。 {\rm vec} X は行列 X を縦ベクトルにばらして縦に並べたものという意味です。沖本本の7章でよく似た  {\rm vech} 作用素というのがありましたが、あちらは行列の下三角にある成分を並べてベクトルにする作用素だったので少し違いますね。何にせよこの手のものは定義を要確認です。

f:id:cookie-box:20190101160814p:plain:w60

{\rm vec} 作用素を使うんだ。それだと形式はベクトル値をとるベクトル関数と同じになるね。

f:id:cookie-box:20190101155733p:plain:w60

ええ、それで微分は、{\rm vec} d F(C;U) \equiv A {\rm vec}U と定義されます。そうすると  d(FG)(C;U) = \bigl(dF(C;U) \bigr)G(C) + F(C)dG(C;U) が成り立つんですがもう疲れたので終わります…。

つづかない