(Caffe混埠,LeNet)權(quán)值更新(七)

本文從CSDN上轉(zhuǎn)移過來:
http://blog.csdn.net/mounty_fsc/article/details/51588773

在Solver::ApplyUpdate()函數(shù)中宙刘,根據(jù)反向傳播階段計(jì)算的loss關(guān)于網(wǎng)絡(luò)權(quán)值的偏導(dǎo),使用配置的學(xué)習(xí)策略杠览,更新網(wǎng)絡(luò)權(quán)值從而完成本輪學(xué)習(xí)蝴罪。

1 模型優(yōu)化

1.1 損失函數(shù)

損失函數(shù)$L(W)$可由經(jīng)驗(yàn)損失加正則化項(xiàng)得到,如下埠偿,其中$X^{(i)}$為輸入樣本透罢;$f_W$為某樣本的損失函數(shù);$N$為mini-batch的樣本數(shù)量冠蒋;$r(W)$為以權(quán)值為$\lambda$的正則項(xiàng)羽圃。

$L(W) \approx \frac{1}{N} \sum_i^N f_W\left(X^{(i)}\right) + \lambda r(W)$

在caffe中,可以分為三個(gè)階段:

  1. 前向計(jì)算階段抖剿,這個(gè)階段計(jì)算$f_W$
  2. 反向傳播階段朽寞,這個(gè)階段計(jì)算$\nabla f_W$
  3. 權(quán)值更新階段胚吁,這個(gè)階段通過$\nabla f_W,\nabla r(W)$等計(jì)算$\Delta W$從而更新$W$

1.2 隨機(jī)梯度下降

在lenet中,solver的類型為SGD(Stochastic gradient descent)

SGD通過以下公式對權(quán)值進(jìn)行更新:

$W_{t+1} = W_t + V_{t+1}$
$V_{t+1} = \mu V_t - \alpha \nabla L(W_t)$

其中愁憔,$W_{t+1}$為第$t+1$輪的權(quán)值腕扶;$V_{t+1}$為第$t+1$輪的更新(也可以寫作$\Delta W_{t+1}$);$\mu$為上一輪更新的權(quán)重;$\alpha$為學(xué)習(xí)率吨掌;$\nabla L(W_t)$為loss對權(quán)值的求導(dǎo)

2 代碼分析

2.1 ApplyUpdate

void SGDSolver<Dtype>::ApplyUpdate() {
  // 獲取該輪迭代的學(xué)習(xí)率(learning rate)
  Dtype rate = GetLearningRate();

  // 對每一層網(wǎng)絡(luò)的權(quán)值進(jìn)行更新
  // 在lenet中半抱,只有`conv1`,`conv2`,`ip1`,`ip2`四層有參數(shù)
  // 每層分別有參數(shù)與偏置參數(shù)兩項(xiàng)參數(shù)
  // 因而`learnable_params_`的size為8.
  for (int param_id = 0; param_id < this->net_->learnable_params().size();
       ++param_id) {
    // 歸一化,iter_size為1不需要膜宋,因而lenet不需要
    Normalize(param_id);
    // 正則化
    Regularize(param_id);
    // 計(jì)算更新值\delta w
    ComputeUpdateValue(param_id, rate);
  }
  // 更新權(quán)值
  this->net_->Update();
}



說明:

  1. lenet中學(xué)習(xí)參數(shù)設(shè)置可從lenet_solver.prototxt中查到

    # The base learning rate, momentum and the weight decay of the network.
    base_lr: 0.01
    momentum: 0.9
    weight_decay: 0.0005
    # The learning rate policy
    lr_policy: "inv"
    gamma: 0.0001
    power: 0.75
    
  2. 獲取學(xué)習(xí)率函數(shù)ApplyUpdate代碼此處不給出窿侈,查看注釋(以及caffe.proto)可知有如下學(xué)習(xí)率獲取策略。在Lenet中采用的是inv的策略秋茫,是一種沒一輪迭代學(xué)習(xí)率都改變的策略史简。

      // The learning rate decay policy. The currently implemented learning rate
      // policies are as follows:
      //    - fixed: always return base_lr.
      //    - step: return base_lr * gamma ^ (floor(iter / step))
      //    - exp: return base_lr * gamma ^ iter
      //    - inv: return base_lr * (1 + gamma * iter) ^ (- power)
      //    - multistep: similar to step but it allows non uniform steps defined by
      //      stepvalue
      //    - poly: the effective learning rate follows a polynomial decay, to be
      //      zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)
      //    - sigmoid: the effective learning rate follows a sigmod decay
      //      return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
      //
      // where base_lr, max_iter, gamma, step, stepvalue and power are defined
      // in the solver parameter protocol buffer, and iter is the current iteration.
    

2.2 Regularize

該函數(shù)實(shí)際執(zhí)行以下公式

$\nabla w_{ij}=decay*w_{ij}+\nabla w_{ij}$

代碼如下:

void SGDSolver<Dtype>::Regularize(int param_id) {
  const vector<Blob<Dtype>*>& net_params = this->net_->learnable_params();
  const vector<float>& net_params_weight_decay =
      this->net_->params_weight_decay();
  Dtype weight_decay = this->param_.weight_decay();
  string regularization_type = this->param_.regularization_type();
  // local_decay = 0.0005 in lenet
  Dtype local_decay = weight_decay * net_params_weight_decay[param_id];
    
  ...
      if (regularization_type == "L2") {
        // axpy means ax_plus_y. i.e., y = a*x + y
        caffe_axpy(net_params[param_id]->count(),
            local_decay,
            net_params[param_id]->cpu_data(),
            net_params[param_id]->mutable_cpu_diff());
      } 
  ...
}

2.3 ComputeUpdateValue

該函數(shù)實(shí)際執(zhí)行以下公式
$\nabla w_{ij}=lr_rate\nabla w_{ij}+momentumw^{'}_{ij}$
$w^{'}$為上一輪的權(quán)值,注意結(jié)果保存的位置在cpu_diff中即loss對參數(shù)的梯度中

代碼如下:


void SGDSolver<Dtype>::ComputeUpdateValue(int param_id, Dtype rate) {
  const vector<Blob<Dtype>*>& net_params = this->net_->learnable_params();
  const vector<float>& net_params_lr = this->net_->params_lr();
  // momentum = 0.9 in lenet
  Dtype momentum = this->param_.momentum();
  // local_rate = lr_mult * global_rate
  // lr_mult為該層學(xué)習(xí)率乘子肛著,在lenet_train_test.prototxt中設(shè)置
  Dtype local_rate = rate * net_params_lr[param_id];
  
  // Compute the update to history, then copy it to the parameter diff.

  ...
    // axpby means ax_plus_by. i.e., y = ax + by
    // 計(jì)算新的權(quán)值更新變化值 \delta w,結(jié)果保存在歷史權(quán)值變化中
    caffe_cpu_axpby(net_params[param_id]->count(), local_rate,
              net_params[param_id]->cpu_diff(), momentum,
              history_[param_id]->mutable_cpu_data());

    // 從歷史權(quán)值變化中把變化值 \delta w 保存到歷史權(quán)值中diff中
    caffe_copy(net_params[param_id]->count(),
        history_[param_id]->cpu_data(),
        net_params[param_id]->mutable_cpu_diff());
   ... 
}

2.4 net_->Update

實(shí)際執(zhí)行以下公式:
$w_{ij}=w_{ij}+(-1)*\nabla w_{ij}$

參考文獻(xiàn):

[1]. http://caffe.berkeleyvision.org/tutorial/solver.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末圆兵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子枢贿,更是在濱河造成了極大的恐慌殉农,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件局荚,死亡現(xiàn)場離奇詭異超凳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耀态,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門轮傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人首装,你說我怎么就攤上這事创夜。” “怎么了簿盅?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵挥下,是天一觀的道長揍魂。 經(jīng)常有香客問我桨醋,道長,這世上最難降的妖魔是什么现斋? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任喜最,我火速辦了婚禮,結(jié)果婚禮上庄蹋,老公的妹妹穿的比我還像新娘瞬内。我一直安慰自己迷雪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布虫蝶。 她就那樣靜靜地躺著章咧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪能真。 梳的紋絲不亂的頭發(fā)上赁严,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音粉铐,去河邊找鬼疼约。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝙泼,可吹牛的內(nèi)容都是我干的程剥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼汤踏,長吁一口氣:“原來是場噩夢啊……” “哼织鲸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溪胶,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤昙沦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后载荔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盾饮,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年懒熙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丘损。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡工扎,死狀恐怖徘钥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肢娘,我是刑警寧澤呈础,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站橱健,受9級特大地震影響而钞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拘荡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一臼节、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦网缝、人聲如沸巨税。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽草添。三九已至,卻和暖如春扼仲,著一層夾襖步出監(jiān)牢的瞬間果元,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工犀盟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留而晒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓阅畴,卻偏偏與公主長得像倡怎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子贱枣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 1. 記者問coco chanel小姐监署,金錢對你來說意味著什么?chanel說纽哥,它使我獲得的獨(dú)立性是很有價(jià)值的钠乏。 ...
    Iris大龍閱讀 419評論 0 0
  • 文/一衾 我在陰暗的房子里 用皮膚和毛發(fā)去感知 感知毫無溫度的 感知冷如冰窯似的 是空白 我在陰暗的房子里 外面的...
    一衾閱讀 212評論 0 3