链式反应和链式法则
之前的文章给自己挖了一个坑,深度学习的核心在于反向传播,而反向传播的核心在于求导,求导的核心在于链式法则。
当一个中子轰击一个铀235原子核的时候,会分裂出3个新的中子,3个新的中子又会轰击更多的原子核,进而又产生更多的中子。链式反应是人类迄今掌握的最强能量释放机制。
链式反应的效应类似于人类大脑的神经元传递信息的方式。一个神经元的激活会影响到下一个神经元,进而影响到更多的神经元。在百万年的进化中,人类大脑实现了非常高效的信息传递和处理机制,即使在高强度思考的情况下,能耗也仅约为22瓦特。
而一台GPU加持的普通家用电脑的能耗轻松超过500瓦特,简而言之,计算很昂贵。而链式法则是人们发明的数学工具,基于它,反向传播的计算成为可能,也让深度学习能够真正落地。
链式法则是微积分中的一个重要定理,它描述了复合函数的导数如何计算。具体来说,如果有两个函数 $f(x)$ 和 $g(x)$,那么它们的复合函数 $h(x) = f(g(x))$ 的导数可以通过链式法则来求解:
\[h'(x) = f'(g(x)) \cdot g'(x)\]上面的公式表示,$h(x)$ 的导数 $h’(x)$ 等于 $f(x)$ 在 $g(x)$ 处的导数 $f’(g(x))$ 乘以 $g(x)$ 的导数 $g’(x)$。
链式法则的推导
下面是对链式法则的推导:
\[h'(x) = \lim_{\Delta x \to 0} \frac{f(g(x + \Delta x)) - f(g(x))}{\Delta x}\]以上是基于导数的定义。但是到这一步以后好像很难再向前推进。
链式法则的推导有两个关键步骤,接下来是第一个关键步骤,在式子中乘以 $g(x + \Delta x) - g(x)$ 分之 $g(x + \Delta x) - g(x)$:
\[= \lim_{\Delta x \to 0} \frac{f(g(x + \Delta x)) - f(g(x))}{\Delta x} \cdot \frac{g(x + \Delta x) - g(x)}{g(x + \Delta x) - g(x)}\]对上式进行移项变形:
\[= \lim_{\Delta x \to 0} \frac{f(g(x + \Delta x)) - f(g(x))}{g(x + \Delta x) - g(x)}\cdot \frac{g(x + \Delta x) - g(x)}{\Delta x}\]可得右项就是 $g(x)$ 的导数:
\[= \lim_{\Delta x \to 0} \frac{f(g(x + \Delta x)) - f(g(x))}{g(x + \Delta x) - g(x)}\cdot g'(x)\]接下来是第二个关键步骤,令 $g(x) = k$ , 则 $g(x+\Delta x) = k + \Delta k$,其中 $\Delta k = g(x+\Delta x) - g(x)$。
\[= \lim_{\Delta x \to 0} \frac{f(k + \Delta k) - f(k)}{k + \Delta k -k} \cdot g'(x)\]化简:
\[= \lim_{\Delta x \to 0} \frac{f(k + \Delta k) - f(k)}{\Delta k} \cdot g'(x)\] \[= f'(k) \cdot g'(x)\]证毕:
\[= f'(g(x)) \cdot g'(x)\]链式法则的变化形式:
基于:
\[= \lim_{\Delta x \to 0} \frac{f(g(x + \Delta x)) - f(g(x))}{g(x + \Delta x) - g(x)}\cdot \frac{g(x + \Delta x) - g(x)}{\Delta x}\]令: $y = f(g(x))$,则:
\[= \frac{dy}{dk} \cdot \frac{dk}{dx} = \frac{dy}{dx}\]链式法则的链式反应可以继续延伸:
令:$y = f(u)$,$u = g(v)$, $v = h(x)$,则:
\[\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dv} \cdot \frac{dv}{dx}\]对sigmoid函数求导
基于链式法则对sigmoid函数的导数进行推导:
\[\sigma(x) = \frac{1}{1 + e^{-x}}\]令: $t = 1 + e^{-x}$,则 $\sigma(x) = \frac{1}{t}$:
\[\sigma'(x) = -{t^{-2}}\]对 $t$ 求导:
\[t' = 0 + -e^{-x}\]根据链式法则:
\[\sigma'(x) = \frac{d(s)}{d(t)} \cdot \frac{d(t)}{d(x)} = -\frac{1}{t^2} \cdot (-e^{-x}) = \frac{e^{-x}}{t^2}\]将 $t$ 代入: \(\sigma'(x) = \frac{e^{-x}}{(1 + e^{-x})^2} = \sigma(x) \cdot (1 - \sigma(x))\)
由此得到sigmoid函数的导数计算的简单方法。 保持足够的简单,才有最大的实用空间。