9月份比较系统的看了李宏毅教授的Machine Learning课程,这个月开始就没太多看ML,DL的东西。下周有一个deep learning project的due,借着机会重新理一下。
下面按照之前笔记加上自己的理解做个梳理
要是发现我理解错了记得告诉我鸭

Lecture0: 机器学习介绍

Machine Learning = Looking for a function, 对于一些复杂现象,当人们靠自己找不到一些规律的时候,用机器学习可以找到事物见那个复杂的方程。在很多领域都有应用。

比如:
语音识别:人们不是对于所有的声音都能给一个确定的tag。
股票:基于过往数据,可以做出来一条回归曲线进行预料。

机器学习基本分3步:

  1. define a set of function 找规律
  2. goodness of functon 规律的好坏
  3. pick the best function 在一堆候选规律里找到最好的那个

Lecture1: Regression

这章是神经网络的基础
很多章内容都用精灵宝可梦的例子来加以解释。这是个非常好的例子,因为pokemon有很多可视化属性,比如cp值,属性,战斗力等。本章目的是想根据一只宝可梦的属性得到它进化后的cp值来决定是否要花精灵球来抓这只pokemon。
Machine Learning 梳理总结 L0~L6首先给一个input: 一只宝可梦的相关信息X(Xcp,Xs,Xhp,Xw)X(X_{cp},X_s,X_{hp},X_w)
output: 我们想要得到进化后的cp值。

step1: define a set of function
根据case选择不同的function,对于这个case,我们只需要知道现有的XcpX_{cp}去预测进化后的XcpX_{cp},这样就是个简单的线性问题。只需要y=aX+b的简单线性方程即可。so… 代入了几组输入之后,如下:
Machine Learning 梳理总结 L0~L6
每一个pokemon都有一个自己的function,自己的参数,我们需要找到是一个可以让每个pokemon都能预测的大model。
Linear model
通式可写成:y=b+Σωixiy=b+\Sigma\omega _ix_i
xix_i: 输入者x的各种属性,一般是一个向量或者矩阵。
wiw_i: weight,权重,后面会有说。
bb: bias, 偏差。

step2: goodness of function
怎样从上述function set中找到好的呢?
我们将本来的值减去预测的值,之间的差值越小说明函数越好。
定义一个新的function:loss function,损失函数。
Input: a function
Output: how bad it is
L(f)=L(ω,b)=n=110(y^n(b+ωxcpn))2L(f)=L(\omega,b)=\sum_{n=1}^{10} (\hat y^n -(b+\omega \cdot x_{cp}^n))^2

step3: Best function
找到让L(f)L(f)最小的function就是最好的:
f=argminL(f)=argminn=110(y^n(b+ωxcpn))2f^* = argminL(f)=argmin \sum_{n=1}^{10} (\hat y^n -(b+\omega \cdot x_{cp}^n))^2
这个例子的function 很简单,用二元次方程就可解,但是现实中,有几百个参数,loss function是几百元的,怎么解?

引出Gradient Descent,只要LL可以微分,都可以用这个解。假设只有一个参数ω\omega,如何求gradient descent?
1.随机选取一个初始的点ω0\omega^0
2.计算dLdωω=ω0\frac{dL}{d\omega}|_{\omega = \omega ^{0}},在这就是算切斜率的意思,如果值为负数->increase ω\omega;如果为正数->decrease ω\omega
走这一步是走多远呢?step size取决于两件事:
第一件事,微分值dLdω\frac{dL}{d\omega}有多大,微分值越大走的越多。
第二件事,添加一个常数项η\eta, “learning rate”:w0ηdLdωω=ω0w^0- \eta \frac{dL}{d\omega}|_{\omega=\omega^0}—>ω1\omega^1
3.计算dLdωω=ω1\frac{dL}{d\omega}|_{\omega = \omega ^1},并且接着更新ω2\omega^2
就这样一直移动直到local optimal发现dLdω\frac{dL}{d\omega}为0,说明是个局部最小值了。
Machine Learning 梳理总结 L0~L6
推广到两个参数,也是一样的解法,只是loss function从一条曲线变成了一个曲面,再多一个参数,立方体?上述问题遇到了local optimal的问题,但是其实没关系,因为在线性回归里面,loss function一直是convex的。
Results!!
我们算出了最佳解b,ωb,\omega之后带入y=b+ωxcpy=b+\omega \cdot x_{cp}。但是发现在test data上面做的测试结果(Generalization)并不是很好呀,error>average error on training data。怎么办呢?
这种问题在现实中很多,选模型没有选好。
1.因为不只是xcpx_{cp}会影响之后的cp值,属性等都会影响!
2.其次预测值和现在的值不是一元线性关系,是2次方呢?
so…
redesign the model
1.把原来的一次方程换成底下这个:
y=b+ω1xcp+ω2xcp2y = b + \omega_1 \cdot x_{cp}+\omega_{2}\cdot{x_{cp}}^2
最后发现training data 的error越来越低, 但是testing data在次方高的时候反而又升高了!很气,这就是过拟合overfitting现象。
**Overfitting:**越复杂的model,可能testing 上的效果就更差。

