文章目录
- Week1
- OverView
- Supervised Learning
- Unsupervised Learning
- Linear Regression Model
- Cost function
- Gradient Descent
- Week2
- Muliple Feature
- Vectorization
- Gradient Descent for Multiple Regression
- Feature Scaling
- Gradient Descent
- Feature Engineering
- Polynomial Regression
- Week3
本系列参考视频:吴恩达的machine-learing 可去coursera官网查看
链接
然后就是比较偏向的是个人笔记,具体就是个人的理解能力以及复盘能力有所差异,这边仅当做个参考,做个笔记式的学习。
这边有看到有别的up进行搬运,这边就也一并粘贴出来:
链接
Week1
OverView
首先对于前三节P1,P2,P3
个人觉得不甚重要,主要介绍的就是关于机器学习的工作,应用,等一系列用途。这比较平淡,就没什么重点。
而我总结一下就是:当你编程的时候,你并不知道如何去定义一个编程思想的时候,你所用的就可以是机器学习,比如说,你想编程一个程序,让这个程序可以识别猫或者狗,这对于你纯编程而言,你并不知道如何去做,因为一张图片实际上到编程中,就是一堆的数字,像素点构成,而你不知道他们之间满足什么条件,他们是猫,他们之间满足什么条件,他们是狗,这是非常难的,用传统的算法方法进行识别,但这用机器学习就可以做到,这就是机器学习。
Supervised Learning
什么是监督学习呢?
在他的ppt当中他是这么说的:
对于监督学习来说,他是有准确答案的,我们期望我们输入x,他就可以固定的输出这个y,而我们想要让机器学习的就是他们之间的这种mapping 映射关系,从而我们输入x,他能通过他学到的mapping关系进行映射出对应的y,替我们人类做出抉择。
而相同的对于监督学习来说,他一般是存在两种类型的任务:
- Regression
就比如说预测房价的这个例子,我们给出一堆的x,也就是已知数据,然后让机器去学习其中的规律,最后比如说得到一条拟合曲线,也就是图中的蓝色线,可能是直线,也可能是曲线,看机器如何去识别出以及人类的算法采用的模型二者相关产生的拟合的曲线,然后我们在训练之后,我们仅仅需要输入x,就能得到对应的预测y-hat。值得关注的是关于回归问题,一般回归的值是一个连续值。
2. Classification
而对于分类问题而言,一般我们是让他通过分类得到一个值,而这个值一般都是离散值,比如0,1,2这样子的,并且每一个sparse都对应代表一个类别,或者输出一个概率值。
而我们想要做到的事情就是,我们还是想要让其学习到两种分类的边界的线,让我们可以明确分类,注意这个和聚类问题的区别,这边的分类是固定选项的,我们希望将其分成我们所固定好的label。
小的总结:
对于监督学习,实际上就是学习的data是一个有明确答案的data,然后一般分为regression和classification两类,前者预测出来的是一个具体的number,后者则是categories。
Unsupervised Learning
无监督学习和监督学习相比之下最为重要的差别就是无监督学习她学习的是没有标签 也就是文中的unlabeled的数据,或者就是说只有输入x,但是没有一个准确的y。
而对于无监督学习来说,它比较常见的任务如下:
- clustering
聚类问题,用处一般挺多的,也是很流行的一种方式,他和分类问题其实很像,但是差别就是对于分类问题我们知道需要分成什么类,比如分成猫,分成狗,但是对于聚类来说,我们就不能知道到底需要分成什么类别,举个例子,我们希望根据网站用户的购买商品的情况,将用户划分成10类,在分类之前,我们并不知道这一类别的具体的属性,没办法做出label,也就无从训练,只能根据机器自己去学习,自己去分类。
- dimensionality reduction
降维 这边先不进行解释,之后特征工程处自然会懂得。 - anomaly detection
异常检测,这实际上和二分类也很像,也需要区分,区别实际上和聚类问题差不多,需要知道的关键的区别就是:在训练的时候的数据是否存在label,那么就有人说了,那我们没有标签,那如何去判断到底是不是有异常呢?比较经典的做法其实就是按分位值来进行判断,这个就等待后续的解释,这边先略,有兴趣也可以去查找一下。
Linear Regression Model
线性回归模型或者线性分类模型,实际上就是我们的一种算法,我们认为我们的数据之间满足一种正相关的简单关系,线性关系,(但事实上不可能这么简单的,方便理解),然后我们通过数据去不断调整y = wx + b中w和b的值,最后得到一个好的w和b的值。
而对于简单的线性回归模型来说,数据一般采用如下图右侧的表格进行展示(当然可能有更多个特征,但在这里先不进行讨论。)
我们的任务或者说我们的目标就是根据右侧的表格中的数据,最后得出这条拟合曲线。
而对于这张图的理解就是,实际上是为了引出目标函数(代价函数)的相关知识,这边先介绍一点,我们训练或者初始化出来的一条y=wx+b这条函数(直线),我们拿去带入x,预测对应的y,我们称这个y叫做y-hat(estimated估值),而我们所指的y就是对应x的真实值,taget或者真实的y。
Cost function
现在我们已经知道了y=wx+b,但对于w和b的值我们完全是随机出来的,或者我们仅能随手画出一条较为可能拟合的曲线,这样听起来很不机器,换句话来说就是我们缺少一个评价标准,这个评价标准来评价这条拟合曲线的好坏。
这就引出了cost function 这一个函数来评估曲线的好坏:
也就是上文中的J(也称作loss损失函数),m的作用是避免点越多损失越大,所以除掉样本总数,2是方便运算用的(之后求梯度方便),y-hat就是预测值,y就是准确值。
而我们做的所有的目标就是为了利用数据集data求取在数据集当中使J最小的w和b,如此之后,在我们输入x之后进行预测的y-hat实际上就会使最为准确的值。
Gradient Descent
现在的问题就是有了评价标准J,之后我们应该如何通过J这个评价函数(目标函数,损失函数)去反向更新w和b,让新的w和b会使得J这个函数更小呢?现在提出的梯度下降就是来解决这个问题的。
我们来看一个比较生活化的例子:
对于这个图来说他的高度代表的就是J,损失,他的x和y轴代表的就是参数w和b,那么假设我们初始化的w和b让我们站在一个较高的位置,也就是那个小人所站在的位置,那么此时我们该怎么下山呢?沿着梯度下降(梯度也就是沿着我们向四周360看一圈,沿着最陡的方向去走,这样子下山的速度是最快的)这也就是我们下山的策略,也是我们梯度下降的原理。
此时的公式自然就是:
对于右半部分的求偏导就是梯度的具体体现,alpha就是学习率。
而至于代码上的实现:
需要注意的是,我们代码上的实现需要做到w和b的同时更新,不能像右边的式子,w先更新完后,我们拿着更新之后的w去更新b,这虽然也有效果,但明显不是我们想要的,追求完美的我们肯定不会这么做,hh。
而对于梯度下降更为数学的理解:
当梯度>0的时候,w = w- alpha乘一个大于0的数,所以他向小走,自然更接近谷底,当他<0的时候相反,也是朝谷底走,最后自然会落到谷底。(而假设我们的alpha是固定的,那么他的下降你会发现他的梯度是越来越小的,到达最底梯度为0,也就是此时他也就停下脚步,这时候你就会发现此后不论怎么走,他都是w = w - alpha*0 也就是w=w 做到了真正的停下脚步),至于alpha我们可以这么认为,alpha就是用来控制w变化的速率的,跳的快或者慢,当很大的时候,他可能跳不到谷底,当很小的时候他可能动的太慢,效果太差,这就算一个超参数,需要人为的去调整,当然之后也会有一些别的方法去做到优化,这边不细说。
但是有时候我们会发现其实我们落到的是一个局部最低点,并不是全局最低点,梯度下降只能做到帮助我们落到局部最优,至于是不是全局最优不一定,这取决于初始化,当然后面也会有相关的方法去优化,这边也不细说,重点是关于局部最优的理解:
就比如上图中,我们落到了黄点处,但此时w = w - alpha*梯度 此时梯度已经为0了,所以w已经不动了,但是真实的最低点时左边的那个最低点,这实际上也就是梯度下降的一个问题所在,之后adam什么的方法也是重点在解决这个问题,先不用了解。
然后就是现在还要了解的一点就是batch
实际上机器学习是拿一个batch,一个batch的数据来进行训练的,并不是一个数据一个数据来进行的训练,因为如果一个数据一个数据来,这实际上就很可能会受到极端数据的影响。
Week2
Muliple Feature
实际上我们的生活中不可能存在仅有一个特征的东西,一般是多种特征来共同决定,在之前的例子当中我们y = w * x + b ,但现在我们需要进行修改一下,比如说之前的预测住房的价格的我们选取的只有和size相关,但实际上他和很多因素相关:
这也就是行向量 我们最后的price = 多个x共同决定
画成线性代数,用dot product(点乘)来表示的话就是如下:
而对于这种多x的线性模型我们称之为:multiple linear regression
Vectorization
使用numpy进行计算的话:实际上很简单,直接使用np.dot()接口即可
而这个相比于前面的计算,他完成了并行计算,他比正常的算法流程来得更快,具体的计算原理这边不细说,只需要关注的是,我们在深度学习,机器学习当中一般使用的都是类numpy的矩阵计算库,不论是torch还是tf的矩阵表示,这边的计算方式都是使用cpu或gpu的计算运算。
Gradient Descent for Multiple Regression
其实也很简单:
这边就放一张图,不细说,实际上和之前的算法一样的流程,只是多求导几轮。
Feature Scaling
这边其实可以参照我的相关的引申介绍:链接
特征缩放是为了做到在一些情况下多个特征,但是其值的差距过大引起的某些维度的更新过慢的情况。
简单举个例子:
还是对于之前的那个预测房价的例子,x1是面积,x2是bedrooms的数量,我们此时会发现在整个数据集当中,我们的每一次训练x1的值是非常的大的,x2的值则是相对非常的小的,这样子会变成什么情况呢?
首先我们知道对于w的更新首先也取决于x的值:
在某一个w更新的过快,某一个w更新的太慢,最后的效果见下:
实际上就会让较大的那一个在真实点疯狂抖动,这是很不利于梯度下降的。
于是就诞生了特征缩放这一个概念:
比较常用的特征缩放就是归一化(mean normalization/maxmin normalization)和标准化(z-score)
而这两种方法之下,其实最常用的还是下面的这个标准化,第一种方法将数据缩放到0-1之间但易受到异常点的影响,第二种方法则还好,他把数据缩放到-1到1之间。
而对于什么时候需要进行特征缩放,对于数据本身就已经在很小的范围内,我们没必要进行特征缩放,但当数据范围很大或者很小,或者数据本身就已经很大的时候对于数据进行缩放。
Gradient Descent
在多次的迭代中,j会随着迭代次数的增加会变得越来越小,接近稳定,这是非常理想的情况下,当我们调整学习率,或者初始化数据不同的时候一般会变成后面的图:
实际上就是J会不断变化或者就是变化的极慢,原因可能就是我们选择的alpha太大或者太小。
Feature Engineering
在正常情况下,我们采集的数据只有frontage和deepth,但是我们认为price取决于面积,于是我们可以自己产生一个size,作为x3,进行输入,这一部分其实比较取决于我们对于业务的理解,我们人类的经验。
有人此时会问,为什么frontage和depth不是已经存在吗,他俩不就能代表size?实际上确实可以,但是我们直接写一个size,实际上就是做到让他更好的去学习出size,而非让他自己猜出size,至于此时的frontage为什么存在,我们可以这么理解,此时我们考虑的就是单纯frontage对于price的增益效果。
Polynomial Regression
多项式的回归问题,实际上的分析中,问题一般都不是简单的线性问题,我们在机器学习当中一般会采用这种定义多项式去模拟,但现在证明这个方式已经快要过时了,不太适合于深度学习,这边深度学习都采用多层的线性,这边也就先跳过,只给出相关的理解,至于梯度的计算就留给你们自己了。