机器学习前沿:改进自身缺陷,满足新战略

前机械师( 来源)

一、说明

        机器学习在人工智能历史上扮演重要角色,然而,存在问题也不少。为了适应新时代和新任务,不做出重大改进是不可能的,本篇就一些突出问题和改进做出讨论。以便读者掌握未来的思路和方向。

二、机器学习历史回顾

6年前,机器学习的作用是弄清楚如何执行人们容易执行但难以正式描述的任务。在那个时候,在语音识别和物体检测等直观任务上重现人类的能力是积极研究的主要目标。尽管这些任务没有完全解决,但值得注意的是该领域的成就,这些成就对日常生活产生了直接影响。我们可以将自动驾驶和口语转录作为该技术的合法示例。

三、机器学习战场转移

        然而,如今,人工智能的主要战场从最终用户需求转移到大型组织和治理的巨大需求。举个例子,昨天的挑战是识别用户面部以解锁手机。如今,执行人脸识别超过百万或十亿张人脸成为需要克服的新前沿。

        这种新场景带来了新的技术挑战。事实上,由于 6 年旧模型的非线性计算成本,解决大量数据的复杂模式识别任务不仅仅是在庞大的后端基础设施上运行旧模型的问题。需要一个新的机器学习模型系列。

        当然,这项技术已经可用,并且存在严重的隐私问题,道德和社会后果。在本系列文章中,我们将从头开始探讨这些主题,调查在最近的出版物和公共存储库中可以找到的内容。

        希望越容易理解,就越容易决定如何将其用于好事。这从本文开始

四、用简单语言还原过去

        简而言之,据说计算机程序可以学习其性能何时随着经验的提高而提高。这种体验是什么样的?

        在人工智能算法方面,这种经验包括处理数据。对制作计算机程序感兴趣的研究领域称为机器学习

        事实上,在过去的二十年里,人工智能受到了机器学习进步的强烈影响。尽管那个时代ML中使用的核心算法并不新鲜,但研究人员在执行自然语言处理和计算机视觉等领域的复杂任务时显着提高了计算机的性能。

         最常见的机器学习任务是模式识别(例如,在图像中查找人脸)。但是,还有其他任务类型,例如转录和数据生成。我们将在文章后面中讨论这些类型的任务。

五、训练计算机执行操作

        机器学习的核心范式是使用数据来提供训练算法。 这种训练的输出是一个最终能够执行感兴趣的任务的模型。因此,训练算法不是静态定义/编码程序来执行某些操作,而是教导(拟合)模型以执行该操作。

5.1 神经网络的作用

        最成功的机器学习模型之一(也许是最成功的一个)是人工神经网络,或者不久之后,ANN。尽管取得了成功,但直到2004年,ANN仅用于玩具应用程序,概念或小型独立场景。但是为什么?

        使用旧 ANN 架构处理一个图像所花费的估计时间

        使用高维数据(例如640x480图像)训练传统ANN的计算成本令人望而却步,即使使用现代计算机也根本不可行。这只有在深度学习的进步之后才会改变。

         理解和使用香草神经网络仍然是必要的。我们将在下一篇文章中讨论经典ANN模型的细节

5.2 深度学习占据了现场

        过去十年见证了深度学习模型的兴起。深度学习是算法和技术的保护伞,它利用空间时间局部性来减少所需的模型参数数量。这种方法通常称为参数共享

        实际上,深度学习使神经网络能够/实用地执行复杂的高维数据任务,例如实时处理VGA,HD或4K图像。事实上,如果没有深度学习,我们都会被锁在90年代的世界里。

>我们将在下一篇文章中介绍卷积神经网络递归神经网络生成对抗网络等深度学习模型

        在我们结束这个演讲之前,有一些非常重要的事情要提。

5.3 优化和正则化

        机器学习有两个核心问题,即优化正则化

        当您使用数据来训练模型时,您希望找到更适合手头数据的最佳模型。这是优化。这里的陷阱是,如果你在这个拟合上走得太远,你可能会得到一个无用的模型,只适用于该数据,一个过度拟合的模型。

         像这样的模型会记住训练数据,而不是学习数据中的规律。

来自维基百科的过度拟合示例

        过度拟合是建模错误。寻找避免过度拟合的方法称为 regularization。

        强烈建议阅读下一篇文章,介绍过拟合和正则化的基础知识。

