回归是指一组用于对一个或多个自变量与因变量之间的关系进行建模的方法。在自然科学和社会科学中,回归的目的通常是描述输入和输出之间的关系。另一方面,机器学习最常与预测有关。

每当我们想要预测一个数值时,就会出现回归问题。常见的例子包括预测价格(房屋、股票等)、预测住院时间(针对住院患者)、需求预测(针对零售)等等。并非每个预测问题都是经典的回归问题。在随后的部分中,我们将介绍分类问题,其目标是预测一组类别的成员资格。

3.1.1 线性回归的基本要素

线性回归可能是回归的标准工具中最简单和最流行的。追溯到 19 世纪初,线性回归源于一些简单的假设。首先,我们假设自变量之间的关系 和因变量是线性的,即可以表示为元素的加权和 , 给定观察结果的一些噪音。其次,我们假设任何噪声都表现良好(遵循高斯分布)。

为了激发这种方法,让我们从一个运行示例开始。假设我们希望根据房屋面积(平方英尺)和年龄(年)来估算房屋价格(美元)。要实际开发一个预测房价的模型,我们需要掌握一个由销售组成的数据集,我们知道每个房屋的销售价格、面积和年龄。在机器学习的术语中,数据集称为训练数据集或训练集,每一行(这里是与一次销售对应的数据)称为一个示例(或数据点、 数据实例、样本)。我们试图预测的东西(价格)称为标签(或目标)。预测所依据的自变量(年龄和面积)称为特征(或 协变量)。

3.1.1.1 线性模型

线性假设只是说目标(价格)可以表示为特征(面积和年龄)的加权和:

给定一个数据集,我们的目标是选择权重w 和偏见b这样平均而言,根据我们的模型做出的预测最符合数据中观察到的真实价格。输出预测由输入特征的仿射变换确定的模型是线性模型,其中仿射变换由选择的权重和偏差指定。


在求和期间应用广播(参见第 2.1.3 节)。给定训练数据集的特征X 和相应的(已知)标签y,线性回归的目标是找到权向量w 和偏置b项给定从相同分布中采样的新数据示例的特征X ,新示例的标签将(在预期中)以最低的误差被预测。


在我们开始搜索最佳参数(或模型参数)之前w和b,我们还需要两件事:

  • (i)某个给定模型的质量度量;
  • (ii) 更新模型以提高其质量的程序。

3.1.1.2。损失函数


常数1/2没有真正的区别,但会证明在符号上很方便,当我们取损失的导数时会抵消。由于训练数据集是给我们的,因此我们无法控制,经验误差只是模型参数的函数。为了使事情更具体,考虑下面的例子,我们为一维情况绘制一个回归问题, 如图 3.1.1 所示。

图 3.1.1用线性模型拟合数据。

3.1.1.3。解析解


虽然像线性回归这样的简单问题可能会接受分析解决方案,但您不应该习惯这种好运。尽管解析解决方案允许进行很好的数学分析,但对解析解决方案的要求非常严格,以至于它会排除所有深度学习。

3.1.1.4。小批量随机梯度下降

即使在我们无法解析模型的情况下,事实证明我们仍然可以在实践中有效地训练模型。此外,对于许多任务,那些难以优化的模型结果要好得多,以至于弄清楚如何训练它们最终是值得的。

优化几乎所有深度学习模型的关键技术,我们将在本书中使用,包括通过在逐渐降低损失函数的方向上更新参数来迭代地减少错误。这种算法称为 梯度下降。

梯度下降最简单的应用包括获取损失函数的导数,这是对数据集中每个示例计算的损失的平均值。实际上,这可能非常慢:我们必须在进行单次更新之前遍历整个数据集。因此,我们通常会在每次需要计算更新时对样本的随机小批量进行抽样,这种变体称为小批量随机梯度下降。


线性回归恰好是一个学习问题,在整个域中只有一个最小值。然而,对于更复杂的模型,如深度网络,损失表面包含许多最小值。幸运的是,由于尚未完全理解的原因,深度学习从业者很少努力寻找能够最大限度地减少训练集损失的参数。更艰巨的任务是找到将在我们以前从未见过的数据上实现低损失的参数,这是一项称为泛化的挑战。我们将在整本书中回到这些主题。

3.1.1.5。使用学习模型进行预测

3.1.2 矩阵加速计算

在训练我们的模型时,我们通常希望同时处理整个小批量示例。要有效地做到这一点,我们需要对计算进行矢量化并利用快速线性代数库,而不是在 Python 中编写昂贵的 for 循环。

%matplotlib inline
import math
import time
import numpy as np
import torch
from d2l import torch as d2l

