深度学习 - 激活函数、梯度问题 and 损失函数
-
激活函数
-
函数、导数 and 优劣
多层神经网络在计算过程中,如果没有非线性计算,那么多层网络等价于单层网络。所以激活函数应运而生,它可以规范梯度,加入非线性因素。
-
Sigmoid
函数: f ( z ) = 1 1 + e − Z f(z)=\frac{1}{1+e^{-Z}} f(z)=1+e−Z1
导数: f ′ ( z ) = f ( z ) [ 1 − f ( z ) ] f'(z)=f(z)[1-f(z)] f′(z)=f(z)[1−f(z)]
特点:在 z 值较小(0附近)梯度较大,更新速度快;但在 z 值很大,趋于正、负无穷时梯度接近 0,致使更新变化缓慢,迭代速度低。
-
Tanh (双曲正切)
函数: f ( z ) = e z − e − z e z + e − z f(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} f(z)=ez+e−zez−e−z
导数: f ′ ( z ) = 1 − f 2 ( z ) f'(z)=1-f^2(z) f′(z)=1−f2(z)
特点:与 Sigmoid 类似,相当于Sigmoid 的平移。
-
ReLU (Rectified Linear Unit,修正线性单元)
函数: f ( z ) = m a x ( 0 , z ) f(z)=max(0, z) f(z)=max(0,z)
导数: f ′ ( z ) = { 1 , x > 0 0 , x ≤ 0 f'(z)=\begin{cases} 1, x>0\\ 0, x\le0\\ \end{cases} f′(z)={1,x>00,x≤0
特点:求梯度简单,可有效解决梯度消失问题,其单侧抑制提供了网络稀疏表达的能力。但会导致神经元不可逆死亡的问题,一旦等于 0 后则参数无法更新。
-
LReLU (Leaky ReLU)
函数: f ( z ) = m a x ( α z , z ) f(z)=max(αz,z) f(z)=max(αz,z)
导数: f ′ ( z ) = { 1 , x > 0 α , x ≤ 0 f'(z)=\begin{cases} 1, x>0\\ α, x\le0\\ \end{cases} f′(z)={1,x>0α,x≤0
特点:
∙ \bullet ∙ α 为一个较小值,在具备 ReLU 的优点的基础上,在 <0 的部分不会使神经元死亡,只是用极小值代替,仍然保留神经元信息。但由于引入了 α,所以 α 超参数的选择称为问题。
∙ \bullet ∙ 由此又产生了 PReLU(Parametric ReLU),参数化的 ReLU,它将 α 作为可学习的参数,加入 BP训练,与其他参数一起优化。
∙ \bullet ∙ 或随机化 α,得到 RReLU (Random ReLU)。将 α 作为一个满足某种分布的随机采样,测试时再固定下来,从一定程度上能起到正则化的作用。
-
ELU(指数线性单元)
函数: f ( z ) = { x , x > 0 α e x − 1 , x ≤ 0 f(z)=\begin{cases} x, x>0\\ αe^x-1, x\le0\\ \end{cases} f(z)={x,x>0αex−1,x≤0
导数: f ′ ( z ) = { 1 , x > 0 α e x , x ≤ 0 f'(z)=\begin{cases} 1, x>0\\ αe^x, x\le0\\ \end{cases} f′(z)={1,x>0αex,x≤0
特点:具备以上的优点,输出的均值趋于 0,但由于指数的存在,计算量较大。
-
Maxout
函数: h i ( z ) = max j ∈ [ 1 , k ] ( w 1 T z + b 1 , . . . , w k T z + b k ) h_i(z)=\max_{j\in[1,k]}{(w_1^Tz+b_1,...,w_k^Tz+b_k)} hi(z)=maxj∈[1,k](w1Tz+b1,...,wkTz+bk)
导数: f ′ ( z ) = w k T , 其 中 w k T z + b k = m a x f'(z)=w_k^T,其中 w_k^Tz+b_k=max f′(z)=wkT,其中wkTz+bk=max
特点:Maxout 可以看做另外加入一个激活函数层,包含一个参数k,代表增加了 k 个神经元,然后输出这 k 个神经元激活值的最大值。也可以形象化理解为 k 条线的拼接。除拥有以上多有优点外,它还可以拟合任意凸函数。
其他详细介绍可参阅 激活函数
-
-
梯度消失与梯度饱和
-
梯度消失
问题:参数无法更新,模型无法训练。
原因:主要因为网络层数太多,太深,导致梯度无法传播。本质应该是激活函数的饱和性。例如 Sigmoid 函数,倘若 x 值已经较大,此时梯度已经很小,而网络层数很多,多个极小值累乘,则梯度只会更小。
解决:替换激活函数,减小网络层数。
-
梯度饱和
问题:结果无法收敛。
原因:梯度太大。
解决:可以通过减小学习率、减小batch size(累积梯度更小)、 特征规范化(避免突然来一个较大的输入)、梯度裁剪。
梯度裁剪: g = m i n ( θ ∣ ∣ g ∣ ∣ , 1 ) g=min(\frac{θ}{||g||},1) g=min(∣∣g∣∣θ,1),将梯度投影到较小的尺度上。
-
-
-
反向传播
主要是用链式求导,详情可见 反向传播与梯度下降
-
平方差损失 and 交叉熵损失
-
平方差损失
公式: J ( W , b ) = 1 2 ∣ ∣ y − f ( z ) ∣ ∣ 2 J(W,b)=\frac{1}{2}||y-f(z)||^2 J(W,b)=21∣∣y−f(z)∣∣2
导数: J ′ ( W , b ) = − [ y − f ( z ) ] f ′ ( z ) J'(W,b)=-[y-f(z)]f'(z) J′(W,b)=−[y−f(z)]f′(z)
应用场景:更适合输出为连续值,且最后一层不含 Sigmoid 的神经网络。因为导数中包含了 f ′ ( z ) f'(z) f′(z),所以如果使用 Sigmoid 作为激活函数,那么 Sigmoid 的梯度消失问题则会显现出来。
-
交叉熵损失
公式: J ( W , b ) = − ∑ k = 1 n y k l n f ( z k ) J(W,b)=-\sum_{k=1}^{n}y_klnf(z_k) J(W,b)=−∑k=1nyklnf(zk)
导数: J ′ ( W , b ) = { f ( z i ) [ 1 − f ( z i ) ] , k i = k j − f ( z i ) f ( z j ) , k i ≠ k j J'(W,b)=\begin{cases} f(z_i)[1-f(z_i)],k_i=k_j\\ -f(z_i)f(z_j),k_i \ne k_j\\ \end{cases} J′(W,b)={f(zi)[1−f(zi)],ki=kj−f(zi)f(zj),ki̸=kj
应用场景:更适合二分类或多分类。使用 Softmax 作为激活函数时,最后一层不存在梯度消失问题,但是如果隐层仍然有 Sigmoid 激活函数,那么仍然存在梯度消失问题。
-