Neural Nets 2

内容列表

  • 设置数据和模型
    • 数据预处理
    • 权重初始化
    • 批归一化(Batch Normalization)
    • 正则化(L2/L1/Maxnorm/Dropout)
  • 损失函数
  • 拓展阅读

Setting up the data and the model

神经元模型在计算内积后进行非线性激活函数计算,神经网络将这些神经元组织成各个层。这些做法共同定义了评分函数的新形式。具体来说,神经网络就是进行了一系列的线性映射与非线性激活函数交织的运算。

Data Preprocessing

数据矩阵$X$,其尺寸为$[N\times D]$,N是数据样本的数量,D是数据的维度

均值减法(Mean subtraction)是预处理最常用的形式。它对数据中每个独立特征减去平均值,从几何上可以理解为在每个维度上都将数据云的中心都迁移到原点。

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

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

有两种方法可以实现归一化:

  • 先对数据做零中心化(zero-centered)处理,然后每个维度都除以其标准差。
    X/=np.std(X,axis=0)
    
  • 对每个维度都做归一化,使得每个维度的最大和最小值是1和-1。

这个预处理操作只有在确信不同的输入特征有不同的数值范围或计量单位是才有意义

PCA和Whitening。在这种处理中,先对数据进行零中心化处理,然后计算协方差矩阵

X-=np.mean(X,axis=0) # zero-center the data
cov=np.dot(X.T,X)/X.shape[0] # compute the data covariance matrix

然后对协方差矩阵进行奇异值分解(SVD)

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

U的列是特征向量,S是装有奇异值的1维数组(因为cov是对称且半正定的,所以S中元素是特征值的平方)。为了去除数据相关性,将已经零中心化处理过的原始数据投影到特征基准上

Xrot=np.dot(X,U) # decorrelate the data

注意U的列是标准正交向量的集合(范式为1,列之间标准正交),所以可以把它们看做标准正交基向量。因此,投影对应x中的数据的一个旋转,旋转产生的结果就是新的特征向量。如果计算Xrot的协方差矩阵,将会看到它是对角对称的。np.linalg.svd的一个良好性质是在它的返回值U中,特征向量是按照特征值的大小排列的。我们可以利用这个性质来对数据降维,只要使用前面的小部分特征向量,丢弃掉那些包含的数据没有方差的维度。 这个操作也被称为主成分分析( Principal Component Analysis 简称PCA)降维

Xrot_reduced=np.dot(X,U[:,:100]) # Xrot_reduced becomes [Nx100]

经过上面的操作,将原始的数据集的大小由[N x D]降到了[N x 100],留下了数据中包含最大方差的100个维度

白化(whitening)操作的输入是特征基准上的数据,然后对每个维度除以其特征值来对数值范围进行归一化。该变换的几何解释是:如果数据服从多变量的高斯分布,那么经过白化后,数据的分布将会是一个均值为零,且协方差相等的矩阵。

# whiten the data:
# divide by the eigenvalues (which are square roots of the singular values)
# we're adding 1e-5 (or a small constant) to prevent division by zero.
Xwhite = Xrot / np.sqrt(S + 1e-5)

下面两张图分别是Normalization和PCA/Whitening操作的可视化图像

$$Normalization$$ $$PCA/Whitening$$

Common pitfall:任何预处理策略(比如数据均值)都只能在训练集数据上进行计算,算法训练完毕后再直接应用到验证集或者测试集上。

Weight Initialization

Do NOT do all zero initialization:如果权重被初始化为同样的值,神经元之间就失去了不对称性的源头。

小随机数初始化:权重初始值要非常接近0又不能等于0。解决方法就是将权重初始化为很小的数值,以此来打破对称性。

# randn samples from a zero mean, unit standard deviation gaussian.
W = 0.01 * np.random.randn(D,H)

根据这个式子,每个神经元的权重向量都被初始化为一个随机向量,而这些随机向量又服从一个多变量高斯分布,这样在输入空间中,所有的神经元的指向是随机的。

