{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Practical Deep Learning for Coders, v3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lesson 2_sgd"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"from fastai.basics import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this part of the lecture we will explain Stochastic Gradient Descent (SGD) which is an **optimization** method commonly used in neural networks We will ilustrate the concepts with concrete examples.
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"在这部分,我们将会解释随机梯度下降算法(SGD),它在神经网络应用中是常用的**优化**算法。我们将通过实例来解释其原理和概念。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Linear Regression problem 线性回归问题"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The goal of linear regression is to fit a line to a set of points.
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"线性回归的目标是将一条直线拟合到一组点。"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"n=100"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[-0.1957, 1.0000],\n",
" [ 0.1826, 1.0000],\n",
" [-0.1008, 1.0000],\n",
" [-0.1449, 1.0000],\n",
" [ 0.7091, 1.0000]])"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = torch.ones(n,2) \n",
"x[:,0].uniform_(-1.,1)\n",
"x[:5]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([3., 2.])"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = tensor(3.,2); a"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"y = x@a + torch.rand(n)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"