批归一化(BN)基本是训练深度网络的必备品,但这篇研究论文提出了一种不使用归一化也能训练超深残差网络的新型初始化方法 Fixup。
选自arXiv,作者:Hongyi Zhang等,机器之心编译,参与:路、思源。

前几天,我们介绍了「机器学习领域的七大谣传」,其中一个谣传就是「训练超深度残差网络怎么少得了批归一化(BN)!」。文中介绍了论文《Fixup Initialization: Residual Learning Without Normalization》表明在不引入任何归一化方法的情况下,通过使用原版 SGD,可以有效地训练一个 10,000 层的深度网络。也就是说「训练超深残差网络可以不用批归一化」。

近日,Tesla AI 总监 Andrej Karpathy 也发推提及了这篇论文,这篇论文到底如何,我们一起来看一下吧。

归一化层是当前最优神经网络架构的重要组成部分。人们普遍认为归一化层可以稳定训练、实现较高的学习率、加速收敛并提高泛化能力,尽管其有效的原因仍然是一个活跃的研究课题。这篇论文就挑战了这一「共识」,认为这些好处并不独属于归一化。

研究者提出了一种新型初始化方法 fixed-update initialization (Fixup),试图在训练开始时通过恰当地调整初始化来解决梯度爆炸和梯度消失问题。实验证明,使用 Fixup 训练残差网络与使用归一化训练残差网络一样稳定,甚至在训练 10000 层的深度网络时也是如此。此外,经过恰当的正则化后,Fixup 使残差网络在不使用归一化的情况下也能在图像分类和机器翻译任务中达到当前最优性能。

左图是 ResNet,红色为批归一化层。中间图是堆叠在一起也能稳定训练的简单 Fixup 网络(移除了偏置项)。右图是添加偏置项参数后的 Fixup。

作者在论文开头就提出了两个问题:

  • 没有归一化,深度残差网络可以得到可靠的训练吗?
  • 如果可以的话,那么使用和不使用归一化的深度残差网络,在相同学习率和最优化方法时,收敛速率和泛化性能能否一致?

而这篇论文中给出的答案是两个「Yes」!

该研究解释了给出这个答案的原因:

  • 归一化为什么有助于模型训练?论文作者推导出残差网络在初始化时,梯度范数的下界,从而解释了为什么在使用标准初始化时,归一化技术对于用大学习率训练深度残差网络是必需的。
  • 关于不使用归一化的模型训练,作者提出了一种新初始化方法 Fixup。通过调整网络架构对残差分支的标准初始化进行重缩放,Fixup 可使深度残差网络在不使用归一化技术的情况下以最大学习率进行稳定训练。

作者还在图像分类和机器翻译任务上对以上第二点结论进行了验证:

  • 图像分类:作者在图像分类基准数据集 CIFAR-10 上训练 Wide-ResNet、在 ImageNet 数据集上训练 ResNet,但将批归一化技术替换成了 Fixup,结果发现经过恰当正则化的 Fixup 性能堪比使用归一化技术的精调基线模型。
  • 机器翻译:作者在机器翻译基准 IWSLT 和 WMT 上训练 Transformer 模型,但将层归一化替换成了 Fixup,结果发现新模型优于基线模型,且同样的架构输出结果却达到了新高。

深度网络标准初始化的问题

标准初始化方法尝试设置网络的初始参数,以使激活函数不会消失也不会爆炸。但是,据观察在没有归一化技术的时候,标准初始化无法恰当处理残差连接的梯度流,从而导致梯度爆炸。

作者分析后指出了深度残差网络标准初始化的失败模式:某些层的梯度范数下界会随着网络深度增加而无限增长,即梯度爆炸。具体推导过程参见论文第 2 章。

新型初始化方法 Fixup

作者同时指出摆脱该失败模式未必就能带来成功的训练,毕竟我们所关心的是把整个网络作为函数,而不是一个层或一个网络块。因此,作者提出了一种新型初始化方法 Fixup,它使用自上而下的设计,通过调整标准初始化来确保网络函数的更新(Gradient)保持在恰当范围内。作者用 η 表示学习率,将目标设置为:

换言之,其目标是设计一种初始化,使网络函数的 SGD 更新保持在合适的尺度内,且独立于网络深度。

总结来看,该研究提出的新型初始化方法 Fixup 可使在不使用归一化技术的情况下完成残差网络训练。其原理如下:

  • 1. 将分类层和每个残差分支的最后一层初始化为 0。
  • 2. 使用标准方法对其他层执行初始化,然后按

