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