スポンサーリンク

「合成関数の微分法」【解析学の基礎シリーズ】1変数実数値関数の微分編 その3

微分法

本記事の内容

本記事は合成関数の微分法について説明し、証明する記事です。
また、なぜ合成関数の微分法について考えないといけないのか、その1例を簡単にではありますが説明します。

本記事を読むにあたり、微分係数、導関数について知っている必要があるため、その際は以下の記事を参照してください。

合成関数の微分法に入る前に…

伏線を張っておくと、合成関数の微分法は至るところで使われます。
もはや呼吸をするかの如く使います。

平たく言えば、微分法というのは「ある瞬間の変化量に着目した分野」です。
例えば、簡単な例ですが、距離を微分すると速度になります。
というのも、速度とは単位時間(1秒やら1分やら1時間やら)あたりに進む距離のことを指すからです。
距離を微分すると、「ある瞬間に進む距離」となりますので、これはまさに速度です。

この速度の例のように簡単な現象もありますが、大抵の現象はそうもいきません。
複雑な現象には複雑な関数が出現して、その関数のある瞬間の変化量を知りたい場合がほとんどです。
この複雑な関数というのは、本当に複雑で怪奇な関数もありますが、初等関数の合成関数の場合もあります。
こういうときに合成関数の微分法を使って、ある瞬間の変化量を調べることで現象を理解しよう、というわけです。

サラッと(本当にサラッと)ですが、機械学習でも合成関数の微分法が出現するため、最後にちょっとだけ述べます。

合成関数の微分法の明示

では、合成関数の微分法を明示しましょう。

合成関数の微分法 I, JRI, JRRRの開区間、f:IR, g:JRf:IR, g:JRとする。このとき、f(I)Jf(I)Jとする。 ffaIaIで微分可能であり、ggb=f(a)b=f(a)で微分可能なとき、合成関数gfgfaaで微分可能である。 さらに、 (gf)(a)=g(b)f(a)(gf)(a)=g(b)f(a) が成り立つ。

今回は、合成関数の微分法をよくある手法で証明します。
他にも集積点という言葉を使った証明(個人的にちょっと難しい)もあります。

証明の前に

事実としては高校数学で出現しましたが、厳密な証明は与えられなかったはずです。
そもそも微分は極限の概念を用いて記述されていて、その極限が高校数学では厳密では有りませんので、極限を使って表現している微分も厳密ではありません。

厳密に証明を与えるために、「微分可能ならば連続」について述べます。

微分可能ならば連続

ある点で微分可能な関数は、その点で連続だ、ということです。

補題1. I⊂∈RIRf:IRf:IRとする。このとき、ffx0Ix0Iで微分可能ならば、ffx0x0で連続である。

補題1.の証明

簡単です。
示したいことは、limxx0f(x)=f(x0)limxx0f(x)=f(x0)です。
limxx0f(x)=limxx0(f(x0)+(xx0)f(x)f(x0)xx0)limxx0f(x)=limxx0(f(x0)+(xx0)f(x)f(x0)xx0)
です。
ここで、xx0のとき、f(x0)f(x0)xx00です。
さらに、fx0で微分可能ですので、c=limxx0f(x)f(x0)xx0というcRが存在します(要は、収束します)。
故に「収束する関数の和の極限は極限の和」、「収束する関数の積の極限は極限の積」という事実(証明は【解析学の基礎シリーズ】関数の極限編 その3を御覧ください)が使えます。
この事実を使えば、
limxx0f(x)=limxx0(f(x0)+(xx0)f(x)f(x0)xx0)=limxx0f(x0)+(limxx0(xx0))limxx0f(x)f(x0)xx0=limxx0f(x0)+0c=f(x0)
となり、連続です。

補題1.の証明終わり

これで準備が整いました。
では、合成関数の微分法の証明をしましょう。

いざ、合成関数の微分法の証明

証明の前に、まずは誠に乱暴な説明をします。

ybが十分近く、xaが十分近ければ、(この時点で直感的だネ)
g(b)g(y)g(b)yb,f(a)ybxa
ですので、
g(y)g(b)g(b)(yb),ybf(b)(xa)
です。
従って、
g(y)g(b)=g(b)f(a)(xa)
ですから、
g(b)f(a)=g(y)g(b)xa
です。
故に、
(gf)(a)=g(b)f(a)です。

これを精密にやろうぜ、ということがこの節です。

合成関数の微分法の証明

y=f(x)z=g(y)と書いたとしましょう。

関数faで微分可能なので、
(1)ϵ1(x)=f(x)f(a)f(a)(xa),(xI)
ϵ1(x)を定めると、
limxaϵ1(x)|xa|=0
です。
すなわち、
(ˆϵ>0) (ˆδ>0) s.t. (xI:0<|xa|<ˆδ|ϵ1(x)xa|<ˆϵ)
です。

同様に、gbで微分可能ですので、
ϵ2(x)=g(y)g(b)g(b)(yb),(yJ)
ϵ1(x)を定めると、
limxaϵ2(x)|yb|=0
です。
すなわち、
(ˆϵ>0) (ˆδ>0) s.t. (yJ:0<|yb|<ˆδ|ϵ2(x)yb|<ˆϵ)
です。

