Как поощрить разреженность тензора с помощью регуляризации L1 - PullRequest
1 голос
/ 21 февраля 2020

Из документации тензорного потока я вижу, что есть несколько способов применения регуляризации L1. Первый самый интуитивный для меня. Этот пример ведет себя, как и ожидалось, d1 имеет все 3, которые в сумме составляют 48 и масштабируются на 0,1, мы получаем 4.8 как потерю.

d1 = tf.ones(shape=(2,2,4))*3
regularizer = tf.keras.regularizers.l1(0.1)
regularizer(d1)

tf.Tensor: shape = (), dtype = float32, numpy = 4.8

Вторым способом мы используем регуляризацию в ядрах. Таким образом, я предполагаю, что это поощряет редкость весов модели. Я не могу точно сказать, как потеря составляет 0,54747146.

layer = tf.keras.layers.Dense(3,input_dim=(2,2,4),kernel_regularizer=tf.keras.regularizers.l1(0.1))
out = layer(d1)
layer.losses

tf.Tensor: shape = (), dtype = float32, numpy = 0,54747146

Третий способ, по моему мнению, должен был дать тот же результат, что и первый способ применения регуляризации непосредственно к слою. Здесь мы используем activity_regularizer: Regularizer для применения штрафа к выходу слоя.

layer2 = tf.keras.layers.Dense(3,input_dim=(2,2,4),activity_regularizer=tf.keras.regularizers.l1(0.1))
out2=layer2(d1)
layer2.losses

tf.Tensor: shape = (), dtype = float32, numpy = 1.4821562

** Значение, возвращаемое activity_regularizer, делится на размер входной партии ...

Почему потеря 1.4821562? Кажется, каждый раз я повторяюсь. Чем отличаются третий и первый способы?

Если я хочу поощрять редкость d1, что мне следует использовать?

1 Ответ

1 голос
/ 21 февраля 2020

То, что рассчитывает ваш плотный слой, является продуктом матрицы y = W x + b. Ваши три различных способа применения L1 рассчитывают:

  1. l1(x)
  2. l1(W)
  3. l1(Wx + b)

Так как веса и смещения генерируются случайным образом, они будут разными для каждого прогона, если вы не укажете фиксированное начальное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...