首页 > 代码库 > cs229 斯坦福机器学习笔记(一)

cs229 斯坦福机器学习笔记(一)

前言

说到机器学习,很多人推荐的学习资料就是斯坦福Andrew Ng的cs229,有相关的视频和讲义。不过好的资料 != 好入门的资料,Andrew Ng在coursera有另外一个机器学习课程,更适合入门。课程有video,review questions和programing exercises,视频虽然没有中文字幕,不过看演示的讲义还是很好理解的(如果当初大学里的课有这么好,我也不至于毕业后成为文盲。。)。最重要的就是里面的programing exercises,得理解透才完成得来的,毕竟不是简单点点鼠标的选择题。不过coursera的课程屏蔽很一些比较难的内容,如果觉得课程不够过瘾,可以再看看cs229的。这篇笔记主要是参照cs229的课程,但也会穿插coursera的一些内容。
接触完机器学习,会发现有两门课很重要,一个是概率统计,另外一个是线性代数。因为机器学习使用的数据,可以看成概率统计里的样本,而机器学习建模之后,你会发现剩下的就是线性代数求解问题。
至于学习资料,我推荐一本《机器学习实战》,能解决你对机器学习怎么落地的困惑。李航的《统计学习方法》可以当提纲参考,中国人写的书,适合填鸭式教学,我不是太喜欢这本。cs229除了lecture notes,还有session notes(简直是雪中送炭,夏天送风扇,lecture notes里那些让你觉得有必要再深入了解的点这里可以找到),和problem sets,资料也够多了。

线性回归 linear regression

  通过现实生活中的例子,可以帮助理解和体会线性回归。比如某日,某屌丝同事说买了房子,那一般大家关心的就是房子在哪,哪个小区,多少钱一平方这些信息,因为我们知道,这些信息是"关键信息”(机器学习里的黑话叫“feature”)。那假设现在要你来评估一套二手房的价格(或者更直接点,你就是一个卖房子的黑中介,嘿嘿),如果你对房价一无所知(比如说房子是在非洲),那你肯定估算不准,最好就能提供同小区其他房子的报价;没有的话,旁边小区也行;再没有的话,所在区的房子均价也行;还是没有的话,所在城市房子均价也行(在北京有套房和在余杭有套房能一样么),因为你知道,这些信息是有“参考价值”的。其次,估算的时候我们肯定希望提供的信息能尽量详细,因为我们知道房子的朝向,装修好坏,位置(靠近马路还是小区中心)是会影响房子价格的。
    其实我们人脑在估算的过程,就类似一个“机器学习”的过程。
a)首先我们需要“训练数据”,也就是相关的房价数据,当然,数据太少肯定不行,要尽量丰富。有了这些数据,人脑可以“学习”出房价的一个大体情况。因为我们知道同一小区的同一户型,一般价格是差不多的(特征相近,目标值-房价也是相近的,不然就没法预测了);房价我们一般按平方算,平方数和房价有“近似”线性的关系。
b)而“训练数据”里面要有啥信息?只给你房子照片肯定不行,肯定是要小区地点,房子大小等等这些关键“特征”
c)一般我们人肉估算的时候,比较随意,也就估个大概,不会算到小数点后几位;而估算的时候,我们会参照现有数据,不会让估算跟“训练数据”差得离谱(也就是下面要讲的让损失函数尽量小),不然还要“训练数据”干嘛。 计算机擅长处理数值计算,把房价估算问题完全可以用数学方法来做。把这里的“人肉估算”数学形式化,也就是“线性回归”。

1.我们定义线性回归函数(linear regression)为: 

然后用h(x) 来预测y

最简单的例子,一个特征size,y是Price,把训练数据画在图上,如下图。(举最简单的例子只是帮助理解,当特征只有一维的时候,画出来是一条直线,多维的时候就是超平面了)

这里有一个问题,如果真实模型不是线性的怎么办?所以套用线性回归的时候是需要预判的,不然训练出来的效果肯定不行。这里不必过于深究,后面也会介绍怎么通过预处理数据处理非线性的情况。

