[cs231n] 深度学习训练的技巧——one time setup

一、One time setup

训练前需要提前考虑好的part: Activation functions; data preprocessing; weight initialization; regularization.

Activation function

1. Sigmoid

[cs231n] 深度学习训练的技巧——one time setup_第1张图片
在这里插入图片描述

  • 将输入x归一化到 [0, 1]
  • 表示了开关状态

缺点:

  • 最关键:’饱和‘的神经元会’kill‘ 梯度。
    当输入x很小,local gradient几乎接近0,反向传播的upstream gradient 和local gradient相乘几乎为0。 使得weights更新很慢。尤其当网络很深时,可能在某一层的gradient变为0,传不到最底层的weight更新,网络训练不动。

  • sigmoid 的输出不是zero-centered。
    [cs231n] 深度学习训练的技巧——one time setup_第2张图片

    在求y = x * w+ b 的local gradient时,dfdw =x, 而x源于上一层节点的sigmoid输出,永远大于0,因此dfdw = x >0, 下一层的local gradient也永远大于0. 则全部梯度符号只取决于upstream gradient的符号,所以永远为正或永远为负。在更新时只能向正反两个方向走,更新路线更弯曲。但是在实际中,由于通常进行batch的整体求gradient,batch整个求梯度的矩阵可能为正可能为负,所以影响不会太大。

  • exp(x) 在CPU的计算较为昂贵。(涉及到计算机基础原理的知识)

2. Tanh

[cs231n] 深度学习训练的技巧——one time setup_第3张图片

  • 将输入归一化到[-1, 1]

缺点:和sigmoid相同,但是改进了第二个缺点。

3. ReLU

[cs231n] 深度学习训练的技巧——one time setup_第4张图片

  • f(x) = max(0, x)

优点:

  • 只要在x大于零,不会出现Sigmoid的饱和,即梯度趋于0.
  • 计算高效。
  • 在实际中,同样网络用sigmoid, tanh, ReLU 训练,ReLU收敛速度快得多。
    缺点:
  • 同sigmoid的not zero-centered,但同样实际中影响不大。
  • 当输入为 0, local gradients 完全为0 ——> leaky ReLU

4. Other ReLU

  • Parameter ReLU:
    [cs231n] 深度学习训练的技巧——one time setup_第5张图片
    f(x) = max(alpha * x, x) , alpha ~ 1e-2
    参数alpha看作超参数,可训练
    缺点:在 0 处的梯度为1 或 alpha
  • Exponential Linear ReLU —— ELU:
    x<0, f(x) = alpha * (exp(x) - 1)
    优点: 解决0处梯度问题
    缺点: exp计算昂贵
  • 还有其他很多提出的改进的activation function,但是性能提升在 1~2 %,并不大。模型性能更取决于网络结构,数据集等,所以不用纠结太多。

实际建议:

  • 需要提升 1% 左右: Leaky ReLU/ ELU/ SELU/ GELU
  • 不要使用 sigmoid/ tanh。

Data preprocessing

1.zero_centered 和 normalized .

为了解决all positive 或 negative 的问题(同sigmoid的第二个缺点)
[cs231n] 深度学习训练的技巧——one time setup_第6张图片

nomalization: (理由不是很明白)

[cs231n] 深度学习训练的技巧——one time setup_第7张图片

实际中网络的处理

[cs231n] 深度学习训练的技巧——one time setup_第8张图片

2.还有PCA和Whitening

但是不常用
[cs231n] 深度学习训练的技巧——one time setup_第9张图片

Weight Initialization

  • 当深度较小时,weights 初始化为0均质,0.01std的高斯分布
    [cs231n] 深度学习训练的技巧——one time setup_第10张图片
w = 0.01 * np.random.randn(Din, Dout)

缺点:但是经过统计分析,weights会随着深度的加深,变得更加集中在0附近,意味着local gradients趋于0.

  • Xavier Initialization,用于tanh activation。保证input的Variance的output的Variance相同,每一层的分布在相同的范围内。std =1/sqrt(Din)。
    [cs231n] 深度学习训练的技巧——one time setup_第11张图片
for Din, Dout in zip(dims【:-1】, dims【1:】):
	w = np.random.randn(Din, Dout) / np.sqrt(Din)
  • Kaiming Initialization, 用于ReLU activation。原理同上一个,std = sqrt(2/Din)

  • 适用于Residual Networks的, 为了保证Var(F(x)+x) = Var(x), 将第一个Conv初始化为Kaiming Initial, 第二个Conv初始化为0.
    (有关初始化也是一个研究领域)

Regularization: Add term to the loss

  • 为了解决过拟合问题。

1. common use

  • L2 regularization (weight decay)
  • L1 regularization
  • Elastic net(L1 + L2)

2. Dropout

  • 在FC层,每一层以概率p随机选取一些activation输出节点为0
  • 解释:每次随机设0的节点不同,可看作是多种模型的ensemble。
def train_step(X):
	H1 = np.maximum(0, np.dot(W1,X)+ b1)
	U1 = np.random.rand(*H1.shape)≤ p
	H1 *= U1
	# H2也一样
	out = np.dot(W3, H2) + b3
  • 缺点:在test时,由于每次train的dropout随机,可能test得到的结果不同。
  • test time:得到随机设置的平均。考虑output at test time = expected output at training time
def predict(X):
	H1 = np.maximum(0, np.dot(W1, X)+ b1) * p
	# H2 相同
	out = np.dot(W3, H2)+ b3

[cs231n] 深度学习训练的技巧——one time setup_第12张图片

  • 总结:在train采取drop,在test time采取scale
  • 更常用:inverted dropout——在train采取drop + scale,test不变
def train_step(X):
	H1 = np.maximum(0, np.dot(W1, X))+ b1
	U1 = (np.random.rand(*H1.shape)≤p)/ p

def predict(X):
	H1 = np.maximum(0, np.dot(W1, X)+ b1)# 无scale  
  • 在实际网络的应用:
    VGG 和 Alexnet的全连接层用的多。
    Googlenet,Resnet等使用global average poolin而不是全连接层,因此不用dropout。
    • 和regularization相似:batch normalization。也是在train中具有随机性,因为每个batch具有随机性,则得到的batch的统计数据如均值,方差等也具有随机性。而在test中,使用固定的统计数值mean等
    • 在Resnet和之后的网络中,一般使用L2+batch normalization

3. Data Augmentation

  • train时随机采样crops和scales;test时平均化固定序列的crops?(resnet用到的)
  • 根据认为判断通过怎样的增强处理可以让网络学到一些知识,是有用的。

4. Other methods

  • DropConnect:随机设置weights为0
  • Fractional Max pooling:随机选择不同大小的kernel,如1✖️1或2✖️2
  • Stochastic Depth (resnet等有block的网络)
  • Cutout:在训练时在图片上随机生成一些mask覆盖住,在test时用全图
  • Mixup:把两张图以随即权重融合。

实际使用建议:

  • 对较大的全连接层,使用dropout
  • 通常batch normalization+data augmentation
  • 遇到小的分类数据集,使用cutout和mixup。

你可能感兴趣的:(深度学习,cs231n,深度学习,cs231n)