1. 程式人生 > >caffe loss以及正則項反向傳播過程

caffe loss以及正則項反向傳播過程

概述

以前一直以為反向傳播的過程是這樣的,由Softmax計算得出分類loss,然後在加上L2正則項得出總的total_loss,然後再利用total_loss進行反向梯度的計算,而正則項會在每層的Forward函式中計算並返回,表面上感覺很對,但是實際分析就會發現這樣想法不合理的地方,

  • 對正則項的計算,不同的solver是不一樣的,而且正則項的方法也是有L2L1, 每層layer的Forward函式在不知道正則方法和solver型別的情況下是不可能計算出正則結果的。

  • 對於用total_loss進行反向梯度傳播,我們知道total_loss在每一層只和該層的權值有關係,而total_loss

    中包含著所有權值的正則化結果,這時候,如果我想把反向誤差傳播轉化為矩陣運算,顯然不行。

caffe中處理方法

首先需要宣告的是,每一個layer的Forward函式的確有返回loss,但是這個loss函式不是表示正則項的結果,而是應付可能出現的如下情況:就是有些網路並不是在最後才進行Softmax的分類計算,有時候會在網路的中間插入Softmax分類,例如googLeNet
所以在caffe中,loss和正則項的計算過程是下面的敘述這樣的

計算Softmax分類loss

Softmax分類loss是在Network的最後一層SoftmaxWithLossLayer計算的,這裡需要交代的是,當引數iter_size

大於1的時候,比如為4,那麼一次迭代會有4次ForwardBackward的過程,這時候loss會進行4次累加,最後做個平均;更重要的是每次方向傳播的過程中,對於引數的梯度也會進行累加,包括權值和偏置,最後也會對梯度做個平均,這在下面有介紹。主要程式碼如下:
solver.cpp line221

for(int i = 0; i < param_.iter_size(); ++i){
  loss += net_->ForwardBackward();
}
loss /= param_.iter_size();
...
ApplyUpdate();

往引數梯度中加入正則項

如一開始所說,正則項不能在最後加入,而是在每一層計算梯度完成之後,再對梯度進行微調。在加入正則項之前,如果iter_size大於0,要對梯度進行平均,然後才進行正則化,正則化之後才根據lr_rate計算最終要更新的值,這些操作,毫無疑問都是在sgd有關函式sgd_solver.cpp裡完成的。主要程式碼如下:
sgd_solver.cpp: 109

for (int param_id = 0; param_id < this->net_->learnable_params().size(); ++param_id) {
  Normalize(param_id) // 對梯度去均值
  Regularize(param_id) // 在梯度中加入正則項
  ComputeUpdateValue(param_id, rate);
}
this->net_->Update();

正則項的計算也是非常簡單,利用L2優化項對對應權值的導數公式,直接利用矩陣乘法計算,

dL2dw=αw
caffe中程式碼如下:
Dtype weight_decay = this->param_.weight_decay();
string regularization_type = this->param_.regularization_type();
Dtype local_decay = weight_decay * net_params_weight_decay[param_id];
if (local_decay) {
  if(regularization_type == "L2") {
    caffe_axpy(net_params[param_id]->count(),
      local_decay,
      net_params[param_id]->cpu_data(),
      net_params[param_id]->mutable_cpu_diff());
  }
}

這裡順便提一下,ComputeUpdateValue函式是基於Momentum演算法計算更新量的。這個在以後會進行總結。

相關推薦

caffe loss以及反向傳播過程

概述 以前一直以為反向傳播的過程是這樣的,由Softmax計算得出分類loss,然後在加上L2正則項得出總的total_loss,然後再利用total_loss進行反向梯度的計算,而正則項會在每層的Forward函式中計算並返回,表面上感覺很對,但是實際分析就

caffe中如何列印/輸出總loss,包括loss(待完成)

並沒有找到合適的方案,目前來看,需要修改原始碼,但是咋修改原始碼,還沒有搞定。並沒有找到合適的方案,目前來看,需要修改原始碼,但是咋修改原始碼,還沒有搞定。並沒有找到合適的方案,目前來看,需要修改原始碼

機器學習中目標函式、損失函式以及的通俗解釋

目錄: 前言: 1、什麼是目標函式? 定義是:指所關心的目標與相關的因素的函式關係。舉個例子,假如我們想要預測公司樓下手抓餅店明天能賣多少張手抓餅,已知過去10天每天賣多少,以及每天的天氣情況,是否有節假日,和手抓餅店老闆和老闆娘的感情狀況,

概率統計與機器學習:極大後驗概率以及

先驗概率 概念:本質上就是古典概型,是利用當前狀態對求解狀態的一種概率估計,可以理解為“由 因求果”中“因”出現的概率。 條件: (1)實驗所有的可能結果是有限的; (2) 每一種出現

Python基礎(遞歸、模塊、包以及)-day05

stack htm ner ice 由於 urn 匿名函數 python 基礎 寫在前面 上課第四天,打卡:     如果再見不能紅著眼,是否還能紅著臉; 一、協程函數(生成器:yield的表達式形式)   1.yield 的語句形式: yield

jQuery擴展插件以及相關函數練習

正則 jquer 相關 img jquery擴展 ges 練習 alt cnblogs 一、jQuery擴展插件 二、相關正則函數: jQuery擴展插件以及正則相關函數練習

caffe源碼 池化層 反向傳播

C4D alt convert ec2 ted 操作 src 技術 space 圖示池化層(前向傳播) 池化層其實和卷積層有點相似,有個類似卷積核的窗口按照固定的步長在移動,每個窗口做一定的操作,按照這個操作的類型可以分為兩種池化層: 輸入參數如下: 輸入: 1 *

通過給目標函數增加一個來防止其過擬合

.cn 通過 python代碼 矩陣 及其 tle 實現 pos www 為什麽可以通過給目標函數增加一個正則項來防止其過擬合?(來使其更圓滑?) 在實現MF矩陣分解算法的時候,也有給損失函數增加一個正則項:推薦系統之矩陣分解及其Python代碼實現 【Re

常用模塊之re模塊以及表達式擴展

之間 lap 開始 cal 第一個 默認 應該 findall 模塊名 什麽是模塊? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。 但其實import加載的模塊分為四個通用類別:  使用pytho

根據表示式反向生成對應的字串現有工具(包)總結

為什麼會調研這塊知識點?在做測試的時候,資料的自動生成,做自動mock都會用到按規則自動生成資料,所以了~~ 其中有部分是前輩們總結的直接拿來了,多種語言的,但我本身關注更多的是java、python和go,其他語言備用 總結如下: python Exrex, Pyt

深入理解線性迴歸演算法(二):的詳細分析

前言 當模型的複雜度達到一定程度時,則模型處於過擬合狀態,類似這種意思相信大家看到個很多次了,本文首先討論了怎麼去理解複雜度這一概念,然後回顧貝葉斯思想(原諒我有點囉嗦),並從貝葉斯的角度去理解正則項的含義以及正則項降低模型複雜度的方法,最後總結全文。     &nb

機器學習演算法中如何選取超引數 學習速率 係數 minibatch size

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

淺議過擬合現象(overfitting)以及化技術原理

1. 過擬合(overfitting)簡介 0x1:假設空間(hypothesis space) 給定學習演算法 A,它所考慮的所有可能概念的集合稱為假設空間,用符號 H 表示。對於假設空間中的任一概念,我們用符號 h 表示,由於並不能確定它是否真是目標概念,因此稱為“假設”(hypothesis) 1

Python re 模組以及表示式

re.compile( ):將正則表示式編譯成一個物件,加快速度並可以重複使用。 import re re.complie() re.sub() :對字串做替換處理 ''' re.sub(pattern, repl, string, count=0, fl

2、邏輯迴歸(約束數學本質)

https://www.jianshu.com/p/209d73fcb17b 【邏輯迴歸函式模型】 1、線性迴歸連續性不適合離散目標擬合 2、sigmod(S型函式1/(1+e**-z)輸出值始終落在[0,1]的特徵 【邏輯迴歸損失函式】 1、預測函式: g(z) = 1/

異常爬蟲demo、 find函式和findAll函式 以及表示式查詢元素

程式碼位於書的第1-2章 # from urllib.request import urlopen # from bs4 import BeautifulSoup # html = urlopen("http://pythonscraping.com/pages/page1

機器學習筆記之五——目標函式、經驗風險與結構風險、

一、常見的目標函式(loss/cost function)   二、經驗風險與結構風險    經驗風險 L(f) 就是以上損失函式,描述的是模型與訓練資料的契合程度。   結構風險Ω(f)對應於過擬合問題,用正則項解決過擬合是結構風險的課

python處理異常、日誌以及表示式

異常捕獲 高階語言通常都內建了一套try…except…finally…的錯誤處理機制,Python也不例外。而且只要在合適的層次去捕獲錯誤就可以了。 def foo(s): return 10 / int(s) def bar(s):

文字搜尋必學命令-grep egrep fgrep用法以及表示式

一、grep、egrep、fgrep命令   本文中主要介紹了linux系統下grep egrep fgrep命令和正則表示式的基本引數和使用格式、方法。(註釋:文中fg代表例子,) 1.1、基本定義:         grep(global search regu

L1、L2 詳解 - 解空間、先驗分佈、最大似然估計 and 最大後驗估計

L1、L2 正則項詳解(解空間、先驗分佈) 引入 直觀看 解空間 先驗分佈 最大似然估計 最大後驗估計 引入 線上性迴歸