对这篇博文(【深度学习】神经网络中的权重初始化:Why and How)的讨论
https://www.jianshu.com/p/03009cfdf733
首先,博文作者是想要表达用高斯分布去随机初始化参数W,用的例子是输入层神经元个数1000,输出层神经元个数1,隐层神经元个数1000
在看代码之前呢,我们来理一下疑问的焦点,博文的作者在博文中写了这么一些话
作者说,“由于W是服从均值为0,方差为1的正态分布,X全为1,b全为0,所以Z为均值为0,方差为1000的正态分布”。
群友A提问,“这个Z的方差为什么是1000?”
群友B给出了数学上的证明,附图回复群友A
这时,群友C敏锐地发现,“z=np.sum(x * w)+b”是一个确定的数,怎么会有均值和方差呢?
于是,群友A与群友BC…等互不相让,大家都认为自己正确,各抒己见,热闹非凡,吃瓜群众围观划水。
在经过激烈的讨论交流后,群友C贴出代码计算得到Z=16.xxxx,是一个标量,于是群友ABC都认为博文有问题
但,群友B毕竟觉得自己的数学证明不应该有错,但print(Z)还真是一个标量,如何解释?
于是群友B就向群友A索要了博文链接,细细地观摩起来。
一段时间后,群友B写下了这篇文章
先说结论,群友C 正确,同时,群友B也正确,群友A看的博文也正确,皆大欢喜有木有!?
- 先交代三点前提,敲黑板!。
- 第一点:数学上,随机变量是随机量,它可以用一个大写字母来表示,如
,随机变量的样本(实例)则用小写字母
来表示
- 第二点:代码上,变量一旦赋值后,就存储在某一地址中,地址中的内容是确定的,除非你去修改它。
- 第三点:根据大数定律与中心极限定理,在计算机中,想要表达一个随机变量,就不是一个大写的X了,而是X的足够多(理论上为无穷大,实际可取较大的数)的实例
,由于这些实例是独立同分布的,可以用这些实例的均值和方差估算X的均值和方差。
理解上面三点,就能理解为什么群友ABC都是正确的了,下面是博文中每一行代码的注释:
#以下是我对代码补充的注释,帮助理解上面写的话。
import numpy as np
import matplotlib.pyplot as plt
t = 20000 #博文作者用20000次来近似满足足够大的实验次数(不理解可以想象是抛硬币的次数,次数越多,越接近真实分布)
z_lst = np.empty(t) #开辟z_lst这么大的空间准备存储20000次Z的计算结果
x = np.ones(1000) #初始化每一个x为1
b = 0 #初始化b为0
for i in range(t):#运行20000次计算Z的过程
w = np.random.randn(1000)#每一次计算Z,都重新初始化W,保证20000次的W都是高斯的
z = np.sum(x * w) + b #每一次都按这个公式计算Z,所以,每一次的Z都是标量(所以群友C没错)
z_lst[i] = z #将每一次z的计算结果存到z_lst【i】中,构成z_lst,用来构成变量Z的20000次独立同分布采样
print('z 均值:',np.mean(z_lst))#求z_lst的均值,根据概率论知识,我们知道这个值接近随机变量Z的均值
print('z 方差:',np.var(z_lst)) #求z_lst的方差,根据概率论知识,我们知道这个值接近随机变量Z的方差(方差接近1000所以群友B没错)
plt.hist(z_lst, bins=100)
plt.show()#画出这20000次计算模拟得到的Z的分布,诺,高斯分布就长这样(群友A看的这篇博文也没错,但应把文字中的小z改写成大Z防止歧义)
所以,代码中的小
附证明Z的方差为1000的过程:
完结,撤~