为了说明为什么这很重要,我们可以考虑两种添加向量的方法。首先,我们实例化两个包含全为 1 的 10000 维向量。在一种方法中,我们将使用 Python for 循环遍历向量。在另一种方法中,我们将依赖于对 +.

n = 10000
a = torch.ones(n)
b = torch.ones(n)

由于我们将在本书中经常对运行时间进行基准测试,因此让我们定义一个计时器。

class Timer:  #@save"""Record multiple running times."""def __init__(self):self.times = []self.start()def start(self):"""Start the timer."""self.tik = time.time()def stop(self):"""Stop the timer and record the time in a list."""self.times.append(time.time() - self.tik)return self.times[-1]def avg(self):"""Return the average time."""return sum(self.times) / len(self.times)def sum(self):"""Return the sum of time."""return sum(self.times)def cumsum(self):"""Return the accumulated time."""return np.array(self.times).cumsum().tolist()

现在我们可以对工作负载进行基准测试。首先,我们使用 for 循环一次添加一个坐标。

c = torch.zeros(n)
timer = Timer()
for i in range(n):c[i] = a[i] + b[i]
f'{timer.stop():.5f} sec'
'0.09488 sec'

或者,我们依靠重新加载的+运算符来计算元素总和。

timer.start()
d = a + b
f'{timer.stop():.5f} sec'
'0.00021 sec'

您可能注意到第二种方法比第一种方法快得多。矢量化代码通常会产生数量级的加速。此外,我们将更多的数学推到库中,不需要自己编写那么多的计算,从而减少了出错的可能性。

3.1.3. 正态分布和平方损失

虽然您已经可以仅使用上述信息来动手,但在下文中,我们可以通过关于噪声分布的假设更正式地激发平方损失目标。

下面我们定义一个 Python 函数来计算正态分布。

def normal(x, mu, sigma):p = 1 / math.sqrt(2 * math.pi * sigma**2)return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)

我们现在可以可视化正态分布。

# Use numpy again for visualization
x = np.arange(-7, 7, 0.01)# Mean and standard deviation pairs
params = [(0, 1), (0, 2), (3, 1)]
d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',ylabel='p(x)', figsize=(4.5, 2.5),legend=[f'mean {mu}, std {sigma}' for mu, sigma in params])


如我们所见,改变均值对应于沿x 轴,增加方差会分散分布,降低其峰值。

使用均方误差损失函数(或简单的平方损失)激发线性回归的一种方法是正式假设观察来自噪声观察,其中噪声正态分布如下:

3.1.4 从线性回归到深度网络

到目前为止,我们只讨论了线性模型。虽然神经网络涵盖了更丰富的模型家族,但我们可以开始将线性模型视为一种神经网络,方法是用神经网络的语言来表达它。首先,让我们从用“层”符号重写事物开始。

3.1.4.1 神经网络图

深度学习从业者喜欢绘制图表来可视化他们模型中发生的事情。在图 3.1.2中,我们将线性回归模型描述为神经网络。请注意,这些图突出显示了连接模式,例如每个输入如何连接到输出,而不是权重或偏差所取的值。

3.1.2线性回归是一个单层神经网络

3.1.4.2 生物神经元

由于线性回归(1795 年发明)早于计算神经科学,将线性回归描述为神经网络似乎不合时宜。当控制论者/神经生理学家 Warren McCulloch 和 Walter Pitts 开始开发人工神经元模型时,要了解为什么线性模型是一个自然的起点,请考虑图 3.1.3中生物神经元的卡通图片,由树突(输入终端)、细胞核(CPU)、 轴突(输出线)和轴突终端(输出终端),通过突触连接到其他神经元。

图 3.1.3真正的神经元。

当然,许多这样的单元可以与正确的连通性和正确的学习算法拼凑在一起,产生比任何一个神经元单独表达的更有趣和更复杂的行为的高级想法,这归功于我们对真实生物神经系统的研究。

与此同时,当今深度学习的大多数研究几乎没有直接从神经科学中汲取灵感。我们引用了 Stuart Russell 和 Peter Norvig,他们在其经典的 AI 教科书《人工智能:一种现代方法》 [Russell & Norvig,2016]中指出,尽管飞机可能受到鸟类的启发,但鸟类学并不是航空学的主要驱动力几个世纪以来的创新。同样,如今深度学习的灵感来自数学、统计学和计算机科学。

3.1.5 总结

  • 机器学习模型中的关键成分是训练数据、损失函数、优化算法,很明显,模型本身。

  • 矢量化使一切变得更好(主要是数学)和更快(主要是代码)。

  • 最小化目标函数和执行最大似然估计可能意味着同样的事情。

  • 线性回归模型也是神经网络。

