- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
这一年来,AI领域层出不穷的技术和应用,真的有点让人疲于奔命。其中AIGC领域的diffusion model 和 NLP领域的 ChatGBT 引领了这一轮风潮。AI取代越来越多脑力工作者的趋势已经不可逆转,在这经济下行内卷严重的当代,竞争将越发的残酷。作为走在风口前沿的技术人,用stable diffusion绘制过逼真的画作,也用ChatGPT生产修改过样板代码,AI带给我的危机感是实实在在,在ChatGPT风头正劲的那段时间,焦虑一度让我夜不能寐.
在AI狂潮告一段落的当下,是时候冷静下来思考,我们应该怎么看待AI, 对待 AI 的正确态度 是什么,这篇文章观点我大体上赞同:
ChatGBT像一个吸收了所有人类知识、但需要别人帮忙才能把这些知识串起来的应届毕业生。看来我今年的工作是安全的。但是,我需要好好学习 ChatGPT,精通它的使用,让我明年也是安全的.
AI 会大大增强程序员的生产力,并创造过去不可能的产品。AI 本质是生产力工具,跟高级语言、云服务、开源代码等是一个性质。写代码的门槛会降低,更多的人会进入 IT 行业,软件市场将变大.
我们要成为这个过程的一部分,需要让自己积极主动,不断更新技能,接受新工具.
是的,我们要成为这个AI落地各行各业过程的一部分,也是我这一年来自学机器学习、深度学习的动力和缘由,也陆陆续续在工作中落地了一些简单的ai项目,而这个机器学习和深度学习的系列就是我学习过程的一个记录和总结.
人工智能可以被定义为将通常由人类完成的智力任务自动化。因此,人工智能是一个综合性的领域,不仅包括机器学习与深度学习,还包括更多不涉及学习的方法。人工智能的真正挑战在于解决那些对人来说很容易执行、但很难形式化描述的任务,比如识别人们所说的话或图像中的脸。对于这些问题,我们人类往往可以凭直觉轻易地解决.
那什么是机器学习?机器学习就是自动发现解决复杂问题的规则的过程。计算机通常的工作方式:程序员编写规则(计算机程序),计算机遵循这些规则将输入数据转换为正确的答案。而机器学习却是把这个过程反过来:机器读取输入数据和对应的答案,然后从中找出合适的规则。与统计学不同,机器学习经常要处理复杂的大型数据集(比如包含数百万张图片的数据集,每张图片又包含数万个像素),用经典的统计分析(比如贝叶斯分析)来处理这种数据集是不切实际的。因此,机器学习(尤其是深度学习)呈现出相对较少的数学理论,从根本上来说是一门工程学科。机器学习是一门非常注重实践的学科,由经验发现所驱动,并深深依赖于软硬件的发展.
深度学习是机器学习的一个分支领域:它是从数据中学习表示的一种新方法,强调从连续的层(layer)中进行学习,这些层对应于越来越有意义的表示。“深度学习”中的“深度”指的并不是利用这种方法所获取的更深层次的理解,而是指一系列连续的表示层。数据模型中包含多少层,这被称为模型的深度(depth).
有三种技术力量在推动着机器学习的进步:
硬件 。
数据 。
算法 。
有一句形象的比喻:如果AI的发展是制造火箭,那么算法就是引擎,数据就是燃料,而硬件就是加速器,这三者缺一不可。在机缘巧合的10年前,它们共同推动了一直延续至今的第三波人工智能的浪潮,虽然我们不知道这次还能持续多久,但在各个领域落地开花后仍然足够改变这个世界.
监督学习:指用带标签的样例来逐步减小模型输出误差的方法,叫作监督式学习(supervised learning)。主要应用于标量回归,图像分类,目标检测,图形分割等.
无监督学习:指从无标签的数据中寻找输入数据的变换,包括聚类和异常检测,其目的在于数据可视化、数据压缩、数据去噪或更好地理解数据中的相关性.
自监督学习:在没有人工标注的标签的监督学习,你可以将它看作没有人类参与的监督学习。标签仍然存在(因为总要有什么东西来监督学习过程),但它们是从输入数据中生成的,通常是使用启发式算法生成的.
强化学习:强调智能体通过与环境的直接互动来学习,主要应用在游戏,自动驾驶、机器人等.
以监督学习为例,机器学习的工作流程由两个阶段构成:训练阶段和推断阶段.
训练阶段:机器自动发现数据与对应答案之间的规则,这个过程中发现的规则会封装在训练好的模型中。它们是训练阶段的成果,并且为推断阶段奠定基础。根据训练数据的多少、模型架构的复杂度和硬件的快慢,训练阶段会持续几毫秒到几天不等.
推断阶段:运用习得的模型为新的数据获取答案.
如果模型不能很好地捕捉数据中的模式,那么就称该现象为欠拟合(underfit);反之,如果模型过度学习这些模式,以至于它不能将所学到规则的泛化到新数据上,那么就称该现象为过拟合(overfit) 。
当模型出现过拟合时,可以通过正则化(regularization)这样的应对措施将其拉回正轨.
要想应对欠拟合,我们通常会通过加大模型的规模来增加模型的表示能力。一般的应对策略是给模型添加更多使用非线性激活函数的层,并增加各层的尺寸(比如增加密集层中的单元数).
模型能力的增强会带来一个副作用:它会使模型对训练集的拟合能力远超出对验证集的拟合能力,而后者包含模型训练时未曾见过的数据。这个现象就是过拟合。这种情况下,模型“过度关注”数据集中不相关的细节,以至于它的预测能力不能很好地泛化到未见过的数据上.
机器学习的根本问题在于优化与泛化之间的矛盾。优化(optimization)是指调节模型使其在训练数据上得到最佳性能的过程(对应机器学习中的学习),泛化(generalization)则是指训练好的模型在前所未见的数据上的性能。机器学习的目标是得到良好的泛化,但你无法控制泛化,只能让模型对训练数据进行拟合。如果拟合得太好,就会出现过拟合,从而影响泛化.
为了实现完美的拟合,你必须首先实现过拟合。由于事先并不知道界线在哪里,因此你必须穿过界线才能找到它。在开始处理一个问题时,你的初始目标是构建一个具有一定泛化能力并且能够过拟合的模型。得到这样一个模型之后,你的重点将是通过降低过拟合来提高泛化能力.
降低或提高学习率。学习率过大,可能会导致权重更新大大超出正常拟合的范围,就像前面的例子一样。学习率过小,则可能导致训练过于缓慢,以至于几乎停止。增加批量大小。如果批量包含更多样本,那么梯度将包含更多信息且噪声更少(方差更小)。最终,你会找到一个能够开始训练的配置.
确定机器学习是否是合适的解决方案 。
定义机器学习问题和数据预测的目标.
定义一种能够可靠地评估模型训练成功与否的度量指标。对于简单的任务,使用预测准确率、精确率、召回率、ROC曲线和AUC值就足够了 。
为模型性能评估做准备。设计用于模型评估的验证过程。具体而言,应该将数据划分成3个分布一致但互无重叠的数据集:训练集、验证集和测试集。验证集和测试集的数据一定不能和训练集重叠.
向量化数据。将数据转换为张量,或者说多维数组。张量中的值应该缩放到较小且居中的范围,例如在[-1, 1]或[0, 1]区间中.
配置最后一层的激活函数:它能对模型的输出实现有效的约束。激活函数的选择应该和当前的问题类型匹配.
配置损失函数:和最后一层的激活函数类似,损失函数也应该和当前的问题类型匹配。例如,对于二分类问题应该使用binaryCrossentropy;对于多分类问题应该使用categoricalCrossentropy;对于回归问题,则应该使用meanSquaredError.
配置优化器:优化器负责驱动神经网络的权重更新.
开发容量充足的模型并刻意地过拟合数据集。通过手动改变超参数,可以逐渐扩展模型的架构,最终达到一个刚好过拟合训练集的模型。之前介绍过,监督式机器学习的一个共通且核心的问题是如何在优化(即拟合训练时见到的数据)和泛化(即针对未见过的数据进行预测)之间取得平衡。在理想情况下,模型应该介于欠拟合和过拟合之间。也就是说,模型的容量应该在容量过低和容量过高之间取得平衡。但只有先跨过平衡的临界点,才能找到这个临界点在哪里.
添加更多层; 。
增加每层的尺寸; 。
使用更多的训练轮次.
应该时常用可视化手段监测训练和验证集上的损失,以及其他你所关心的度量指标(例如AUC)的性能。当你发现模型在验证集上的准确率开始下降时,就说明模型开始过拟合了.
给模型添加正则化并调整超参数,从而尽可能接近介于欠拟合和过拟合之间的理想模型。在这一步中,你会需要不断地修改模型,训练它,在验证集上评估它(这一步还不需要在测试集上评估)。然后再重复这一过程,直到模型足够接近其理想状态。就正则化而言,可以尝试以下步骤.
添加使用不同丢弃率的dropout层.
尝试L1或L2正则化.
尝试不同的模型架构,比如对层数稍加调整.
调整其他超参数(例如密集层的单元数).
神经网络就是函数的级联。神经网络的每一层都可以看作一个函数,将这些层叠加在一起就意味着级联这些函数,这样得到的更复杂的函数就是神经网络。在深度学习的语境下,将输入特征映射到输出目标上的函数叫作模型(model),模型还可以叫作网络(network).
构建多层神经网络时注意要在隐藏层中添加非线性激活函数,最常用的是relu函数。引入了非线性(nonlinearity)目的是增强神经网络的表示能力,使用得当可以提高各种预测任务的准确率.
神经网络的核心组成部分是层(layer),它是一个数据处理模块,可以看作张量之间的一个可调函数.
从本质上讲,密集层就是执行每组输入与输出之间的可调的乘积累加(multiply-add)运算。因为只有一个输入和一个输出,所以这个模型就是简单的线性方程:y = m * x + b。在密集层中,m叫作核(kernel),b叫作偏差(bias).
为了得到较好的预测值,必须让模型从数据中学习,自动为核与偏差寻找恰当的数值。这个寻找的过程就是训练过程(training process)。 训练神经网络主要围绕以下四个方面.
你可以将深度网络看作多级信息蒸馏操作:信息穿过连续的过滤器,其纯度越来越高(即对任务的帮助越来越大).
在深度学习中,一切都是向量,一切都是几何空间中的点。首先将模型的输入(文本、图像等)和目标向量化,即将其转换为初始输入向量空间和目标向量空间。深度学习模型的每一层都对通过该层的数据做简单的几何变换。模型中的一连串层共同构成了一个非常复杂的几何变换,它可以分解为一系列简单的几何变换。这个复杂的几何变换试图将输入空间逐点映射到目标空间。它由层的权重来参数化,权重是根据模型当前的表现来迭代更新的。深度学习的神奇之处:将意义转化为向量,再转化为几何空间,然后逐步学习将一个空间映射到另一个空间的复杂几何变换。你需要的只是维度足够大的空间,以便捕捉到原始数据中的所有关系.
参考资料 《Python深度学习》 《Javascript深度学习》 。
最后此篇关于人工智能、机器学习和深度学习的文章就讲到这里了,如果你想了解更多关于人工智能、机器学习和深度学习的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用python 2.7 当我尝试在其上运行epsilon操作时出现此错误, 这是我的代码 import cv2 import numpy as np img = cv2.imread('img
1 很多程序员对互联网行业中广泛讨论的“35岁危机”表示不满,似乎所有的程序员都有着35岁的职业保质期。然而,随着AI技术的兴起,这场翻天覆地的技术革命正以更加残酷且直接的方式渗透到各行各业。程序员
我有一个包含多个子模块的项目,我想列出每个子模块的相对深度 该项目: main_project submodule1 submodule1\submodule1_1 submo
我有一张彩色图像及其深度图,它们都是由 Kinect 捕获的。我想将它投影到另一个位置(以查看它在另一个视角下的样子)。由于我没有 Kinect 的内在参数(相机参数);我该如何实现? P.S:我正在
给出了这三个网址: 1) https://example.com 2) https://example.com/app 3) https://example.com/app?param=hello 假
这个着色器(最后的代码)使用 raymarching 来渲染程序几何: 但是,在图像(上图)中,背景中的立方体应该部分遮挡粉红色实体;不是因为这个: struct fragmentOutput {
我希望能够在 ThreeJS 中创建一个房间。这是我到目前为止所拥有的: http://jsfiddle.net/7oyq4yqz/ var camera, scene, renderer, geom
我正在尝试通过编写小程序来学习 Haskell...所以我目前正在为简单表达式编写一个词法分析器/解析器。 (是的,我可以使用 Alex/Happy...但我想先学习核心语言)。 我的解析器本质上是一
我想使用像 [parse_ini_file][1] 这样的东西。 例如,我有一个 boot.ini 文件,我将加载该文件以进行进一步的处理: ;database connection sett
我正在使用 Mockito 来测试我的类(class)。我正在尝试使用深度 stub ,因为我没有办法在 Mockito 中的另一个模拟对象中注入(inject) Mock。 class MyServ
我试图在调整设备屏幕大小时重新排列布局,所以我这样做: if(screenOrientation == SCREEN_ORIENTATION_LANDSCAPE) { document
我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST 似乎不起作用。后面的物体出现在前面的物体前面
static FAST_FUNC int fileAction(const char *pathname, struct stat *sb UNUSED_PARAM, void *mo
我有这样的层次结构: namespace MyService{ class IBase { public: virtual ~IBase(){} protected: IPointer
我正在制作一个图片库,需要一些循环类别方面的帮助。下一个深度是图库配置文件中的已知设置,因此这不是关于无限深度循环的问题,而是循环已知深度并输出所有结果的最有效方法。 本质上,我想创建一个 包含系统中
如何以编程方式在树状结构上获取 n 深度迭代器?在根目录中我有 List 每个节点有 Map> n+1 深度。 我已修复 1 个深度: // DEPTH 1 nodeData.forEach(base
我正在构建一个包含大量自定义元素的 Polymer 单页界面。 现在我希望我的元素具有某种主样式,我可以在 index.html 或我的主要内容元素中定义它。可以这样想: index.html
我正在尝试每 25 秒连接到配对的蓝牙设备,通过 AlarmManager 安排,它会触发 WakefulBroadcastReceiver 以启动服务以进行连接。设备进入休眠状态后,前几个小时一切正
假设有一个有默认值的函数: int foo(int x=42); 如果这被其他人这样调用: int bar(int x=42) { return foo(x); } int moo(int x=42)
是否可以使用 Javascript 获取 url 深度(级别)? 如果我有这个网址:www.website.com/site/product/category/item -> depth=4www.w
我是一名优秀的程序员,十分优秀!