2.把新发现的factor加进去比如,物种的影响。
重新设计了一个model:
Machine Learning 梳理总结 L0~L6
当物种不同的时候,会有不同的结果。但发现最后还是overfitting了。
这时候又需要一招:正则化!

Regularization正则化:
y=b+Σωixiy=b+\Sigma\omega_{i}x_{i}
L(f)=n(y^n(b+ωxcpn))2+λΣωi2L(f)=\sum_{n}(\hat y^n -(b+\omega \cdot x_{cp}^n))^2+\lambda\Sigma{\omega_{i}}^2
对于这个问题,我是从结果倒退着想的。

首先,现实生活中,不止是光有ω1\omega_1,ω2\omega_2等, 是有几百个ω\omega的,需要知道我们想要的结果,其实并不是那个物件本身的所有信息我们都需要知道。比如我想预测一个学生下次考试成绩,我需要上次成绩,智商,平时表现等,我不需要这位学生的性别。所以就要有意的去剔除一些feature,但是人为剔除低效。就需要机器自己找这个feature是不是我们要的,如果这个feature其实不是很重要, feature对应的那个x前面ω\omega就可以很小,这样是变相剔除了这个参数的影响。

既然我们需要ω\omega非常小,那此项λΣωi2\lambda\Sigma{\omega_{i}}^2就可以理解了,λ\lambda越大,说明第二项越大,希望剔除的比重就越大。直到loss function处理到我们想要的那个点,ω\omega也就被处理过了。

Lecture2: Where does the error come from?

从training data, 我们得到了ff^*, ff^*f^(real)\hat{f}(real)的estimator。
error来自bias和variance,可以这么理解(正好和我的参数估计对上了)。

bias:假设有一变量X, mean:μ\mu, variance:σ2\sigma^2, 取其中的n个点{x1,x2,...,xnx^1, x^2, ..., x^n}, m=1Nnxnm=\frac{1}{N}\sum_{n}x^n不等于μ\mu,但是E[m]=E[1Nnxn]E[m]=E[\frac{1}{N}\sum_{n}x^n],所以用m来预测就是有偏差的。(相当于打靶时,打了好几下,都是偏某一个方位的)
改进方式:Add more features as input; A more complex model

variance: 代表每次预测都离正确的点有多分散,方差的感觉。(相当于打靶时,对准了准心,但是都很分散)
改进方式: More data; Regularization(会让曲线变得平滑),但是可能会伤害到bias。

Lecture3: Gradient Descent

此章节主要说的是处理梯度下降的一些tips
tip1.turning your learning rates
在调节learning rate的时候要非常小心,过大过小都不行,如图。
Machine Learning 梳理总结 L0~L6
Adaptive Learning Rates可以自动的调节步伐,没走几步就改一下learning rate,一开始离重点远,用大的步伐,越离越近就用小的。
eg. 加上时间这个参数: 1/t dacay = ηt\eta^t=tt+1\frac{t}{\sqrt{t+1}}

Adagrad:自适应梯度算法(每个参数都有自己的learning rate)
ωt+1\omega^{t+1}<—ωtηtσtgt\omega^t-\frac{\eta^t}{\sigma^t}g^t,σt\sigma^t is root mean square of the previous derivatives of parameter ω\omega. 这样既有关于时间的参数,也有关于ω\omega的参数。
最终推导的式子为:

ωt+1\omega^{t+1}<—ωtηi=0t(gi)2gt\omega^t-\frac{\eta}{\sqrt{\sum_{i=0}^t(g_i)^2}}g^t
更新项:分子η\eta随着时间变大而变大,分子i=0t(gi)2\sqrt{\sum_{i=0}^t(g_i)^2}随着叠加也会越来越大。在此处发现有点矛盾?怎么会分子分母同时增大,这目的是啥?其实是为了有一个反差,我具体数学推导证明不会,只是心里有一点概念。
tip2: stochastic gradient descent 随机梯度下降:
正常的gradient descent是L(f)=n(y^n(b+ωxcpn))2L(f)=\sum_{n}(\hat y^n -(b+\omega \cdot x_{cp}^n))^2,是先选取一个ω\omega然后对整个loss function做求导,再加和。每进行一次,要整体遍历,是计算量非常大的。但我经验来看,对于线性回归类的问题,正常梯度下降表现还是可以的。

