DAY2:神经网络基础和深度学习笔记整理
一、neural network representation
二、activation function and their derivative
Question:为什么要使用非线性的**函数?
如果使用线性**函数,那么神经网络不管有多少隐藏层都只是把输入做线性组合然后再输出(两个线性函数的组合 仍然是线性函数)【详见上图】。线性**函数在回归问题中有时候也是可行的,比如房价的预测问题,所得的答案 是一个[0,∞]的实值,但其只用应用于输出层不能应用于隐藏层。(与压缩有关的问题可能会把线性**函数应用于隐 藏层)
tanh: y=(e^x-e^-x)/(e^x+e^-x) f'(x)=1-(f(x))²
sigmoid: y=1/(1+e^-x) f'(x)=f(x)(1-f(x))
ReLU: y=max(0,x) ①x<0 f'(x)=0 ② x>0 f'(x)=1
leaky ReLU: y=max(0.01x,x) ①当x<0 f'(x)=0.01 ②当 x>0 f'(x)=1
双曲正切函数tanh在任何场合的变现几乎均优于sigmoid函数,因为tanh函数的均值为0,使用其作为**函数有利于 处理后面的layer。而在二分类问题上的表现逊色于sigmoid函数,因为二分类问题要求的取值是{0,1},而tanh的取值 范围为(-1,1)。
而ReLU=max(0,x)函数(修正线性单元)在神经网络训练速度的表现上更加突出,因为它不存在导数接近于0的 情况(大于0时,处处导数均为1),所以对参数进行优化的时候收敛的速度会更快。
一般情况下只有在二分类的问题下才会使用sigmoid作为**函数,大部分情况下均使用tanh和ReLU作为**函数。 关于tanh和ReLU的对比,
三、随机值的初始化问题
不能把权重矩阵W的元素全部初始化为0,因为隐藏单元之间存在对称性,这样会使得不同的隐藏单元计算着同一个函数,使用梯度下降法时计算的也都是同一个函数。而偏置顶b不存在对称性问题,可以初始化为全0.
w[1]=np.random.randn((2,2))*0.01(一般把权重矩阵的元素设为很小的随机值,有利于加速**函数的收敛)
b[1]=np.zore((2,1))