y=f(x)b=f(a)ですので、(1)により、
yb=f(a)(xa)+ϵ1(x)
です。
従って、b=f(a)に注意すると、
(gf)(x)=g(f(x))=g(y)=g(b)+g(b)(yb)+ϵ2(y)=g(f(a))+g(b){f(a)+f(a)(xa)+ϵ1(x)b}+ϵ2(f(x))=g(f(a))+g(b){f(a)(xa)+ϵ1(x)b}+ϵ2(f(x))=g(f(a))+g(b)f(a)(xa)+g(b)ϵ1(x)b+ϵ2(f(x))

②を変形してみると、
(gf)(x)(gf)(a)=g(b)f(a)(xa)+g(b)ϵ1(x)+ϵ2(f(x))(gf)(x)(gf)(a)xa=g(b)f(a)+g(b)ϵ1(x)xa+ϵ2(f(x))xa
です。
従って、
limxag(b)ϵ1(x)xa=limx0ϵ2(f(x))xa=0
であれば、証明完了です。

個々でちょっと一息。

では、limxag(b)ϵ1(x)xaについて考えてみましょう。
|g(b)ϵ1(x)xa||g(b)||ϵ1(x)||xa|
です。
ここで、limxaϵ1(x)|xa|=0でしたので、
limxag(b)ϵ1(x)xa=0
です。

続いて、limx0ϵ2(f(x))xaについて考えてみましょう。
M(y)={|ϵ2(y)||yb|(yb)0(y=b)
とします。
ϵ2(b)=0に注意すると、
|ϵ2(y)|=|yb|M(y)
です。
また、③により、limxaM(y)=0が成り立ちます。
ここで、ある点で微分可能であればその点で連続ですので、xaのときにf(x)f(a)=bに注意すれば、0=limxaM(y)=limxaM(f(x))です。

さて、(1)により、
|f(x)b|=|f(a)(xa)+ϵ1(x)||f(a)(xa)|+|ϵ1(x)||f(a)||xa|+|ϵ1(x)|
です。

また、limxaϵ1(x)|xa|=0により、0<|xa|<ˆδを満たす任意のxIに対しては|ϵ1(x)xa|<ˆϵが成り立っています。
このˆϵ>0は任意なので、ˆϵ=1でも成り立ちます。
従って、0<|xa|<ˆδを満たす任意のxIに対しては|ϵ1(x)xa|<1が成り立っています。
故に、|ϵ1(x)||xa|が成り立っているので、
|f(b)b|(|f(a)|+1)|xa|
です。
従って、
|ϵ2(f(x))|xa=f(x)bxaM(f(x))(|f(a)|+1)M(f(x))
となります。
limxaM(f(x))=0を思い出すと、
limxa|ϵ2(f(x))|xa=0
です。

以上のことから、
limxag(b)ϵ1(x)xa=limx0ϵ2(f(x))xa=0
ですので、
(gf)(a)=g(b)f(a)
です。

合成関数の微分法の証明終わり

本当に成り立つのかネ?

成り立ちます。
簡単な例を挙げます。

例. h:(0,2)Rh(x)=(2x+3)4で定められているとします。
このときh(1)を考えます。

h(x)=((2x+3)4)=(16x4+144x2+81+96x3+216x+72x2)=64x3+288x+288x2+216+144x
により、h(1)=1000です。

一方、hf(x)=2x+3g(x)=x4の合成関数なので、
h(x)=(gf)(x)=g(2x+3)f(x)=4(2x+3)32
です。
従って、h(1)=(gf)(1)=1000です。

合成関数の微分法の応用例(本当にサラッと)

いきなり機械学習の話というのも妙ですが、サラッとお話します。
(本当にサラッとです。)

機械学習は基本的に、正解データの誤差をどんどん小さくしたいので、誤差がどんどん小さくなるようにネットワークのパラメータを更新していきます。
正解データとの誤差が小さければ”基本的には”良いネットワークということになります。
これを目指してネットワークを作っていくわけです。

このネットワークの形のイメージはこんな感じです。

このように沢山の階層に分かれています。
つまり、ある階層に値が入力されたらば、その階層に対応する計算をして、その計算結果がその階層の計算結果として出力されます。
その出力された値が次の階層の入力値となり…ということを繰り返します。
これはまさに合成関数です。

その誤差を考えようというわけですので、誤差も色々な関数の合成関数です(平たくいえばネ)。
この誤差をどんどん小さくしたいわけですので、誤差の変化量が負であるような方向に値を更新したいわけです。
従って、関数としてどういう形か、どの方向が変化量が負なのか、ということを知るために誤差の関数を微分します。
誤差の関数は合成関数だ、と述べましたので、ここで合成関数の微分が使われます。

※筆者もまだ勉強中なので、間違っているかもしれませんが、イメージとしてそんなもんだと思います。

今回は合成関数の微分法について解説しました。
高校数学で証明っぽいものは見かけたかもしれませんが、そもそも高校数学では極限が厳密に議論されていないため、極限を用いて議論される微分についても厳密な議論はされていません。

数式としては知っていることも、真面目に証明しようと思うと骨が折れますね。

次回は逆関数の微分法について解説します。

乞うご期待!質問、コメントなどお待ちしております!

コメントをする

タイトルとURLをコピーしました