六、建模基础知识

        如果世界今天重新启动,您必须了解哪些建模概念才能重新启动机器学习?

        尽管有科学的努力,但不可能理解作用在物理或社会现象上的每一种力量。发生这种情况是由于三类限制:

  • 理论无知:给定现象的关系和理论规律尚不完全清楚
  • 实际无知:缺乏完整的观察,如事实、测量和实验读数
  • 懒惰:作用于给定现象的全套力是如此巨大,以至于无法列出它们或精确计算它们的结果

        机器学习使用函数近似来处理这样的场景。这些函数近似称为模型

6.1 模型

        在机器学习的上下文中,建模是通过训练过程找到有用模型的过程。

        当模型在看不见的数据(即构建过程中未使用的数据)上表现良好时,模型就很有用。简而言之:

当然,我们希望摆脱欠拟合超拟合的模型。让我们考虑以下合成方案,以便了解如何操作。

6.2 合成数据支持

        合成数据是一种宝贵的资源。在将模型和算法应用于实际数据之前,可以更轻松地理解它们的行为。在这里和之后,我们将使用合成数据来深入了解机器学习建模的主要关注点。

        让我们假设我们以某种方式知道控制所研究现象的生成源:

        蓝线代表我们已经奇迹般地知道的源函数。这个特殊的函数是周期性正弦波函数f(x) = sin(x)。JavaScript 中生成此正弦数据的代码是:

const N = 91;
// generating a sequence 91 elements from 0 to 2π
const xs = [...Array(N).keys()].map(x => 2*Math.PI*x / (N - 1));
// generating f(x) = sin(x)
const signal = xs.map(x => Math.sin(x));// sampling 20 random elements and adding a N(0, 0.4) gaussian error
const sampleSize = 20;
const sample = [...Array(N).keys()].sort(() => 0.5 - jStat.uniform.sample(0, 1)).slice(0, sampleSize).map(index => ({x: index, y: signal[index] + jStat.normal.sample(0.0, 0.4)}));
        

        图表中的红叉是通过实验程序从真实现象中获得的测量值。请注意,由于噪声源不同,这些实验读数与源生成正弦函数并不完全共线性。

        正态分布是此类噪声的良好表示。事实上,中心极限定理指出,自随机变量的总和是近似正态分布的。

        在真实场景中,我们甚至不知道生成源信号的形状。通常我们只能访问实验数据:

在本文的其余部分,我们将找到方法来获得源生成信号的良好近似值,假设我们既不知道它的形状也不知道公式。

6.3 近似函数

        粗略地说,训练算法旨在找到给定训练数据的近似函数(或模型)。为了检查它的运行情况,我们将训练数据设置为原始实验数据的 67%,将剩余的 33% 留作将来验证

> 拆分训练集和验证集中的数据称为保留。常见的拆分百分比为 67%、80%、90% 和 99%。

为了使事情尽可能简单,在这个实验中,我们将使用简单的基本教科书模型:直线(也称为 1 次多项式)、三次多项式(三次曲线)等。因此,使用最小二乘法,我们可以找到以下近似值:

哪个模型更接近训练数据?检查图像,我们可以发现第 9 次多项式曲线几乎经过每个训练点,而其他曲线或多或少更近。但是,如何量化这种接近度?

回答这个问题的一个很好的替代方法是均方误差或 mse

mse 是预测值 Ŷ 和观测值 Y 之间的平方差的平均值。预测值是模型猜测的值,而观测值是数据集中的原始值对于我们特定的一维数据,MSE 的实现非常简单:

function mse(model, data) {let result = 0.0;for (let i = 0; i < data.length; ++i) {const elem = data[i];const x = elem.x;const y = elem.y;const y_hat = predict(x, model);const diff = y_hat - y;result += diff * diff;}return result / data.length;
}

对于像 mse 这样的错误指示器,越小越好。对训练数据应用 MSE 会导致:

基于这种性能,我们可以认为最好的模型是第9次多项式次近似。当然,这是一个错误的发现:将 mse 应用于验证数据可以公平地查看实际模型性能:

上图使用对数刻度!它清楚地表明,第 9 项式模型在验证数据上表现不佳——尽管它在训练数据上实现了高性能。换句话说,这张图显示的是第 9 个多项式模型遭受过拟合。

另一方面,线性模型在训练集和验证集中的性能都很低。这称为欠拟合。在实际实验中,线性和 9 度模型都应丢弃。

