1. embedding部分
1 | def init_weight(modules, activation): |
这里涉及到的是一个权重的初始化的步骤,在神经网络中的初始化步骤很重要。初始化应该既保证输入输出的差异性,又能让model稳定而快速的收敛。描述差异性的方法就是数学中的方差。对于每个神经元的输入z,\(z=\sum_{i=1}^nw_ix_i\),其中n是上一层中的神经元的个数。
那么两个随机变量的方差的公式为:\(Var(w_ix_i)=E[w_i]^2Var(x_i)+E[x_i]^2Var(w_i)+Var(w_i)Var(x_i)\),可以知道如果\(E[x_i]=E[w_i]=0\),能通过批量归一化满足这一条件,那么就有:
\(Var(z)=\sum_{i=1}^nVar(x_i)Var(w_i)\),如果随机变量独立同分布的话,\(Var(z)=nVar(w)Var(x)\)。一般来讲,类别空间相较于样本空间更加稠密,所以反向传播的误差到样本空间将显得微不足道。我们要让样本空间与类别空间的分布差异不要太大,也就是方差尽可能相等。
Xavier初始化方法就是:
gain参数就是可选择的缩放的参数,总之以上就是初始化为了让神经网络更加健壮的手段。