机器学习 学习记录
我将用三篇文章分别阐述以下三个方面
1. Linear Regression
2. Logistic Regression
3. Deep Learning
在具体阐述各个方面之前,我们先要明确一个基本问题:What is machine learning?
其实机器学习的概念在很早之前就被提出,在近几年再一次火了起来。本质上来说机器学习无非就是让计算机从你的输入中提取出来你想要的结果。比如,我想要一个身高和体重之间的关系模型,然后利用这个模型对某些数据进行预测(给一个人身高就能输出可能的体重)。为了得到这个模型,我需要事先收集一些数据,利用这些数据对机器进行训练,让机器找到一个最好的模型。
到这里,机器学习的概念大致就讲清楚了。那么问题又来了:How to make machine learn by itself ?
通过上面的阐述,你其实也能了解机器学习并不是完全靠着机器自己去学习,事先我们要给机器明确学习的方法,以及学习的具体内容。
所以在这里要引出机器学习的一般步骤(我们要做那些事情):
1.Model :我们首先需要给机器设定一个模型。模型在本质上就是一个函数集合。机器要做的就是在这个庞大的函数集合里寻找一个合适的函数使得输入数据通过这个函数之后能够得到尽量符合需求的输出
2.Goodness of Model:这一步,我们需要设定一个方法,让机器能够利用这个方法寻找那个我们想要的函数
3.Find the best Function:找一个最优秀的函数
下面介绍的就是具体内容啦
1.Linear Regression
继续上面举过的例子,我现在希望机器帮我找到人的身高和体重的关系。在这之前我做了个调研(假装做了),得到了以下数据:
Height {x:[140,165,170,175,172,171,180,103]}
Weight {y:[40,45,56,65,66,59,81,30]}
上面的数据好像是有一定的线性关系的(这里应该有图)
所以我们建的模型应该是线性的:y=w*x+b,那么机器学习的第一步我们就做完了,这一步就是给机器限定了一个函数集合,机器只能从这个函数集合里面去找一个合适的函数。
那第二步就是找一个方法,让机器能够按照这个方法去找一个最合适的函数
我们定义了一个Loss Function用来衡量误差
显然,我们希望这个误差越小越好,误差越小,所拟合出来的函数就越能反映出我们所输入训练数据之间的线性关系。
所以现在的问题就变成了,找这样一组 w 和
Gradient Descent:
对于上面的Loss Function ,我们可以把它看作为关于
w,b
的二元函数,于是这个问题就转化成了如何去求解二元函数的最小值点问题。数学分析告诉我们可以通过求偏导的方法找到极值点,即:
我们看下面的图
![]()
图片引用自李宏毅(台湾大学)《机器学习》
这张图是在一维函数上去考虑的。事先我们是不知道极值点到底在哪的,于是我们随机设定了一个点
w0
,求这个点的导数,如果导数大于零,说明极小值点在这个点的左边,导函数小于零说明极小值点在这个点的右边。接着我们更新这个点的坐标,当导函数小于零时,增大坐标,大于零时减小坐标。这样随着操作次数的增加,总是能找到一个导函数为零的点,这时候这个点就是我们所说的极小值点。数学上的表达如下:
如果是二元函数,表达如下:
这里的 η 称作learning rate,我们可以通过调整learning rate来调节我们的学习结果和学习速度。另外,有可能我们哪天碰到的模型不是和x有关系,而是和 x2,x3,... 等有关怎么办呢?答案是调整模型,就是增加特征。将模型调整成 y=w1⋅x+w2⋅x2+⋯+b ( y=w1⋅x1+w2⋅x2+⋯+b )。关于如何根据variance,bias去调整模型以及如何调整learning rate这里不做赘述,请有兴趣的读者自行参考相关资料。
这时候需要注意以下两个问题:
1.Gradient Descent所找到的点并不一定是最小值点,比如下面图片中第三个球球所表示的点就不是极小值点(这个点导函数为0但不是极值点),第四个球球所表示的点也不是最小值点,因为它仅是一个极小值点,但在整个定义域上去看的话,它不是最值点
2.Gradient Descent并不总能找到导数为0的点,比如下面图片第二个球球所表示的点,如果这个时候导函数非常非常小,你的learning rate又设的比较小,这个时候每次参数更新的速度就比较低。导致卡住,可能你的程序循环都结束了,也没能找到导数为0的点
在这里附上Regression的小demo
下面我们将以二元函数为例从数学角度去探讨一下Gradient Descent方法的正确性
上面的这个图描述了一个二元函数
f(θ1,θ2)
的图像(等高线画法)
为了求得这个函数的最小值点,我们先在图像上任意找得一点
θ0
(这里的上标用来表示点的序号,下同),在
θ0
的邻域内找一该邻域函数值最小的点
θ1
,然后在
θ1
的邻域内找一个该邻域函数值最小的点
θ2
,以此类推便能找得到函数的最小值点。我们从
θ0
开始看。那么你肯定会问,如何去找
θ0
邻域内的最小值点呢?这时,我就要祭出大学所学最恐怖的公式——泰勒公式。对二元函数,泰勒公式的展开如下:
拉格朗日余项有点忘了,等我想起来再补上QAQ
由于余项是关于 (θ1−θ01)和 (θ2−θ02) 的高阶无穷小,忽略掉。
从上式可以看出 f(θ1,θ2) 的大小会随着 ∂f(θ01,θ02)∂θ1(θ1−θ01)+∂f(θ01,θ02)∂θ2(θ2−θ02) 的变化而变化,而 ∂f(θ01,θ02)∂θ1(θ1−θ01)+∂f(θ01,θ02)∂θ2(θ2−θ02) 的大小可以看作向量 θ0→=⎡⎣⎢∂f(θ01,θ02)∂θ1∂f(θ01,θ02)∂θ2⎤⎦⎥ 与向量 α⃗ =[θ1−θ01θ2−θ02] 的内积。
我们要做的就是求解这个内积的最小值。我们知道两个向量做内积,当两个向量反向的时候内积最小。所以应该使 α⃗ =−η⋅θ0→ ,亦即:
这不就是我们所说的Gradient Descent方法的最终表达式吗?
所以到这里我们就验证了Gradient Descent方法在数学上的正确性