从零实现深度学习框架(十)线性回归简介

Hello丶Java

共 3233字,需浏览 7分钟

 · 2022-01-11


更多精彩推荐,请关注我们


引言

本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。

要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不适用外部完备的框架前提下,实现我们想要的模型。本系列文章的宗旨就是通过这样的过程,让大家切实掌握深度学习底层实现,而不是仅做一个调包侠。

我们自动求导工具第一阶段的实现已经完成了,本文最简单的模型——线性回归模型进行简单的介绍。

线性回归

给定输入,可能有多个维度(特征),和输出。线性回归(linear regression)假设输入和输出之间的关系是线性的。即可以表示为中元素的加权和,这里通常允许包含观测值的一些噪声,我们假设任何噪声都比较正常,比如噪声遵循高斯分布。

我们举一个例子:我们希望根据房屋的面积(㎡)和房龄(年)来估计房屋的售价(万/㎡)。以某卖房软件上深圳南山区近地铁口售价的真实数据为例。我们收集了房屋的售价、面积和房龄。在机器学习中,该数据集称为训练集(training data set)。每行数据(一次房屋交易相对应的数据)称为样本(sample),也称为数据点(data point)。我们把试图预测的目标(比如房屋价格)称为标签(label)或目标(target)。预测所依据的自变量(面积或房龄)称为特征(feature)。

我们使用来表示数据集中的样本数,对索引为的样本,其输入表示为,其对应的标签是

我们收集到的数据集如下:

X = [
    [64.431], # [面积, 房龄]
    [6821],
    [74.119],
    [74.824],
    [76.917],
    [78.116],
    [78.617]
]
y = [6.16.257.86.667.827.148.02]

线性回归假设目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下:


其中称为权重(weight),权重代表每个特征对预测值的影响(权重越大表面影响越大)。称为偏置(bias)或截距(intercept)。严格来说,上式是输入特征的一个仿射变换(affine transformation)。仿射变换是通过加权和对特征进行线性变换(linear transformation),并通过偏置项来进行平移(translation)。

有了数据集以后,我们的目标是寻找线性回归模型的权重和偏置,以对新的样本进行预测。

在机器学习领域,我们使用的一般是高维数据集,建模时采用线性代数表示法会比较方便。假设我们的输入包含个特征时,我们将预测结果表示为:

比如在我们房价预测的例子中总共有2个特征,分别是房屋面积和房龄。所以可以写成:

假设表示面积;表示房龄。

如果将所有的特征都放到向量中,并将所有权重放到向量中,我们可以用点积形式来简介地表达模型:

向量表示包含所有特征的单个样本数据。那么用符号可以表示我们整个数据集中的个样本,其中,的每一行是一个样本,每一列是一种特征。

那么预测值就可以通过矩阵-向量乘法表示:

有时候也可以把加到权重中去,也进行相应的变化得到增广矩阵。上面的式子展开如下:

这里的会进行广播。我们如果把加到权重中去,就变成了:

上式最后用表示增广后的矩阵和向量。

我们已经有了数据集和模型,那么如何得到模型参数呢?答案就是学习过程。

学习过程

学习过程说的是:基于初始的模型参数,我们可以得到一个预测输出,然后我们计算该输出和真实输出之间的距离。通过最小化损失函数和优化方法就可以来优化模型参数。

损失函数:衡量实际值与预测值之间的差距。数值越小代表损失越小,完美预测时损失为0。

优化:改变模型参数以获得更少的损失

损失函数

一维情况下的回归问题

我们为一维情况下的回归问题绘制图像,如上图所示。一维情况即样本只有一个特征。比如横坐标代表身高,纵坐标代表体重。

假设某人的真实身高是180cm,你预测的身高是156cm。那么衡量距离,你首先想到的应该是它们之间的差值。为了避免负数,也应该加一个绝对值。所以定义为,但是绝对值是不可求导的,我们可以把绝对值改成平方,并加上系数好进行求导。这就是平方误差损失函数:


是度量单个样本的损失,为了度量整个数据集的损失,我们需要计算训练集个样本上的损失均值:


此时叫作均方误差损失函数。

我们要找的就是能使所有训练样本上的损失均值最小的参数:

梯度下降

对于线性回归来说,有一种方法叫作解析解。但是它应用有限,无法进行推广。因此这里不做分析。

本节介绍的方法即使我们无法得到解析解的情况下,仍然可以有效地训练模型。

那就是梯度下降(gradient descent)的方法,这种方法几乎可以优化所有的深度学习模型。它通过不断地在损失函数递减的方向上更新参数来降低误差。

梯度下降最简单的用法是计算损失函数关于模型参数的导数(或者说是梯度)。通常是遍历完整个数据集再进行参数更新,但实际上可能非常慢。因此我们遍历的时候只遍历部分批量数据,遍历完该批量数据即进行参数更新。

我们刚刚看到的方法叫作小批量随机梯度下降法,随机指的是每批数据都是随机抽取的。

用下面的数学公式来表示这一更新过程:

其中表示偏导数;代表小批量数据;表示这一小批量数据的数量;是学习率。

算法的步骤如下:

  • 初始化模型参数,通常采用随机初始化
  • 从数据集中随机抽取小批量样本,且在梯度的反方向上更新参数,不断迭代这一步骤。

批量大小和学习率的值通常需要预先指定,而不是通过学习得到的,这种参数叫作超参数(hyperparameter)。

在训练了预先确定的若干次迭代次数后(或满足某些停止条件),我们保存此时模型参数的估计值,记为

优化方法

线性回归恰好只有一个最小值,但是对于深度神经网络这种复杂的模型来说,可能有多个局部极小值点。

局部极小值与全局最小值

此时可能需要用到随机梯度下降法的一些变体,比如Adagrad、RMSProp等。这些变体被称为优化方法或优化器。

关于这些变体后面的文章会讨论。

从最大似然来看均方误差

本节来看一下为什么采用均分误差作为损失函数。

我们上面说过,假设噪声(误差)遵循高斯分布(正态分布)。为什么要这么假设呢,一种解释是,根据中心极限定理:许多独立随机变量的和趋向于正态分布。因为影响噪声的因素有很多,而这些因素都是独立且随机分布的,所以这么假设。

若随机变量具有均值和方差,其正态分布概率密度函数如下:

高斯分布图形

改变均值会产生沿轴的偏移,增加方差会降低分布的峰值。

均方误差损失函数(简称均方误差)可以用于线性回归的一个原因是:我们假设了观测中包含噪声,其中噪声服从正态分布。则预测函数可以写为:

其中,有

根据,也可写成

因此,我们可以写出给定观测到特定的似然:

参数的最优值是使整个数据集的似然最大的值:

由于取对数不改变单调性,同时优化一般是指最小化,我们再加上负号,变成最小化负对数似然,由此可得:

代入得:

上面式子的解并不依赖于,因此,在高斯噪声的假设下,最小化均方误差等价于对线性模型的极大似然估计。

参考

  1. 动手学习深度学习

最后一句:BUG,走你!

Markdown笔记神器Typora配置Gitee图床
不会真有人觉得聊天机器人难吧(一)
Spring Cloud学习笔记(一)
没有人比我更懂Spring Boot(一)
入门人工智能必备的线性代数基础

1.看到这里了就点个在看支持下吧,你的在看是我创作的动力。
2.关注公众号,每天为您分享原创或精选文章
3.特殊阶段,带好口罩,做好个人防护。

浏览 20
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报