缩放残差分支中的权重层。

  • 3. 在每个分支中添加一个标量乘数((initialized at 1),在每个卷积、线性和元素级激活层前面添加一个标量偏差((initialized at 0)。

其中规则 2 是必要的。

实验结果

该研究在深度网络和图像分类、机器翻译任务上对这一新方法进行了测试。

深度网络

以默认学习率在 CIFAR-10 数据集上进行第一个 epoch 训练后,Fixup 的性能与批归一化不相上下,甚至对 10000 层的深度网络也是如此。

图 3:不同方法以默认学习率在 CIFAR-10 数据集上训练一个 epoch,训练后的残差网络深度和测试准确率对比。从图中可以看到 Fixup 在训练非常深的网络时可以与批归一化具备同样的学习率(越高越好)。

图像识别

研究者在图像分类应用上将批归一化替换成 Fixup,来测试 Fixup 的能力。

表 1:使用 ResNet-110 在 CIFAR-10 数据集上的结果(5 次训练的平均值,分值越低越好)。

Fixup 能够在 CIFAR-10 上以高学习速率训练一个 110 层的深度残差网络,得到的测试集表现和利用批归一化训练的同结构网络效果相当。

作者还在 ImageNet 数据集上进行了测试。

表 2:使用 ResNet 架构在 ImageNet 数据集上的测试结果(分值越低越好)

机器翻译

为了展示 Fixup 的通用性,研究者还使用 Transformer 在机器翻译任务中进行了测试。

表 3:在机器翻译任务上对比 Fixup 和 LayerNorm(分值越高越好)

论文链接:https://arxiv.org/pdf/1901.09321v1.pdf

l2tp连接尝试失败 因为安全层在初始化_不用批归一化也能训练万层ResNet,新型初始化方法Fixup了解一下...相关推荐

  1. L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误...

    连接vpn时报一下的错误时:L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误. 解决步骤:1. 单击"开始",单击"运行",键入&q ...

  2. Windows 11 L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误

    错误描述:" L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误" 事件查看器中没有错误代码显示. Windows 10 L2TP/IPsec Manu ...

  3. 解决win10连接:L2TP连接尝试失败,因为安全层在初始化与远程计算机的...

    问题: 电脑连接不上公司的,连接报错:L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误. 解决方法: 1. 先设置一下连接 2. 添加注册表项AllowL2TPWeakCr ...

  4. win10内置vpn连接出现的一个错误——L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误

    并不是每台电脑都会出现这个错误,因电脑环境而异 错误描述 " L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误"` 处理方法–两种 亲测第二种完美解决 ...

  5. L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误

    L2TP连接尝试失败 昨天还能连接,就因为昨晚上把windows10更新了,今天就连接不了.报错如下 百度全都是千篇一律的文章,也无法解决我的问题,知道我发现是因为更新的问题,卸载更新后问题成功解决. ...

  6. l2tp连接尝试失败 因为安全层在初始化_线程安全互斥锁

    1认知 线程安全机制: 由于线程它是共享进程里面所有的资源,当然这里面就会包括虚拟内存里面所有的东西(包含全局变量,堆内存,映射的内存及程序段落等),它也继承了进程当中所有的资源(文件描述符,信号资源 ...

  7. L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误

    废话不多先看bug 解决方案在下面 !!!! 启动服务 查看服务是否开启 首先我的电脑 - 右键 - 管理 - 服务和应用程序 - 服务 - 找到IPsec Policy Agent - 右键属性 - ...

  8. win10连接ipsec提示“L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误”

    现象: 今年年初,突然发现之前已经建立好的ipsec隧道再连接就报错了,当时以为家里的routeros上期间做了什么配置导致,在win10上抓包看ISAKMP请求收到了应答然后就没反应了,并且服务端的 ...

  9. Win11配置VPN:L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误

    修改注册表 (1)在"开始 > 运行"中输入regedit.exe,单击"确定",进入注册表编辑器. (2)在"注册表编辑器"页面的左 ...

最新文章

  1. startActivityForResult()
  2. java网页制作教程_JavaWeb程序设计任务教程
  3. hutool 读取扩展名文件_用卓语言实现中文编程显示隐藏文件扩展名
  4. xhprof的简单使用
  5. CodeForces - 1348C Phoenix and Distribution(思维)
  6. JavaScript 之 动态加载JS代码或JS文件
  7. datagrid获取页面总记录数的方法,datagrid获取页面总记录数为0的解决方法
  8. 2016年计算机网考,2016年电大:计算机网考(全)练习题.doc
  9. log4j 禁止类输出日志_log4j 2过滤spring日志遇到的问题
  10. 关于C++中二维vector使用
  11. tensorflow版本升级后的各种方法问题
  12. c++ 每半个小时打印一次_有了3D打印机,后期该如何维护呢
  13. 再次提醒自己测试过程中的侥幸导致失败
  14. cacheinterceptor第二次访问没被调用_双分派访问者模式的前世今生
  15. linux发布微软消息队列,消息队列RabbitMQ入门与5种模式详解
  16. MySQL中的mysqldump命令使用详解
  17. 分享一些使用电脑的小技巧
  18. 用Python全自动下载抖音视频!
  19. nginx重启后出现[error] open() “/usr/local/var/run/nginx/nginx.pid” failed
  20. [NOIP模拟测试37]反思+题解

热门文章

  1. Zookeeper的ZAB协议和Leader选举过程剖析
  2. 基于jedis的Redis工具类
  3. 04.Android之动画问题
  4. 招聘笔记:机器学习基础知识(19道题,有参考答案)
  5. 大数据开发 | MapReduce介绍
  6. php生成迷宫和迷宫寻址算法实例
  7. Max OS X下关于JDK的那些事
  8. Web API 设计摘要
  9. hadoop版本升级到2.4.1
  10. javascript脚本中使用json2.js解析json