【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)
🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
1. 前言
2. 机器学习
2.1 机器学习简史
2.2 机器学习模型
3 线性回归
3.1 线性模型
3.2 目标函数(损失函数)
3.3 优化
3.4 批量输入
3.5 训练
4. 总结
1. 前言
进入这篇文章之前,想必大家已经阅读过前面的【PyTorch入门】系列文章~~
从本篇文章开始,我们将进入深度学习基础的学习。首先我们需要对机器学习、深度学习等基本概念有一个了解;然后,我们需要对人工智能整个历史发展有一个了解。
- 机器学习、深度学习等基础概念。
- 人工智能发展历史。
2. 机器学习
在很多科幻电影中,时常会出现一些具有独立思考能力的机器人,这些机器人的智力和人类的相当,甚至超过了人类。银幕上的人工智能形象让人印象深刻、充满幻想。但是在现阶段的现实世界中,我们距离那样的“强人工智能”还有很长一段距离,平时在广告或技术文档中提到的人工智能通常指的是“弱人工智能”。在学术界,研究者们尝试着用各式各样的方法来实现人工智能,因此,该研究领域十分宽泛。如下图所示,人工智能包含机器学习领域,而神经网络是机器学习的一个子领域。本书主要介绍的是神经网络的子领域一深度神经网络,也就是我们常说的“深度学习”。
- 深度学习就是深度神经网络去学习。
- 深度神经网络是神经网络的一部分。
- 神经网络又是机器学习的一个研究领域。
- 人工智能还有强化学习、联邦学习、迁移学习等,都不是机器学习。
- 机器学习中除了神经网络还有SVM、KNN聚类等学习算法,但是数学理论复杂。
- 神经网络本质就是函数拟合数据,是机器学习中最重要的一块。
- 扩展神经网络的连接层深度就是深度神经网络,也就是深度学习。
2.1 机器学习简史
早在古希腊时期,人们就梦想着能创造出有自主思考能力的机器,这不论在文学作品中还是历史文档中都能找到印迹。在电子计算机还没有被发明之前,发明家们做了很多尝试,但都因机器结构过于简单而失败。第二次世界大战期间,美国为了处理大量的军事数据,组织研究小组研发了第一台电子计算机,电子计算机的发明更加激发了人们对人工智能的向往。1950年,艾伦·麦席森·图灵提出了“图灵测试”理论,也让图灵摘得了“人工智能之父”的桂冠。如今,人工智能已经成为一个学术研究热点和商业市场焦点,且正在快速发展。从20世纪50年代开始,机器学习就是人工智能的重要领域之一,此概念是由Hebb在1949年根据神经心理学的学习原理提出来的。随后在1952年,美国计算机科学家ArthurSamuel为机器学习作出更明确的定义,“机器有能力去学习,而不是通过预先准确实现的代码”。下图展示了各机器学习算法的里程碑时间轴。
1957年,Rosenblatt基于神经科学提出了机器学习的经典模型之一一感知器模型。感知器模型的意义非凡,它表示:对复杂智能活动的研究可以从对简单感知器模型的研究开始。感知器模型抽象了复杂的生物细胞结构,可以说是神经网络的“鼻祖”。在1969年,人工智能科学家基于对感知器的研究,提出了多层感知器的构想,我们后来将其称为“神经网络”。最初,由于“神经网络”结构复杂且无法找到合适的训练方法,它的发展停滞不前,直到1981年,Linnainmaa提出反向传播训练算法(Backpropagation,BP算法),成功实现了神经网络的有效训练。如今,反向传播算法仍然是深度神经网络的核心训练算法。基于这一训练算法,人工智能科学家们对各种结构的神经网络进行了大胆的尝试,逐渐从浅层结构走向深层结构。
- 感知器模型是初始模型。
- 多层感知器:神经网络模型的鼻祖。
- 训练方法导致神经网络发展停滞,直到反向传播算法出现。
- 反向传播算法+梯度下降算法 的出现使得神经网络从浅层走向深层。
科学家们除了对脑神经的联结方式进行模拟之外,也基于符号逻辑方法进行了尝试。1986年,J.R.Quinlan提出决策树模型,该模型能够处理较为简单的分类学习问题。1995年,Vapnik和Cortes提出了著名的“支持向量机”算法(SVM算法),该算法拥有非常坚实的数学理论基础并且能得到理想的分类结果。当时出现了两大人工智能阵营,一个以“神经网络”为核心,主张联结主义;一个以“支持向量机”为核心,主张符号逻辑方法。从1995年提出SVM算法到2005年,这期间SVM以其更好的分类效果及更低的训练成本赢得了大多数人工智能科学家的青。直到2005年,以Hinton、LeCun、Bengio和AndrewNg等众多人工智能科学家为首,成功地训练了结构更深的神经网络,并且计算结果达到了前所未有的正确率,从而开启了深度学习革命,让神经网络模型再度成为研究热潮。
2.2 机器学习模型
深度学习是机器学习的一个分支,所以在学习深度学习之前,我们先探讨一下什么是机器学习。假设世界上任意一个现象背后都存在规律。这个规律可以看作一个复杂的函数f。从哲学的角度来看,世间万事万物的规律函数f就是我们所追求的真理。从机器学习和数学角度去看,f是我们的目标函数。
人类天生具有学习能力。比如一听到打雷,就知道将晒在外面的衣服收回来。打雷可能下雨这个规律是人类通过长期观察现实世界后总结出来的规律。但是世界如此之大,我们眼晴看到的、耳朵听到的事物无论在时间上还是空间上都非常有限。因此,人类通过观察局部世界所总结出来的规律只能不断接近于事物的本质,无法完全相同。从数学角度看,人类所观察的现象就是目标函数f产生的样本集D。我们通过不断地观察现象、进行总结,会得到规律函数g,因为现实中所观察到的现象往往包含误差或干扰,并且样本数不可能无限多,所以规律函数g只能趋近目标函数f,不可能完全相等。规律函数g越趋近f,说明我们的总结归纳越好、理论越完备。
机器学习就是让机器代替人类去观察样本、求解函数g的过程。如图3-3所示,未知目标函数
f:X→Y通过取样得到数据样本集D={(x,y),...,(xn,yn)}。机器学习算法A负责从数据样本集D中找出统计规律,算法A会在假设函数集H中找出规律函数g,找到的规律函数g与目标函数f越相似,
找到的规律就越可靠。最终我们可以找到一个与f最相似的规律函数g,它就是机器所学习到的“知识”。
3 线性回归
上一节描绘了机器学习模型的概貌,其实在实际应用中,许多统计问题经常被近似为线性模型,因为线性模型非常简单明了,容易模拟。在这一节中,我们也将线性回(LinearRegression,LR)模型当作深度学习入门的第一个模型,用一个简单的线性回归实例来帮助大家了解机器学习模型的实现过程,现在就让我们一起动手实现它吧!
3.1 线性模型
我们在进行机器学习之前需要准备好数据样本集D,假设数据样本集D种有5个样本,它们的具体数值如下表所示:
我们利用scatter()方法绘制散点图。需要注意的是,在使用matplotlib 绘制图形时,传人的预Tensor必须先转换成NumPy数据:
import matplotlib.pyplot as plt # 用来画图的库
import torch
x = torch.Tensor([1.4, 5, 11, 16, 21])
y = torch.Tensor([14.4, 29.6, 62, 80, 119.4])
# .numpy():把Tensor转化为numpy数组。
plt.scatter(x.numpy(), y.numpy())
plt.show()
数据样本集D中的样本分布情况如下图所示。通过观察,我们会发现这5个点符合一种线性的规律,也就是说可以通过一条直线去拟合5个点。
因为我们假设使用一条直线去拟合,所以依据二维平面中直线的数学公式:
公式中的k是斜率,b是截距,又称偏置(bias)。可以发现,不同的k和b的组合可以代表不同的直线,所以,k和b非常重要,我们又称它们为参数(parameter),有时候也称它们为权重(weight)。既然如此,寻找直线的问题就转化成了找寻一组合适的(k,b)。为了统一,我们用w1代替k,用w0代替b,新公式如下:
3.2 目标函数(损失函数)
上一节,我们的目标是找到一组合适的(w1,w0)。假设最初的(w1,w0)是随机的,为了方便区分,那么我们可以把上面的数学公式中的y改写成:
如下表所示,是由样本中的传人线性模型后计算得到的输出,是我们真实测量拿到
的样本值。
因为一开始w1和w0的值不一定是准确的,所以5个数据样本的实际y值与公式下的y值不是完全相等的。现在,我们用一个函数去衡量实际y值和公式y值之间的误差,这个函数有很多名字——损失函数(lossfunction)、准则(criterion)、目标函数(objectivefunction)、代价函数(costfunction)或误差函数(errorfunction),我们可以用L表示。
在这里,采用的损失函数是均方误差(Mean-SquareError,MSE):
可以发现,损失函数L实际是一个关于参数(w0,w1)的函数。因此,我们的目标就是找到一组合适的(w0,w1)使得和之间误差最小,即让损失函数L的值最小。
3.3 优化
为了让损失函数L的值降到最小,我们要开始调整参数(w1,wo)的值!这个过程就称为优化。L(w0,w1)是一个拥有两个自变量的函数,因此画出来的图形是一个三维的图像,如下图所示。我们要找的最小值就是图像的谷底。
这里我们采用一种叫作“梯度下降”的方法,这样不论是从图中A点还是B点,都可以最终抵达谷底。什么是梯度?从数学上来看,梯度是一个向量,可以用符号V表示,是函数对每个自变量的偏微分,L的梯度的具体数学表达如下:
我们现在将函数想象成一座山。梯度向量的方向刚好和等高线垂直。也就是说,梯度向量代表着函数增长速度最快的方向。如图下图所示,我们朝着梯度向量的反方向移动,梯度向量的反方向始终朝着下降速度最快的方向,最终到达谷底(最低点),这种方法我们称为“梯度下降”。
上面讨论的是三维的情况,可能比较抽象。我们现在把问题假设成二维的情况:如下图所示,假设t时刻的参数w在最低点的右侧,此时wt处的导数值大于0,w要往数轴左方移动才能让
函数值最小。因此我们不妨使用如下公式进行更新:
这里 就是学习率,是自定义的一个超参数。其越大表示下降越快,越小下降越慢。
当然在三维、四维甚至无限维度的情况下,仍然成立。具体公式可以修改为:
3.4 批量输入
将原本的样本增加一个维度B,表示批次,也就是我们熟知的batch。作用为让多个数据样本同时被处理,从向量变为矩阵,公式都不改变。具体见后面的代码项目部分即可。
3.5 训练
训练就是不断地通过前向传播和反向传播,对参数w进行调优,最终让损失函数的损失值L达到最小的过程。如下图所示,我们将前向传播分为两步:第1步是将输入x和参数w按照直线公式计
算后得到输出;第2步是将输出和输入损失函数计算后得到损失值L。接着进行反向传播,即求出损失值的梯度向量,然后使用梯度下降法更新参数W。
4. 总结
如果想要学习更多深度学习知识,大家可以点个关注并订阅,持续学习、天天进步
你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~