有人在生产中部署过拟合模型的著名图片

这里最重要的一课是:使用训练中未使用的数据评估模型

现在,我们知道如何检测过度拟合的模型。但是,是什么让模型过度拟合?如何避免?

6.4 过度安装和安装不足的原因

        过度拟合的常见原因是模型复杂性。我们可以将模型复杂性恢复为模型中自由参数的数量。在第 9 多项式的情况下,有 10 个自由参数来拟合数据。自由参数越多,越容易过度拟合。

艾因斯滕引文调查在这里

        相反,参数很少的模型容易出现欠拟合。这是使用线性模型近似(非线性)正弦波函数的情况。

        模型复杂性的选择是在建模阶段要做出的更重要的决定之一。在训练算法中自动执行此决策是机器学习中积极研究的来源。

        减少自由参数的数量或影响通常称为 regularization。我们将在另一篇文章中详细讨论正则化。

6.5 过度拟合和欠拟合的其他来源

        拟合不足和过度拟合还有其他原因,通常与数据质量有关。特别是,小数据是一个大问题,对欠拟合和过拟合都有很强的影响。

        数据采集和准备过程是建模成功的关键。我们将在下一篇文章中讨论它。

过度/欠拟合的另一个原因是训练超参数的选择。本系列的下一篇文章将介绍训练过程。

6.6 最后,是什么让模型有用?

        在我们之前的实验中,具有中间复杂度(第 3 和第 5 个)的模型在训练和验证性能之间显示出最佳平衡。这种平衡是模型选择的主要指标。

        但是,当两个或多个不同的模型具有大致相同的性能时,在这种情况下会发生什么?很简单!选择最简单的一个!

        使用不太复杂的模型而不是更复杂的模型的论点被称为奥卡姆剃刀原理。查看前面的示例,我们发现 3 次和 5 次多项式模型的形状与原始源信号(蓝线)非常相似。因此,通过遵循奥卡姆剃刀原理,我们将选择第 3 个作为最终选择的模型。

> 在实时应用程序中,最简单的模型也是更快的模型。因此,对于两个性能相同的模型,最简单的模型始终是所选模型。

七、结论

        在本文中,我们讨论了机器学习背景下建模的基本主题。使用合成场景和简单的学校级多项式函数来说明欠拟合和过度拟合等概念。在实际场景中,更复杂的模型取而代之,并使用适当的迭代训练算法。无论如何,这里讨论的核心建模主题,如训练和验证集,过度/欠拟合和模型复杂性也被发现并且同样有效。

八、代码

        本文中使用的代码是用 JavaScript 编写的。您可以在此要点或使用下面的小提琴中找到它:

const ctx = document.getElementById('synthetic');
const N = 91;
const xs = [...Array(N).keys()].map(x => 2*Math.PI*x / (N - 1));function mulberry32(a) {return function() {var t = a += 0x6D2B79F5;t = Math.imul(t ^ t >>> 15, t | 1);t ^= t + Math.imul(t ^ t >>> 7, t | 61);return ((t ^ t >>> 14) >>> 0) / 4294967296;}
}
// change seed to an arbitrary number
const seed = 1111;
jStat.setRandom(mulberry32(1111));const signal = xs.map(x => Math.sin(x) );
const sampleSize = 20;
const sample = [...Array(N).keys()].sort(() => 0.5 - jStat.uniform.sample(0,1)).slice(0, sampleSize).map(index => ({x: index, y: signal[index] + jStat.normal.sample(0.0, 0.4)}));sample.sort(() => 0.5 - jStat.uniform.sample(0,1));const dataSplit = Math.round(sampleSize * 0.67);const training_data = sample.slice(0, dataSplit);
const validation_data = sample.slice(dataSplit, sampleSize);_labels = ["0", "π/5", "2π/5", "3π/5", "4π/5", "π", "6π/5", "7π/5", "8π/5", "9π/5", "2π"];const x = [];
const y = [];for (let i = 0; i < training_data.length; ++i) {const elem = training_data[i];x.push(xs[elem.x]);y.push(elem.y);}const order = 3;function fit(x, y, order) {const xMatrix = [];const yMatrix = numeric.transpose([y]);let xTemp = [];for (let j=0; j<x.length; ++j) {xTemp = [];for(let i = 0; i <= order; ++i) {xTemp.push(Math.pow(x[j], i));}xMatrix.push(xTemp);}const xMatrixT = numeric.transpose(xMatrix);const dot1 = numeric.dot(xMatrixT, xMatrix);const dotInv = numeric.inv(dot1);const dot2 = numeric.dot(xMatrixT, yMatrix);const result = numeric.dot(dotInv, dot2);return result.flat(1);
}function predict(x, coeffs) {let result = 0;let xx = 1;for (let i = 0; i < coeffs.length; ++i) {result += xx*coeffs[i];xx *= x;}return result;
}function generateModelData(x, y, order) {const model3 = fit(x, y, order);const result = [];for (let i = 0; i < xs.length; ++i) {result.push(predict(xs[i], model3));}return result;
}const myChart = new Chart(ctx, {data: {labels: xs,datasets: [{type: 'line',label: 'Original Generative Signal',pointRadius: 0,borderColor: 'rgb(0, 125, 255)',pointBackgroundColor: 'rgb(0, 125, 255)',data: signal},{type: 'line',label: 'Linear approximation',pointRadius: 0,borderColor: 'rgb(88, 24, 69)',borderDash: [5, 3],data: generateModelData(x, y, 1)},{type: 'line',label: 'Cubic Approximation',pointRadius: 0,borderColor: 'rgb(255, 87, 51)',data: generateModelData(x, y, 3)},{type: 'line',label: '5th-degree polynomial approximation',pointRadius: 0,borderColor: 'rgb(165, 255, 51)',borderDash: [10, 5],data: generateModelData(x, y, 5)},{type: 'line',label: '9th-degree polynomial approximation',pointRadius: 0,borderColor: 'rgb(123, 36, 28)',pointBackgroundColor: 'rgb(255, 0, 0)',borderDash: [10, 2],data: generateModelData(x, y, 9)},{type: 'scatter',label: 'Training data',pointStyle: 'crossRot',pointRadius: 10,borderColor: 'rgb(255, 128, 0)',data: Array(N).fill().map((element, index) => {const v = training_data.find(elem => elem.x == index);if (v != undefined) {return v.y;} else {return null;}})}]},options: {plugins: {legend: {position: 'bottom'},title: {display: true,text: 'Polynomial regression',font: {size: 48,family: 'Arial'}}},scales: {x: {ticks: {maxTicksLimit: _labels.length,maxRotation: 0,minRotation: 0,callback: function(value, index, ticks) {const factor = index * (_labels.length - 1);let result = "";const n = N - 1;if (factor % n == 0){result = _labels[Math.ceil(factor / n)];}return result;}}},y: {min: -2,max: 2,}}}
});

        如果JavaScript不是你的首选语言,不用担心。将这些代码移植到不同的语言(如Python,Java或C++)并不难。 

参考资料: 查皮

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

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

相关文章

【Lychee图床】本地电脑搭建私人图床,公网远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

springboot配置统一返回结果类

目录结构&#xff1a; Result类&#xff1a; package com.xxxx.common.result;import lombok.Data;Data public class Result<T> {//状态码private Integer code;//信息private String message;//数据private T data;//构造私有化private Result() { }//设置数据,返回对…

报文信息转换器

HttpMessageConverter HttpMessageConverter:报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响应报文。它提供了两个注解和两个类型&#xff1a; RequestBody, ResponseBody, RequestEntity, ResponseEntity(响应用的较多) 准备 创建模块并…

行业追踪,2023-08-30

自动复盘 2023-08-30 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

从一到无穷大 #13 How does Lindorm TSDB solve the high cardinality problem?

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言优势挑战系统架构细节/优化存储引擎索引写入查询 经验Ablation Study总结 引言 …

一文速学-让神经网络不再神秘,一天速学神经网络基础(七)-基于误差的反向传播

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

基于边缘物联网关的智慧零售应用方案

推动经济健康发展增长&#xff0c;就要持续促进和扩大消费需求&#xff0c;提升消费体验。随着物联网技术的普及&#xff0c;面向日常消费的智慧零售应用迎来爆发式增长&#xff0c;不仅可以提升消费者消费体验&#xff0c;还可以提高商家营销和管理效率。本篇就为大家简单介绍…

Ubuntu入门04——目录与文件

目录 1.显示当前工作目录 2.更改目录 3.创建工作目录 4.删除工作目录 5.移动文件或者文件夹 6.文件夹and文件查看命令 7. 回到根目录&#xff0c;回到上一级 8.删除工作目录 9.查看目录和文件 10.以树状图列出目录内容 11.文件查找 12.在数据库中查找文件或目录 1…

