我有关于伯努利掩模的问题。
据我了解,掩码应该取决于速率(概率)p。 (例如,如果 p= 0.5 并且掩码是大小=2 的数组 A,则掩码应类似于:[0,1] 或 [1,0])。 大多数 theano 代码都使用伯努利,例如:
rs = np.random.RandomState(1234)
rng = theano.tensor.shared_randomstreams.RandomStreams(rs.randint(999999))
mask = rng.binomial(n=1, p=(0.5), size=A.shape)
但是当我测试这个时,我发现掩码也可以是 [0,0] 或 [1,1],这对我来说似乎不符合逻辑。因为我想随机地将数组的一半设置为零。 也许有一个错误吗?或者也许 theano 为此目的提供了一种替代方案。 预先感谢您!
最佳答案
rng.binomial(n=1, p=0.5, shape=A.shape)
将为结果张量的每个元素独立地从伯努利分布中采样,形状为 A.shape
。由于每个样本都是独立的,因此结果张量的每个元素将以 0.5 的概率为零,以 0.5 的概率为 1。因此,如果结果张量的形状应为 (2, )
(即长度为 2 的向量),有四种可能的结果,每种结果的概率为 0.25:
[0, 0]
[0, 1]
[1, 0]
[1, 1]
目前尚不清楚您的用例是什么,但如果是用于去噪自动编码器,则这是通常的方法;有时你会比其他时候放弃更多的功能。丢弃所有特征是相当极端的,但当结果张量的大小远大于 2 时,这是不太可能的结果。
如果您确实需要屏蔽一半的元素,那么您可以使用 theano.tensor.raw_random.shuffle_row_elements
。我没有尝试过这个,但想法是使用 shuffle_row_elements
象征性地对索引列表进行洗牌。 ,选择结果列表的前半部分,然后使用 set_subtensor
仅屏蔽原始张量中选定索引处的那些元素。
关于theano - 伯努利理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31971462/