现在推荐的这一款,叫随机梯度下降:
L(f)n=n(y^n(b+ωxcpn))L(f)^n=\sum_{n}(\hat y^n -(b+\omega \cdot x_{cp}^n))
先随机选取一个ω\omega,然后每次只选取一个点进行移动,这样比上面的要快很多。但是缺点是由于是只选取一个点,波动经常就很大。经验来看比较适合二分类的问题。

tip3: feature scaling特征缩放
Machine Learning 梳理总结 L0~L6
有些输入的参数,之间不是非常匹配,这种时候就要进行缩放,比如像normalize的一些处理。比如,输入进来一堆设备的参数信息,有寿命,耐久,电压等。发现电压数远远大于另外几个参数,这时候就对电压进行feature 缩减。

Lecture4: Classification

上述的例子都是线性回归问题,输入若干个参数,得到的也是一个数值。现在有另外一种问题,还是用pokemon来举例子:
我想给pokemon分类,怎么分?
希望input一只皮卡丘(若干参数)得到output电类生气宝贝。

试试看regression的方法,0为分界,如果output>1,就是皮卡丘;output<1,就不是皮卡丘。看下结果:
Machine Learning 梳理总结 L0~L6
可以看到,左边的绿线是很完美的。但是如果数据像右边的图,分界线就是紫线,分割的就是错的。我个人理解下,线性回归是根据一些数据拟合出一条曲线,能解决的问题,得是output和input的值密切相关的,output之间也是有点联系的。这个例子output是人为的给定了数值,class之前没有关系。

Naive Bayesian Model 贝叶斯模型
现在用概率的知识去考虑这个问题
Machine Learning 梳理总结 L0~L6现在有两个盒子Box1,2和blue,green的点。现在已知每个盒子出green,blue点的概率。现在给你一个blue的点,用贝叶斯定理可以求出它从蓝盒子和绿盒子出来的概率。

把这个想法对应到pokemon上,P(C1),P(C2)P(C_1), P(C_2)对应的是出水,电,光系等神奇宝贝的概率。xx是这些pokemon的属性,P(xC1)P(x|C_1)代表了xx属性出现在c1c_1类的概率,P(xC2)P(x|C_2)同理。用这个想法可以解决一些分类问题了
Machine Learning 梳理总结 L0~L6
现在一个一个来求,首先分子上的P(C1)P(C_1)很好求,意思是某个系的神奇宝贝会出现的概率,是可以现实提取到的。
P(xC1)P(x|C_1)指的是c1c_1类别里,有这些feature的概率。

现在假设每个pokemon都有两个feature,所以是可以在二维平面画出来的。
Machine Learning 梳理总结 L0~L6
图上的每一个点都代表一只pokemon,我们需要做的是根据这些已经被标注的点推出一个分布公式,再用它预测别的点。现在假设这79个水系点都是从一个Gaussian的distribution里sample出来的。
Machine Learning 梳理总结 L0~L6
input是x,相当于一只pokemon的参数,输出为这个点的概率。这个function的形状由μ\mu和covariance matrix的Σ\Sigma决定的,也就是说要用这79个点来找到μ\muΣ\Sigma

如何找到?
Maximum Likelihood
有很多组的μ\muΣ\Sigma可以拟合出这79个点,但是怎么判断好坏呢?因为已经确定这79个点是水系的了,所以能让这些点出来的概率最大的μ\muΣ\Sigma才是好的。

Likelihood of a Gaussian with mean ? and covariance matrix ?
Different Likelihood= the probability of the Gaussian samples x1,x2,x3,...,x79x^1,x^2,x^3,...,x^{79}

L(μ,Σ)=fμΣ(x1)fμΣ(x2)fμΣ(x3).......fμΣ(x79)L(\mu^*,\Sigma^*)=f_{\mu\Sigma}(x^1)f_{\mu\Sigma}(x^2)f_{\mu\Sigma}(x^3).......f_{\mu\Sigma}(x^{79})
只要求出哪个μ\muΣ\Sigma能让L(μ,Σ)L(\mu,\Sigma)最大,就是最好的μ\muΣ\Sigma。这就是数学问题了。

接下来可以分类了
P(C1x)=P(xC1)P(C1)P(xC1)P(C1)+P(xC2)P(C2)P(C_1|x)=\frac{P(x|C_1)P(C_1)}{P(x|C_1)P(C_1)+P(x|C_2)P(C_2)}

