Умножает ли кофе параметр регуляризации на смещение?

У меня куча вопросов о том, как регуляризация и предвзятость работают в кафе.

Во-первых, в сети по умолчанию существуют тенденциозные, правильно ли это? Или мне нужно попросить кафе добавить их?

Во-вторых, когда он получает значение потерь, он не учитывает регуляризацию. это правильно? Я имею в виду, что потеря просто содержит значение функции потерь. Насколько я понял, он просто учитывает регуляризацию при расчете градиента. Это правильно?

В-третьих, когда caffe получает градиент, учитывает ли он также смещенное значение при регуляризации? Или он просто учитывает вес сети при регуляризации?

Заранее спасибо,

Афшин


person Afshin Oroojlooy    schedule 25.08.2016    source источник


Ответы (1)


На ваши 3 вопроса мой ответ:

  1. Да. Предвзятость существует в сети по умолчанию. Например, в ConvolutionParameter и InnerProductParameter в caffe.proto значение по умолчанию для bias_term равно true, что означает, что слой convolution/innerproduct в сети будет иметь смещение по умолчанию.
  2. Да. Значение потерь, полученное слоем потерь, не содержит значения члена регуляризации. И это просто учитывает регуляризацию после вызова функции net_->ForwardBackward() а на самом деле в функции ApplyUpdate(), где обновление сети параметры бывают.
  3. Возьмите слой свертки в сети, например:

    layer {
      name: "SomeLayer"
      type: "Convolution"
      bottom: "data"
      top: "conv"
      #for weights
      param {
        lr_mult: 1 
        decay_mult: 1.0 #coefficient of regularization for weights
                        #default is 1.0, here is for the sake of clarity  
      }
      #for bias
      param {
        lr_mult: 2
        decay_mult: 1.0 #coefficient of regularization for bias
                        #default is 1.0, here is for the sake of clarity 
      } 
      ...  #left 
    }
    

    Ответ на этот вопрос таков: когда caffe получает градиент, решатель будет учитывать смещенное значение в регуляризации, только если две переменные: вторая decay_mult выше и weight_decay в solver.prototxt больше нуля.

    Подробности можно найти в функции void SGDSolver::Regularize(). .

Надеюсь, что это поможет вам.

person Dale    schedule 25.08.2016
comment
Спасибо Дейл за исчерпывающее объяснение - person Afshin Oroojlooy; 25.08.2016
comment
В void SGDSolver::Regularize(), как вы упомянули, когда оба этих параметра не равны нулю, net_params, который действительно равен learnable_params, обновляются. Вы знаете, где в кафе у нас есть этот предвзятый член learnable_params ? - person Afshin Oroojlooy; 26.08.2016
comment
Это функция Net<Dtype>::AppendParam() в net.cpp. @AfshinOroojlooy - person Dale; 26.08.2016