bluejad / deeplearning

deep learing note
1 stars 0 forks source link

CS231n: Convolutional Neural Networks for Visual Recognition #2

Open bluejad opened 7 years ago

bluejad commented 7 years ago

斯坦福CS231n:面向视觉识别的卷积神经网络

CS231n课程翻译系列

课程教师Andrej Karpathy

bluejad commented 7 years ago

激活函数Tanh

bluejad commented 7 years ago

ReLU比Tanh收敛快6倍 实线ReLU 虚线Tanh

relu tanh 6
bluejad commented 7 years ago

激活函数ReLU

bluejad commented 7 years ago

ReLU函数的公式

f(x) = max(0, x)

bluejad commented 7 years ago

ReLU函数的优点:

bluejad commented 7 years ago

ReLU函数的缺点:

通过合理设置学习率,这种情况的发生概率会降低

bluejad commented 7 years ago

激活函数Leaky ReLU函数

leaky relu

α是一个小的常量

bluejad commented 7 years ago

Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01

bluejad commented 7 years ago

激活函数Maxout函数

maxout

bluejad commented 7 years ago

Maxout是对ReLU和leaky ReLU的一般化归纳

bluejad commented 7 years ago

ReLU和Leaky ReLU都是这个公式的特殊情况(比如ReLU就是当w_1,b_1=0的时候)

bluejad commented 7 years ago

这样Maxout神经元就拥有ReLU单元的所有优点(线性操作和不饱和),而没有它的缺点(死亡的ReLU单元)

bluejad commented 7 years ago

然而和ReLU对比,它每个神经元的参数数量增加了一倍,这就导致整体参数的数量激增

bluejad commented 7 years ago

将神经网络算法以神经元的形式图形化

bluejad commented 7 years ago

神经网络被建模成神经元的集合,神经元之间以无环图的形式进行连接

bluejad commented 7 years ago

全连接层中的神经元与其前后两层的神经元是完全成对连接的,但是在同一个全连接层内的神经元之间没有连接

bluejad commented 7 years ago
default

左边是一个2层神经网络,隐层由4个神经元(也可称为单元(unit))组成,输出层由2个神经元组成,输入层是3个神经元。右边是一个3层神经网络,两个含4个神经元的隐层

bluejad commented 7 years ago

层与层之间的神经元是全连接的,但是层内的神经元不连接

bluejad commented 7 years ago

人工神经网络(Artificial Neural Networks 缩写ANN)

bluejad commented 7 years ago

多层感知器(Multi-Layer Perceptrons 缩写MLP)

bluejad commented 7 years ago

用来度量神经网络的尺寸的标准主要有两个:一个是神经元的个数,另一个是参数的个数

bluejad commented 7 years ago

用上面图示的两个网络举例:

bluejad commented 7 years ago

一个层所有连接的强度可以存在一个单独的矩阵中。比如第一个隐层的权重W1是[4x3],所有单元的偏置储存在b1中,尺寸[4x1]。这样,每个神经元的权重都在W1的一个行中,于是矩阵乘法np.dot(W1, x)就能计算该层中所有神经元的激活数据。类似的,W2将会是[4x4]矩阵,存储着第二个隐层的连接,W3是[1x4]的矩阵,用于输出层。完整的3层神经网络的前向传播就是简单的3次矩阵乘法,其中交织着激活函数的应用

bluejad commented 7 years ago

一个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
bluejad commented 7 years ago

全连接层的前向传播一般就是先进行一个矩阵乘法,然后加上偏置并运用激活函数

bluejad commented 7 years ago

拥有至少一个隐层的神经网络是一个通用的近似器

bluejad commented 7 years ago

既然一个隐层就能近似任何函数,那为什么还要构建更多层来将网络做得更深?

答案是:虽然一个2层网络在数学理论上能完美地近似所有连续函数,但在实际操作中效果相对较差

bluejad commented 7 years ago

