2015-08-12 6 views
1

У меня вопрос о маске Bernoulli.Bernoulli in theano

Насколько я понимаю, маска должна зависеть от скорости (вероятности) p. (например, если p = 0,5, а маска - массив A с размером = 2, то маска должна быть примерно такой: [0,1] или [1,0]). Большинство Theano кодов используют Бернулли, как:

Rs = np.random.RandomState (1234)

RNG = theano.tensor.shared_randomstreams.RandomStreams (rs.randint (999999))

маска = rng.binomial (n = 1, p = (0,5), size = A.shape)

, но когда я проверяю это, я выясню, что маска также может быть [0,0] или [1,1] , что кажется мне не логичным. Потому что я хочу случайным образом установить половину массива в нули. Может быть, ошибка? или, может быть, есть альтернатива, которую дает анано для этой цели. Спасибо заранее!

ответ

1

rng.binomial(n=1, p=0.5, shape=A.shape) будет производить выборку из распределения Бернулли независимо для каждого элемента тензора результатов с формой A.shape. Поскольку каждый образец независим, каждый элемент тензора результатов будет равен нулю с вероятностью 0,5 и 1 с вероятностью 0,5. Следовательно, если тензор результат должен иметь форму (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, чтобы скрыть только те элементы в исходных тензорах по выбранным индексам.

+0

спасибо, что ответив на мой вопрос! Я фактически использую его для подхода отсева в нейронных сетях. Таким образом, это было бы «rng.binomial» правильным, поскольку во всех документах они упомянули, что маска должна иметь распределение bernoulli. – mimou

+0

Я думаю, что также нормально использовать независимые образцы Bernoulli при выпадении, поэтому количество входов, которые отбрасываются, может измениться и может означать, что каждый вход иногда падает (в зависимости от размера ввода). –