cs231n 笔记02:反向传播与2-NN示例

lecture4 反向传播

反向传播链式计算梯度。

常用激活函数:

  1. sigmoid函数将实数压缩到[0,1],tanh函数将实数压缩到[-1,1]。
    • sigmoid缺点:sigmoid函数饱和时梯度消失,神经元的激活在接近0或1处梯度几乎为0;sigmoid输出不是零中心的。如果输入神经元的数据总是正数,那么w的梯度在反向传播的过程中,要么全部是正数,要么全部是负数这会导致下降权重更新时出现z字型的下降。然而,可以看到整个批量的数据的梯度被加起来,权值的更新有不同的正负。
  2. ReLU函数
    优点:梯度下降收敛巨大加速。
    缺点:如果学习率设置得太快,可能会发现网络中40%神经元不被激活。改进—Leaky ReLU。x<0时,y接近0。
    Maxout是ReLU与Leaky ReLU的一般化归纳。函数是
    m a x ( w 1 T x + b 1 , w 2 T x + b 2 )

2层神经网络python实现

第一层激活函数为sigmoid函数,第二层激活函数为线性函数,输入为64*1000矩阵,输出64*10,第二层输入为64*100。运行2000次后损失函数为4.04。

#两层神经网络
import numpy as np
from numpy.random import randn
#H 为第二层的输入维度
N,D_in,H,D_out=64,1000,100,10
#rand产生0-1的数,randn产生符合正态分布的数,randint产生整数,定义最小值
x,y = randn(N,D_in),randn(N,D_out)#64*1000
w1,w2 = randn(D_in,H),randn(H,D_out)

for t in range(2000):
    h = 1/(1+np.exp(-x.dot(w1)))
    y_pred = h.dot(w2)
    loss = np.square(y_pred-y).sum()
    print t,loss
# 结果1999,4.04  
# 损失函数对w1,w2求导
    grad_y_pred=2.0*(y_pred-y) 
    grad_w2 = h.T.dot(grad_y_pred)
    grad_h = grad_y_pred.dot(w2.T)
    grad_w1 = x.T.dot(grad_h*h*(1-h))
    w1 -=1e-4*grad_w1
    w2 -=1e-4*grad_w2 

猜你喜欢

转载自blog.csdn.net/qq_33476409/article/details/81977520