Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save michaelchughes/5345a740124578062ed744032354faa8 to your computer and use it in GitHub Desktop.
Save michaelchughes/5345a740124578062ed744032354faa8 to your computer and use it in GitHub Desktop.
Power Law Fit to the trend in Error vs Dev Set size in View Classifier Performance
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "forty-kenya",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import scipy.stats"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "perceived-duplicate",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"sns.set_style(\"whitegrid\")\n",
"sns.set_context(\"notebook\", font_scale=1.25)"
]
},
{
"cell_type": "markdown",
"id": "thousand-advisory",
"metadata": {},
"source": [
"There is compelling prior theoretical work and experimental work (see Hestness et al. 2017; https://arxiv.org/pdf/1712.00409.pdf) that suggests that the loss incurred by a model as a function of training set size $n$ scales using a power-law relationship\n",
"\n",
"$$\n",
"\\ell(n) = \\alpha n^{-\\beta} \n",
"$$\n",
"\n",
"for $\\alpha > 0$ and $\\beta \\in (0, 1)$."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "agreed-suggestion",
"metadata": {},
"outputs": [],
"source": [
"# Raw Data from Zhe\n",
"\n",
"### view classification performance\n",
"acc_P = np.array([90.34, 95.77, 97.03]) / 100.\n",
"\n",
"### X: corresponding size of the development set\n",
"n_P = np.array([56, 165, 479])\n",
"\n",
"loss_P = 1.0 - acc_P\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "opened-vertex",
"metadata": {},
"outputs": [],
"source": [
"def project_loss(n, alpha, beta):\n",
" return alpha * np.power(n, -beta)"
]
},
{
"cell_type": "markdown",
"id": "amended-preference",
"metadata": {},
"source": [
"Let's show this class of projection models might reasonabily fit our data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "instructional-package",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot( n_P, loss_P, 's');\n",
"\n",
"alpha = 1.0\n",
"\n",
"n_G = np.logspace(np.log10(10), np.log10(10000), 30)\n",
"\n",
"for beta in [0.3, 0.5, 0.7]:\n",
" plt.plot(n_G, project_loss(n_G, alpha, beta), label=r'$\\beta=%s$' % beta);\n",
"plt.legend();"
]
},
{
"cell_type": "markdown",
"id": "sustained-consortium",
"metadata": {},
"source": [
"## Now, let's do a mean-squared error fit to our data\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "solar-nutrition",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 6,
"id": "isolated-suite",
"metadata": {},
"outputs": [],
"source": [
"import autograd"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "brazilian-bicycle",
"metadata": {},
"outputs": [],
"source": [
"import autograd.numpy as ag_np\n",
"import autograd.scipy.special as ag_special"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "virgin-chocolate",
"metadata": {},
"outputs": [],
"source": [
"def ag_softplus(r_alpha):\n",
" return ag_np.log(1 + ag_np.exp(r_alpha))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "adjusted-bruce",
"metadata": {},
"outputs": [],
"source": [
"ag_sigmoid = ag_special.expit"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "recreational-former",
"metadata": {},
"outputs": [],
"source": [
"def ag_project_loss(n, alpha, beta):\n",
" return alpha * ag_np.power(n, -beta)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "numerous-fellowship",
"metadata": {},
"outputs": [],
"source": [
"def calc_cost_at_param_vec(pvec):\n",
" hat_loss_P = ag_project_loss(n_P, ag_softplus(pvec[0]), ag_sigmoid(pvec[1]))\n",
" return ag_np.sum(ag_np.square(hat_loss_P - loss_P))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "sacred-andrews",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0047561726148123065"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"calc_cost_at_param_vec([0.0, 1.0])\n"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "weekly-orlando",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0001556678872876396"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"calc_cost_at_param_vec(np.asarray([0.0, 0.0]))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "wrapped-primary",
"metadata": {},
"outputs": [],
"source": [
"calc_grad_at_param_vec = autograd.grad(calc_cost_at_param_vec, argnum=0)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "killing-stocks",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.0004668 , -0.00105819])"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"calc_grad_at_param_vec(ag_np.asarray([0.0, 0.0]))"
]
},
{
"cell_type": "markdown",
"id": "loaded-fifty",
"metadata": {},
"source": [
"# Minimize via scipy optimize"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "endless-leisure",
"metadata": {},
"outputs": [],
"source": [
"import scipy.optimize"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "atmospheric-supervision",
"metadata": {},
"outputs": [],
"source": [
"ans = scipy.optimize.minimize(\n",
" calc_cost_at_param_vec,\n",
" jac=calc_grad_at_param_vec,\n",
" x0=np.zeros(2),\n",
" method='bfgs')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "brutal-sequence",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
" fun: 6.214769899777294e-05\n",
" hess_inv: array([[4226.43851196, 2321.53517882],\n",
" [2321.53517882, 1312.89223456]])\n",
" jac: array([-3.41309401e-07, -6.30261846e-07])\n",
" message: 'Optimization terminated successfully.'\n",
" nfev: 20\n",
" nit: 17\n",
" njev: 20\n",
" status: 0\n",
" success: True\n",
" x: array([0.89378172, 0.56242587])"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ans"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "crucial-feature",
"metadata": {},
"outputs": [],
"source": [
"assert ans.message.count('success')"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "aerial-lawrence",
"metadata": {},
"outputs": [],
"source": [
"best_alpha = ag_softplus(ans.x[0])"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "tested-queens",
"metadata": {},
"outputs": [],
"source": [
"best_beta = ag_sigmoid(ans.x[1])"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "settled-chorus",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"alpha = 1.2367\n",
"beta = 0.6370\n"
]
}
],
"source": [
"print(\"alpha = %.4f\" % best_alpha)\n",
"print(\"beta = %.4f\" % best_beta)"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "disciplinary-latino",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Z88e/fH17NmTzz//XP9/FqBChQoEBQWxevXq+9YhzKRAAwGJcicyMlK1bNlS7d69W12/fl19//33qlWrVmrr1q1KKd30uE8++aRSSqnbt2+rmzdv6j+hoaGqefPm6pdfflFKKbVhwwbVvn179d1336m4uDi1bds25efnp77++muj+75z547q1KmTevHFF9XZs2fVmTNn1NChQ1WnTp3U7du3VXJysnrjjTfUv/71L3Xz5k2VlZWVr46tW7eqli1bqtDQUBUTE6P+97//KU9PTzV06FCllFJpaWmqW7du6s0331RRUVHq3Llzaty4cSooKEhlZWWp1NRU5e3tbTAN7w8//KBatWqlbt++nW9/P/74o/L391cHDx5U165dU2FhYapp06bq6NGjJp2D3377TXl6eqrdu3cbrV8ppZ555hm1cOFCgzJPT0+1bds2pZRSX3zxhWrVqpUKCwtTly9fVhs3blSPPfaY+vzzz/X7aN68uVqwYIG6dOmSCgsLU61atVKenp5G9zd06FD1zjvvGJT5+vrmG7crNDRU+fj4GK3jYeflm2++US1atFCrV69WsbGxKiwsTLVo0UL98ssvKj4+Xj322GNq/vz56sqVKyoyMlKNHj1atW/fXt/mXbp00Y/9tW/fPuXt7a02bdqk4uLi1J49e1SnTp3Up59+ahDT/v37lZeXl8rIyDAaszAPSTrigb7//nvl5eWlzpw5oy+LiIjQD854b9K5V2RkpPLx8VGrV6/Wl3Xs2FGtX7/eYL0lS5aoHj16GN33+vXrlY+Pj0pOTtaXJSYmKm9vb30977zzjj6BGDN48GD19ttvG5QNGjRIv01YWJjq0KGDysnJ0S/PyspSPj4++kTz5ptvqtGjR+uXT5gwQU2cONHo/latWqUCAwNVbGysvuzgwYPq1q1bJp2D33//XXl6eqrDhw8brT83N1e1aNHCYEpipf5OOnl5eapDhw7q448/Nlg+b9481b59e5WXl6cmT56snnvuOYPlc+bMKVDSad68uf4Pj7u2bt2qmjdvbrSOh52XZ555Rr311lv5ttm/f7+Ki4tTK1euVHl5efplhw4dUp6enio+Pl4pZZh0hgwZoubMmWNQ1/bt21WrVq1Ubm6uvuzuuY6IiDAaszAPmTlUPFDHjh3x9vZm0KBBNGzYkMcff5xevXoZvc9/161btxg7dixP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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(np.log10(n_P), loss_P, 's');\n",
"\n",
"alpha = 1.0\n",
"\n",
"n_G = np.logspace(np.log10(10), np.log10(10000), 30)\n",
"\n",
"plt.plot(np.log10(n_G), project_loss(n_G, best_alpha, best_beta), label=r'$\\alpha$=%.3f, $\\beta$=%.3f' % (best_alpha,best_beta));\n",
"\n",
"\n",
"nticks_G = np.logspace(np.log10(10), np.log10(10000), 4)\n",
"plt.gca().set_xticks(np.log10(nticks_G))\n",
"plt.gca().set_xticklabels(nticks_G)\n",
"plt.ylabel('error rate');\n",
"plt.xlabel('size of dev set (log10 scale)');\n",
"\n",
"plt.legend();"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "junior-frame",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "settled-strengthening",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.9.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
@michaelchughes
Copy link
Author

Just in case, here's the final plot

image

Says that with size 1000, we can expect error rate below 2%, and essentially 0 error at size 10000

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