{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Differential Intelligence\n", "(by Dario Izzo)\n", "\n", "In this notebook we lay down the basic idea behind \"differential intelligence\", that is the use of high order derivatives in machine learning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Importing stuff\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from pyaudi import gdual_double as gdual\n", "from pyaudi import sin, cos, tan\n", "from random import random\n", "from matplotlib import pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Controller representation and \"simulator\"\n", "Take as an example the task of learning a robotic controller. In neuro evolution (or Evolutionary Robotics), the controller is typically represented by a neural network, but for the purpose of explaining this new learning concept we will use a polinomial representation for the controller. Later, changing the controller into a NN with weights as parameters will not change the essence of what is done here." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Definition of the controller in terms of some weights parameters\n", "def u(state, weights):\n", " x,v = state\n", " a,b,c,e,f,g = weights\n", " return a + b*x + c*v + e*x*v + f*x**2 + g*v**2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Definition of the equation of motion (our physics simulator propagating the system to its next state)\n", "def eom(state, weights):\n", " x,v = state\n", " dx = v\n", " dv = u(state, weights)\n", " return (dx, dv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Euler Propagation\n", "In Evolutionary Robotics Euler propagators are commonly used. The essence of what is done here would not change the if we code a Newton Raphson or a better method." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# The weights are all generalized duals\n", "weights = [gdual(0.2*(random()-0.5), _, 4) for _ in \"abcefg\"]\n", "x = [gdual(2*(random()-0.5))]\n", "v = [gdual(2*(random()-0.5))]\n", "dt = 0.1\n", "# We propagate for 10 seconds (cannot oincrease this much as the control is polynomial thus x**2 and v**2 would make u1 biiiig)\n", "for i in range(100):\n", " dx, dv = eom([x[-1],v[-1]], weights)\n", " x.append(x[-1] + dt * dx)\n", " v.append(v[-1] + dt * dv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NOTE: the resulting points are gdual, they contain information on how the state reached by our \"robot\" changes if we change the control weights!!" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.309729,\n", " -87.5171*db*dc*df+297.88*dc*df*dg-154.116*da*dc**2+79.3569*dc*df+2474.95*db*dc*df*dg+24164.4*db*df**3+640.084*de*df*dg**2+2253.7*da**2*de**2+282.832*db*de**2-80.4944*de**2*dg+5.67697*db**2+6491.1*da*df**2*dg+49.6749*da*de*df**2+43.0813*dc**2*df-83.068*da*db**2+1520.98*dc**2*df*dg-1910.19*db*dc**2*df-1715.38*da**2*db*dc-995.404*da**2*db**2-119.649*de**3+...)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[0], x[-1]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.294666,\n", " -390.009*db*dc*df+158.987*dc*df*dg-120.352*da*dc**2-23.4238*dc*df+577.104*db*dc*df*dg+4984.88*db*df**3-257.731*de*df*dg**2-669.141*da**2*de**2+375.522*db*de**2+10.2758*de**2*dg+10.3176*db**2+5799.32*da*df**2*dg+24280.3*da*de*df**2+128.821*dc**2*df+74.0659*da*db**2-46.6656*dc**2*df*dg-386.135*db*dc**2*df+939.824*da**2*db*dc-116.105*da**2*db**2-131.728*de**3+...)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v[0],v[-1]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot([it.constant_cf for it in x],[it.constant_cf for it in v])\n", "plt.plot(x[0].constant_cf, v[0].constant_cf, 'ro')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "xf, vf = x[-1], v[-1]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.0111055918281473" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xf.constant_cf" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9026672236603197" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vf.constant_cf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Studying the effects of the weights on the behavior\n", "We have represented all the robot behavior (x, v) as a polynomial function of the weights. So we now know what happens to the behaviour if we change the weights!! Lets see ... we only consider the final state, but the same can be done for all states before" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "new xf: -0.7524686709396718\n", "new vf: 0.6325559582894508\n" ] } ], "source": [ "dweights = dict({'da': -0.002, 'db': 0.003, 'dc': -0.02, 'de': 0.03, 'df': 0.02, 'dg': -0.01})\n", "#Lets predict the new final position of our 'robot' if we change his controller as defined above\n", "print(\"new xf: {}\".format(xf.evaluate(dweights)))\n", "print(\"new vf: {}\".format(vf.evaluate(dweights)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Check that we learned the correct map\n", "We now simulate again our behavior using the new weights to see where we end up to check if the prediction made after our differential learning is correct." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "new_weights = [it + dweights['d' + it.symbol_set[0]] for it in weights] " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "new_simulated_x = [x[0]]\n", "new_simulated_v = [v[0]]\n", "dt = 0.1\n", "# We propagate for 10 seconds (cannot oincrease this much as the control is polynomial thus x**2 and v**2 would make u1 biiiig)\n", "for i in range(100):\n", " dx, dv = eom([new_simulated_x[-1],new_simulated_v[-1]], new_weights)\n", " new_simulated_x.append(new_simulated_x[-1] + dt * dx)\n", " new_simulated_v.append(new_simulated_v[-1] + dt * dv)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nhdHjAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot([it.constant_cf for it in x],[it.constant_cf for it in v],label='original')\n", "plt.plot([it.constant_cf for it in new_simulated_x],[it.constant_cf for it in new_simulated_v],'r',label='simulation')\n", "plt.plot([it.evaluate(dweights) for it in x],[it.evaluate(dweights) for it in v],'g',label='differential learning')\n", "plt.plot(x[0].constant_cf, v[0].constant_cf, 'ro')\n", "plt.legend(loc=2)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "new_simulated_xf, new_simulated_vf = new_simulated_x[-1], new_simulated_v[-1]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.7483217322326989" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_simulated_xf.constant_cf" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6311539480420831" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_simulated_vf.constant_cf" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Differential learning xf: \t-0.7524686709396718\n", "Real xf: \t\t\t-0.7483217322326989\n", "Differential learning vf: \t0.6325559582894508\n", "Real vf: \t\t\t0.6311539480420831\n" ] } ], "source": [ "print(\"Differential learning xf: \\t{}\".format(xf.evaluate(dweights)))\n", "print(\"Real xf: \\t\\t\\t{}\".format(new_simulated_xf.constant_cf))\n", "print(\"Differential learning vf: \\t{}\".format(vf.evaluate(dweights)))\n", "print(\"Real vf: \\t\\t\\t{}\".format(new_simulated_vf.constant_cf))" ] } ], "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.6.4" } }, "nbformat": 4, "nbformat_minor": 1 }