x=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): a=random.normal(loc=0, scale=1, size=(512,512))*math.sqrt(1./512) x=numpy.array([math.tanh(c)for c in a@x]) x.mean(), x.std()
(0.0008083661917762789, 0.05757114952184833)
可以观察到,在一百层神经网络后,x的均值与标准差值仍处于有效范围,激活未完全消失。
1 2 3 4 5
x=numpy.random.uniform(low=-1,high=1,size=512)#均值为0,方差为1/3的均匀分布(从-1到1取值),512个数据 for i inrange(100): a=random.normal(loc=0, scale=1, size=(512,512))*math.sqrt(1./512) x=numpy.array([math.tanh(c)for c in a@x]) x.mean(), x.std()
(0.0013361727805947863, 0.0572257326796936)
1 2 3 4 5 6
x=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): #权值取均值为0,方差为1/3的均匀分布(从-1到1取值),512*512个数据*1/n a=numpy.random.uniform(low=-1,high=1,size=(512,512))*math.sqrt(1./512) x=numpy.array([math.tanh(c)for c in a@x]) x.mean(), x.std()
x=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): #权值取均值为0,方差为1的均匀分布(从-sqrt3到sqrt3取值),512*512个数据*1/n a=numpy.random.uniform(low=-1.73205081,high=1.73205081,size=(512,512))*math.sqrt(1./512) x=numpy.array([math.tanh(c)for c in a@x]) x.mean(), x.std()
#xavier初始化 x=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): a=xavier(512,512) x=numpy.array([math.tanh(c)for c in a@x]) print(x.mean(), x.std()) #xavier初始化,但是权重并非U(-1,1)而是N(0,1)分布 x1=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): a=xbvier(512,512) x1=numpy.array([math.tanh(c)for c in a@x1]) print(x1.mean(), x1.std()) #凑方差为1初始化,权重U(-1,1)分布 x2=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): a=numpy.random.uniform(low=-1,high=1,size=(512,512))*math.sqrt(3./512) x2=numpy.array([math.tanh(c)for c in a@x2]) print(x2.mean(), x2.std())
#以下为无激活函数的情况 #xavier初始化 x=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): a=xavier(512,512) x=a@x print(x.mean(), x.std()) #xavier初始化,但是权重并非U(-1,1)而是N(0,1)分布 x1=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): a=xbvier(512,512) x1=a@x print(x1.mean(), x1.std()) #凑方差为1初始化,权重U(-1,1)分布 x2=random.normal(loc=0, scale=1, size=512)#均值为0,方差为1的正态分布,512个数据 for i inrange(100): a=numpy.random.uniform(low=-1,high=1,size=(512,512))*math.sqrt(3./512) x2=numpy.array([math.tanh(c)for c in a@x2]) print(x2.mean(), x2.std())