将之前算好的P(xC1)P(x|C_1)带入分子,分母也是一样的算法。
If P(C1x)&gt;0.5P(C_1|x)&gt;0.5–> x belongs to class1
If P(C1x)&lt;0.5P(C_1|x)&lt;0.5–> x belongs to other class
但是这样做会发现结果其实并不是很好。

改进?Modifying Model
每个class都有自己的μ1,Σ1\mu^1,\Sigma^1μ2,Σ2\mu^2,\Sigma^2,这样当input feature size很大的时候,Σ\Sigma增长的是非常快的,所以需要减小参数,不同的class可以share同一个Σ\Sigma

naive bayes classifier适合不同dimension之间独立,如果dimendion之间有联系,那么bias就大了。

Lecture5: Logistic Regression

紧接着上节内容,发现了一个有趣的现象,我们转换一下bayes function:
Machine Learning 梳理总结 L0~L6
紧接着,我们对z=lnP(xC1)P(C1)P(xC2)P(C2)z=ln\frac{P(x|C_1)P(C_1)}{P(x|C_2)P(C_2)}进行各种数学操作(注意要shareΣ\Sigma),此处省略,得到:
Machine Learning 梳理总结 L0~L6也就是说P(C1x)=σ(z)=σ(ωx+b)P(C_1|x)=\sigma(z)=\sigma(\omega x +b)
其实这就是一个nerual的原型了!
Machine Learning 梳理总结 L0~L6
用这个模型我们再来按照步骤来一次
step1: Function set
fω,b(x)=Pω,b(C1x)=σ(z)=σ(ωx+b)f_{\omega,b}(x)=P_{\omega,b}(C_1|x)=\sigma(z)=\sigma(\omega x +b)
step2: Goodness of a function
Training Data:
Machine Learning 梳理总结 L0~L6
假设这些data从fω,b(x)=Pω,b(C1x)f_{\omega,b}(x)=P_{\omega,b}(C_1|x)出来的,怎样找到好的ω,b\omega^* ,b^*呢?可以让L(ω,b)L(\omega,b)最大的ω,b\omega^* ,b^*就是我们要的。Machine Learning 梳理总结 L0~L6
蓝色线条为交叉熵,反应了两个分布的相似程度,要让他越小越好,证明测试出来的和real的越贴近。

理解:为什么不用线性回归里的平方误差函数了?
因为这个分类的例子用平方误差函数,将不再是convex函数,一扭一扭的,local optimal非常的多。
而cross entropy其实是个分段函数,y=0和y=1时一个递增一个递减,这样结合起来,是一个凸函数,并且非常符合一元二次的样子。
step3: find the best function
InL(ω,b)=Σn[y^Infω,b(xn)+(1y^n)In(1fω,b(xn))]=Σn(y^nfω,b(xn))xin-InL_{(\omega,b)}=\Sigma_{n}[\hat{y}Inf_{\omega,b}(x^n)+(1-\hat{y}^n)In(1-f_{\omega,b}(x^n))]=\Sigma_{n}-(\hat{y}^n-f_{\omega,b}(x^n)){x_i}^n
ωi\omega_i<—ωiΣn(y^nfω,b(xn))xin\omega_i -\Sigma_{n}-(\hat{y}^n-f_{\omega,b}(x^n)){x_i}^n,Larger difference, lager update step, 直到求到最小值。
Machine Learning 梳理总结 L0~L6
**Discriminative V.S Generative **
Discrimninate:判别模型
判别模型估计的是条件概率分布(conditional distribution),P(yx)P(y|x),是给定观测变量x和目标变量y的条件模型。由数据直接学习决策函数y=f(x)y=f(x)或者条件概率分布P(yx)P(y|x)作为预测的模型。判别方法关心的是对于给定的输入XX,应该预测什么样的输出YY

Generative: 生成模型
生成模型估计的是联合概率分布(joint probability distribution),P(y,x)=P(yx)P(x)P(y, x)=P(y|x)*P(x),由数据学习联合概率密度分布P(x,y)P(x,y),然后求出条件概率分布P(yx)P(y|x)作为预测的模型,即生成模型: P(yx)=P(x,y)/P(x)P(y|x)= P(x,y)/ P(x)。基本思想是首先建立样本的联合概率概率密度模型P(x,y)P(x,y),然后再得到后验概率P(yx)P(y|x),再利用它进行分类。生成方法关心的是给定输入x产生输出y的生成关系。

相关文章: