人工智能:使一部机器像人一样进行感知、认知、决策、执行的人工程序或系统
人工智能三个层面:计算智能、感知智能、认知智能
机器学习的定义:从数据中自动提取知识
半监督学习:部分数据标记已知
强化学习:数据标记未知,但知道与输出目标相关的反馈,适用于决策类问题
深度学习
应用研究:视觉+语言
缺点:算法输出不稳定,容易被攻击;模型复杂度高,难以纠错和调试;模型层级复合程度高,参数不透明;端到端训练方式对数据依赖性强,模型增量性差;专注直观感知类问题,对开放性推理问题无能为力;人类知识无法有效引入进行监督,机器偏见难以避免。
神经网络
万有逼近原理:如果一个隐层包含足够多的神经元,三层前馈神经网络(输入-隐层-输出)能以任意精度逼近任意预定的连续函数。双隐层可以解决任何复杂的分类问题。
每一层的作用:完成输入到输出的空间变换,将原始输入空间投影到线性可分的空间去分类;增加结点数;增加层数。
在神经元总数相当的情况下,深度的贡献是指数增长,宽度的贡献线性增长。
参数学习:误差反向传播(多层神经网络可看成是一个复合的非线性多元函数),参数沿负梯度方向更新可以使函数值下降。
逐层预训练:无法实现初衷效果,很少使用
疑问:反向传播如何实现?目前深度学习已经在多方面初有成效,除了视觉、语言外,我们还能在哪里用到深度学习?
参考Rogan的博客进行Google邮箱的注册、登录,在谷歌网盘中创建新的文件夹,在网页中安装Colaboratory并进行使用;
参考老师发的pytorch基础操作实验指导进行简单的代码输入,查看结果:
定义数据:
定义操作:
matplotlib作图:
矩阵操作:
初始化样本特征:X为特征矩阵,Y为样本标签,将样本的坐标都保存在X里,而Y中存储的则是样本的类别。
构建线性模型分类:每个线性模型都包含weight和bias,初始化一些函数后便开始训练:把数据输入模型后,得到预测结果,再进行多次反向传播,最后更新全部参数。最终可视化。
构建两层神经网络分类:与线性模型不同的是,这种分类在两层之间加入了一个ReLU激活函数(在神经网络中,线性整流作为神经元的激活函数,定义了该神经元在线性变换 之后的非线性输出结果。),其余不变。进行可视化。
由结果可见,两层神经网络的方法比线性模型的准确率高了很多,能更好的实现准确分类。
可视化很好的将结果展现在人们面前,使结果更加清晰,便于比较;我搞不懂的地方是构建模型为什么要进行反向传播,这种反向传播的意义是什么。后来又看了一遍视频再去网上搜索,知道了反向传播就是求梯度,用梯度下降法对参数进行更新,而更新就需要梯度。更新梯度后就可以不断训练学习更好的参数。
心得:学习到很多关于机器学习和深度学习的知识
一.概述
1.机器学习的定义:
最常用定义:计算机系统能够利用经验提高自身的性能
可操作定义:机器学习本质是一个基于经验数据的函数估计问题
统计学定义:提取重要模式、趋势,并理解数据,即从数据中学习
核心是从数据中自动提取知识
2.机器学习三大要素:
模型:对要学习问题映射的假设(问题建模,确定假设空间)
策略:从假设空间中学习/选择最优模型的准则(确定目标函数)
算法:根据目标函数求解最优模型的具体计算方法(求解模型参数)
3.在实际应用中,特征往往比分类器更重要
二.深度学习概述
深度学习的不能:稳定性低、可调试性差、参数不透明、机器偏见、增量性差、推理能力差
解释性的三个层次:
“对症下药”:知道哪些特征对输出有重要影响,出了问题准确快速纠错
不再“对牛弹琴”:算法能被人的知识体系所理解+利用和结合人类知识
“站在巨人的肩膀上”:知识能得到有效存储、积累和复用
神经网络每一层数学公式:y=a(Wx+b)
a:弯曲,b:平移,Wx:升维/降维,放大/缩小,旋转
问题:对于神经网络的参数学习中误差反向传播部分不太理解。
二、代码解读
本次学习了用torch.Tensor定义数据,支持定义float、int等各种各样的数据,可以用ones、rand等多种方法创建Tensor。也学习了用Tensor进行基本计算、布尔运算、线性运算,非常方便操作。
构建线性模型分类的类似实验以前在python数值分析课上做过,步骤差不多,创建模型、开始训练、预测结果,要注意:每次反向传播前要把梯度置0。对于螺旋数据,线性模型难以准确分类,故而通过构建两层神经网络分类的方法,在两层之间加入了一个ReLU激活函数,实现准确分类。
视频心得:
作为入门学习,本课程让我对在图像处理、语音识别、自然语言处理等方面都有着自己的卓越贡献的深度学习有了初步的认识。
深度学习分为有监督学习方法(深度前馈神经网络、卷积神经网络等)和无监督学习方法(深度玻尔兹曼机、深度自编码器等),一般是指通过训练多层网络结构对未知数据进行分类或回归,它的基本思想是通过构建多层网络对目标进行多层表示,以此通过多层的高层次特征表示数据抽象语义信息,获取更多更优事物特征;
神经网络的计算主要有两种:前向传播与反向传播,二者区别在于前向传播是作用于每一层的输入,通过逐层计算得到输出结果;而反向传播是作用于网络的输出,通过计算梯度由深到浅更新网络参数;
由于反向传播算法是一个链式的连乘的形式,层数越深,梯度就趋向以指数形式传播,结果中的梯度消失等问题也逐渐明显,于是应用了预训练和微调、使用激活函数等算法进行解决;
同时为了解决问题,为了结果准确性,一起引入的有自编码器和波尔兹曼机。自编码器是为了使数据特征得到最大保留,其思想可以大致理解为使输出层尽量还原输入层,同时获取中间层降维结果。受限玻尔兹曼机则是为了最大程度保留概率分布,它是一大类的神经网络,其中使用最为广泛的是RBM。
问题总结:
1.除了介绍到的梯度消失等外还有什么是深度神经网络难以训练的原因吗?这些原因在算法升级后也能得到解决吗?
2.如何去选择合适的激活函数,需要考虑哪些因素?这些因素有优先级一说吗?
代码解读:
pytorch 基础练习:
了解了pytorch的基本操作,比如说用torch.Tensor定义不同的数据类型(整数、浮点数、一维数组、二维数组、多维数组等),用各种Function进行运算(矩阵大小、切片、矩阵变换),此外还有通过matplotlib.pyplot对于图形化界面的实现(hist生成直方图)。
螺旋数据分类:
1.初始化:下载绘图函数,引入基本的库,初始化随机数种子,设置样本属性,随机生成样本点,使之构成螺旋形,将每个样本的(x,y)坐标记录进X中,将类别号记录入Y,将X、Y都放到GPU上运行;
2.构建线性模型分类:创建线性模型并进行梯度下降优化,输入数据入模型进行训练,依照模型划分获得predicted结果,若predicted结果与对应Y中标签一致,那么说明预测正确,最后用预测正确数除以全部数量后获得到正确率(因为pytorch为了减少资源消耗需要进行梯度累加,所以在每次反向传播前手动将梯度清零);
3.构建两层神经网络分类:在构建模型时加入ReLU激活函数,优化和训练步骤与2中相同。
结果分析:在线性模型中,对于螺旋形数据的预测准确率最高只能达到50%,而增加激活函数后准确率达到了92.6%,足以说明线性函数在面对很多实际问题时并不能很好地解决也说明了增加激活函数的必要性和有效性。
第一个视频介绍了机器学习的原理以及深度学习的引入:
1.机器学习就是用算法解析数据,不断学习,对世界中发生的事做出判断和预测的一项技术。机器学习是模拟、延伸和扩展人的智能的一条路径,所以是人工智能的一个子集,同时机器学习需要基于大量数据。
2.深度学习在早期也被称为神经网络。深度学习是用于建立、模拟人脑进行分析学习的神经网络,并模仿人脑的机制来解释数据的一种机器学习技术。它的基本特点,是试图模仿大脑的神经元之间传递,处理信息的模式.
3.机器学习是由大量数据+专家知识驱动的特征设计+专家选择的分类器支持的,因此学习的结果可能会受到专家的主观因素影响以及专家的水平局限,而深度学习是由大量数据+专家选择深度模型+机器优化深度模型支持的,在数据较少的情况下深度学习表现不佳,学习的结果也会受到数据内容的影响而产生一些“机器偏见”等,因此深度学习也有很多局限性。
第二个视频主要讲解了深度学习的发展历史和主要内容:
1.早期的神经网络就够了多次的春天和冬天才发展成现在的深度学习:早期神经网络无法解决非线性问题,神经网络第一个成熟算法是线性感知器算法,该算法对线性问题解释性较好,但因为连非线性问题中最简单的“异或问题”都解决不了而迎来了神经网络的第一个冬天;而后神经网络使用了非线性函数,证明了神经网络的万有逼近定理,但此后又出现了支持向量机(SVM),在性能和解释性方面都强于神经网络;直到2010年左右,人们通过采用新的激励函数,逐渐克服了梯度消失或者发散问题,加之数据量和计算力的不断提高,深度学习迎来了蓬勃发展。
2.深度学习的主流模型包括卷积神经网络、受限玻尔兹曼机和深度置信网络、自动编码器等;深度模型的训练过程包括:(1)通过无监督学习对每一层网络进行初始化,并将其训练结果作为高一层网络的输入;(2)通过监督学习微调整个网络的参数;深度学习的应用主要是计算机视觉和语音识别方面。
1.深度学习是运用了神经网络的机器学习,即赋予计算机类似我们人脑“神经元”的部分,但为什么又在学习过程中与人的逻辑思维相差甚远?
2.对神经网络的算法不太能理解清楚。
1.pytorch基础练习主要是练习了一些PyTorch的基本语法,熟悉PyTorch库的一些函数。
2.螺旋数据分类:最开始直接构建线性模型分类可以看出,线性模型的准确率最高只能达到 50% 左右,对于这样复杂的一个数据分布,线性模型难以实现准确分类,在两层之间加入了一个 ReLU 激活函数后,分类的准确率得到了显著提高,由此体现神经网络激活函数的性能。
一、视频学习心得:
在第一个视频中,从人工智能到机器学习再到深度学习,进行了一个主要的简介,我学习到了大体的脉络过程,了解到机器学习是实现人工智能的一个最主要的方法,而深度学习是机器学习范畴中的一个部分;我学习到机器学习主要从模型,策略和算法这三个方面逐层推进,模型是对于问题的建模,确定假设空间,模型根据不同的分类标准又可以细分为很多种类的模型,适用于解决不同的问题。
在第二个视频中,对于深度学习进行了更加全面的了解,明白了深度学习的算法应该稳定,复杂度不易过高,要便于调试和纠错,层级的复合度不易过高,对于数据的依赖性不易过高,模型的增量性能要优秀。首先是浅层的神经网络,其中一个比较重要的点是激活函数,如果没有激活函数,则只能拟合线性函数。激活函数有很多种,有线性函数、斜面函数、阈值函数、符合函数、S性函数、双极S性函数、ReLU修正线性单元,Leaky ReLU等。还学习到了由单层感知器向多层感知器的发展,以及万有逼近定理,单隐层神经网络能以任意精度逼近任意预定的连续函数,双隐层感知器逼近非连续函数。而神经网络的每一层实际上是进行了空间的变换。以及学习到了随着层级的增多会出现梯度消失,我们可以利用梯度下降的方式来训练神经网络模型,误差回传并更新优化神经网络。
遇到的问题:对于神经网络的不同层对空间的改变以及如何通过梯度下降来训练神经模型这一方面还不是很理解。
二、代码练习:
1、首先是pytorch的基础练习,我根据老师发的博客的教学,学习了解了pytorch的基础操作,并将代码输入到colab,观察运行效果。
(1)第一个学习了如何用torch定义数据,使用torch.tensor定义了各种形式的数据,包括一个数、一维数组、二维数组、任意维度数组,学习到torch.tensor支持各种各样类型的数据。还学习了创建Tensor的多种方法,包括:ones(全1张量), zeros(全0张量), eye, arange, linspace, rand(随机张量), randn, normal, uniform, randperm等等。
(2)学习了如何用tensor进行一些运算,并学习到了tensor所包含的运算。
我在进行m @ v时出现了问题,查找原因发现是因为数据类型的不同导致不能进行@运算,我输出了m与v的dtype,发现m的dtype是torch.float32而v的dtype是torch.int64于是我使用torch.as_tensor的方法修改了v的dtype与m的相同后,运行成功。
2.第二个代码练习中,学习到了如何构建模型实现对数据的分类,如何训练模型,优化模型。对于数据的分类,首先构建了线性模型的分类,发现准确率只有百分之五十左右,然后是构建了两层神经网络分类,加入了激活函数ReLU,分类的结果较为准确,准确率显著提高,通过输入代码运行,我切实体会到了线性模型与两层神经网络对于数据分类之间的差别,两层神经网络不单单能够拟合线性函数,可以无限逼近非线性函数,神经网络的每一层实现空间的变换,达到更加准确的分类效果。