10.1 深度神经网络架构【stanford-cs329p】


Deep Network Tuning

  • DL是一种很有效的编程语言,能够很好的理解数据

    • 一些值可以在后续真实数据填充
    • 可微
  • 各种设计模式,从层到网络架构

Batch Normalization

  • 将数据标准化使损失函数更加平滑特别是线性模型,不然可能梯度突然很大

  • BN把中间一些输入也做了标准化帮助训练更容易,更平滑

  • 把输入变成2D(如果本来就是2D那就不变)

    • XRn×c×w×hXRnwh×c
  • 对每一列标准归一化

    • x^j(x^jmean(xj))/std(xj)
  • y^j=γjx^j+βj 还原得到 Y

  • Y 转回以前的 Y

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def bacth_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):
if not torch.is_grad_enabled(): # in prediction mode
X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps)
else:
assert len(X.shape) in (2, 4)
if len(X.shape) == 2:
mean = X.mean(dim=0)
var = ((X - mean)**2).mean(dim=0)
else:
mean = X.mean(dim=(0, 2, 3), keepdim=True)
var = ((X - mean)**2).mean(dim=(0, 2, 3), keepdim=True)
X_hat = (X - mean) / torch.sqrt(var + eps)
moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
moving_var = momentum * moing_var + (1.0 - momentum) * var
Y = gamma * X_hat + beta
return Y, moving_mean, moving_var

Layer Normalization

  • 如果应用在RNN里面,BN在每个时间步都需要维护均值方差等,这个不能共享
    • 假设训练时句子是10,预测是20,这下好了静态数值都不够了
  • LN做了个转置,把输入 XRn×pXRp×nXRn×c×w×hXRcwh×n ,剩下的和BN一样
    • 区别就是在哪个维度做均值和方差,LN是在样本里面操作
    • 训练和推理时是一致的
    • 在Transformer中很流行

More Normalization

  • 修改“reshape”

    • InstanceNorm:n×c×w×hwh×cn
    • GroupNorm:n×c×w×hswh×gnc=sg
    • CrossNorm:给一堆特征后交换均值/方差
  • 修改“normalize”:白化

  • 修改”recovery“:修改 γ,β

  • 应用到权重或梯度

Summary

  • 把中间层数值更稳定使训练更容易
  • 归一化技术主要三步:输入重置,归一化数据,还原步骤

Powered By Valine
v1.5.2