斯坦福深度视觉识别课程cs231n 学习笔记三:神经网络
反向传播
一个简单的例子
如图,z=f(x,y)为一个结点,由输入x,y得到预测值z,计算损失值L,可得到L对z的偏导数。根据链式求导法则,可求得L对x和y的偏微分,将计算得到的偏微分继续往前传播,即为反向传播。
具体例子
加法门:梯度分配器
如图,z=x+y,z对x的偏导为1,z对y的偏导为1,因此x处的反向传播值等于上游梯度乘1,等于2,同理,y处的反向传播值等于上游梯度乘1,等于2。
max门:梯度路由器
如图,z=max{x,y},反向传播至x,y中的较大值,较小值为0,即x的反向传播值为2,y的反向传播值为0。
乘法门:梯度转换器
如图,z=x*y,z对x的偏导为y,z对y的偏导为x,则x处的反向传播值等于上游梯度乘y,等于-8,y处的反向传播值等于上游梯度乘x,等于6。
两个上游结点
如图,有两个上游结点时,应该分别反向传播的值相加,进行运算。
一个向量的例子
由于df/dqi=2qi,则qi的反向传播值为上游梯度乘2qi,例如,q1处的反向传播值=1.0020.22=0.44。
因为dqi/dwij=xi,则wij处的反向传播值为xi乘qi处的反向传播值,例如,w11处的反向传播值=0.20.44=0.088。又因为dqi/dxj=wij,则xj处的反向传播值q1w1j+q2w2j,例如x1处的反向传播值=0.440.1-0.30.52=-0.112。
神经网络
神经元基本结构
举例如下,输入变量及对应的权值,在神经元内进行运算,运算也可以是非线性运算,得到运算结果,作为变量输入激活函数,激活函数值即为神经元输出。
常用激活函数
通过激活函数作用,可以将输出映射成离散的分类值。
神经网络结构
多个神经元按一定规律组织结构,可构成神经网络,如图,第一层被称为输入层,最后一层被称为输出层,中间各层被称为隐藏层。当隐藏层最后一层的输出分别输入到输出层的输入,此时又叫做全连接层。
前向传播代码示例
以上图为例
class Neuron:
def feed_forward():
#前向传播三层神经网络
f=lambda x:1.0/(1.0+np.exp(-x))
x=np.random.randon(3,1) #随机输入3*1的向量
h1=f(np.dot(W1,x)+b1) #计算第一层隐藏层
h2=f(np.dot(W2,h1)+b2)#计算第二次隐藏层
out=np.dot(W3,h2)+b3 #计算输出
return out