神经网络
1 简介
之前,线性评分函数:f=Wx f = W x
现在,二层神经网络:f=W2max(0,W1x) f = W 2 m a x ( 0 , W 1 x )
或者三层神经网路:f=W3max(0,W2max(0,W1x)) f = W 3 m a x ( 0 , W 2 m a x ( 0 , W 1 x ) )
实现训练一个2层的神经网络大概需要20行代码
import numpy as np
from numpy.random import randn
N, D_in, H, D_out = 64, 1000, 100, 10
x, y = randn(N, D_in), randn(N, D_out)
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)
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
2 激活函数
神经元有能力“喜欢”(激活函数值接近1),或者不喜欢(接货函数接近0)输入空间中的某些线性区域
在SVM/Softmax的例子中,正则化损失从生物学角度可以看做逐渐遗忘,因为它的效果是让所有突触权重w w 在参数更新过程中逐渐向着0变化。
(1)Sigmoid:σ(x)=11+e−xσ(x)=11+e−x
(2)tanh:tanh(x) t a n h ( x ) 其中,tanh(x)=2σ(2x)−1 t a n h ( x ) = 2 σ ( 2 x ) − 1
(3)relu:max(0,x) m a x ( 0 , x )
(4)Leaky relu:max(0.1x,x) m a x ( 0.1 x , x )
(5)maxout:max(wT1x+b1,wT2x+b2) m a x ( w 1 T x + b 1 , w 2 T x + b 2 )
(6)elu:{xα(ex−1)x⩾0x<0 { x x ⩾ 0 α ( e x − 1 ) x < 0
sigmoid的两个缺点
① Sigmoid函数饱和和使梯度消失;
② Sigmoid函数的输出中心不是零中心的;
relu优缺点
优点:
① 相较于sigmoid和tanh函数,relu对于随机梯度下降有着巨大的收敛作用;
② sigmoid和tanh神经元含有指数运算等耗费计算资源的操作,而relu可以通过对一个矩阵进行阈值计算得到;
缺点:
① 在训练的时候,relu单元比较脆弱并且可能“死掉”。通过合理降低学习率,这种情况发生的概率会降低
注:
在同一网络中混合使用不同类型的神经元是非常少见的,虽然没有什么根本性问题来禁止这么做。
3 神经网络-结构
当我们说N层神经网络的时候,我们并没有把输入层算入。
单层的神经网络就是没有隐层的(输入直接映射输出)
输出层:和神经网络中其他层不同,输出层的神经元一般是不会有激活函数的(或者可以认为他们有一个线性相等的激活函数)
确定网络尺寸
用来度量神经网络尺寸的标准有两个:
① 神经元的个数;
② 参数的个数;
二层神经网络
一隐含层神经网络
全连接神经网络
前向传播
不断重复的矩阵乘法与激活函数交织。
全连接层的前向传播一般就是先进行一个矩阵乘法,然后加上偏置并运用激活函数。
防止神经网络的过拟合有好多方法(L2正则化,dropout和输入噪声等),在实践中,使用这些方法来控制过拟合比减少网络神经元数目要好得多。
不要减少网络中神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练。
注意:不应该因为害怕出现过拟合而使用小网络。相反,应该尽可能使用大网络,然后使用正则化技巧来控制过拟合。
4 总结
(1)我们部署神经元到全连接神经网络;
(2)抽象成层可以方便我们高效的使用向量化编码(例如,矩阵乘法);
(3)神经网络不是真正意义上的神经;
(4)下一章,我们将学习卷积神经网络;