1、safe softmax
softmax 函数定义如下,其经常用作分类模型的概率输出,比如用在神经网络的输出层,得到样本属于多类的概率,请回答如下问题:
softmax(x)i=ezi∑j=1Kexj,i=1,...,K \text{softmax}(\boldsymbol{x})_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{x_j}}, \quad i = 1, ..., K softmax(x)i=∑j=1Kexjezi,i=1,...,K
该函数在计算机上进行计算时可能会遇到问题,请分析原因
(a)数值溢出:由于指数函数的增长速度太快。当输入的数值较大时,指数函数会非常大,导致溢出。
(b)精度损失:由于计算机使用有限精度浮点数,在如果分母是一组具有大差异的数值,那么进行求和时会出现累加误差。
解决问题的一个有效方法是替换 $\boldsymbol{x} $ 为 x−max(x)\boldsymbol{x} - max(\boldsymbol{x})x−max(x)。请分析该替换是否能解决问题,并请证明该替换并不影响 softmax 函数的值。
分析:softmax 函数的归一化分母是∑j=1Kexj\sum_{j=1}^{K} e^{x_j}∑j=1Kexj,替换$\boldsymbol{x} $ 为 $\boldsymbol{x} - c $ 将所有的输入平移了一个常量,不会改变相对大小。通过减去 ccc,新的输入的数值都变得接近于零或更小,避免计算指数函数求和时发生溢出。
证明:将x\boldsymbol{x}x 替换为 x−c\boldsymbol{x} - cx−c 带入 softmax 函数:
softmax(x−c)i=exi−c∑j=1Kexj−c=exp(xi)exp(maxi(xi))∑j=1nexp(xj)exp(maxi(xi))=exi∑j=1Kexj=softmax(x)i \text{softmax}(\boldsymbol{x} - c)_i = \frac{e^{x_i - c}}{\sum_{j=1}^{K} e^{x_j - c}} =\frac{\frac{exp\left(x_i\right)}{exp\left({max}_i{\left(x_i\right)}\right)}}{\sum_{j=1}^{n}\frac{exp\left(x_j\right)}{exp\left({max}_i{\left(x_i\right)}\right)}}= \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}} = \text{softmax}(\boldsymbol{x})_i softmax(x−c)i=∑j=1Kexj−cexi−c=∑j=1nexp(maxi(xi))exp(xj)exp(maxi(xi))exp(xi)=∑j=1Kexjexi=softmax(x)i
可以看出替换后的 softmax 函数与原始 softmax 函数输出完全相同。
代码实现:
X_max = X.max()
X_exp_sum_sub_max = torch.exp(X-X_max).sum()
X_safe_softmax_hand = torch.exp(X - X_max) / X_exp_sum_sub_max
print(X_safe_softmax_hand)
2、sigmoid
logistics sigmoid 函数定义如下:
σ(x)=11+e−x,x∈R
\sigma(x) = \frac{1}{1 + e^{-x}}, \quad x \in \mathbb{R}
σ(x)=1+e−x1,x∈R
证明该函数拥有以下性质:
σ′(x)=σ(x)(1−σ(x)) \sigma'(x) = \sigma(x)(1 - \sigma(x)) σ′(x)=σ(x)(1−σ(x))
证:对 σ(x)\sigma(x)σ(x) 求导:
σ′(x)=ddz(11+e−x)=e−x(1+e−x)2=11+e−x⋅e−x1+e−x=σ(x)(1−σ(x)) \sigma'(x) = \frac{d}{dz} \left( \frac{1}{1 + e^{-x}} \right) = \frac{e^{-x}}{(1 + e^{-x})^2} = \frac{1}{1 + e^{-x}} \cdot \frac{e^{-x}}{1 + e^{-x}} = \sigma(x)(1 - \sigma(x)) σ′(x)=dzd(1+e−x1)=(1+e−x)2e−x=1+e−x1⋅1+e−xe−x=σ(x)(1−σ(x))
而满足:
1−σ(x)=1−11+e−x=e−x1+e−x=σ(−x) 1 - \sigma(x) = 1 - \frac{1}{1 + e^{-x}} = \frac{e^{-x}}{1 + e^{-x}} = \sigma(-x) 1−σ(x)=1−1+e−x1=1+e−xe−x=σ(−x)
故得证。
sigmoid函数的缺陷
在前馈神经网络的梯度反向传播中,第 lll 层的误差项表示为下式表示:
δ(l)≜∂L(y,y^)∂z(l)=fl′(z(l))⊙((W(l+1))⊤δ(l+1))←
{\delta }^{(l)} \triangleq \frac{\partial \mathcal{L}(\mathbf{y},\hat{\mathbf{y}})}{\partial {\mathbf{z}}^{(l)}} = {f}_{l}^{\prime }({\mathbf{z}}^{(l)}) \odot {\left( {\left( {\mathbf{W}}^{(l + 1)}\right) }^{\top }{\delta }^{(l + 1)}\right) }_{\leftarrow }
δ(l)≜∂z(l)∂L(y,y^)=fl′(z(l))⊙((W(l+1))⊤δ(l+1))←
如果采用 sigmoid 函数作为激活函数,请分析梯度反向传播过程中会存在什么问题。
(a)梯度消失问题:从梯度反向传播的公式进行分析,其中W(l+1)W^{(l+1)}W(l+1)的取值是随机初始化的,所以δ(l+1)\delta^{(l+1)}δ(l+1)和W(l+1)W^{(l+1)}W(l+1)的乘积不一定是一个较小的浮点数,但是激活函数的导数项fl′(z(l))f_l^\prime(z^{(l)})fl′(z(l))满足:
fl′(z(l))=exp(−x)(1+exp(−x))2≤0.25
f_l^\prime\left(z^{\left(l\right)}\right)=\frac{exp\left(-x\right)}{{(1+exp\left(-x\right))}^2}\le0.25
fl′(z(l))=(1+exp(−x))2exp(−x)≤0.25
可以发现,Sigmoid 函数的导数在取极大或极小值时,导数接近于零,同时最大值也不会超过 0.25。所以在链式法则的连乘过程中,激活函数的导数连乘可能导致梯度消失问题,进行梯度反向传播时只更新神经网络后几层的参数,前面几层的参数几乎不会被更新。
(b)计算效率较低:Sigmoid 函数涉及指数运算,因此在计算过程中需要较多的计算资源。
3、 ReLU 函数
ReLU(Rectified Linear Unit)激活函数定义为:
ReLU(x)=max(0,x) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
如果采用 ReLU 函数作为激活函数,是否能解决sigmoid函数的问题。
ReLU 函数导数为:
ddxReLU(x)={1if x>00if x<=0 \frac{d}{dx} \text{ReLU}(x) = \begin{cases} 1 & \text{if } x > 0 \\ 0 & \text{if } x <= 0 \end{cases} dxdReLU(x)={10if x>0if x<=0
-
ReLU 是左饱和函数,正区间的导数始终为 1,不会因为数值过小而导致梯度消失。因此 ReLU 可以有效避免梯度消失问题。
-
ReLU 的梯度计算简单,只需要比较大小,没有涉及指数运算,解决了计算效率较低的问题。
343

被折叠的 条评论
为什么被折叠?



