【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)

🌈 个人主页:十二月的猫-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 torchx = 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个点。

        因为我们假设使用一条直线去拟合,所以依据二维平面中直线的数学公式:

y=kx+b

        公式中的k是斜率,b是截距,又称偏置(bias)。可以发现,不同的k和b的组合可以代表不同的直线,所以,k和b非常重要,我们又称它们为参数(parameter),有时候也称它们为权重(weight)。既然如此,寻找直线的问题就转化成了找寻一组合适的(k,b)。为了统一,我们用w1代替k,用w0代替b,新公式如下:

y=w_1x+w_0

3.2 目标函数(损失函数)

        上一节,我们的目标是找到一组合适的(w1,w0)。假设最初的(w1,w0)是随机的,为了方便区分,那么我们可以把上面的数学公式中的y改写成\widehat{y}

\widehat{y}=w_1x+w_0

        如下表所示,\widehat{y}^{(i)}是由样本中的\widehat{x}^{(i)}传人线性模型后计算得到的输出,{y}^{(i)}是我们真实测量拿到
的样本值。

        因为一开始w1和w0的值不一定是准确的,所以5个数据样本的实际y值与公式下的y值不是完全相等的。现在,我们用一个函数去衡量实际y值和公式y值之间的误差,这个函数有很多名字——损失函数(lossfunction)、准则(criterion)、目标函数(objectivefunction)、代价函数(costfunction)或误差函数(errorfunction),我们可以用L表示。

        在这里,采用的损失函数是均方误差(Mean-SquareError,MSE):

L(w_{1},w_{0})=\sum_{i=1}^{5}(\hat{y}^{(i)}-y^{(i)})^{2}=\sum_{i=1}^{5}(w_{1}x^{(i)}+w_{0}-y^{(i)})^{2}

        可以发现,损失函数L实际是一个关于参数(w0,w1)的函数。因此,我们的目标就是找到一组合适的(w0,w1)使得y^{(i)}\hat{y}^{(i)}之间误差最小,即让损失函数L的值最小。

3.3 优化

        为了让损失函数L的值降到最小,我们要开始调整参数(w1,wo)的值!这个过程就称为优化。L(w0,w1)是一个拥有两个自变量的函数,因此画出来的图形是一个三维的图像,如下图所示。我们要找的最小值就是图像的谷底。

        这里我们采用一种叫作“梯度下降”的方法,这样不论是从图中A点还是B点,都可以最终抵达谷底。什么是梯度?从数学上来看,梯度是一个向量,可以用符号V表示,是函数对每个自变量的偏微分,L的梯度的具体数学表达如下:

\nabla L=(\frac{\partial L}{\partial w_{1}},\frac{\partial L}{\partial w_{0}})

        我们现在将函数想象成一座山。梯度向量的方向刚好和等高线垂直。也就是说,梯度向量代表着函数增长速度最快的方向。如图下图所示,我们朝着梯度向量的反方向移动,梯度向量的反方向始终朝着下降速度最快的方向,最终到达谷底(最低点),这种方法我们称为“梯度下降”。

        上面讨论的是三维的情况,可能比较抽象。我们现在把问题假设成二维的情况:如下图所示,假设t时刻的参数w在最低点的右侧,此时wt处的导数值大于0,w要往数轴左方移动才能让
函数值最小。因此我们不妨使用如下公式进行更新:

w^{t+1}=w^t-\frac{\mathrm{d}L}{\mathrm{d}w^t}\times\delta\quad(\delta>0) 

        这里 \delta就是学习率,是自定义的一个超参数。其越大表示下降越快,越小下降越慢。

        当然在三维、四维甚至无限维度的情况下,仍然成立。具体公式可以修改为:

w_{1}^{t+1}=w_{1}^{t}-\frac{\partial L}{\partial w_{1}^{t}}\times\delta \\w_{0}^{t+1}=w_{0}^{t}-\frac{\partial L}{\partial w_{0}^{t}}\times\delta