3.1.6 练习

参考

https://d2l.ai/chapter_linear-networks/linear-regression.html

翻译: 3.1 线性回归 深入神经网络 pytorch相关推荐

  1. 【Kaggle-MNIST之路】两层的神经网络Pytorch(改进版)(二)

    简述 [Kaggle-MNIST之路]两层的神经网络Pytorch(四行代码的模型) 基于我的上一篇文章改进. 其实就是把损失函数调整了一下. 从CrossEntroyLoss到MultiMargin ...

  2. 线性回归的神经网络法——机器学习

    一.算法思想 线性回归方程在神经网络深度学习中线性回归方程是需要掌握的最基础的式子,就是:y=wx+b,其中w,b是未知的. 神经网络就是可以通过收集大量的数据集,然后将这些数据集进行训练后得到几个较 ...

  3. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  4. 深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

    文章目录 一.前期工作 导入库包 导入数据 主成分分析(PCA) 聚类分析(K-means) 二.神经网络模型建立 三.检验模型 大家好,我是微学AI,今天给大家带来一个利用卷积神经网络(pytorc ...

  5. 神经网络 pytorch 分类二维矩阵图像和一维向量的方法

    在网上找资料的过程中,发现并没有特别细致的讲解分类图像和分类一维向量的做法,导致我捅咕了有几天才弄明白,可能使我比较菜吧......现在在这里记录一下. 首先需要明确,前文我们已经讲解了包装数据集的方 ...

  6. 翻译: 2.7. 如何利用帮助文档 深入神经网络 pytorch

    由于本书篇幅的限制,我们不可能介绍每一个 PyTorch 函数和类(你可能不希望我们这样做).API 文档和其他教程和示例提供了本书之外的大量文档.在本节中,我们为您提供一些探索 PyTorch AP ...

  7. 哪个才是解决回归问题的最佳算法?线性回归、神经网络还是随机森林?

    编译 | AI科技大本营 参与 | 王珂凝 编辑 | 明 明 [AI科技大本营导读]现在,不管想解决什么类型的机器学习(ML)问题,都会有各种不同的算法可以供你选择.尽管在一定程度上,一种算法并不能总 ...

  8. 【Kaggle-MNIST之路】两层的神经网络Pytorch(四行代码的模型)

    简述 第一次学习Kaggle.按照之前的要求,先搞个简单的版本来慢慢完善. 所以,第一次的版本特别烂(hhhh). 任务描述 对mnist数据集进行贴标签.(给图片数据(向量),输出对应的标签.) 得 ...

  9. pytorch线性回归代码_[PyTorch 学习笔记] 1.3 张量操作与线性回归

    本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson1/linear_regression.py 张量的操作 拼 ...

最新文章

  1. CentOS 6.4下安装中文输入法
  2. 华三DHCP分配ip
  3. 如何学习Python课程
  4. python Counter ^
  5. web使用js调用摄像头扫码、拍照、录像
  6. 惠普136nw打印机清零_惠普打印机硒鼓清零方法是怎样的
  7. 上网账号口令怎么获取_我的路由器上网账号和口令忘记了该怎么办
  8. 学云计算能从事什么工作 云计算就业怎么样
  9. 还在为表情包而发愁吗?今天教你用 Python 画一个奸笑(滑稽)表情(内附源码)
  10. 春晚红包互动:中国云计算的成长史
  11. 修改IE浏览器点击右键“查看源文件”时的打开程序
  12. 稻盛和夫「活法」| 读书笔记系列01
  13. UML-类 图 (2)
  14. ECMAScript基础
  15. tensorflow-tf基础
  16. WF100DPZ 1BG S6 DT数字压力传感器
  17. Element引入Iconfont(阿里巴巴矢量图标库)第三方图标库
  18. 新年第一篇,androidHAL层知多少?
  19. JS中用一个button按钮实现开关灯效果
  20. 知识焦虑时代如何进行学习

热门文章

  1. TMS320F28xx SPI master/slave example
  2. 数据库战争:MySQL VS MongoDB
  3. 哈佛大学20条经典校训
  4. google 流瀑布画廊滑块
  5. ai模型去除图像衍射光斑_GAN生成的假脸太逼真了!别怕,十招教你识别AI生成的假图像...
  6. nginx配置https证书双向认证
  7. “碳关税”将实施,家电企业是否被卡脖子?
  8. HDU 6681 Rikka with Cake(扫描线、动态开点线段树)
  9. Mplus教程:如何做潜在类别分析LCA
  10. 基于xilinx fpga的ofdm通信系统基带设计_仪器设备研制 | 基于AD9361的雷达干扰信号模拟器设计...