python - Python 中 numpy.random.rand 与 numpy.random.randn 之间的区别

标签 python numpy neural-network numpy-random

numpy.random.randnumpy.random.randn有什么区别?

从文档中,我知道它们之间的唯一区别是每个数字的概率分布,但整体结构(维度)和使用的数据类型( float )是相同的。因此,我很难调试神经网络。

具体来说,我正在尝试重新实现 Neural Network and Deep Learning book by Michael Nielson 中提供的神经网络.原码可以找到here .我的实现和原来的一样;但是,我改为在 init 函数中使用 numpy.random.rand 而不是 numpy.random.randn 定义和初始化权重和偏差功能如原文所示。

但是,我使用 random.rand 来初始化 weights and biases 的代码不起作用。网络不会学习,权重和偏差不会改变。

导致这种怪异的两个随机函数之间有什么区别?

最佳答案

首先,正如您从文档中看到的那样,numpy.random.randn 从正态分布生成样本,而 numpy.random.rand 从均匀分布生成样本(在范围 [0,1))。

第二,为什么均匀分布不起作用?主要原因是激活函数,尤其是在您使用 sigmoid 函数的情况下。 sigmoid 的图如下所示:

enter image description here

因此,您可以看到,如果您的输入远离 0,则函数的斜率下降得非常快,因此您会得到微小的梯度和微小的权重更新。如果你有很多层 - 这些梯度在回传中会被多次相乘,所以即使是“正确”的梯度在乘法之后也会变小并且不再产生任何影响。因此,如果您有很多权重将您的输入带到这些区域,那么您的网络很难训练。这就是为什么通常的做法是在零值附近初始化网络变量。这样做是为了确保您获得合理的梯度(接近 1)来训练您的网络。

然而,均匀分布并不是完全不受欢迎的,你只需要使范围更小,更接近于零。一种好的做法是使用 Xavier 初始化。在这种方法中,您可以使用以下方法初始化权重:

  1. 正态分布。其中 mean 为 0,var = sqrt(2./(in + out)),其中 in - 是神经元的输入数,out - 输出数。

  2. 范围内均匀分布[-sqrt(6./(in + out)), +sqrt(6./(in + out))]

关于python - Python 中 numpy.random.rand 与 numpy.random.randn 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47240308/

相关文章:

python - 使用连续标准化颜色图填充函数下的区域

python - 使用 argv 将参数传递给 python 中的函数

python - 将 Numpy 数组转换为列表会打印出额外的零吗? Python

python - Keras - TypeError : Output tensors to a Model must be Keras tensors - while modelling multiple input , 多输出网络

Python Pandas 循环字典键(元组)并绘制变量相互关系

python - Alembic Django Flask 迁移数据库

Python numpy float16 数据类型操作,和 float8?

python - 开始 :stop slicing inconsistencies between numpy and Pandas?

machine-learning - 如何解释机器学习模型的损失和准确性

python - model.save_weights 和 model.load_weights 未按预期工作