9月份比较系统的看了李宏毅教授的Machine Learning课程,这个月开始就没太多看ML,DL的东西。下周有一个deep learning project的due,借着机会重新理一下。
下面按照之前笔记加上自己的理解做个梳理
要是发现我理解错了记得告诉我鸭
Lecture0: 机器学习介绍
Machine Learning = Looking for a function, 对于一些复杂现象,当人们靠自己找不到一些规律的时候,用机器学习可以找到事物见那个复杂的方程。在很多领域都有应用。
比如:
语音识别:人们不是对于所有的声音都能给一个确定的tag。
股票:基于过往数据,可以做出来一条回归曲线进行预料。
机器学习基本分3步:
- define a set of function 找规律
- goodness of functon 规律的好坏
- pick the best function 在一堆候选规律里找到最好的那个
Lecture1: Regression
这章是神经网络的基础
很多章内容都用精灵宝可梦的例子来加以解释。这是个非常好的例子,因为pokemon有很多可视化属性,比如cp值,属性,战斗力等。本章目的是想根据一只宝可梦的属性得到它进化后的cp值来决定是否要花精灵球来抓这只pokemon。首先给一个input: 一只宝可梦的相关信息。
output: 我们想要得到进化后的cp值。
step1: define a set of function
根据case选择不同的function,对于这个case,我们只需要知道现有的去预测进化后的,这样就是个简单的线性问题。只需要y=aX+b的简单线性方程即可。so… 代入了几组输入之后,如下:
每一个pokemon都有一个自己的function,自己的参数,我们需要找到是一个可以让每个pokemon都能预测的大model。
Linear model
通式可写成:
: 输入者x的各种属性,一般是一个向量或者矩阵。
: weight,权重,后面会有说。
: bias, 偏差。
step2: goodness of function
怎样从上述function set中找到好的呢?
我们将本来的值减去预测的值,之间的差值越小说明函数越好。
定义一个新的function:loss function,损失函数。
Input: a function
Output: how bad it is
step3: Best function
找到让最小的function就是最好的:
这个例子的function 很简单,用二元次方程就可解,但是现实中,有几百个参数,loss function是几百元的,怎么解?
引出Gradient Descent,只要可以微分,都可以用这个解。假设只有一个参数,如何求gradient descent?
1.随机选取一个初始的点
2.计算,在这就是算切斜率的意思,如果值为负数->increase ;如果为正数->decrease 。
走这一步是走多远呢?step size取决于两件事:
第一件事,微分值有多大,微分值越大走的越多。
第二件事,添加一个常数项, “learning rate”:—>
3.计算,并且接着更新。
就这样一直移动直到local optimal发现为0,说明是个局部最小值了。
推广到两个参数,也是一样的解法,只是loss function从一条曲线变成了一个曲面,再多一个参数,立方体?上述问题遇到了local optimal的问题,但是其实没关系,因为在线性回归里面,loss function一直是convex的。
Results!!
我们算出了最佳解之后带入。但是发现在test data上面做的测试结果(Generalization)并不是很好呀,error>average error on training data。怎么办呢?
这种问题在现实中很多,选模型没有选好。
1.因为不只是会影响之后的cp值,属性等都会影响!
2.其次预测值和现在的值不是一元线性关系,是2次方呢?
so…
redesign the model
1.把原来的一次方程换成底下这个:
最后发现training data 的error越来越低, 但是testing data在次方高的时候反而又升高了!很气,这就是过拟合overfitting现象。
**Overfitting:**越复杂的model,可能testing 上的效果就更差。
2.把新发现的factor加进去比如,物种的影响。
重新设计了一个model:
当物种不同的时候,会有不同的结果。但发现最后还是overfitting了。
这时候又需要一招:正则化!
Regularization正则化:
对于这个问题,我是从结果倒退着想的。
首先,现实生活中,不止是光有,等, 是有几百个的,需要知道我们想要的结果,其实并不是那个物件本身的所有信息我们都需要知道。比如我想预测一个学生下次考试成绩,我需要上次成绩,智商,平时表现等,我不需要这位学生的性别。所以就要有意的去剔除一些feature,但是人为剔除低效。就需要机器自己找这个feature是不是我们要的,如果这个feature其实不是很重要, feature对应的那个x前面就可以很小,这样是变相剔除了这个参数的影响。
既然我们需要非常小,那此项就可以理解了,越大,说明第二项越大,希望剔除的比重就越大。直到loss function处理到我们想要的那个点,也就被处理过了。
Lecture2: Where does the error come from?
从training data, 我们得到了, 是的estimator。
error来自bias和variance,可以这么理解(正好和我的参数估计对上了)。
bias:假设有一变量X, mean:, variance:, 取其中的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的时候要非常小心,过大过小都不行,如图。
Adaptive Learning Rates可以自动的调节步伐,没走几步就改一下learning rate,一开始离重点远,用大的步伐,越离越近就用小的。
eg. 加上时间这个参数: 1/t dacay = =
Adagrad:自适应梯度算法(每个参数都有自己的learning rate)
<—, is root mean square of the previous derivatives of parameter . 这样既有关于时间的参数,也有关于的参数。
最终推导的式子为:
<—
更新项:分子随着时间变大而变大,分子随着叠加也会越来越大。在此处发现有点矛盾?怎么会分子分母同时增大,这目的是啥?其实是为了有一个反差,我具体数学推导证明不会,只是心里有一点概念。
tip2: stochastic gradient descent 随机梯度下降:
正常的gradient descent是,是先选取一个然后对整个loss function做求导,再加和。每进行一次,要整体遍历,是计算量非常大的。但我经验来看,对于线性回归类的问题,正常梯度下降表现还是可以的。
现在推荐的这一款,叫随机梯度下降:
先随机选取一个,然后每次只选取一个点进行移动,这样比上面的要快很多。但是缺点是由于是只选取一个点,波动经常就很大。经验来看比较适合二分类的问题。
tip3: feature scaling特征缩放
有些输入的参数,之间不是非常匹配,这种时候就要进行缩放,比如像normalize的一些处理。比如,输入进来一堆设备的参数信息,有寿命,耐久,电压等。发现电压数远远大于另外几个参数,这时候就对电压进行feature 缩减。
Lecture4: Classification
上述的例子都是线性回归问题,输入若干个参数,得到的也是一个数值。现在有另外一种问题,还是用pokemon来举例子:
我想给pokemon分类,怎么分?
希望input一只皮卡丘(若干参数)得到output电类生气宝贝。
试试看regression的方法,0为分界,如果output>1,就是皮卡丘;output<1,就不是皮卡丘。看下结果:
可以看到,左边的绿线是很完美的。但是如果数据像右边的图,分界线就是紫线,分割的就是错的。我个人理解下,线性回归是根据一些数据拟合出一条曲线,能解决的问题,得是output和input的值密切相关的,output之间也是有点联系的。这个例子output是人为的给定了数值,class之前没有关系。
Naive Bayesian Model 贝叶斯模型
现在用概率的知识去考虑这个问题现在有两个盒子Box1,2和blue,green的点。现在已知每个盒子出green,blue点的概率。现在给你一个blue的点,用贝叶斯定理可以求出它从蓝盒子和绿盒子出来的概率。
把这个想法对应到pokemon上,对应的是出水,电,光系等神奇宝贝的概率。是这些pokemon的属性,代表了属性出现在类的概率,同理。用这个想法可以解决一些分类问题了
现在一个一个来求,首先分子上的很好求,意思是某个系的神奇宝贝会出现的概率,是可以现实提取到的。
指的是类别里,有这些feature的概率。
现在假设每个pokemon都有两个feature,所以是可以在二维平面画出来的。
图上的每一个点都代表一只pokemon,我们需要做的是根据这些已经被标注的点推出一个分布公式,再用它预测别的点。现在假设这79个水系点都是从一个Gaussian的distribution里sample出来的。
input是x,相当于一只pokemon的参数,输出为这个点的概率。这个function的形状由和covariance matrix的决定的,也就是说要用这79个点来找到和。
如何找到?
Maximum Likelihood
有很多组的和可以拟合出这79个点,但是怎么判断好坏呢?因为已经确定这79个点是水系的了,所以能让这些点出来的概率最大的和才是好的。
Likelihood of a Gaussian with mean ? and covariance matrix ?
Different Likelihood= the probability of the Gaussian samples
只要求出哪个和能让最大,就是最好的和。这就是数学问题了。
接下来可以分类了
将之前算好的带入分子,分母也是一样的算法。
If –> x belongs to class1
If –> x belongs to other class
但是这样做会发现结果其实并不是很好。
改进?Modifying Model
每个class都有自己的和,这样当input feature size很大的时候,增长的是非常快的,所以需要减小参数,不同的class可以share同一个。
naive bayes classifier适合不同dimension之间独立,如果dimendion之间有联系,那么bias就大了。
Lecture5: Logistic Regression
紧接着上节内容,发现了一个有趣的现象,我们转换一下bayes function:
紧接着,我们对进行各种数学操作(注意要share),此处省略,得到:也就是说
其实这就是一个nerual的原型了!
用这个模型我们再来按照步骤来一次
step1: Function set
step2: Goodness of a function
Training Data:
假设这些data从出来的,怎样找到好的呢?可以让最大的就是我们要的。
蓝色线条为交叉熵,反应了两个分布的相似程度,要让他越小越好,证明测试出来的和real的越贴近。
理解:为什么不用线性回归里的平方误差函数了?
因为这个分类的例子用平方误差函数,将不再是convex函数,一扭一扭的,local optimal非常的多。
而cross entropy其实是个分段函数,y=0和y=1时一个递增一个递减,这样结合起来,是一个凸函数,并且非常符合一元二次的样子。
step3: find the best function
<—,Larger difference, lager update step, 直到求到最小值。
**Discriminative V.S Generative **
Discrimninate:判别模型
判别模型估计的是条件概率分布(conditional distribution),,是给定观测变量x和目标变量y的条件模型。由数据直接学习决策函数或者条件概率分布作为预测的模型。判别方法关心的是对于给定的输入,应该预测什么样的输出。
Generative: 生成模型
生成模型估计的是联合概率分布(joint probability distribution),,由数据学习联合概率密度分布,然后求出条件概率分布作为预测的模型,即生成模型: 。基本思想是首先建立样本的联合概率概率密度模型,然后再得到后验概率,再利用它进行分类。生成方法关心的是给定输入x产生输出y的生成关系。