使用1/sqrt(n)校准方差:为避免随数据量的增长,随机初始化的神经元的输出数据的分布中的方差也变得很大,可以除以输入数据量的平方根来调整其数值范围,使得神经元的输出方差归一化到1。

W = np.random.randn(n)/sqrt(n)

上述理论的推导过程如下: $$ % <![CDATA[ \begin{align} \text{Var}(s) &= \text{Var}(\sum_i^n w_ix_i) \\\\ &= \sum_i^n \text{Var}(w_ix_i) \\\\ &= \sum_i^n [E(w_i)]^2\text{Var}(x_i) + E[(x_i)]^2\text{Var}(w_i) + \text{Var}(x_i)\text{Var}(w_i) \\\\ &= \sum_i^n \text{Var}(x_i)\text{Var}(w_i) \\\\ &= \left( n \text{Var}(w) \right) \text{Var}(x) \end{align} %]]> $$ 其中我们假设输入和权重的均值都是0,且所有的$w_i,x_i$都服从同样的分布

Glorot等人在Understanding the difficulty of training deep feedforward neural networks中提出使用$Var(w)=2/(n_{in}+n_{out})$的形式,其中$n_{in}$和$n_{out}$分别是前一层和后一层单元的个数。

Kaiming He等人在Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification中提出了使用$W=np.random.randn(n)*sqrt(2.0/n)$的形式对ReLU神经元进行初始化,使得网络中神经元的方差为$2.0/n$。

稀疏初始化(Sparse initialization):将所有权重矩阵设为0,而每个神经元都同下一层固定数目的神经元随机连接(权重数值由一个小的高斯分布生成)。

偏置(biases)的初始化:通常将偏置初始化为0

In Practice:推荐使用ReLU激活函数,并使用$W=np.random.randn(n)*sqrt(2.0/n)$进行权重初始化

Batch Normalization

Batch Normalization方法减轻了如何合理初始化神经网络的问题,其做法是让激活函数在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。在实现层面,应用这个技巧通常意味着全连接层(或者是卷积层)与激活函数之间添加一个BatchNorm层。

批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。

Regularization

Controlling the capacity of Neural Networks to prevent overfitting.

L2正则化:对于网络中的每个权重$w$,向目标函数中增加一个$\frac{1}{2} \lambda w^2$。使用L2正则化意味着所有的权重都以$w += -lambda * W$向着0线性下降。

L1正则化:对于每个$w$我们都向目标函数增加一个$\lambda|w|$。L1和L2正则化也可以进行组合:$\lambda_1|w|+\lambda_2w^2$,这也被称作Elastic net regularizaton

使用L1正则化的神经元最后使用的是它们最重要的输入数据的稀疏子集,同时对于噪音输入则几乎是不变的了。相较L1正则化,L2正则化中的权重向量大多是分散的小数字。

最大范式约束(Max norm constraints):给每个神经元中权重向量的量级设定上限,并使用投影梯度下降来确保这一约束。即参数更新方式不变,然后要求神经元中的权重向量$\overrightarrow{w}$必须满足$||\overrightarrow{w}||_2<c$这一条件,一般c值为3或者4。

随机失活(Dropout):在训练的时候,随机失活的实现方法是让神经元以超参数p的概率被激活或者被设置为0。更多细节在Dropout: A Simple Way to Prevent Neural Networks from Overfitting

predict函数中不进行随机失活,但是对于两个隐层的输出都要乘以p,调整其数值范围。这一点非常重要,因为在测试时所有的神经元都能看见它们的输入,因此我们想要神经元的输出与训练时的预期输出是一致的。

反向随机失活(inverted dropout),它是在训练时就进行数值范围调整,从而让前向传播在测试时保持不变,即对于训练过程中的隐层输出都要除以p。这样做还有一个好处,无论你决定是否使用随机失活,预测方法的代码可以保持不变。

前向传播中的噪音:在更一般化的分类上,随机失活属于网络在前向传播中有随机行为的方法。测试时,通过分析法(在使用随机失活的本例中就是乘以p)或数值法(例如通过抽样出很多子网络,随机选择不同子网络进行前向传播,最后对它们取平均)将噪音边缘化。在这个方向上的另一个研究是DropConnect,它在前向传播的时候,一系列权重被随机设置为0。提前说一下,卷积神经网络同样会吸取这类方法的优点,比如随机汇合(stochastic pooling),分级汇合(fractional pooling),数据增长(data augmentation)。

