{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 7.6 RMSProp算法" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import math\n", "import torch\n", "import sys\n", "sys.path.append(\"..\") \n", "import d2lzh_pytorch as d2l" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.6.1 算法" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "epoch 20, x1 -0.010599, x2 0.000000\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def rmsprop_2d(x1, x2, s1, s2):\n", " g1, g2, eps = 0.2 * x1, 4 * x2, 1e-6\n", " s1 = gamma * s1 + (1 - gamma) * g1 ** 2\n", " s2 = gamma * s2 + (1 - gamma) * g2 ** 2\n", " x1 -= eta / math.sqrt(s1 + eps) * g1\n", " x2 -= eta / math.sqrt(s2 + eps) * g2\n", " return x1, x2, s1, s2\n", "\n", "def f_2d(x1, x2):\n", " return 0.1 * x1 ** 2 + 2 * x2 ** 2\n", "\n", "eta, gamma = 0.4, 0.9\n", "d2l.show_trace_2d(f_2d, d2l.train_2d(rmsprop_2d))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.6.2 从零开始实现" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "features, labels = d2l.get_data_ch7()\n", "\n", "def init_rmsprop_states():\n", " s_w = torch.zeros((features.shape[1], 1), dtype=torch.float32)\n", " s_b = torch.zeros(1, dtype=torch.float32)\n", " return (s_w, s_b)\n", "\n", "def rmsprop(params, states, hyperparams):\n", " gamma, eps = hyperparams['gamma'], 1e-6\n", " for p, s in zip(params, states):\n", " s.data = gamma * s.data + (1 - gamma) * (p.grad.data)**2\n", " p.data -= hyperparams['lr'] * p.grad.data / torch.sqrt(s + eps)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loss: 0.242014, 0.053250 sec per epoch\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "d2l.train_ch7(rmsprop, init_rmsprop_states(), {'lr': 0.01, 'gamma': 0.9},\n", " features, labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.6.3 简洁实现" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loss: 0.243676, 0.043637 sec per epoch\n" ] }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "d2l.train_pytorch_ch7(torch.optim.RMSprop, {'lr': 0.01, 'alpha': 0.9},\n", " features, labels)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }