为什么均匀分布初始化 标准差需要乘上Sqrt(3)

深度学习 · 04-16 · 176 人浏览

Pytorch中的kaiming_uniform中标准差stdv乘了一个因子$\sqrt{3}$

def kaiming_uniform_(
    tensor: Tensor, a: float = 0, mode: str = 'fan_in', nonlinearity: str = 'leaky_relu'
):
    #......
    std = gain / math.sqrt(fan)
    bound = math.sqrt(3.0) * std  # Calculate uniform bounds from standard deviation
    with torch.no_grad():
        return tensor.uniform_(-bound, bound)

为什么会出现这个因子,原因其实和物理实验里B类误差需要除去$\sqrt{3}$一样。
均匀分布的方差是$Var = \frac {(b-a)^2}{12}$,而我们真正想要的bound是$(b-a)/2$,所以有$Var = \frac{1}{3} {bound}^2$,标准差则是$\frac{1}{\sqrt 3} bound$。所以求出标准差stdv后,还需要乘一个$\sqrt{3}$得到真正的bound。

不过理论虽然如此,实践中这个因子似乎已经被抛弃了。
https://github.com/pytorch/pytorch/issues/57109

Pytorch
Theme Jasmine by Kent Liao