文章目录
- 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
- Motivations
- Logistic Regression
- Decision Boundary
- Cost Function For Logistics Regression
- Gradient Descent Implementation
- Overfitting and Adressing Overfitting
- Regulation
本系列参考视频:吴恩达的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
多项式的回归问题,实际上的分析中,问题一般都不是简单的线性问题,我们在机器学习当中一般会采用这种定义多项式去模拟,但现在证明这个方式已经快要过时了,不太适合于深度学习,这边深度学习都采用多层的线性,这边也就先跳过,只给出相关的理解,至于梯度的计算就留给你们自己了。
Week3
Motivations
这一节主要讲解的是在classfication的情况下,线性回归的缺点,为之后提出逻辑回归做了一个开头(注意),逻辑回归虽然叫做回归,但是他是解决分类问题的。
加入我们拿线性回归问题来解决分类问题,我们的处理就是当其预测出来的值小于0.5,我们取到的是no这个类别,当预测出来的值是大于0.5,那我们就当作是yes这一类,当然预测的数值会大于1也会小于0。这样子会有一个什么样子的问题呢,比如我们加上左右边的一个×,那么新的回归线就会是那条绿线,我们会发现此时有两个×被纳入了no这个家族,也就是对于线性回归来说,完成分类问题易受到异常值的影响。
总结一下,线性回归完成分类的坏处:
- 值没有在0-1之间,(我们一般采取的是0为no,1为yes)
- 易受异常值的影响。
Logistic Regression
替代的我们采用逻辑回归来替代线性回归,首先,先看一下,采用了逻辑回归之后,我们的图像:
我们希望我们绘制的图像是这样子的,始终在0-1之间,这个时候比如我们输出的值为0.7,我们可以将之认为这个值对应的就是预测是yes的概率是70%,这样子也是极好的,我们这边采用了sigmoid函数进行缩放,这也就是logistic和线性的区别,多采用了一层sigmoid函数进行包裹。
具体的实现函数:
Decision Boundary
上面的三张图,实际上就是关于决策边界的理解,实际上告诉我们的是,面对多维度的点集,我们使用逻辑回归之后,想要训练出来的东西和线性回归的一样,仍然是对应的w和b的值,最后构成相关的的曲线,对于这些数据进行包围,然后分类就是,将这些w和b与对应的x相乘之后,得到一个值,求这个值和0的大小,进行的分类。
Cost Function For Logistics Regression
训练集的格式
仍然是多个特征x1到xn,最后我们想要输出的是一个y,y的取值只能是0或者1,和预测的时候不一样,预测可以小数,后面会经过一个softmax或者直接设置阈值。
回忆一下我们之前采用的Square error 那可以用在logistics上吗?可以用,但是效果很不好,原因就是y的值非连续,最后出来的效果就是绘制的J损失函数的图像会有很多的局部最低点(非凸函数)。
这导致训练的时候就很难去达到最好的效果。
而相同的我们采用一个新的损失函数来让这一切可以训练,从而得到使得损失函数最小的w和b。
简单一点的式子,由于y只能取0或者1,所以有下面的式子。
解释一下式子吧:
当y=1的时候,实际上就是当经过sigmoid函数输出后得到的值是大于0.5的那一部分,也就是上图的0.5-1之间的那一部分,在这一部分当中,在这一段区间中,我们分析当输出为1,loss为0 正确的,当输出不为1,loss随之变化,且变化幅度越过0.5之前都还能接受,所以这是一个好的函数,相同的我们可以看y=0的时候,这个分析就留给你们自己了,一样的分析方法,而且我们会发现这两部分是完全对称y=0.5的函数,也就是说loss没有偏向性,没有更倾向于让哪一边更小,这也是很好的特性。
最后绘制出来的图像就是如下,手绘有点丑陋,理解意思即可哈。
Gradient Descent Implementation
关于这一部分其实实际上就和之前的线性方程的梯度下降是一样的,这边就不细说了,只是加上了链式求导。
更新方法也是一样的。
Overfitting and Adressing Overfitting
这边介绍一下回归 和 分类的overfitting:
回归:
分类:
我们通过看上文的图像我们自然可以明白三种类型的区别:
对于underfit,就是还未拟合,和我们想要的曲线还有差距,这时我们的做法应该是继续训练,或者调整训练模型,而对于just right 就是训练的正好,而overfitting就是学到了太多的东西了,他对于训练集非常有效,但是对于测试,或者不是这个训练集的一部分内容的元素来说,这就非常的有问题,泛化能力太差了,我们可以看到方差太大了。
而如何解决overfitting问题这边会有三个角度提供给你:
-
收集更多的数据
可以看到当点更密集,他就更容易学到这样子的效果。 -
选择你认为的比较相关的特征,而非全部特征
选择个人认为比较有用的特征。 -
正则化
把高的w的级数通过正则化算法调小(先这么理解,后面会解释,因为正则化实际上惩罚了所有的参数)。
Regulation
正则化采用的方式很简单,就是在原本计算损失函数的末尾加上一个参数,这个参数和所有参数的w相关:
这是通过实践证明了的方法,他会更容易让高级参数更趋向于0,而非直接等于0,所以他是一个L2类型的正则化,它可以做到让高级参数变小,低级参数想对于高级变化不大,进而提供更好的泛化能力,下面通过数学的角度进行解释一下为什么会变化:
对于线性回归:
对于线性回归来说,我们进行变化之后可以看到,实际上他会在每一次迭代过程中都对于w进行一次微小的缩小就是那个shrink-wj,这就做到了会让高级参数逐渐趋向于0(个人推测可能是因为低级参数比较好进行改变,高级的比较难,没有依据,纯猜测)。
而相同的对于logistic也是这个道理,这边就省略不写。
而我们对于b是否要进行正则化呢,其实没有严格的规定,要也可以,不要也可以,区别很小,所以就不要啦。