Perenial youth.

ECNU 2019 NLP Spring_Seminar 第三讲 Gradient Descent&Classification

ECNU 2019 NLP Spring_Seminar 第三讲 Gradient Descent&Classification

课件链接:

http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/Gradient%20Descent%20(v2).pdf

http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/DL%20(v2).pdf

http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/BP.pdf

梯度下降:

资料满天飞,原理就不多说了。。稍微值得注意的一个point是,gradient的方向是loss的等高线的法线方向。这个下降的过程嘛,用一张PPT解释:

训练的Tips:

1.选择合适的learning rate。一个方法是采取adaptive learning rates: 随着epoch增多,减小learning rate,比如:
\( \eta^t=\eta/\sqrt{t+1} \) 同时,仅仅这样还不够,还需要让每个参数的learning rate不同;因此,可以采用Adagrad。Adagrad简单的来说就是在改变学习率的基础上,针对每一个参数,再次调整学习率。解释见下图:

可以把\(\eta^t\)和 \(\sigma^t\)中的东西消去,如下图:

那最终得到的\(w^{t+1} \leftarrow w^t -\frac{\eta }{\sqrt{\sum_{i=0}^t (g^i)^2}}g^t \)东西是个什么意思呢?直观上来说,Adagrad是想强调先在这个gradient的“反差”有多大,也就是和之前的步骤相比,造成反差的效果。

在只有一个参数的时候,梯度越大,往往离最优点越远;但是跨参数下这个是不成立的。因此跨参数的时候想比距离最低点的距离,需要比的是:一次导数/二次导数。(为什么要跨参数比呢?我个人理解是,因为想要让各个参数达到最优的时间近似相同)

正如上面这段所说,Adagrad实际上就是想反映一次/二次微分。那问题又来了:为什么不直接用一次/二次呢?因为要考虑复杂度。二次微分可能算出来要非常久的时间,Adagrad做的事情是,尝试在不增加额外运算的情况下考虑近似二次微分。二次微分产生的收益要是还没有额外运算耗损的多那就得不偿失了。

2. Stochastic gradient descent. 随机梯度下降,老生常谈了。对每一个example都考虑梯度,只考虑每一个example的loss;如果loss function是非常崎岖的话,会比较有用。也就是说每一个sample都更新一次loss,有一种步步为营的感觉

3. Feature scaling. 也就是说把不同的feature的range变得一样大,让不同的feature有一样的scale。为什么要这么做呢?其实我以前有这个是否要标准化的疑问,但是后来觉得,我的参数都是独立更新的,我不标准化,我的参数更新也会“自动”帮我标准化,也就是自动得帮我完成这个事情。但现在深度思考一下发现并不是这样,因为参数的更新是由梯度和步长决定的,梯度和标准化无关,也就是说函数并不知道我有没有做标准化,而步长是人为确定的,因此,迭代过程完全没道理会自动做标准化这个事情。

直观解释:

如果不rescaling,则用相同的更新步长的话会首先照顾一方。

如何scaling呢:

Formal Derivation

Taylor Series

梯度下降的理论是由泰勒公式支持的。考虑泰勒式子中越多的项,步长实际上可以取得越大(步长其实就是\(\)\delta x[\latex]),但是这样会引入更多的计算,往往是不划算的。

Gradient Descent的问题:

  1. 会卡在local minimal的地方
  2. 会卡在鞍点上
  3. 实际中不是找梯度exactly等于0的时候,而是小于一个值,比如10e-9. 但这样其实不一定取到的是局部最优点(应该是下面这个例子的意思)

最后老师拿minecraft举了个例子。就算两个方向都是较低的,综合考虑之后不一定loss会降低。这个不是因为步长,完全是这种方法的弊端(类似于,单独考虑a,function变小,单独考虑b也变小了,但是把a,b综合在function中考虑,却不一定变小!)

分类:

二分类的classification可以用regression的问题解决。比如训练的时候把一类的label作为1,另一类的作为0,预测时大于0归位一类,小于0归为另一类。

但是有这样一个问题:如果用regression的话,噪音点会非常影响我们找到的函数的结果。如下图所示:

可以看到,图二中的噪声点很大地影响了回归曲线。

原理上来说,分类只在乎是1还是0,而回归则还考虑分到的数值和1或0之间的差值。比如9999,分类中就是1,而回归中,则由于9999和1差距非常大,会导致函数不得不向这些噪声点靠近。这一靠近,就可能导致很多临界点被分错。(感觉如果一定要用regression的话可以在损失函数上套一个sigmoid)

同时,多分类的问题不好用regression去处理。因为二分类用regression做,是因为只有两类,可以分成大于0和小于0;而比如三类的时候,数值有时候是没办法取的,只能onehot编码。

接着来说分类的事情。

上面是一个贝叶斯公式(注意不是naive bayes,没有naive的条件)

需要知道p(c1),p(c2),p(x|c1),p(x|C2)才能算。

这四个值是通过training data估测出来,这一套想法叫做generative model,即产生式模型。

有这个model之后,可以generate一个x。什么意思呢,我们可以计算某一个x出现的几率。如果可以计算每一个x出现的几率,则可以知道x的distribution。然后可以用这个distribution来自己产生x。(我的理解是,产生式模型判断之前,实际上是得到了这整个模型的x的条件分布,也就是掌握了数据的全貌)

p(x|c1)具体怎么算呢?根据training data来统计。拿如果training data中没sample到怎么办呢?我们假设training data从gaussian distribution中sample出来。这里就涉及到概率模型了,这是产生式模型中十分重要的东西。那么要怎么找到这个gaussian distribution呢?找gaussian distribution 的均值和方差。那么怎么找均值和方差呢?通过极大似然估计。事实上这是很显然的。training data可能从任何一个gaussian distribution中sample出来,但是有几率的高低之分,找概率最高的那个即可。

这些点是独立采样的所以可以这么写。事实上实际不可能穷举所有的均值和方差,均值实际上很好直接判断,就是样本的均值;方差则通过下式微分找。

但事实上,一般来说不是每一个类都有自己的高斯分布。这样的话模型的参数就太多了,容易overfitting。因此,可以让不同的类share相同的co-variance,而均值不同。

共用co-variance后的分类结果:这样的model也称为linear model。但不共用的话就不是。为什么共用了就是线性模型了呢?下面会说

概率模型的步骤:

为什么要选高斯作为概率模型呢:

人自己选的。。看直觉和经验。

如果是布尔的,可以用Bernoulli分布

那么z应该长什么样子?

实在太懒了先不敲公式了。。直接从ppt截了。上式推导说明为何分界面是线性的。

那么可以看到,我们实际上就是要找w和b。而目前我们的做法是找到u和co-variance然后再带回去,有点舍近求远。那么有没有办法直接找w和b呢?

且听下回分解。

xinyu