神经网络中,梯度是如何计算的?

简单的花一点时间总结一下梯度的计算情况。要尽量少花一点的时间来总结基础知识,多去写写代码,调一下bug,再不调连debug都忘了。什么是梯度下降法?什么又是梯度?只看概念的话记不住,主要是理解。

梯度:高数的知识,是个向量,每点只有一个梯度。=

梯度的方向:与这个函数在该点增长最快的方向一致。梯度的大小:|梯度|=max(方向导数),具体概念都是高数的知识。上式要一阶可导。梯度下降法:求损失函数最小值。求解步骤是:先对f(x)求梯度△,再向着和梯度相反的方向移动x,不断移动,直到两次迭代算出来的f(x)差值基本上不变了,就算迭代收敛了,完成。因此每次迭代就把x更新成x-λ△,就是x-步长×梯度。基础就说到这。。。

梯度消失:靠近输出层的层,梯度大,参数更新快,容易收敛。离输出层远的层,梯度小,参数更新慢,就跟最初一样基本是随机分布的,不容易收敛。这个就算梯度消失。一般出现在sigmoid上,因为sigmoid函数导数是f'(x) = f(x)(1-f(x)) ∈ (0,1) ,DNN的反向传播是对偏导数逐层相乘,因此(0,1)一直相乘,接近为0时,则梯度消失。

解决办法:用Relu或者tanh。Relu的偏导数一直是1,tanh虽然也可能梯度消失,但是看它图像,偏导数的增长率还是很大的,因此也比sigmoid好。

梯度爆炸:这个好解释,如果对倒数第二层的激活函数开始求偏导数,当它大于1时,后面层数增多以后,梯度就指数爆炸般的上升了。因此梯度值就爆了。

梯度消失不是个需要担心的问题,如果用残差网络,那梯度消失就彻底解决了,因为它反向传播比较好。

用python写一个简单的前向/反向的传播过程:

正向:y=wx 是一个结果=矩阵×矩阵   反向:x=y△ 是一个矩阵=结果×梯度

import numpy as np
‘’‘
前向传播
’‘’
w = np.random.randn(2, 3)
x = np.random.randn(3, 5)
y = w.dot(x)

‘’‘
反向传播
’‘’
dy = np.random.randn(*y.shape())
dw = dy.dot(x.T)
dx = w.T.dot(dy)

注意矩阵的翻转。

残差学习的部分后面再补。

你可能感兴趣的:(深度学习,神经网络,梯度,梯度下降,反向传播)