写点什么

实用机器学习笔记二十七:深度神经网络架构

作者:打工人!
  • 2022 年 3 月 13 日
  • 本文字数:2060 字

    阅读完需:约 7 分钟

实用机器学习笔记二十七:深度神经网络架构

前言:

本文是个人在 B 站自学李沐老师的实用机器学习课程【斯坦福 2021 秋季中文同步】的学习笔记,感觉沐神讲解的非常棒 yyds。


过去的一些年里,经过总结,深度神经网络出现了很多设计模式,这些设计模式帮助我们制定神经网络的模板。

批量和层的归一化:

批量归一化:


  • 对于线性模型,会对数据进行标准化(均值为 0,方差为 1)来使损失函数更加平滑

  • 平滑:给定输入,损失对 x 的倒数与损失对 y 的倒数的差的平方小于等于 常数× x 与 y 的差的平方。意味着:当做优化时,对 x 求梯度,然后沿着梯度的方向向前走,当走到 y 时,如果 y 的梯度发生了很大的变化,就会使优化方向走歪;如果 y 的梯度没有发生很大的变化,优化方向就可以继续沿着这个方向走,走的更远,可以有很大的学习率。这个方程的意思:如果 x 和 y 的之间的距离不是很远的话,他们之间的梯度差的平方(梯度改变的方向)可以被上限 bound 住。

  • 小,就可以使用更大一点的学习率,意味着在 x 点可以走更长的步长

  • 不会作用于深度神经网络,只会帮助直接线性作用于 x 上的函数,如果隐藏层中进行了非线性化,是不起作用的


  • 批量归一化(batch normalization)对中间层的输入也做了标准化

  • 提升函数的平滑度,使训练神经网络时更加容易

步骤:


  • reshape:输入转换为 2D,如果输入数据本身就是 2D 就不用转换

  • ------> (batch n, channel c, width w, height h)


  • 标准化:对每一列数据进行标准化



  • Recovery(恢复): ,j 表示第 j 列数据,如果需要的话,可以使用这个等式对数据进行恢复到是可以学习的参数。


  • 通过把转换成以前的维度,就得到输出

代码实现:

http://d2l.ai/chapter_convolutional-modern/batch-norm.html


def batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):    # Use `autograd` to determine whether the current mode is training mode or    # prediction mode    if not autograd.is_training():        # If it is prediction mode, directly use the mean and variance        # obtained by moving average        X_hat = (X - moving_mean) / torch.sqrt(moving_var + eps)    else:        assert len(X.shape) in (2, 4)        if len(X.shape) == 2:            # When using a fully-connected layer, calculate the mean and            # variance on the feature dimension            mean = X.mean(axis=0)            var = ((X - mean) ** 2).mean(axis=0)        else:            # When using a two-dimensional convolutional layer, calculate the            # mean and variance on the channel dimension (axis=1). Here we            # need to maintain the shape of `X`, so that the broadcasting            # operation can be carried out later            mean = X.mean(axis=(0, 2, 3), keepdims=True)            var = ((X - mean) ** 2).mean(axis=(0, 2, 3), keepdims=True)        # In training mode, the current mean and variance are used for the        # standardization        X_hat = (X - mean) / torch.sqrt(var + eps)        # Update the mean and variance using moving average        moving_mean = momentum * moving_mean + (1.0 - momentum) * mean        moving_var = momentum * moving_var + (1.0 - momentum) * var    Y = gamma * X_hat + beta  # Scale and shift    return Y, moving_mean, moving_var
复制代码

层归一化:


  • 主要用于 RNN 中,在序列预测中,每一个时间步,都要维护一个均值和方差,在做预测的时候,碰到句子超过训练时的句子长度时,超过的部分就没有可用的均值和方差了。


  • 层归一化:输入, ,是按照每一个样本来做归一化,归一化的具体计算和 BN 一样

  • 归一化每一个样本,到当前的时间步

  • 在 transformers 上比较好

其他归一化:


  • 修改“reshape”:

  • InstanceNorm: n × c × w × h ---> wh × cn

  • GroupNorm: n × c × w × h ---> swg × gn, c = sg

  • CrossNorm: 交换均值和方差


  • 修改“normalize”: 比如:白化(不仅使均值为 0 方差为 1,并且使得每一个特征之间没有关系,做 PCA)


  • 修改“recovery”:比如:使用神经网络来拟合


  • 把神经网络的权重或者梯度进行归一化。

发布于: 刚刚阅读数: 2
用户头像

打工人!

关注

未来自动驾驶领域扫地僧 2019.11.10 加入

2021年InfoQ年度最佳内容获得者。 InfoQ签约作者 自动化和控制专业入坑人士,目前在研究深度强化学习(DRL)技术。学了Java,本来要入坑互联网,现在要入坑车联网了。喜欢了解科技前沿技术,喜欢手机摄影。

评论

发布
暂无评论
实用机器学习笔记二十七:深度神经网络架构_深度学习_打工人!_InfoQ写作平台