偏置正则化:不常见,但是对偏置进行正则化也并不会导致算法性能变差

Per-layer regularization

In Practice:通过交叉验证获得一个全局使用的L2正则化强度是比较常见的。在使用L2正则化的同时在所有层后面使用随机失活也很常见。$p$值一般默认设为0.5,也可能在验证集上调参。

Loss functions

数据损失是对所有样本的数据损失求平均。也就是说,$L=\frac{1}{N}\sum_iL_i$中,$N$是训练集数据的样本数。下面把神经网络中输出层的激活函数简写为$f=f(x_i;W)$。

Classification

  1. SVM(the Weston Watkins formulation) $$L_i = \sum_{j\neq y_i} \max(0, f_j - f_{y_i} + 1) \quad \text{or} \quad L_i = \sum_{j\neq y_i} \max(0, f_j - f_{y_i} + 1)^2$$
  1. Softmax $$\displaystyle L_i=-log(\frac{e^{f_{y_i}}}{\sum_je^{f_j}})$$

Problem:类别数目巨大。当标签集很大时,需要使用分层Softmax(Hierarchical Softmax,reference

Attribute classification:每个样本可能有也可能没有某个属性,且各属性之间并不互相排斥。

  • 为每个属性创建一个独立的二分类的分类器 $$L_i = \sum_j \max(0, 1 - y_{ij} f_j)$$ 上式中,求和是对所有分类$j$,$y_{ij}$的值为1或-1,具体根据第i个样本是否被第j个属性打标签而定。当该类别被正确预测并展示的时候,分值向量$f_j$为正,其余情况为负。可以发现,当一个正样本的得分小于+1,或者一个负样本得分大于-1的时候,算法就会累计损失值。
  • 对每种属性训练一个独立的逻辑回归分类器。二分类的逻辑回归分类器只有两个分类(0,1),其中对于分类1的概率计算为: $$\displaystyle P(y=1|x;w,b)=\frac{1}{1+e^{-(w^Tx+b)}}=\sigma(w^Tx+b)$$ 这样如果$\sigma(w^Tx+b)>0.5 \quad \text{or} \quad w^Tx+b>0$,则该样本被分类为正样本。然后损失函数最大化这个对数似然函数,问题简化为: $$L_i = \sum_j y_{ij} \log(\sigma(f_j)) + (1 - y_{ij}) \log(1 - \sigma(f_j))$$ 上式中,$y_{ij}$非0即1,$\displaystyle \frac{\partial L_i}{\partial f_j}=y_{ij}-\sigma(f_j)$

Regression

对于这种问题,通常是计算预测值和真实值之间的损失。然后用L2平方范式或L1范式度量差异。

  • L2范式:$L_i = \Vert f - y_i \Vert_2^2$
  • L1范式:$L_i = \Vert f - y_i \Vert_1 = \sum_j \mid f_j - (y_i)_j \mid$

在上式中,如果有多个数量被预测了,就要对预测的所有维度的预测求和,即$\sum_j$。观察第i个样本的第j维,用$\delta_{ij}$表示预测值与真实值之间的差异。关于该维度的梯度(也就是$\partial L_i/\partial f_j$)能够轻松地通过被求导为L2范式的$\delta_{ij}$或$sign(\delta_{ij})$。这就是说,评分值的梯度要么与误差中的差值直接成比例,要么是固定的并从差值中继承sign

当面对一个回归任务,首先考虑是不是必须这样。一般而言,尽量把你的输出变成二分类,然后对它们进行分类,从而变成一个分类问题。

Structured Prediction

结构化损失是指标签可以是任意的结构,例如图表、树或者其他复杂物体的情况。结构化SVM(the structured SVM loss)背后的基本思想就是在正确的结构$y_i$和得分最高的非正确结构之间画出一个边界

Further Readings