Knowledge Point (KP): BN, LN, IN,GN和SN的异同

本文对比了BN、LN、IN、GN和SN五种归一化技术,分析了它们在不同场景下的适用性和优缺点。BN适用于大规模批处理,LN适合RNN,IN在图像生成任务中有优势,GN在小批量时表现良好,而SN则是自适应归一化的方法。此外,还探讨了BN有效性的可能原因,指出其主要作用在于平滑损失曲面,帮助优化过程。

本文首先讲解BN[1], LN[2], IN[3], GN[4]和SN[5]的异同,其次讲解BN为何有效的可能原因[6]。


BN、LN、IN、GN和SN的异同
在这里插入图片描述
参考上图:

  • BN是在batch上,对N,H,W做归一化,对小batchsize效果不好,应优先考虑
  • LN在通道方向上,对C,H,W做归一化,主要用于RNN
  • IN在图像像素上,对H, W做归一化,主要用于风格迁移, GAN
  • GN将通道分组,然后归一化,适合mini-batch很小的情况
  • SN将BN,LN,IN结合,赋予权重,让网络自适应归一化层

基于机器学习领域的一个重要的假设: i i d iid iid假设,即假设训练数据和测试数据是满足相同的分布的,这是通过训练数据集获得的模型能够在测试集上获得好的效果的一个基本保障。

Batch Normalization
那么BN,简单的说,就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同的分布。
在这里插入图片描述

尽管解决了ICS(ICS与CS是不同的,前者全称为internal covariate shift,是针对网络内部的,后者全称covariate shift,是针对输入数据的)的问题,并获得了很好的效果,比如加速模型收敛,不再依赖精细的参数初始化过程,可以调大学习率,同时引入的随机噪声能够对模型参数进行正则化,有利于增强模型的泛化性能。

但是也有不少问题:

  • 如果batch size太小,则BN效果明显下降
  • 对于有些像素级图片生成任务,效果不佳
  • 不适合RNN等动态网络,不方便且效果不佳
  • 训练时和推理时统计量不一致

Layer Normalization
为了能够在只有当前一个训练实例下,找到一个合理的统计范围,一个直接的想法是:把同一个卷积层作为集合,求均值和方差;对于RNN,就是把同层隐层神经元的响应值(不同时刻)作为集合,再求均值和方差。

Instance Normalization
LN是对所有的通道,那对一个通道做归一化是怎样呢!IN就是这么做的,单个通道的feature map作为集合,并在此集合上求均值和方差,这种像素级上的操作,使得IN对于一些图片生成类的任务效果明显优于BN,比如图片风格转换。

Group Normalization
LN是对于所有的通道,IN是对于单个通道,如果把所有通道分组,再各个组上做归一化又会怎样呢?这就是GN啦。通道分组也是CNN常用的优化技巧。GN在mini-batch比较小的场景或者物体检测、视频分类等场景下效果优于BN。

Switchable Normalization
归一化,虽能提高模型的泛化能力,但BN,LN, IN, GN都是人工设计的,是否可以放开手脚,让网络自适应呢!这是个更加generic的做法。
h ^ n c i j = γ h n c i j − ∑ k ∈ Ω w k μ k ∑ k ∈ Ω w k ′ σ k 2 + ϵ + β \hat{h}_{ncij} = \gamma \frac{h_{ncij} - \sum_{k \in \Omega}w_k \mu_k}{\sqrt{\sum_{k \in \Omega} w_k^{'} \sigma_k^{2} + \epsilon}} + \beta h^ncij=γkΩwkσk2+ϵ hncijkΩwkμk

`href="{% url 'knowledge_graph:knowledge_point_detail' knowledge_point.pk %}"` 是 Django 模板语言中的一种用法,主要用于生成指向特定视图的 URL 链接。下面详细解释其作用原理。 ### 作用 在 HTML 模板中,需要创建一个指向特定视图的超链接。使用 `{% url %}` 模板标签可以动态生成 URL,避免硬编码 URL,提高代码的可维护性。当 URL 模式发生变化时,只需修改 `urls.py` 文件,而无需在模板中逐个修改链接。 ### 原理 - `{% url %}` 是 Django 模板语言提供的一个标签,用于进行 URL 反转。URL 反转是指根据 URL 模式的名称参数,动态生成对应的 URL。 - `'knowledge_graph:knowledge_point_detail'` 是 URL 模式的名称,`knowledge_graph` 是命名空间,`knowledge_point_detail` 是具体的 URL 模式名称。通过这种命名方式,可以避免不同应用中 URL 名称冲突。 - `knowledge_point.pk` 是传递给 URL 模式的参数,`pk` 通常是模型实例的主键。在 URL 模式中,通常会使用类似 `(?P<pk>[0-9]+)` 的正则表达式来捕获这个参数。 ### 示例代码 假设 `urls.py` 中的 URL 模式定义如下: ```python from django.urls import path from . import views app_name = 'knowledge_graph' urlpatterns = [ path('points/<int:pk>/', views.knowledge_point_detail, name='knowledge_point_detail'), ] ``` 在模板中使用 `{% url %}` 标签: ```html <a href="{% url 'knowledge_graph:knowledge_point_detail' knowledge_point.pk %}"> {{ knowledge_point.name }} </a> ``` 当渲染模板时,Django 会根据 `knowledge_point.pk` 的值,动态生成对应的 URL。例如,如果 `knowledge_point.pk` 的值为 1,生成的 URL 可能是 `/knowledge_graph/points/1/`。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值