Из документации тензорного потока я вижу, что есть несколько способов применения регуляризации 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, что мне следует использовать?