torch.nn.init细节
毕业论文进度0/50。大晚上挂着下骑砍2想顺便写论文的,内心太抗拒没办法,在这把以前看到的一些torch里的细节记录一下吧。
Abstract
torch默认的卷积初始化针对的激活函是 s l o p e = 5 slope=\sqrt{5} slope=5的leaky-relu,而不是relu。
常见init的种类
平时能用到的卷积的初始化一般涉及到两个名字:xavier,kaiming.两者都是基于对数据张量的variance的传播推导得出的,不同点在于kaiming的推导里考虑到了激活函数的作用。
以ReLU为例, R e L U ( x ) ReLU(x) ReLU(x)会将 x x x的负元素置0。假设x为正态分布或者均匀分布等具有对称性的分布时,ReLU正好将一半的元素置零,再经过卷积 ξ \xi ξ的传播,我们有 v a r ( ξ ( R e L U ( x ) ) ) = 1 2 v a r ( ξ ( x ) ) var(\xi(ReLU(x)))=\frac{1}{2}var(\xi(x)) var(ξ(ReLU(x)))=21var(ξ(x)).右边是xavier初始化考虑的情形。所以kaiming初始化需要在xavier初始化的基础上scale一个2.
具体的细节推导网上有很多,这里不多描述。
xavier_uniform
和torch里的代码略有不同,至少我本人从原文里看到的实现应该是:
a = 6 f i n + f o u t a=\sqrt{\frac{6}{f_{in}+f_{out}}} a=fin+fout6