• 【论文笔记】Training Very Deep Networks


    目标:

    怎么训练很深的神经网络
    然而过深的神经网络会造成各种问题,梯度消失之类的,导致很难训练
    作者利用了类似LSTM的方法,通过增加gate来控制transform前和transform后的数据的比例,称为Highway network
    至于为什么会有效...大概和LSTM会有效的原因一样吧。

    方法:

    首先是普通的神经网络,每一层H从输入x映射到输出y,H通常包含一个仿射变换和一个非线性变换,如下
    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    在这个基础上,highway network添加了两个gate
    1)T:trasform gate
    2)C:carry gate
    添加后的层输出如下:
    note:Training <wbr>Very <wbr>Deep <wbr>Networks
    可以看出T和C控制就是x和H之间的比例,为了简化,设C=1-T
     
    note:Training <wbr>Very <wbr>Deep <wbr>Networks
    显然,y的值:
     
    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    对应的导数为
     
    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    那么还剩下一个问题,这个transform gate的形式是什么,作者使用的是类似LSTM中的仿射变换+sigmoid的方法:
    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    其中b的值会被初始化为负值(-1~-3),这样的话初始状态carry gate的值会更大,也就是说输出y会更偏向x。
     
    另外,由于这里要求每一层的输入x与输出y有相同的大小,所以在每一层之间可能存在一个映射层,把上一层映射到下一层的输入大小。

    实验:

    所有实验使用带动量的SGD,学习率随指数衰减,每一层的H由仿射和RELU组成,文中提供了源码:
    http://people.idsia.ch/~rupesh/very_deep_learning/
     
    首先是网络层数的实验
     
    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    highway指的是本文方法,plain指的是普通的神经网络,可以看出,对于深层的神经网络,highway的结果要好得多。这也就说明添加transform gate的方法是有效的。
     
    另外还有一些关于准确率/层数/参数数量相关的实验:
    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    note:Training <wbr>Very <wbr>Deep <wbr>Networks

    分析:
     
    首先看看各个gate相关参数的激活
    note:Training <wbr>Very <wbr>Deep <wbr>Networks
    上图中的第一列表示gate的bias项,CIFAR数据集中,bias随着层数不断增减,这也就说明前几层受原始输入影响比较大,而后几层则受激活函数H影响更大。
    第二列和第三列表示transform gate的输出,某种意义上说更明显,多数项的gate是close的,仅仅把输入直接传递给输出,只有少数项是激活的。
    最后一列是输出,可以看出,输入和输出并没有改变太多,同一block上基本同正负。
     
    从上面的结果看,其实这更像是skip connection,输入的结果并不会影响每一层,而是在直接传递n层后给了后面的某一层,这有点像高速公路,多数车在一个车道行驶,偶尔变道。
     
    那么这种“变道”是固定的吗?答案是不对,数据还是会选择合适地方进行变道,如下图所示
    note:Training <wbr>Very <wbr>Deep <wbr>Networks
    另一个问题,既然真正激活的内容那么少,是不是意味着许多层并没有提供贡献?
    答案:要看问题
    对于MNIST,由于问题比较简单,因此就算是移除60%的层,依然可以有让人满意的结果
    但是对于复杂的问题,比如CIFAR,随便删除一些层会导致结果大幅度下降,这也就说明深层数对于复杂问题而言更重要(废话
     
    总结:
    这篇与其说是怎么构造更深的神经网络,不如说是如何帮网络中的信息做路由,不同的信息应该在不同的层得到激活,而不是都在同一层。
    而和一般的skip-connection不同,这种跨层的关系不是固定的,是通过学习得到的,所以对问题的适应性应该会更强。
  • 相关阅读:
    前端错误监控
    MeasureSpec内容
    java异常
    JAVA线程的xiao习:线程池 线程同步 线程间通讯 =》进程间通信
    四大组件的context的研究
    初遇Java StringBuffer 和 StringBuilder 类&&利用 StringBuilder 给TextView实现换行处理
    AlertDialog 的context 不能是application的context
    BroadCast用法以及notification用法
    安卓 ContentProvider
    远程service的使用思路
  • 原文地址:https://www.cnblogs.com/zeze/p/8274305.html
Copyright © 2020-2023  润新知