Lua판 제로로부터 만드는 Deep Learning 그 10[1차원의 수치 미분]

과거 기사 요약



Lua판 제로로부터 만드는 Deep Learning 정리

소개



이번은 원서 4장의 수치 미분의 부분을 실장합니다.
CNN을 구현하는데 있어서는 이 부분은 날려도 상관없습니다. Torch를 이용한 그래프 묘사의 참고 정도로서 주시면 좋겠습니다.
스크립트는 다음과 같습니다.

gradient_1.lua
require 'gnuplot'

---数値微分関数.
-- 入力値に対する一変数関数の数値微分を求める
-- @param f 一変数関数 (Type:function)
-- @param x 入力値 (Type:Tensor)
-- @return 入力値に対する数値微分の値 (Type:Tensor)
function numerical_diff(f, x)
    local h = 1e-4 -- 0.0001
    return (f(x+h) - f(x-h)) / (2*h)
end

---(0.01x^2+0.1x)一変数関数.
-- @param x 入力値 (Type:Tensor)
-- @return 出力値 (Type:Tensor)
function function_1(x)
    return 0.01*torch.pow(x,2) + 0.1*x 
end

---接線生成関数.
-- 入力値に対する関数の接線関数を求める
-- @param f 一変数関数 (Type:function)
-- @param x 入力値 (Type:number)
-- @return 接線関数 (Type:function)
function tangent_line(f, x)
    d = numerical_diff(f, x)
    print(d)
    y = f(x) - d*x
    return function(t) return d*t + y end
end

--function_1(x)のグラフを描写
local x = torch.range(0.0, 20.0, 0.1)
local y = function_1(x)
gnuplot.figure(1)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'})

--数値微分の値
print(numerical_diff(function_1, torch.Tensor({5})))
print(numerical_diff(function_1, torch.Tensor({10})))

--接線のグラフ描写
--x=5の場合
local function_t1 = tangent_line(function_1, 5)
local L_5 = function_t1(x)
gnuplot.figure(2)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'},{x, L_5, '-'},{torch.Tensor({5}), function_t1(torch.Tensor({5})), '+'})
--x=10の場合
local function_t2 = tangent_line(function_1, 10)
local L_10 = function_t2(x)
gnuplot.figure(3)
gnuplot.axis({torch.min(x), torch.max(x), torch.min(y), torch.max(y)})
gnuplot.xlabel("x")
gnuplot.ylabel("f(x)")
gnuplot.plot({x, y, '-'},{x, L_10, '-'},{torch.Tensor({10}), function_t1(torch.Tensor({10})), '+'})

 
그래프의 설명에 관해서는 공식 매뉴얼 의 설명이 몹시 알기 쉽습니다.
 
실행 결과는 다음과 같습니다.

실행 결과
$ th gradient_1.lua
 0.2000
[torch.DoubleTensor of size 1]

 0.3000
[torch.DoubleTensor of size 1]

0.19999999999909    
0.29999999999863

 f(x) = 0.01x^2 + 0.1x 그래프
 


 
 f(x) = 0.01x^2 + 0.1x 그래프와 x=5에서의 접선
 


 
 f(x) = 0.01x^2 + 0.1x 그래프와 x=10에서의 접선



 

결론



이번은 이상입니다.

다음 번은 편미분의 경우를 보고 싶습니다.
 
고맙습니다.

좋은 웹페이지 즐겨찾기