2.目标就是画一条直线尽量靠近这些点,用数学语言来描述就是cost function尽量小。
为什么是平方和? 直接相减取一下绝对值不行么, | h(x)-y |  ? (后面的Probabilistic interpretation会解释,这样求出来的是likelihood最大。另外一个问题, | h(x)-y |大的时候 ( h(x)-y )^2 不也是一样增大,看上去好像也一样?! 除了后者是凸函数,好求解,所以就用平方和? 不是的,单独一个样本纵向比较确实一样,但别漏了式子前面还有一个求和符号,这两者的差异体现在样本横向比较的时候,比如现在有两组差值,每组两个样本,第一组绝对值差是1,3,第二组是2,2,绝对值差求和是一样,4=4, 算平方差就不一样了,10 > 8。其实,x^2求导是2x,这里的意思就是惩罚随偏差值线性增大,最终的效果从图上看就是尽可能让直线靠近所有点)

3 然后就是怎么求解了。如果h(x)=y那就是初中时候的多元一次方程组了,现在不是,所以要用高端一点的方法。以前初中、高中课本也有提到怎么求解回归方程,都是按计算器,难怪我一点印象都没有,囧。。
notes 1里面介绍3种方法
1.gradient descent (梯度下降)
a.batch gradient descent
b.stochastic gradient descent (上面的变形)
2.the normal equations
3.Newton method(Fisher scoring)

1.gradient descent algorithm

α is called the learning rate.

只有一个训练数据的例子:


这个式子直观上也很好理解,假设xj是正数,y比预测值h(x)大的话,我们要加大θ,所以α前面是+号(当xj是负数同理)

举一个数据的例子只是帮助我们理解,实际中是会有多个数据的,你会体会到矩阵的便利性的。

上面的式子在具体更新的时候有小的不同
方法 a.batch gradient descent
注意,要同时进行更新。因为更新θ(j+1)的时候要用hθ(x),这里的hθ(x)用的还是老的θ1 到 θj。


直观上看,等高线代表cost function的值,横纵坐标是θ1 θ2两个参数,梯度下降就是每次一小步沿着垂直等高线的方向往等高线低(图的中心)的地方走。显然步子不能太大,不然容易扯着蛋(跨一大步之后反而到了更高的点)
方法 b.stochastic gradient descent (also incremental gradient descent) 

这两种方法看公式可能不好理解,看后面的代码实现就容易区分。

2.the normal equations。

初学者可以先跳过推导过程(不是鼓励不看。),直接先记住结论。(在线性代数的复习课件cs229-linalg会说明,这个式子其实是把y投影到X)

3.牛顿法

Another algorithm for maximizing ?(θ)
Returning to logistic regression with g(z) being the sigmoid function, lets now talk about a different algorithm for minimizing -?(θ)。(感觉notes1里面少了个负号)
牛顿法求函数0点,即 f (Θ) = 0

这样迭代就行,f′(θ)是斜率,从图上看,就是“用三角形去拟合曲线,找0点”


因为我们是要求导数等于0,把上面的式子替换一下f(θ) = ?′(θ)
θ是多维的,有
where 
When Newton’s method is applied to maximize the logistic regression log likelihood function ?(θ), the resulting method is also called Fisher scoring.

coursera的课件提到其他方法,估计初学者没空深究,了解一下有这些东西就好。


逻辑回归logistic regression

现在如果有一个0和1的2分类问题的,套进去线性回归去解,如下图

离群点会对结果影响很大,比如上图(我们以h(x)>0.5时预测y=1,一个离群点让直线大旋转,一下子把不少点误分类了)(coursera的课程只提到这个原因,但貌似不止),而且还有一个问题,Intuitively, it also doesn’t make sense for h(x) to take values larger than 1 or smaller than 0 when we know that y ∈ {0, 1}. (那h(x)在[0,1]又代表什么呢?呵呵)
换成这个曲线就好多了,这个函数是sigmoid function
g(z) 值域 (0,1)

把线性回归套进去g(z)就是

为什么是sigmoid函数?换个形状类似的函数不行么?这个后面一样有概率解释的。注意,这个函数输出值代表“y为1的概率”,再回过头看看,前面y用1和0来表示正反也是有讲究的(讲svn的时候又换成+1,-1),直观上看sigmoid越接近1表示1的概率大,接近0表示0的概率大,还有一个好处就是下面算likelihood的时候用式子好表示。

建模好,还缺一个cost function,是不是跟linear regression一样求平方差就行?
 呵呵,不是,coursera课程给出的原因是套入sigmoid后,这个函数不是凸函数,不好求解了。但其实h(x) -y 算出来是一个概率,多个训练数据的概率相加是没意义的,得相乘。p(x,y) = p(x)* p(y)。

先讲一个useful property
推导公式时可以用,习题也会用到的


把两个概率公式合到一起
=> 
likelihood of the parameters:
log likelihood:
 
一个训练数据的时候(代入前面的结论)

注意,前面linear regression,我们求cost function的最小值,所以是减号
对于logistic regression,我们要求的是likelihood最大(附录提到,是等价的),所以要换成加号。这样θ最终的迭代式子才跟前面linear regression一样,这是巧合么?隐隐约约感觉这其中有一腿。

machine learning in practice

我总觉得计算机科学动手实践很重要,纸上谈兵不接地气。coursera有programing exercise,必须完成下。octave用起来挺爽的。这里记录一下关键点。

1.coursera的cost function多除了一个m

其实起到一个归一化的作用,让迭代步长α与训练样本数无关(你可以当作α=α‘/m)

2.batch gradient descent和stochastic gradient descent的差别

batch gradient descent
for iter = 1:num_iters
 A = ( X * theta - y )';
 theta = theta - 1/m * alpha * ( A * X )';
end

stochastic gradient descent
for iter = 1:num_iters
 A = ( X * theta - y )';
 for j = 1:m
   theta = theta - alpha * ( A(1, j) * X(j, :) )';    
 end
end

用ex1_multi.m改改,生成两个cost下降图,可以发现stochastic gradient descent挺犀利的。。

3.feature scaling的作用是啥?

(具体模型具体分析,这里只针对LR模型,不要把结论随意推广)coursera提到的作用是加速收敛,那会影响结果么?直觉上,把一个feature扩大10倍,那算cost function的时候岂不是很占便宜,算出来的权重会偏向这个feature么?
对这种问题,数学家会理论证明,工程师做实验验证,我习惯粗略证明,然后实验验证自己对不对。
(下面都是粗略的想法,不是严谨证明!!)假设每个样本的feature j 乘以10,那算出来的θj除以10不就结果跟原来一样了?我猜不会影响。看一下我们迭代时候的式子
xj变大,h(x) 也变大,粗略迭代步长要扩大10倍(那就起到抑制θ的作用)但最终的θ要变为1/10,想想略蛋疼,比如现在100每次减少1,减99次后变为1,现在每次要减少10,却要让最终的结果到0.1,得改α才行啊,看来feature scaling能起到归一化α的作用。
把ex1.m改一下,做做实验。会发现缩放一个feature后,收敛很困难啊,我只乘以2,原来的代码就输出NaN了。。我把alpha平方一下 alpha^2。
可以发现等高线变密集了,椭圆形变得很扁,所以步长不能很大,收敛很困难,一直在一个类似直线的椭圆跳来跳去慢慢挪。至于结果会不会变,用normal equation来验证,因为梯度下降有困难。改下ex1_muliti.m
X2 = X;
X2(:,2) = X2(:, 2)* 2;
theta2 = pinv(X2' * X2) * X2' * y;
theta2
theta

theta2(2)就是神奇地变1/2了。。
theta2 =
  8.9598e+004
  6.9605e+001
  -8.7380e+003
theta =
  8.9598e+004
  1.3921e+002
  -8.7380e+003

前面是linear regression,对logistic regression可以改ex2.m也验证下
X2(:,2)= X2(:,2)*2;
[theta2, cost] = fminunc(@(t)(costFunction(t, X2, y)), initial_theta, options);
theta2
theta:
 -25.161272
 0.206233
 0.201470
theta2 =
  -25.16127
    0.10312
    0.20147

附录

cost function的概率解释

我们知道h(x)和真实的y是有偏差的,设偏差是ε

假设ε是iid(独立同分布)的,符合高斯分布(通常高斯分布是合理的,具体不解释),联想到高斯分布的式子,有平方就不奇怪了。

 
得到
likelihood function:


求解技巧,转成 log likelihood ?(θ)(这个是个非常基础的技巧,后面会大量用到):


 

To summarize: Under the previous probabilistic assumptions on the data,
least-squares regression corresponds to finding the maximum likelihood estimate of θ.