3.4 批量输入

        将原本的样本增加一个维度B,表示批次,也就是我们熟知的batch。作用为让多个数据样本同时被处理,从向量变为矩阵,公式都不改变。具体见后面的代码项目部分即可。

3.5 训练

        训练就是不断地通过前向传播和反向传播,对参数w进行调优,最终让损失函数的损失值L达到最小的过程。如下图所示,我们将前向传播分为两步:第1步是将输入x和参数w按照直线公式计
算后得到输出;第2步是将输出和输入损失函数计算后得到损失值L。接着进行反向传播,即求出损失值的梯度向量\Delta L,然后使用梯度下降法更新参数W。

4. 总结

如果想要学习更多深度学习知识,大家可以点个关注并订阅,持续学习、天天进步

你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos 8 离线升级openssh 9.9

背景 根据云服务漏检报告,需要升级云服务器openssh服务(离线环境)。本文将采用rpm包形式,将openssh服务由OpenSSH_8.0p1 升级至OpenSSH_9.9p1。准备一台能够联网的服务器(简称server1)用于下载程序包&#…

利用Vue和javascript分别编写一个“Hello World”的定时更新

目录 一、利用Vue编写一个“Hello World”的定时更新(1)vue编码在Html文件中(2)vue编码在js文件中 二、利用javascript编写一个“Hello World”的定时更新 一、利用Vue编写一个“Hello World”的定时更新 (1&#xff…

蓝桥杯python基础算法(2-1)——排序

目录 一、排序 二、例题 P3225——宝藏排序Ⅰ 三、各种排序比较 四、例题 P3226——宝藏排序Ⅱ 一、排序 (一)冒泡排序 基本思想:比较相邻的元素,如果顺序错误就把它们交换过来。 (二)选择排序 基本思想…

洛谷 P4552 [Poetize6] IncDec Sequence C语言

P4552 [Poetize6] IncDec Sequence - 洛谷 | 计算机科学教育新生态 题目描述 给定一个长度为 n 的数列 a1​,a2​,…,an​,每次可以选择一个区间 [l,r],使这个区间内的数都加 1 或者都减 1。 请问至少需要多少次操作才能使数列中的所有数都一样&#…

Vue Dom截图插件,截图转Base64 html2canvas

安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…

88.[4]攻防世界 web php_rce

之前做过&#xff0c;回顾&#xff08;看了眼之前的wp,跟没做过一样&#xff09; 属于远程命令执行漏洞 在 PHP 里&#xff0c;system()、exec()、shell_exec()、反引号&#xff08;&#xff09;等都可用于执行系统命令。 直接访问index.php没效果 index.php?sindex/think\a…

为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?

为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同&#xff0c;实参前会加前缀&#xff0c;尤其参数很多的情况&#xff0c;可读性很强。例如&#xff1a; [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意&#xff0…

数据结构-堆和PriorityQueue

1.堆&#xff08;Heap&#xff09; 1.1堆的概念 堆是一种非常重要的数据结构&#xff0c;通常被实现为一种特殊的完全二叉树 如果有一个关键码的集合K{k0,k1,k2,...,kn-1}&#xff0c;把它所有的元素按照完全二叉树的顺序存储在一个一维数组中&#xff0c;如果满足ki<k2i…

【C#】Process、ProcessStartInfo启动外部exe

在C#中使用 Process 和 ProcessStartInfo 类启动外部 .exe 文件&#xff0c;可以按照以下步骤进行&#xff1a; 创建 ProcessStartInfo 实例&#xff1a;配置进程启动信息&#xff0c;包括可执行文件的路径、传递给该程序的参数等。 设置启动选项&#xff1a;根据需要配置 Pro…

oracle 基础语法复习记录

Oracle SQL基础 因工作需要sql能力&#xff0c;需要重新把sql这块知识重新盘活&#xff0c;特此记录学习过程。 希望有新的发现。加油&#xff01;20250205 学习范围 学习SQL基础语法 掌握SELECT、INSERT、UPDATE、DELETE等基本操作。 熟悉WHERE、GROUP BY、ORDER BY、HAVIN…

【Rust自学】20.2. 最后的项目:多线程Web服务器

说句题外话&#xff0c;这篇文章非常要求Rust的各方面知识&#xff0c;最好看一下我的【Rust自学】专栏的所有内容。这篇文章也是整个专栏最长&#xff08;4762字&#xff09;的文章&#xff0c;需要多次阅读消化&#xff0c;最好点个收藏&#xff0c;免得刷不到了。 喜欢的话…

RabbitMQ深度探索:简单实现 MQ

基于多线程队列实现 MQ &#xff1a; 实现类&#xff1a; public class ThreadMQ {private static LinkedBlockingDeque<JSONObject> broker new LinkedBlockingDeque<JSONObject>();public static void main(String[] args) {//创建生产者线程Thread producer n…

自定义多功能输入对话框:基于 Qt 打造灵活交互界面

一、引言 在使用 Qt 进行应用程序开发时&#xff0c;我们经常需要与用户进行交互&#xff0c;获取他们输入的各种信息。QInputDialog 是 Qt 提供的一个便捷工具&#xff0c;可用于简单的输入场景&#xff0c;但当需求变得复杂&#xff0c;需要支持更多类型的输入控件&#xff0…

国产编辑器EverEdit - 工具栏说明

1 工具栏 1.1 应用场景 当用户想显示/隐藏界面的标签栏、工具栏、状态栏、主菜单等界面元素时&#xff0c;可以通过EverEdit的菜单选项进行设置。 1.2 使用方法 选择菜单查看 -> 工具栏&#xff0c;在工具栏的子菜单中选择勾选或去掉勾选对应的选项。 标签栏&#xff1…

ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务

目录 一、ASP.NET Core 中使用依赖注入 (DI) 容器获取并执行自定义服务 1. app.Services 2. GetRequiredService() 3. Init() 二、应用场景 三、依赖注入使用拓展 1、使用场景 2、使用步骤 1. 定义服务接口和实现类 2. 注册服务到依赖注入容器 3. 使用依赖注入获取并…

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…

当大模型遇上Spark:解锁大数据处理新姿势

大模型与 Spark&#xff1a;技术初印象 在当今数字化浪潮中&#xff0c;大模型和 Spark 无疑是备受瞩目的两大技术。它们各自在人工智能和大数据处理领域大放异彩&#xff0c;而当这两者相遇&#xff0c;又会碰撞出怎样的火花呢&#xff1f;让我们先来分别认识一下大模型和 Sp…

第 1 天:UE5 C++ 开发环境搭建,全流程指南

&#x1f3af; 目标&#xff1a;搭建 Unreal Engine 5&#xff08;UE5&#xff09;C 开发环境&#xff0c;配置 Visual Studio 并成功运行 C 代码&#xff01; 1️⃣ Unreal Engine 5 安装 &#x1f539; 下载与安装 Unreal Engine 5 步骤&#xff1a; 注册并安装 Epic Game…

芝法酱学习笔记(2.6)——flink-cdc监听mysql binlog并同步数据至elastic-search和更新redis缓存

一、需求背景 在有的项目中&#xff0c;尤其是进销存类的saas软件&#xff0c;一开始为了快速把产品做出来&#xff0c;并没有考虑缓存问题。而这类软件&#xff0c;有着复杂的业务逻辑。如果想在原先的代码中&#xff0c;添加redis缓存&#xff0c;改动面将非常大&#xff0c…

VLAN 基础 | 不同 VLAN 间通信实验

注&#xff1a;本文为 “ Vlan 间通信” 相关文章合辑。 英文引文&#xff0c;机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信&#xff1f; Posted on November 20, 2015 by RouterSwi…