Skip to content

Instantly share code, notes, and snippets.

@tillahoffmann
Created December 29, 2016 14:10
Show Gist options
  • Save tillahoffmann/cff5ce8cad89b5a61092ed2d4b88c6fc to your computer and use it in GitHub Desktop.
Save tillahoffmann/cff5ce8cad89b5a61092ed2d4b88c6fc to your computer and use it in GitHub Desktop.
Gradient calculation in tensorflow and numerical instabilities
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt, rcParams\n",
"%matplotlib inline\n",
"rcParams['figure.dpi'] = 100"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Construct a graph and create a session\n",
"with tf.Graph().as_default() as graph:\n",
" a = tf.placeholder(tf.float32)\n",
" b = tf.placeholder(tf.float32)\n",
" \n",
" f = - a / b\n",
" df_db, = tf.gradients(f, b)\n",
" \n",
" g = - tf.exp(tf.log(a) - tf.log(b))\n",
" dg_db, = tf.gradients(g, b)\n",
" \n",
" \n",
"session = tf.Session(graph=graph)\n",
"\n",
"# Evaluate the gradients\n",
"def evaluate_gradient(a, b, naive=True):\n",
" if naive:\n",
" return a / b ** 2\n",
" else:\n",
" return (a / b) / b"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"factors = np.logspace(-35, 35, 101).astype(np.float32)\n",
"x, y = session.run([f, g], {a: factors, b: factors})\n",
"np.testing.assert_allclose(x, y)\n",
"\n",
"f_grads = session.run(df_db, {a: factors, b: factors})\n",
"g_grads = session.run(dg_db, {a: factors, b: factors})"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x120cbd2b0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x120c1dac8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(factors, f_grads, label=r'$0<\\frac{df}{db}<\\infty$')\n",
"plt.yscale('log')\n",
"plt.xscale('log')\n",
"\n",
"not_finite = factors[~np.isfinite(f_grads)]\n",
"plt.plot(not_finite, evaluate_gradient(not_finite, not_finite, False), label=r'$\\frac{df}{db}=\\infty$')\n",
"\n",
"zero = factors[f_grads == 0]\n",
"plt.plot(zero, evaluate_gradient(zero, zero, False), label=r'$\\frac{df}{db}=0$')\n",
"\n",
"plt.plot(factors, g_grads, label=r'$\\frac{dg}{db}$', ls=':')\n",
"\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"some gradients are infinite using the naive method\n",
"all gradients finite not using the naive method\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Users/tillhoffmann/miniconda3/envs/aggregated_inference/lib/python3.5/site-packages/ipykernel/__main__.py:18: RuntimeWarning: overflow encountered in square\n",
"/Users/tillhoffmann/miniconda3/envs/aggregated_inference/lib/python3.5/site-packages/ipykernel/__main__.py:18: RuntimeWarning: divide by zero encountered in true_divide\n"
]
}
],
"source": [
"for naive in [True, False]:\n",
" message = \"\" if naive else \"not\"\n",
" if np.all(np.isfinite(evaluate_gradient(factors, factors, naive=naive))):\n",
" print('all gradients finite %s using the naive method' % message)\n",
" else:\n",
" print('some gradients are infinite %s using the naive method' % message)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment