问题:
权重初始化对神经网络最终的收敛有重要影响。梯度爆炸:当损失函数梯度过大,导致损失函数在最小值附近振荡;梯度消失:当损失函数梯度过小,导致损失函数未到最小值就提前收敛。
原则:如何找到合适的初始化函数?1.激活函数的均值为0;2.每一层激活值的方差应该保持一致。
解决方案:Kaiming初始化函数:
1)在给定层上创建适合权重矩阵的维度的张量,并用服从标准正态分布的随机数字填充(均值为0,方差为1);
2)将每个随机选择的数字乘以sqrt(2/n),其中n是从上一层的输入给定层的传入连接数;
3)偏置张量初始化为0。
1.Kaiming初始化函数的定义
import torch
import math
def kaiming(n, h):
return torch.randn(n, h) * math.sqrt(2./n)
def relu(x):
return x.clamp_min(0.)
2.凯明初始化的均值和标准差
x = torch.randn(512)
for i in range(100):
w = kaiming(512, 512)
x = relu(w @ x)
if i%10 == 0:
print(x.mean(), x.std())
网友评论