在rand
函数的文档中提到:
返回一个矩阵,其中的元素在区间(0, 1)上均匀分布的随机数。
我的问题是:这些随机数中是否有任何可能在输出中(全部或部分)相等?
作为旁注,我对这个问题感到好奇,因为在Andrew Ng的机器学习课程中建议在训练神经网络时,使用rand
函数来随机化所有theta的值(从而打破对称性)。
回答:
理论上,如果是真正的随机,那么是的——总是存在一个小的可能性,所有值都会相等。然而,这些是浮点数——所以存在很多微小的差异。如果你担心几个权重会得到完全相同的值,你应该去买很多彩票——你中奖的几率会更大!
即使几个权重最终完全相同,并且无法改变——这也不会对整个网络造成太大的影响。
现代正则化技术,如drop-out,使这个问题变得更加不重要。Dropout只会在每个训练批次中使用神经元的一个随机子集,并且只有这些神经元会被更新——所以如果两个权重相同,最终其中一个会被选中用于一个批次(并调整其权重),而另一个则保持不变——从而打破对称性。
注意:rand函数并不是真正的随机,它是伪随机。文档中说它使用了梅森旋转算法(Mersenne Twister)伪随机数生成器,这是一个相对高质量(不是加密级别)的、众所周知且值得信赖的伪随机数生成器。如果你使用的是一个非常低质量的伪随机数生成器,得到完全相同的数值可能会成为一个潜在的问题——但在这种情况下你应该是安全的。