Open bluejad opened 7 years ago
激活函数Tanh
存在饱和梯度消失(坏)
输出是零中心的(好)
ReLU比Tanh收敛快6倍 实线ReLU 虚线Tanh
激活函数ReLU
左边是ReLU(校正线性单元:Rectified Linear Unit)激活函数,当x=0时函数值为0。当x>0函数的斜率为1
关于0的阈值
ReLU函数的公式
f(x) = max(0, x)
ReLU函数的优点:
ReLU函数对随机梯度下降收敛有巨大加速作用(据称这是由它的线性,非饱和的公式导致的)
sigmoid和tanh神经元含有指数运算等耗费计算资源的操作,而ReLU可以简单地通过对一个矩阵进行阈值计算得到
ReLU函数的缺点:
通过合理设置学习率,这种情况的发生概率会降低
激活函数Leaky ReLU函数
α是一个小的常量
Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01
激活函数Maxout函数
Maxout是对ReLU和leaky ReLU的一般化归纳
ReLU和Leaky ReLU都是这个公式的特殊情况(比如ReLU就是当w_1,b_1=0的时候)
这样Maxout神经元就拥有ReLU单元的所有优点(线性操作和不饱和),而没有它的缺点(死亡的ReLU单元)
然而和ReLU对比,它每个神经元的参数数量增加了一倍,这就导致整体参数的数量激增
将神经网络算法以神经元的形式图形化
神经网络被建模成神经元的集合,神经元之间以无环图的形式进行连接
全连接层中的神经元与其前后两层的神经元是完全成对连接的,但是在同一个全连接层内的神经元之间没有连接
左边是一个2层神经网络,隐层由4个神经元(也可称为单元(unit))组成,输出层由2个神经元组成,输入层是3个神经元。右边是一个3层神经网络,两个含4个神经元的隐层
层与层之间的神经元是全连接的,但是层内的神经元不连接
人工神经网络(Artificial Neural Networks 缩写ANN)
多层感知器(Multi-Layer Perceptrons 缩写MLP)
用来度量神经网络的尺寸的标准主要有两个:一个是神经元的个数,另一个是参数的个数
用上面图示的两个网络举例:
第一个网络有4+2=6个神经元(输入层不算),[3x4]+[4x2]=20个权重,还有4+2=6个偏置,共26个可学习的参数
第二个网络有4+4+1=9个神经元,[3x4]+[4x4]+[4x1]=32个权重,4+4+1=9个偏置,共41个可学习的参数
一个层所有连接的强度可以存在一个单独的矩阵中。比如第一个隐层的权重W1是[4x3],所有单元的偏置储存在b1中,尺寸[4x1]。这样,每个神经元的权重都在W1的一个行中,于是矩阵乘法np.dot(W1, x)就能计算该层中所有神经元的激活数据。类似的,W2将会是[4x4]矩阵,存储着第二个隐层的连接,W3是[1x4]的矩阵,用于输出层。完整的3层神经网络的前向传播就是简单的3次矩阵乘法,其中交织着激活函数的应用
一个3层神经网络的前向传播
f = lambda x: 1.0/(1.0 + np.exp(-x)) 激活函数sigmoid
含3个数字的随机输入向量(3x1)
x = np.random.randn(3, 1)
计算第一个隐层的激活数据(4x1)
h1 = f(np.dot(W1, x) + b1)
计算第二个隐层的激活数据(4x1)
h2 = f(np.dot(W2, x) + b2)
神经元输出(1x1)
out = np.dot(W3, h2) + b3
全连接层的前向传播一般就是先进行一个矩阵乘法,然后加上偏置并运用激活函数
拥有至少一个隐层的神经网络是一个通用的近似器
既然一个隐层就能近似任何函数,那为什么还要构建更多层来将网络做得更深?
答案是:虽然一个2层网络在数学理论上能完美地近似所有连续函数,但在实际操作中效果相对较差
虽然在理论上深层网络(使用了多个隐层)和单层网络的表达能力是一样的,但是就实践经验而言,深度网络效果比单层网络好
要知道当我们增加层的数量和尺寸时,网络的容量上升了。即神经元们可以合作表达许多复杂函数,所以表达函数的空间增加
在上图中,可以看见有更多神经元的神经网络可以表达更复杂的函数。然而这既是优势也是不足,优势是可以分类更复杂的数据,不足是可能造成对训练数据的过拟合
有3个神经元的模型的表达能力只能用比较宽泛的方式去分类数据
e.g. 有更强的泛化能力
基于上面的讨论,看起来如果数据不是足够复杂,则似乎小一点的网络更好,因为可以防止过拟合。然而并非如此,防止神经网络的过拟合有很多方法(L2正则化,dropout和输入噪音等),后面会详细讨论。在实践中,使用这些方法来控制过拟合比减少网络神经元数目要好得多
不要减少网络神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练
不同正则化强度的效果:每个神经网络都有20个隐层神经元,但是随着正则化强度增加,它的决策边界变得更加平滑
需要记住的是:不应该因为害怕出现过拟合而使用小网络。相反,应该进尽可能使用大网络,然后使用正则化技巧来控制过拟合
均值减法:它对数据中每个独立特征减去平均值,从几何上可以理解为在每个维度上都将数据云的中心都迁移到原点
代码实现
X -= np.mean(X, axis=0)
X -= np.mean(X)
归一化:是指将数据的所有维度都归一化,使其数值范围都近似相等
有两种常用方法可以实现归一化。
第一种是先对数据做零中心化(zero-centered)处理,然后每个维度都除以其标准差,实现代码为X /= np.std(X, axis=0)
第二种方法是对每个维度都做归一化,使得每个维度的最大和最小值是1和-1。这个预处理操作只有在确信不同的输入特征有不同的数值范围(或计量单位)时才有意义
一般数据预处理流程
一般数据预处理流程:
左边:原始的2维输入数据。
中间:在每个维度上都减去平均值后得到零中心化数据,现在数据云是以原点为中心的
右边:每个维度都除以其标准差来调整其数值范围
红色的线指出了数据各维度的数值范围,在中间的零中心化数据的数值范围不同,但在右边归一化数据中数值范围相同
数据预处理形式:
均值减法
归一化
PCA和白化
PCA和白化(Whitening)是另一种预处理形式。在这种处理中,先对数据进行零中心化处理,然后计算协方差矩阵
对数据零中心化 大小 N * D N是数据样本的数量,D是数据的维度
X -= np.mean(X, axis = 0)
得到数据的协方差矩阵
cov = np.dot(X.T, X)
数据协方差矩阵的第(i, j)个元素是数据第i个和第j个维度的协方差。具体来说,该矩阵的对角线上的元素是方差
协方差矩阵是对称和半正定的
我们可以对数据协方差矩阵进行SVD(奇异值分解)运算
U, S, V = np.linalg.svd(cov)
U的列是特征向量,S是装有奇异值的1维数组(因为cov是对称且半正定的,所以S中元素是特征值的平方)
为了去除数据相关性,将已经零中心化处理过的原始数据投影到特征基准上
Xrot = np.dot(X, U)
注意U的列是标准正交向量的集合(范式为1,列之间标准正交),所以可以把它们看做标准正交基向量。因此,投影对应x中的数据的一个旋转,旋转产生的结果就是新的特征向量
如果计算Xrot的协方差矩阵,将会看到它是对角对称的
np.linalg.svd的一个良好性质是在它的返回值U中,特征向量是按照特征值的大小排列的。我们可以利用这个性质来对数据降维,只要使用前面的小部分特征向量,丢弃掉那些包含的数据没有方差的维度。 这个操作也被称为主成分分析( Principal Component Analysis 简称PCA)降维:
Xrot_reduced = np.dot(X, U[:, :100])
大小N * 100
斯坦福CS231n:面向视觉识别的卷积神经网络
CS231n课程翻译系列
课程教师Andrej Karpathy