uni-app:实现右侧弹窗

效果&#xff1a; 代码&#xff1a; <template><view class"container"><button click"showModal true">点击按钮</button><view class"modal-overlay" v-if"showModal" click"closeModal">…

linux并发服务器 —— 项目实战(九)

阻塞/非阻塞、同步/异步 数据就绪 - 根据系统IO操作的就绪状态 阻塞 - 调用IO方法的线程进入阻塞状态&#xff08;挂起&#xff09; 非阻塞 - 不会改变线程的状态&#xff0c;通过返回值判断 数据读写 - 根据应用程序和内核的交互方式 同步 - 数据的读写需要应用层去读写 …

poll epoll初学习

正是select这些缺点&#xff0c;才有了poll 1.I/O多路转接之poll 2.I/O多路转接之epoll 其中的struct epoll_event:

react-grapesjs——开源代码学习与修改(初出茅庐)

文章目录 ⭐前言⭐grapesjs初始化过程&#x1f496; 渲染大体流程&#x1f496; Editor对象 创建&#x1f496; EditorModel 对象创建&#x1f496; load modules 加载定义的目录模块Module&#x1f496; StyleManager渲染过程 ⭐修改grapesjs配置项⭐总结⭐ 如何修改开源代码⭐…

外贸爬虫系统

全球智能搜索 全球智能搜索 支持全球所有国家搜索引擎&#xff0c;及社交平台&#xff0c;精准定位优质的外贸客户&#xff0c;免翻墙 全球任意国家地区实时采集 搜索引擎全网邮箱电话采集 社交平台一键查看采集&#xff08;Facebook,Twitter,Linkedin等&#xff09; 职位…

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

官方网址&#xff1a;https://ververica.github.io/flink-cdc-connectors/release-2.3/content/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/mysql-postgres-tutorial-zh.html官方教程有些坑&#xff0c;经过自己实测&#xff0c;记录个笔记。 服务器环境&#xff1a; VM虚拟机&am…

【个人博客系统网站】我的博客列表页 · 增删改我的博文 · 退出登录 · 博客详情页 · 多线程应用

【JavaEE】进阶 个人博客系统&#xff08;4&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;4&#xff09;1. 增加博文1.1 预期效果1.1 约定前后端交互接口1.2 后端代码1.3 前端代码1.4 测试 2. 我的博客列表页2.1 期待效果2.2 显示用户信息以及博客信息2.2.1…

Kotlin管道Channel在receiveAsFlow时debounce与flow差异

Kotlin管道Channel在receiveAsFlow时debounce与flow差异 import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import kotlinx.coroutine…

kafka学习-概念与简单实战

目录 1、核心概念 消息和批次 Topic和Partition Replicas Offset broker和集群 生产者和消费者 2、开发实战 2.1、消息发送 介绍 代码实现 2.2、消息消费 介绍 代码实现 2.3、SpringBoot Kafka pom application.yaml KafkaConfig producer consumer 1、核心…

【Spring MVC】统一功能处理

一、登录验证 登录验证通过拦截器实现&#xff0c;拦截器就是在用户访问服务器时&#xff0c;预先拦截检查一下用户的访问请求。 没有拦截器时&#xff0c;用户访问服务器的流程是&#xff1a;用户–>controller–>service–>Mapper。有拦截器时&#xff0c;用户访问…

RouterOS-配置PPPoEv4v6 Server

1 接口 ether3 出接口 ether4 内网接口 2 出接口 出接口采用PPPoE拨号SLAAC获取前缀&#xff0c;手动配置后缀 2.1 选择出接口interface&#xff0c;配置PPPoE client模式 2.2 配置PPPoE client用户名和密码 2.3 从PPPoE client获取前缀地址池 2.4 给出接口选择前缀并配置…

第10章_索引优化与查询优化(覆盖索引, 索引下推等)

4. 子查询优化 MySQL 从 4.1 版本开始支持子查询&#xff0c;使用子查询可以进行 SELECT 语句的嵌套查询&#xff0c;即一个 SELECT 查询的结果作为另一个SELECT 语句的条件。 子查询可以一次性完成很多逻辑上需要多个步骤才能完成的 SQL 操作 。 子查询是 MySQL 的一项重…