Skip to content

Instantly share code, notes, and snippets.

@sharanry
Last active August 29, 2019 08:50
Show Gist options
  • Save sharanry/2d4e824f27ed01e4f7a1d6fb6f02305a to your computer and use it in GitHub Desktop.
Save sharanry/2d4e824f27ed01e4f7a1d6fb6f02305a to your computer and use it in GitHub Desktop.
Simple NFVI
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 320,
"metadata": {},
"outputs": [],
"source": [
"using Debugger"
]
},
{
"cell_type": "code",
"execution_count": 321,
"metadata": {},
"outputs": [],
"source": [
"using Bijectors\n",
"using Distributions\n",
"using Turing\n",
"using TrackedDistributions\n",
"using ForwardDiff\n",
"using Random\n",
"using Tracker\n",
"using Flux\n",
"using Distances"
]
},
{
"cell_type": "code",
"execution_count": 335,
"metadata": {},
"outputs": [],
"source": [
"@model simple() = begin\n",
" a ~ Normal(10, 5) \n",
" b ~ Normal(a, 5) \n",
" return a, b\n",
"end\n",
"model = simple();\n",
"# @model gdemo_d() = begin\n",
"# s ~ InverseGamma(2, 3)\n",
"# m ~ Normal(0, sqrt(s))\n",
"# 1.5 ~ Normal(m, sqrt(s))\n",
"# 2.0 ~ Normal(m, sqrt(s))\n",
"# return s, m\n",
"# end\n",
"# model = gdemo_d();"
]
},
{
"cell_type": "code",
"execution_count": 362,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"get_transforms (generic function with 1 method)"
]
},
"execution_count": 362,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function get_transforms(model::Turing.Model)\n",
" varinfo = Turing.VarInfo(model)\n",
" num_params = sum([size(varinfo.metadata[sym].vals, 1) for sym ∈ keys(varinfo.metadata)])\n",
" \n",
" base = MvNormal(zeros(num_params), ones(num_params))\n",
" flow = Bijectors.compose(Bijectors.Scale(num_params, param), Bijectors.Shift(num_params, param), [ i%2==1 ? Bijectors.RadialLayer(num_params, param) : Bijectors.PlanarLayer(num_params, param) for i in 1:10]...);\n",
" trans_base = transformed(base, flow);\n",
" return (base=base, flow=flow, trans_base=trans_base) \n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 363,
"metadata": {},
"outputs": [],
"source": [
"base, flow, trans_base = get_transforms(model);"
]
},
{
"cell_type": "code",
"execution_count": 364,
"metadata": {},
"outputs": [],
"source": [
"rng = MersenneTwister(1234);"
]
},
{
"cell_type": "code",
"execution_count": 365,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"6.4086145128384295 (tracked)"
]
},
"execution_count": 365,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function F(rng, model, trans_base; num_samples=10, x=nothing, print_info=false)\n",
" logpdf_p = []\n",
" if x==nothing\n",
" x = rand(rng, trans_base.dist, num_samples)\n",
" end\n",
" \n",
" _x, y, logjac, logpdf = forward(trans_base, x)\n",
" if print_info\n",
" @info \"x\" x\n",
" @info \"y\" y\n",
" @info \"logjac\" logjac\n",
" @info \"logpdf\" logpdf\n",
" end\n",
" \n",
" varinfo = Turing.VarInfo(model)\n",
" \n",
" for i in 1:size(y, 2)\n",
" varinfo_new = Turing.VarInfo(varinfo, Turing.SampleFromUniform(), y[:,i])\n",
" model(varinfo_new)\n",
" if print_info\n",
" @info \"varinfo_new\" varinfo_new.logp\n",
" end\n",
" append!(logpdf_p, varinfo_new.logp)\n",
" end\n",
" \n",
" logpdf_q = logpdf - logjac# - [x[1,i] for i in 1:size(x, 2)]\n",
" if print_info\n",
" @info \"logpdf_p\" logpdf_p \n",
" @info \"logpdf_q\" logpdf_q\n",
" end\n",
" logpdf_p = Tracker.collect(logpdf_p)\n",
"# mean(logpdf_q - logpdf_p)#, logpdf_q, logpdf_p\n",
" kl_divergence(exp.(logpdf_q), exp.(logpdf_p))\n",
"end\n",
"\n",
"# Sanity Check\n",
"out = F(rng, model, trans_base, print_info=false, num_samples=10)"
]
},
{
"cell_type": "code",
"execution_count": 366,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"Figure(PyObject <Figure size 640x480 with 1 Axes>)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# High variability of F. A pontential problem\n",
"using PyPlot\n",
"PyPlot.hist([F(rng, model, trans_base, num_samples=100).data for i in 1:1000], bins=50);"
]
},
{
"cell_type": "code",
"execution_count": 367,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"get_ϕ! (generic function with 1 method)"
]
},
"execution_count": 367,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# To extract all tracked params\n",
"function get_ϕ!(flow::Composed, ϕ)\n",
" for i in flow.ts\n",
" if typeof(i) <: Composed\n",
" get_ϕ!(i, ϕ)\n",
" else\n",
" for j in propertynames(i, false)\n",
" append!(ϕ, [getproperty(i,j)])\n",
" end\n",
" end\n",
" end\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 368,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"32-element Array{Any,1}:\n",
" [1.0 0.0; 0.0 1.0] (tracked) \n",
" [0.0; 0.0] (tracked) \n",
" [-0.517413] (tracked) \n",
" [0.718511] (tracked) \n",
" [1.77198; 1.4844] (tracked) \n",
" [1.55561; -2.24004] (tracked) \n",
" [-0.417338; -3.55184] (tracked) \n",
" [-1.46857] (tracked) \n",
" [-0.427506] (tracked) \n",
" [-0.425289] (tracked) \n",
" [-0.33839; -0.133261] (tracked) \n",
" [-1.87512; -0.371103] (tracked) \n",
" [1.91111; 0.645955] (tracked) \n",
" ⋮ \n",
" [0.987035] (tracked) \n",
" [0.842437] (tracked) \n",
" [-0.604559; -0.282666] (tracked)\n",
" [0.524474; 1.61454] (tracked) \n",
" [-1.82578; 2.07189] (tracked) \n",
" [0.209868] (tracked) \n",
" [-0.257118] (tracked) \n",
" [1.20459] (tracked) \n",
" [0.279818; 2.293] (tracked) \n",
" [0.366493; -1.01509] (tracked) \n",
" [0.575756; -1.35863] (tracked) \n",
" [-0.210145] (tracked) "
]
},
"execution_count": 368,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ϕ = []\n",
"get_ϕ!(flow, ϕ)\n",
"ϕ"
]
},
{
"cell_type": "code",
"execution_count": 369,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"┌ Info: 5.687605605915064 (tracked)\n",
"└ @ Main In[369]:6\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"..........\n",
"(100/10000) done; loss=5.798888461987018\n",
"..........\n",
"(200/10000) done; loss=5.532302103696383\n",
"..........\n",
"(300/10000) done; loss=5.40636217290014\n",
"..........\n",
"(400/10000) done; loss=5.277394195225437\n",
"..........\n",
"(500/10000) done; loss=5.089418426079885\n",
"..........\n",
"(600/10000) done; loss=5.062693849123746\n",
"..........\n",
"(700/10000) done; loss=5.07495216807752\n",
"..........\n",
"(800/10000) done; loss=4.935018449783298\n",
"..........\n",
"(900/10000) done; loss=4.838258708632543\n",
"..........\n",
"(1000/10000) done; loss=4.6412013565065005\n",
"..........\n",
"(1100/10000) done; loss=4.622866199425547\n",
"..........\n",
"(1200/10000) done; loss=4.322743314518878\n",
"..........\n",
"(1300/10000) done; loss=4.480712672678272\n",
"..........\n",
"(1400/10000) done; loss=4.158097191002094\n",
"..........\n",
"(1500/10000) done; loss=4.264347791127247\n",
"..........\n",
"(1600/10000) done; loss=4.173307206543895\n",
"..........\n",
"(1700/10000) done; loss=3.9286591644533093\n",
"..........\n",
"(1800/10000) done; loss=4.002175241609857\n",
"..........\n",
"(1900/10000) done; loss=3.93243579345907\n",
"..........\n",
"(2000/10000) done; loss=3.886448858843637\n",
"..........\n",
"(2100/10000) done; loss=3.8873126379114797\n",
"..........\n",
"(2200/10000) done; loss=3.931958139182028\n",
"..........\n",
"(2300/10000) done; loss=3.7904366437152492\n",
"..........\n",
"(2400/10000) done; loss=3.751041661311117\n",
"..........\n",
"(2500/10000) done; loss=3.716294025864434\n",
"..........\n",
"(2600/10000) done; loss=3.697364805947052\n",
"..........\n",
"(2700/10000) done; loss=3.646594445889464\n",
"..........\n",
"(2800/10000) done; loss=3.575102239215171\n",
"..........\n",
"(2900/10000) done; loss=3.655719770510173\n",
"..........\n",
"(3000/10000) done; loss=3.5701629347308574\n",
"..........\n",
"(3100/10000) done; loss=3.568918757494621\n",
"..........\n",
"(3200/10000) done; loss=3.6122952747296955\n",
"..........\n",
"(3300/10000) done; loss=3.384335376480747\n",
"..........\n",
"(3400/10000) done; loss=3.345501497890491\n",
"..........\n",
"(3500/10000) done; loss=3.5238478717671415\n",
"..........\n",
"(3600/10000) done; loss=3.410132750398626\n",
"..........\n",
"(3700/10000) done; loss=3.3041982877108067\n",
"..........\n",
"(3800/10000) done; loss=3.2532203455570756\n",
"..........\n",
"(3900/10000) done; loss=3.3720866060014174\n",
"..........\n",
"(4000/10000) done; loss=3.2459250924003067\n",
"..........\n",
"(4100/10000) done; loss=3.214724416423852\n",
"..........\n",
"(4200/10000) done; loss=3.174708212806242\n",
"..........\n",
"(4300/10000) done; loss=3.289272111654915\n",
"..........\n",
"(4400/10000) done; loss=3.250804309497583\n",
"..........\n",
"(4500/10000) done; loss=3.2941254904724366\n",
"..........\n",
"(4600/10000) done; loss=3.178987992552885\n",
"..........\n",
"(4700/10000) done; loss=3.125103800561713\n",
"..........\n",
"(4800/10000) done; loss=3.228475500384154\n",
"..........\n",
"(4900/10000) done; loss=3.0838138888630042\n",
"..........\n",
"(5000/10000) done; loss=3.136007874265254\n",
"..........\n",
"(5100/10000) done; loss=3.0248921318124626\n",
"..........\n",
"(5200/10000) done; loss=3.085563156977406\n",
"..........\n",
"(5300/10000) done; loss=3.0645348100492162\n",
"..........\n",
"(5400/10000) done; loss=2.958291727211016\n",
"..........\n",
"(5500/10000) done; loss=2.9304965829886176\n",
"..........\n",
"(5600/10000) done; loss=2.796315805425349\n",
"..........\n",
"(5700/10000) done; loss=2.180155893884919\n",
"..........\n",
"(5800/10000) done; loss=2.0358903633729097\n",
"..........\n",
"(5900/10000) done; loss=2.144586747322932\n",
"..........\n",
"(6000/10000) done; loss=2.1564737450051426\n",
"..........\n",
"(6100/10000) done; loss=2.167814701455386\n",
"..........\n",
"(6200/10000) done; loss=2.105650026763533\n",
"..........\n",
"(6300/10000) done; loss=2.2037724907621925\n",
"..........\n",
"(6400/10000) done; loss=2.0986737473657593\n",
"..........\n",
"(6500/10000) done; loss=2.139643804825428\n",
"..........\n",
"(6600/10000) done; loss=2.0869740899137\n",
"..........\n",
"(6700/10000) done; loss=2.144057399045887\n",
"..........\n",
"(6800/10000) done; loss=2.140419313082119\n",
"..........\n",
"(6900/10000) done; loss=2.123319137390585\n",
"..........\n",
"(7000/10000) done; loss=2.272158844173498\n",
"..........\n",
"(7100/10000) done; loss=2.077289583190817\n",
"..........\n",
"(7200/10000) done; loss=2.131396233779441\n",
"..........\n",
"(7300/10000) done; loss=2.1276211355646013\n",
"...."
]
},
{
"ename": "InterruptException",
"evalue": "InterruptException:",
"output_type": "error",
"traceback": [
"InterruptException:",
"",
"Stacktrace:",
" [1] gradient_(::getfield(Main, Symbol(\"##396#397\")), ::Params) at /home/sharan/.julia/packages/Tracker/SAr25/src/back.jl:7",
" [2] #gradient#24(::Bool, ::Function, ::Function, ::Params) at /home/sharan/.julia/packages/Tracker/SAr25/src/back.jl:164",
" [3] gradient(::Function, ::Params) at /home/sharan/.julia/packages/Tracker/SAr25/src/back.jl:164",
" [4] top-level scope at In[369]:11",
" [5] top-level scope at util.jl:213",
" [6] top-level scope at In[369]:7"
]
}
],
"source": [
"Phi = Flux.Params(ϕ)\n",
"opt = ADAM(2e-4)\n",
"niters = 10_000\n",
"losses = []\n",
"# Initial F\n",
"@info F(rng, model, trans_base, num_samples=10)\n",
"timeused = @elapsed for iter = 1:niters\n",
" iter % 10 == 0 && print(\".\")\n",
"\n",
" loss = F(rng, model, trans_base, num_samples=10)\n",
" gs = Tracker.gradient(() -> loss, Phi)\n",
" for p in ϕ\n",
" Tracker.update!(opt, p, gs[p])\n",
" end\n",
" append!(losses, loss.data)\n",
" \n",
" if iter % 100 == 0\n",
" mean_loss = mean(losses[end-99:end])\n",
" println(\"\\n($iter/$niters) done; loss=$mean_loss\")\n",
" end\n",
"end\n",
"println(\"done; $(timeused)s used\")"
]
},
{
"cell_type": "code",
"execution_count": 371,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"Figure(PyObject <Figure size 640x480 with 1 Axes>)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"1-element Array{PyCall.PyObject,1}:\n",
" PyObject <matplotlib.lines.Line2D object at 0x7f648f7ace80>"
]
},
"execution_count": 371,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Moving Mean Loss Plot\n",
"using PyPlot\n",
"PyPlot.plot([mean(losses[i-99:i]) for i in 100:7347])\n",
"# PyPlot.plot(losses)"
]
},
{
"cell_type": "code",
"execution_count": 372,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"32-element Array{TrackedArray{Float64,N,A} where A<:AbstractArray{Float64,N} where N,1}:\n",
" [-0.00539625 0.00162034; 0.00945505 -0.000361126] (tracked)\n",
" [-0.00731297; 0.00805593] (tracked) \n",
" [0.00160014] (tracked) \n",
" [-0.00177673] (tracked) \n",
" [0.000831536; -0.000520562] (tracked) \n",
" [-0.00307323; -0.00107566] (tracked) \n",
" [0.00131467; -0.00104153] (tracked) \n",
" [-0.00300304] (tracked) \n",
" [-0.00100636] (tracked) \n",
" [0.000581572] (tracked) \n",
" [-0.000491236; 2.52041e-5] (tracked) \n",
" [0.000513647; -0.00079435] (tracked) \n",
" [0.00075561; -0.00257502] (tracked) \n",
" ⋮ \n",
" [0.0001627] (tracked) \n",
" [-0.000169308] (tracked) \n",
" [-0.000202415; 0.000218317] (tracked) \n",
" [0.00332348; 0.000783873] (tracked) \n",
" [0.00102101; 0.000384939] (tracked) \n",
" [0.00212457] (tracked) \n",
" [0.000564511] (tracked) \n",
" [-0.000680569] (tracked) \n",
" [7.86032e-5; 5.91268e-5] (tracked) \n",
" [0.339627; -1.19814] (tracked) \n",
" [-0.000927946; 0.000120444] (tracked) \n",
" [-0.0133198] (tracked) "
]
},
"execution_count": 372,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"loss = F(rng, model, trans_base, num_samples=10)\n",
"gs = Tracker.gradient(() -> loss, Phi)\n",
"[gs[ϕ[i]] for i in 1:length(ϕ)]"
]
},
{
"cell_type": "code",
"execution_count": 373,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9.890143206195424"
]
},
"execution_count": 373,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean((flow(rand(rng, base, 10000)))[1,:].data)"
]
},
{
"cell_type": "code",
"execution_count": 374,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9.979383902117426"
]
},
"execution_count": 374,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean((flow(rand(rng, base, 10000)))[2,:].data)"
]
},
{
"cell_type": "code",
"execution_count": 375,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"Figure(PyObject <Figure size 640x480 with 1 Axes>)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"PyPlot.hist(flow(rand(rng, base, 10000))[1,:].data);"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"@webio": {
"lastCommId": null,
"lastKernelId": null
},
"kernelspec": {
"display_name": "Julia 1.1.0",
"language": "julia",
"name": "julia-1.1"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.1.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment