Skip to content

Instantly share code, notes, and snippets.

@phsamuel
Last active February 2, 2017 02:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phsamuel/f1d00ade31b06fb741e75deba26cba8a to your computer and use it in GitHub Desktop.
Save phsamuel/f1d00ade31b06fb741e75deba26cba8a to your computer and use it in GitHub Desktop.
A demo to compare some popular numerical optimizer
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### define optimization methods"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Generic optimizer"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import sympy\n",
"\n",
"def erase_buf(method):\n",
" try:\n",
" delattr(method,'buf')\n",
" except AttributeError:\n",
" pass\n",
"\n",
"def load_buf(method):\n",
" try:\n",
" v=getattr(method,'buf')\n",
" except AttributeError:\n",
" v=0\n",
" return v\n",
"\n",
"def opt(method,function,starting_point,learning_rate=0.12,steps=10):\n",
" erase_buf(method)\n",
" x,y=sympy.symbols('x,y')\n",
" point=starting_point\n",
" plist=[point]\n",
" fx=function.diff(x)\n",
" fy=function.diff(y)\n",
" for i in range(steps):\n",
" point=method(function,fx,fy,point,learning_rate)\n",
" plist.append(point) \n",
" return plist"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Optimizers"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import sympy\n",
"import numpy as np\n",
"import math\n",
"\n",
"# Stochastic Gradient Descent\n",
"def sgd_step(f,fx,fy,point,learning_rate=0.1):\n",
" x,y=sympy.symbols('x,y')\n",
" dx=np.array((fx.subs(x,point[0]).subs(y,point[1]),fy.subs(x,point[0]).subs(y,point[1])))\n",
" x=np.array(point) # not a good symbol, try to match stanford note, unfortunately symbol used earlier\n",
" \n",
" x=x-learning_rate*dx\n",
" return (x[0],x[1])\n",
"\n",
"# SGD with Momentum\n",
"def momentum_step(f,fx,fy,point,learning_rate=0.1,mu=0.5):\n",
" # load buf\n",
" v=load_buf(momentum_step)\n",
"\n",
" x,y=sympy.symbols('x,y') \n",
" dx=np.array((fx.subs(x,point[0]).subs(y,point[1]),fy.subs(x,point[0]).subs(y,point[1])))\n",
" x=np.array(point) # not a good symbol, try to match stanford note, unfortunately symbol used earlier\n",
" \n",
" v=mu*v-learning_rate*dx \n",
" x=x+v\n",
" \n",
" # save buf\n",
" momentum_step.buf = v\n",
" return (x[0],x[1])\n",
"\n",
"# Nesterov Momentum\n",
"def nag_step(f,fx,fy,point,learning_rate=0.1,mu=0.5):\n",
" v=np.zeros(2)+load_buf(nag_step)\n",
" \n",
" # compute gradient\n",
" x,y=sympy.symbols('x,y')\n",
" \n",
" dx=np.array((fx.subs(x,point[0]+mu*v[0]).subs(y,point[1]+mu*v[1]),\n",
" fy.subs(x,point[0]+mu*v[0]).subs(y,point[1]+mu*v[1])))\n",
" #print (dx)\n",
" x=np.array(point) # not a good symbol, try to match stanford note, unfortunately symbol used earlier\n",
"\n",
" # update\n",
" v = mu*v-learning_rate*dx \n",
" x=x+v\n",
" \n",
" # save buf\n",
" nag_step.buf = v\n",
" return (x[0],x[1])\n",
"\n",
"# AdaGrad\n",
"def adagrad_step(f,fx,fy,point,learning_rate=0.1):\n",
" cache = load_buf(adagrad_step)\n",
" \n",
" x,y=sympy.symbols('x,y')\n",
" dx=np.array((fx.subs(x,point[0]).subs(y,point[1]),fy.subs(x,point[0]).subs(y,point[1])))\n",
" x=np.array(point) # not a good symbol, try to match stanford note, unfortunately symbol used earlier\n",
" \n",
" cache += dx[0]**2 + dx[1]**2 \n",
" x=x-learning_rate*dx/(math.sqrt(cache)+1e-7)\n",
" \n",
" adagrad_step.buf=cache\n",
" return (x[0],x[1])\n",
"\n",
"# RMSProp\n",
"def rmsprop_step(f,fx,fy,point,learning_rate=0.1,decay_rate=0.5):\n",
" cache = load_buf(rmsprop_step)\n",
" \n",
" x,y=sympy.symbols('x,y')\n",
" dx=np.array((fx.subs(x,point[0]).subs(y,point[1]),fy.subs(x,point[0]).subs(y,point[1])))\n",
" x=np.array(point) # not a good symbol, try to match stanford note, unfortunately symbol used earlier\n",
" \n",
" cache = decay_rate*cache + (1-decay_rate)*(dx[0]**2 + dx[1]**2)\n",
" x=x-learning_rate*dx/(math.sqrt(cache)+1e-7)\n",
" \n",
" rmsprop_step.buf=cache\n",
" return (x[0],x[1])\n",
"\n",
"# Adam\n",
"def adam_step(f,fx,fy,point,learning_rate=0.1,beta1=0.5,beta2=0.5):\n",
" buf = np.zeros(4)+load_buf(adam_step)\n",
" \n",
" t=buf[0]\n",
" m=buf[1:3]\n",
" v=buf[3]\n",
" \n",
" x,y=sympy.symbols('x,y')\n",
" dx=np.array((fx.subs(x,point[0]).subs(y,point[1]),fy.subs(x,point[0]).subs(y,point[1])))\n",
" x=np.array(point) # not a good symbol, try to match stanford note, unfortunately symbol used earlier\n",
" \n",
" t=t+1\n",
" m=beta1*m+(1-beta1)*dx\n",
" v=beta2*v+(1-beta2)*(dx[0]**2 + dx[1]**2)\n",
" mb=m/(1-beta1**t)\n",
" vb=v/(1-beta2**t) \n",
" x=x-learning_rate*mb/(math.sqrt(vb)+1e-7) \n",
"\n",
" adam_step.buf=np.concatenate([np.ones(1)*t,m,np.ones(1)*v])\n",
" return (x[0],x[1])\n",
"\n",
"# Newton\n",
"def newton_step(f,fx,fy,point,learning_rate=0.1,beta1=0.5,beta2=0.5):\n",
" x,y=sympy.symbols('x,y')\n",
" H=np.zeros((2,2))\n",
" H[0,0]=fx.diff(x).subs(x,point[0]).subs(y,point[1])\n",
" H[0,1]=fx.diff(y).subs(x,point[0]).subs(y,point[1])\n",
" H[1,0]=fy.diff(x).subs(x,point[0]).subs(y,point[1])\n",
" H[1,1]=fy.diff(y).subs(x,point[0]).subs(y,point[1])\n",
" \n",
" dx=np.array((fx.subs(x,point[0]).subs(y,point[1]),fy.subs(x,point[0]).subs(y,point[1])))\n",
" x=np.array(point)-np.linalg.inv(H).dot(dx)\n",
" \n",
" return (x[0],x[1])"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import string\n",
"import numpy as np\n",
"%matplotlib inline\n",
"\n",
"def del_variable(var):\n",
" try:\n",
" del globals()[var]\n",
" except:\n",
" pass\n",
"\n",
"def del_variables(varlist): \n",
" for var in varlist:\n",
" del_variable(var)\n",
" \n",
"def form_legend_list(varlist):\n",
" li=[]\n",
" for var in varlist:\n",
" if var in globals():\n",
" li.append(var)\n",
" \n",
"def plot_contour(z,rang=(-10,10,-10,10),delta=0.05):\n",
" xr=np.arange(rang[0],rang[1],delta)\n",
" yr=np.arange(rang[2],rang[3],delta)\n",
"\n",
" [X,Y]=np.meshgrid(xr,yr)\n",
"\n",
" cmd=string.upper(str(z))\n",
" Z=eval(cmd)\n",
"\n",
" plt.contour(X,Y,Z)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Main"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f457875afd0>"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f4579a39410>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import sympy\n",
"\n",
"x,y=sympy.symbols('x,y')\n",
"z=x**2 + 8*y**2 # define function\n",
"\n",
"sgd_learning_rate=0.12 #0.12\n",
"momentum_learning_rate=0.12 # more stable than sgd\n",
"nag_learning_rate=0.09 # less stable than sgd\n",
"ada_learning_rate=20 # very stable\n",
"rms_learning_rate=3 # tend to ocillate near optimum \n",
"adam_learning_rate=4 # more stable than rmsprop\n",
"\n",
"starting_point=(9,9)\n",
"num_step=20\n",
"\n",
"plist_sgd=opt(sgd_step,z,starting_point,sgd_learning_rate,num_step)\n",
"plist_momentum=opt(momentum_step,z,starting_point,momentum_learning_rate,num_step)\n",
"plist_nag=opt(nag_step,z,starting_point,nag_learning_rate,num_step)\n",
"plist_ada=opt(adagrad_step,z,starting_point,ada_learning_rate,num_step)\n",
"plist_rmsprop=opt(rmsprop_step,z,starting_point,rms_learning_rate,num_step)\n",
"plist_adam=opt(adam_step,z,starting_point,adam_learning_rate,num_step)\n",
"plist_newton=opt(newton_step,z,starting_point,0,num_step) # learning rate (0) is a dummy\n",
"\n",
"plot_contour(z)\n",
"del_variables(['sgd','momentum','nag','ada','rmsprop','adam','newton'])\n",
"sgd,=plt.plot(np.array(plist_sgd).T[0],np.array(plist_sgd).T[1],label='sgd')\n",
"momentum,=plt.plot(np.array(plist_momentum).T[0],np.array(plist_momentum).T[1],label='momentum')\n",
"nag,=plt.plot(np.array(plist_nag).T[0],np.array(plist_nag).T[1],label='nag')\n",
"ada,=plt.plot(np.array(plist_ada).T[0],np.array(plist_ada).T[1],label='adagrad')\n",
"rmsprop,=plt.plot(np.array(plist_rmsprop).T[0],np.array(plist_rmsprop).T[1],label='rmsprop')\n",
"adam,=plt.plot(np.array(plist_adam).T[0],np.array(plist_adam).T[1],label='adam')\n",
"newton,=plt.plot(np.array(plist_newton).T[0],np.array(plist_newton).T[1],label='newton')\n",
"\n",
"legend_list=form_legend_list(['sgd','momentum','nag','ada','rmsprop','adam','newton'])\n",
"plt.legend(bbox_to_anchor=(0.4, 1),handles=legend_list)"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f4578616f90>"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nP/ywLiws1HV1dT6Vo7XWu3bt0pmZmfr999/XWmv9n//8R2dmZuoDBw5orbUeNWqULiws1Nu2bdPH\njx/Xo0aN0nPmzNFaa11SUqINw9BWq9X+HObOnaunT59u325MU19fby+vR48e+pdfftGVlZW6T58+\nulevXvqTTz7R9fX1+uqrr9bXXnuty9co3P+G4aiqqkoXFxfrBx54QF900UU6JydH5+Xl6csuu0w/\n8sgjetWqVbqmpibU1RRuLJrza/1/D49oVRkNnx2ncTXqu2LUvNZ/K+p7/e+auOmmm8jKygJg+PDh\n5ObmcvrppwMwceJEPv74Y5RSXHjhhfZ512fPns0TTzzBF198wYgRI7wq55NPPgHg5Zdf5oILLuBX\nv/oVAOeeey6DBg1i2bJl9pb3NddcQ/fu3QGYPHky77zzjuPzbeiS8dY111xD165dARg/fjw//PAD\no0ePBmDSpEncc889PrxioiktfeNRy8WAloCI+sDemqAcCLm5ufbHiYmJLbarqqrYvXu3wxJ4SikK\nCgocVlPyphywdZW8/vrr9mCttcZisXDuuefa03fo0MH+OCkpyZ43mM9ReEf6xk8WOqgLSkR9YA93\nSiny8vL47jvHX+ns3LnTYW1UbxUUFHD11VezcOFCv+rSXHJyMseOHbNv79692+dyhXPSGj/JSYs9\nuk2ePJkHH3yQFStWMHz4cB5//HESEhIoKiryuayrrrqKwYMHc9lll3HeeedhNpv58ssv6dGjB3l5\neW7zZmdnYxgGP//8Mz169ABgwIABPPzww+zcuZPU1FQefPBBv56jkNa4aEbGsUem5q0sV62uHj16\n2Ec0lJeXM2DAAN555x1MJpNP5QDk5+fz9ttv81//9V9MnToVk8nE4MGD+fvf/+4xb2JiInfddRdD\nhw7FYrHw/vvvc95553HFFVdw+umnk52dze233+7QJy8tSeekNS7cUUEexy5TCoiQUkrx7bflLfa7\n+7N6+puH4i1RU3OM77/fwMaN37Bx4zds2vQtMTEm+vUbSL9+Z9Kv35n07t2P+HjXrXF3Ad75pFwt\nd7acJKt5o8D1cceJq/zb780+d2las+1NWlfpXJXnzX5353bln3deTfu0XVx++ydu07kT9lMKZGf/\nBa01VmvDKt26cRjmiXvb/pb7ROS75pq3vQpSjsfcf3CC2QjWWmM2H6Cq6meqq3+huno7x4/vITGx\n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\njRrVmmoJIUTYsnfF1PuWr7i4mOLiYq/SKq2DM+ZGKdVBa72n4fEfgLO01tOcpNPBqoMQQoSb1za9\nhmWEhV739WLQrEF+l6OUQmvnzf5gjop5WCk1ANslghLghiCeSwghIoKhDK665So2Td4UtHMELbBr\nra8OVtlCCBGpGrti7F0ywThH0EoWQgjRggR2IYSIMhLYhRAiykhgF0KIKCOBXQghoowEdiGEiDIS\n2IUQIsrYpxRQYTpXjBBCCN+0RYs92POxe2XlyhKUUiiFy3sIzL7mx23bno+7KsPZ46Zlusvf/Jir\ntN6md7btLo2rdM33CwHQOPVH0xlAmk4H0vjQXbrmaRr3edpuzOMpv7u07tJ5yt88TfPHntI23bd9\n32EANm/az5545TGPszI8zcISFoH9T39aAbSsvNXq/AXzd5+zczhL23juxuOuynD2uGmZ7vI3P+Yq\nrbfpnW27S+MqnTvNY723Xwru8rlK4yqdq7Te5POWq+ytndLI05xIrg47y+csbfN0zdO4+3u35r3g\nayPCVePD03ZjHk/5/W1wedOQc1WOtw1HpRRVWVthBPzh1g+JNadiGC3LbL6v+b0nQZsEzFsyCVj4\n8icQ+BJcXKVxlc5VWm/yectT9tb+I+PpQ+nqsL9fht5+Gbs7Jv+9BdZnOz5jxHMj2P9f+8lKyvK7\nnFBNAiYinLsgIItjCeEfGRUjhBBRRgK7EEJEGQnsQggRZezj2IPYnSmBXQgh2pC02IUQIspIYBdC\niCgjgV0IIaKMBHYhhIgy9l+XSmAXQojoIC12IYSIMo3DHIM5VUNYTCnQbrLtXinHH6rbJrxpeOxh\n/4kJeJqkc3HMmzTOjjmkw8k+J3ld5XdVlrv03pbrqUx/0rva53a/891u83g65ss5IoEvM9u4m8fG\n7TEf8zifu8d9mb7mcZxfqHXpWs5H5H16e1oP+V3ldZfPVX5LLNAVsq5sWW7z+nja70pYTAJ29Jh2\n+iK5etE9PXmHfe7S+HDMn3TO6u6qfu7SeFuWN/n8Se8sjcf9zne7zePpWGvShjOfvsj8/EJ0dciX\nL2tfGwue8gSyAeOqLq7O73UDzot07hp5zo5tO7SFoS/0Zv8ftNNyPTVaG/enJof5JGDtEkNdAyGE\naBsVFtt9VmrwziF97EIIEWUksAshRJSRwC6EEFFGArsQQkQZCexCCBFlwmJUzGEsLfapZve2x6rF\n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\nSUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f45786b68d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import sympy\n",
"\n",
"x,y=sympy.symbols('x,y')\n",
"z=x**2 + 4*y**4 # define function\n",
"\n",
"sgd_learning_rate=0.001 #0.12\n",
"momentum_learning_rate=0.001 # more stable than sgd\n",
"nag_learning_rate=0.001 # less stable than sgd\n",
"ada_learning_rate=10 # very stable (converge very slowly)\n",
"rms_learning_rate=10 # occillate near optimum\n",
"adam_learning_rate=5 # even more stable than rmsprop\n",
"\n",
"starting_point=(9,9)\n",
"num_step=20\n",
"\n",
"plist_sgd=opt(sgd_step,z,starting_point,sgd_learning_rate,num_step)\n",
"plist_momentum=opt(momentum_step,z,starting_point,momentum_learning_rate,num_step)\n",
"plist_nag=opt(nag_step,z,starting_point,nag_learning_rate,num_step)\n",
"plist_ada=opt(adagrad_step,z,starting_point,ada_learning_rate,num_step)\n",
"plist_rmsprop=opt(rmsprop_step,z,starting_point,rms_learning_rate,num_step)\n",
"plist_adam=opt(adam_step,z,starting_point,adam_learning_rate,num_step)\n",
"plist_newton=opt(newton_step,z,starting_point,0,num_step) # learning rate (0) is a dummy\n",
"\n",
"plot_contour(z)\n",
"del_variables(['sgd','momentum','nag','ada','rmsprop','adam','newton'])\n",
"sgd,=plt.plot(np.array(plist_sgd).T[0],np.array(plist_sgd).T[1],label='sgd')\n",
"momentum,=plt.plot(np.array(plist_momentum).T[0],np.array(plist_momentum).T[1],label='momentum')\n",
"nag,=plt.plot(np.array(plist_nag).T[0],np.array(plist_nag).T[1],label='nag')\n",
"ada,=plt.plot(np.array(plist_ada).T[0],np.array(plist_ada).T[1],label='adagrad')\n",
"rmsprop,=plt.plot(np.array(plist_rmsprop).T[0],np.array(plist_rmsprop).T[1],label='rmsprop')\n",
"adam,=plt.plot(np.array(plist_adam).T[0],np.array(plist_adam).T[1],label='adam')\n",
"newton,=plt.plot(np.array(plist_newton).T[0],np.array(plist_newton).T[1],label='newton')\n",
"\n",
"legend_list=form_legend_list(['sgd','momentum','nag','ada','rmsprop','adam','newton'])\n",
"plt.legend(bbox_to_anchor=(0.4, 1),handles=legend_list)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2 conda2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@phsamuel
Copy link
Author

phsamuel commented Feb 2, 2017

Compare several different popular numerical optimizers

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment