深度學習 Deep Learning UFLDL 最新Tutorial 學習筆記 4:Debugging: Gradient Checking
阿新 • • 發佈:2017-07-13
style inline add tom radi posit math size tutorial
可是我們看到,推導出來的公式是復雜的。特別到後面的神經網絡,更加復雜。這就產生了一個問題,我們怎樣推斷我們編寫的程序就是計算出正確的Gradient呢?
解決的方法就是通過數值計算的方法來估算Gradient然後與用公式計算出來的數據做對照,假設差距非常小,那麽就說明我們的計算是對的。
那麽採用什麽數值計算方法呢?事實上就是基於最主要的求導公式:
ddθJ(θ)=lim?→0J(θ+?)?J(θ??)2?.
我們取epsilon一個非常小的值,那麽得到的數據就是導數的近似。
因此g(θ)≈J(θ+EPSILON)?J(θ?EPSILON)2×EPSILON.
那麽在使用中。比方在ex1a_linreg.m中,能夠這樣使用:
【本文為原創文章。轉載請註明出處:blog.csdn.net/songrotek 歡迎交流哦QQ:363523441】
1 Gradient Checking 說明
前面我們已經實現了Linear Regression和Logistic Regression。關鍵在於代價函數Cost Function和其梯度Gradient的計算。在Gradient的計算中,我們一般採用推導出來的計算公式來進行計算。可是我們看到,推導出來的公式是復雜的。特別到後面的神經網絡,更加復雜。這就產生了一個問題,我們怎樣推斷我們編寫的程序就是計算出正確的Gradient呢?
解決的方法就是通過數值計算的方法來估算Gradient然後與用公式計算出來的數據做對照,假設差距非常小,那麽就說明我們的計算是對的。
那麽採用什麽數值計算方法呢?事實上就是基於最主要的求導公式:
ddθJ(θ)=lim?→0J(θ+?)?J(θ??)2?.
我們取epsilon一個非常小的值,那麽得到的數據就是導數的近似。
因此g(θ)≈J(θ+EPSILON)?J(θ?EPSILON)2×EPSILON.
2 代碼實現
這裏我們不須要自己Code,官方已經給出了代碼。我們僅僅須要分析一下:這個代碼用來計算gradient平均誤差% 說明:grad_check 參數 % fun為函數 % num_checks 檢查次數 % varagin為參數列 var1,var2,var3...這個varagin必須放在function最後一個項 function average_error = grad_check(fun, theta0, num_checks, varargin) delta=1e-3; sum_error=0; fprintf(‘ Iter i err‘); fprintf(‘ g_est g f\n‘) for i=1:num_checks T = theta0; j = randsample(numel(T),1); T0=T; T0(j) = T0(j)-delta; T1=T; T1(j) = T1(j)+delta; [f,g] = fun(T, varargin{:}); %因為fun是linear_regression或logistic_regression f0 = fun(T0, varargin{:}); %所以這裏的varagin{:}參數為train.X,train.y f1 = fun(T1, varargin{:}); g_est = (f1-f0) / (2*delta); error = abs(g(j) - g_est); fprintf(‘% 5d % 6d % 15g % 15f % 15f % 15f\n‘, ... i,j,error,g(j),g_est,f); sum_error = sum_error + error; end average_error =sum_error/num_checks;
那麽在使用中。比方在ex1a_linreg.m中,能夠這樣使用:
% Gradient Check average_error = grad_check(@linear_regression_vec,theta,50,train.X,train.y); fprintf(‘Average error :%f\n‘,average_error);
【本文為原創文章。轉載請註明出處:blog.csdn.net/songrotek 歡迎交流哦QQ:363523441】
深度學習 Deep Learning UFLDL 最新Tutorial 學習筆記 4:Debugging: Gradient Checking