问题:当算力可以无限强大,能构建无限深的网络吗?
因为最终可能会走向梯度爆炸或者梯度消失,这个问题的答案可能是否定的。
一、消失
梯度消失就是偏导数极端的偏小,从而导致反向传播时,w = w - dw*r,w变化很小,所以很多层几乎都不学习,从而变成了僵尸层,导致深度神经网络变成了浅度神经网络。
出现原因:常常出现在深层网络、采用了不合适的激活函数的情况下。(例如sigmoid,因为sigmoid的斜率是不超过0.25的),根据链式法则,反向传播层数多了,梯度就会逐渐消失。
二、爆炸
激活值 = a( W[L]A[L-1] + b[L] ),假设b为0,则激活值 = a( W[L]A[L-1] ),假设激活值是一个线性函数,a[z]=z,则激活值 = W[L]A[L-1] = W[L] (W[L-1]A[L-2]) =…= W[L]W[L-1]W[L-2]…W[1]A[0]
如果w>1,如果1.3,那么后层激活值则为 1.3 x 1.3 x 1.3 … x1.3 x a0,最后变大很大NaN爆炸了。 如果w<1,则越深层的a,值越小。
三、梯度爆炸与梯度消失
前向传播中激活值随着层数的增加而不断成倍的增加或减小。也导致了在反向传播中的偏导数/梯度计算也成倍的增加或减小(dW = dZ[L] A[L-1],此时A无限大或者无限小),导致梯度爆炸或梯度消失。
实际应用中,梯度消失出现的比较多。因为反向传播是从后向前传播的,如果A[L] < 1,则前几层很可能梯度消失。前面层的权重和之前一样,变成了僵尸层,形同虚设,白白浪费了算力。
延缓梯度爆炸和梯度消失的措施:更好的初始化参数。
z = w1x1 + w2x2 + … wnxn,假设特征x一样,则z = (w1+w2+w3)x,而激活值 = a(z) = (w1+w2+w3) x + (w1+w2+w3) a1 + (w1 + w2 + w3)a2 + …。假设a1、a2…与特征值相同,则 a(z) = (w1 + w2 + w3) (w1 + w2 + w3) (w1 + w2 + w3) x…,故如果使得每层的(w1+w2+w3) = 1,则a = (1) (1) (1) x … 那么就能延缓梯度爆炸和梯度消失。如果非1,则可能 z = 3x ,z=0.3x,随着层数不断增多,都会导致梯度爆炸或梯度消失。
由于随机初始化的权重w[i] = np.random.randn(),本身符合正太分布。(靠近0的个数最多)
那么延缓梯度爆炸和消失的参数初始化方式为:
w[i] = np.random.randn() * np.sqrt( u/n^[L-1] )
,sqrt是平方根,n[L-1]是上一层神经元个数。 u为可调参数,如果激活函数是relu,u一般取2。 如果是tanh,u取1。如果上一层神经元越多,那么w越靠近0。 另外也可以使用 n.sqrt( u/(n^[L-1] + n^[L]) )
。
这样初始化后多个w靠近0,a = 1 x 1 x 1 x …a0 ,则没有严重的梯度爆炸或消失了。