你挡我一时,挡不了我一世
前文链接:https://write-bug.com/article/2700.html
距离上次总结,已是两年前,两年前的总结只注重微观性,逻辑性不强。从大数据的采集、存储、数据预处理、计算(简单机器学习算法)、常用评判标准的一条龙项目架构做了概括。但每个知识点都是分散的,虽然介绍了单个框架的深入原理,用了入门级的代码实现功能,介绍使用方法。这些框架每一个都可以钻的很深,一不小心就会掉入漩涡,无法从足够的高度观察工程,浪费时间,徒增烦恼。
由上面的架构概括,可观察到其中的每一个步骤所产生的价值、业务,甚至可以说是选择一个方向作为兴趣发展为你的专长,在之前的推荐系统项目中,虽然是单机版,但已经很好的帮助串起整个项目的工程和业务,这对你以后做其中任何一个节点的深入专业,都是有好处的。推荐系统把我引入到了机器学习的大门,里面NLP/CV两个方向所实现的功能更让人叹为观止。
学习时,我们总有一种系统学习的思想,好像老师划分考试范围,超出这个知识树的范围都不是我要学习的,缺乏自主学习能力,有人把这个称之为学生思维,但其实生活中所有知识都是散碎的,时刻创新的,需要我们不断地去吸收、消化,再输出。循环往复。
从这里开始,将参考吴恩达视频从头介绍机器学习、深度学习,这次会尽可能简洁的写下每个步骤所产生的逻辑,用numpy、pandas、matlab、pytorch/tensflow、sklearn等学习库介绍并实现每个算法。
学习的难点在于,不是拥有这些学习算法,而是针对不同的问题如何恰当地使用不同的算法组合(解决方案)。
之前项目所用到的机器学习领域的应用属于数据挖掘案例,近年由于网络信息和自动化技术的爆炸性增长,意味着产生了史上最大的数据集。web用户点击数据(即用户行为数据)、电子医疗记录、DNA基因数据序列等等都可以通过数据挖掘来给予用户最好的服务。
而除此之外,还有更多有趣又简单的应用:无人驾驶、item分类、web搜索、手写识别等等,计算机语言处理NLP、计算机视觉CV也都应用了机器学习。
吴恩达视频中,有个有趣的押韵定义:
在无需具体的编程规则的条件下,给予计算机以学习的能力
假如对于邮件分类问题:T为邮件分类,E为观察用户是否标记垃圾邮件,P为正确归类邮件的比例。
主要分为两种类型的学习算法:监督学习、无监督学习。
简单地说:
监督学习算法时指我们将教计算机如何完成任务
无监督学习算法指我们打算让它自己学习
x:房子面积
y:房价
我们把收集到的真实房价数据映射在直角坐标系中:
假设我们手里有一个房子面积是750平方英尺,如何知道卖多少钱呢?
应用学习算法,在图中这组数据上拟合一条直线,或者曲线,此时我们可将面积直接代入一次或二次方程算出房价$200k。
此例子中的数据集,由“正确答案“组成,而我们想预测房子价格的问题被称为“回归问题”,即 试推测一系列连续值属性。
x:肿瘤大小
y:良性0/恶性1
同样映射入坐标系后,根据新数据的肿瘤大小预测是否为良性的问题。
以上两种数据描绘方式,第一种是根据肿瘤大小预测离散值的结果,第二种是根据肿瘤大小和患者年龄预测离散值的结果,这类问题被称为“分类问题”,即 试推测离散的输出值。
当然在机器学习问题中,肯定遇到不止一种特征的问题,比如患者的年龄(第二种描绘方式)、肿瘤密度、形状等都是决定良性与否的特征。此时我们就要找到一种算法,即使有无限多的特征都可以处理。比如支持向量机……
以上:
介绍了监督学习,即 根据真实样本数据做出预测
介绍了回归问题,即预测连续的输出
介绍了分类问题,即预测离散的输出
不同于监督学习,无监督学习的数据无任何标签,我们不知如何处理,只是一个数据集。
应用:Google新闻主题自动聚类(这里聚类只是无监督学习其中的一个算法),DNA微观数据聚类,用户市场分类、天文数据分析等。
宴会中有很多人,在房间内放置两个话筒录音,那么多人的声音就会重叠在一起,声音大小不同,音色不同。此时,就可通过无监督学习算法分离出不同人的声音。
以上,介绍了无监督学习,想象一下,如果没有这类算法,我们将制定大量的专业知识、规则、链接大量的java库等等对数据做处理,而这个只需要让机器自动学出规律。
第一个学习算法:线性回归算法。
下面将介绍一些术语和表达字母:
之前介绍的回归与分类例子,都有一个数据集称为训练集(Training Set),其中一条为训练样本
m:训练样本的数目,即训练集中实例的数量
x:特征/输入变量
y:目标变量/输出变量
(x,y):训练集中实例/一条训练样本
(x^i,y^i):第 i 个观察样本
h:学习算法的函数(解决方案),也称假设(hypothesis)
将训练集“喂”给学习算法得到函数h,将变量x输入h得到预测y。
问题1:我们如何由学习算法得到h?
假设我们的h(x) = θ0 +θ1x ,因为只有一个x特征/输入变量,所以叫单变量线性回归问题。
问题2:我们如何确定函数h(x)是否拟合Training Set?如何确定拟合时的θ参数?
假设 h(x)初始化参数θ0=0,θ1=0.5,如图所示。
初始化参数描绘出的图和训练集的拟合程度相差很大,即模型h(x)所预测的值与训练集中实际值之间的差距,即建模误差(modeling error)。
此时,我们的目标就是让预测更准确,也就是让建模误差的平方和最小时的模型参数。
即代价函数:
最小。
这里通过三维坐标θ0,θ1和J(θ0,θ1)绘制等高线图:
此时,可以在三维空间中找到一个最低点,就是最佳参数:θ0,θ1。
这个代价函数被称为平方误差代价函数,这个代价函数可解决大多数回归问题,作为常用手段使用。
通过以上两个问题和介绍:
介绍了机器学习算法的使用术语
了解了模型函数h
了解了平方误差代价函数
前面我们理解了代价函数是做什么的。接下来,我们将继续介绍目标:代价函数和如何自动使代价函数最小化θ参数的值。
不管是这里的二维空间表达的代价函数J,还是三维空间表达的等高线图,我们最后都需要他取最小值时的参数θ0,θ1 的值。
问题:如何找到一种有效的算法,可以自动求出代价函数J 的最小值呢?
梯度下降是一个用来求函数最小值的算法,可求出代价函数J(θ0,θ1)的最小值。
随机选取一个参数组合(θ0,θ1……θn),计算代价函数
再寻找下一组可以让代价函数值下降更多的参数组合
反复迭代到一个局部最小值(local minimum)
由于没有尝试所有的参数组合,所以不能确定得到的最小值是否是全局最小值(global minimum),选取不同的初始参数组合,就可找到不同的局部最小值。
想象站在山顶,在梯度下降算法中,我们需要观看周围360°,找出最快下山方向(θ偏导数),走出一小步(学习率),再次观察最佳方向,走出一小步,重复以上,直到你接近局部最低点位置,也就是你所在的位置可能是个坑。
批量梯度下降(batch gradient descent)公式:
(for j=0 & j=1)
α为学习率(learning rate),即走多大的步子。决定了我们沿着让代价函数下降程度最大的方向向下的步子有多大。
α太小,下降会很慢,需要迭代很多次才能到最低点
α太大,梯度下降法可能会越过最低点,甚至无法收敛,直至离最低点越来越远
是代价函数的偏导数,决定了向什么方向下山。
如果一开始θ1就初始化在局部最低点,意味着局部最优点的导数等于0,θ1不更新
当导数接近最低点时,导数值自动变小,所以移动幅度会自动变小,而在局部最低时导数等于0,或者直至移动幅度非常小时停止(可设阈值)。所以不需要额外减小a
问题1:
的含义是什么?
问题2:当我们谈论梯度下降时,意思时每次下降要更新所有参数,这里j取0和1,但对不同参数求导时,需要用到另外的参数,那么如何才能同时更新所有参数呢?
代码实现上,我们应先计算等式右边的公式,再同时更新参数θ。
以上,就是梯度下降的介绍,它可以用来最小化任何代价函数,不只是线性回归。
结合梯度下降法与平方代价函数,得出第一个学习算法:线性回归算法。
公式对比:
用于线性回归的梯度下降:
这种梯度下降算法,有时也成为批量梯度下降。
即每一步更新参数时,都需要对所有训练样本计算(求导求和),事实上,也有其它类型的梯度下降法不是批量型,不考虑整个训练集,只关注小的子集,以后介绍。
以上,就是此章节的内容。
关键词: 机器学习、术语、监督学习、无监督学习、回归、分类、单变量线性回归、代价函数、梯度下降
参考褚博士pytorch视频
链接:https://pan.baidu.com/s/1kxWaWik2UyvTYWnmXWEpqQ
提取码:gvyu
参考吴恩达机器学习视频
https://www.bilibili.com/video/BV164411S78V
其他的手撕代码后续更新
更新(代码地址):https://github.com/duhaichao/ML-code