虽然在理论上深层网络(使用了多个隐层)和单层网络的表达能力是一样的,但是就实践经验而言,深度网络效果比单层网络好

bluejad commented 7 years ago

要知道当我们增加层的数量和尺寸时,网络的容量上升了。即神经元们可以合作表达许多复杂函数,所以表达函数的空间增加

bluejad commented 7 years ago
default
bluejad commented 7 years ago

在上图中,可以看见有更多神经元的神经网络可以表达更复杂的函数。然而这既是优势也是不足,优势是可以分类更复杂的数据,不足是可能造成对训练数据的过拟合

bluejad commented 7 years ago

有3个神经元的模型的表达能力只能用比较宽泛的方式去分类数据

e.g. 有更强的泛化能力

bluejad commented 7 years ago

基于上面的讨论,看起来如果数据不是足够复杂,则似乎小一点的网络更好,因为可以防止过拟合。然而并非如此,防止神经网络的过拟合有很多方法(L2正则化,dropout和输入噪音等),后面会详细讨论。在实践中,使用这些方法来控制过拟合比减少网络神经元数目要好得多

bluejad commented 7 years ago

不要减少网络神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练

bluejad commented 7 years ago
default

不同正则化强度的效果:每个神经网络都有20个隐层神经元,但是随着正则化强度增加,它的决策边界变得更加平滑

bluejad commented 7 years ago

需要记住的是:不应该因为害怕出现过拟合而使用小网络。相反,应该进尽可能使用大网络,然后使用正则化技巧来控制过拟合

bluejad commented 7 years ago

均值减法:它对数据中每个独立特征减去平均值,从几何上可以理解为在每个维度上都将数据云的中心都迁移到原点

代码实现

X -= np.mean(X, axis=0)

X -= np.mean(X)

bluejad commented 7 years ago

归一化:是指将数据的所有维度都归一化,使其数值范围都近似相等

有两种常用方法可以实现归一化。

bluejad commented 7 years ago

一般数据预处理流程

default
bluejad commented 7 years ago

一般数据预处理流程:

bluejad commented 7 years ago

数据预处理形式:

bluejad commented 7 years ago

PCA和白化(Whitening)是另一种预处理形式。在这种处理中,先对数据进行零中心化处理,然后计算协方差矩阵

bluejad commented 7 years ago

对数据零中心化 大小 N * D N是数据样本的数量,D是数据的维度

X -= np.mean(X, axis = 0)

得到数据的协方差矩阵

cov = np.dot(X.T, X)

bluejad commented 7 years ago

数据协方差矩阵的第(i, j)个元素是数据第i个和第j个维度的协方差。具体来说,该矩阵的对角线上的元素是方差

bluejad commented 7 years ago

协方差矩阵是对称和半正定的

bluejad commented 7 years ago

我们可以对数据协方差矩阵进行SVD(奇异值分解)运算

U, S, V = np.linalg.svd(cov)

U的列是特征向量,S是装有奇异值的1维数组(因为cov是对称且半正定的,所以S中元素是特征值的平方)

bluejad commented 7 years ago

为了去除数据相关性,将已经零中心化处理过的原始数据投影到特征基准上

Xrot = np.dot(X, U)

bluejad commented 7 years ago

注意U的列是标准正交向量的集合(范式为1,列之间标准正交),所以可以把它们看做标准正交基向量。因此,投影对应x中的数据的一个旋转,旋转产生的结果就是新的特征向量

bluejad commented 7 years ago

如果计算Xrot的协方差矩阵,将会看到它是对角对称的

bluejad commented 7 years ago

np.linalg.svd的一个良好性质是在它的返回值U中,特征向量是按照特征值的大小排列的。我们可以利用这个性质来对数据降维,只要使用前面的小部分特征向量,丢弃掉那些包含的数据没有方差的维度。 这个操作也被称为主成分分析( Principal Component Analysis 简称PCA)降维:

Xrot_reduced = np.dot(X, U[:, :100]) 大小N * 100