2017-03-28 19:14:11 xzy_thu 阅读数 10162

台湾大学李宏毅老师的机器学习课程是一份非常好的ML/DL入门资料,李宏毅老师将课程录像上传到了YouTube,地址:NTUEE ML 2016
这篇文章是学习本课程第1-3课所做的笔记和自己的理解。


Lecture 1: Regression - Case Study

machine learning 有三个步骤,step 1 是选择 a set of function, 即选择一个 model,step 2 是评价goodness of function,step 3 是选出 best function。

regression 的例子有道琼斯指数预测、自动驾驶中的方向盘角度预测,以及推荐系统中购买可能性的预测。课程中的例子是预测宝可梦进化后的CP值。

一只宝可梦可由5个参数表示,x=(x_cp, x_s, x_hp, x_w, x_h)。我们在选择 model 的时候先选择linear model。接下来评价goodness of function ,它类似于函数的函数,我们输入一个函数,输出的是how bad it is,这就需要定义一个loss function。在所选的model中,随着参数的不同,有着无数个function(即,model确定之后,function是由参数所决定的),每个function都有其loss,选择best function即是选择loss最小的function(参数),求解最优参数的方法可以是gradient descent。

gradient descent 的步骤是:先选择参数的初始值,再向损失函数对参数的负梯度方向迭代更新,learning rate控制步子大小、学习速度。梯度方向是损失函数等高线的法线方向。

gradient descent 可能使参数停在损失函数的局部最小值、导数为0的点、或者导数极小的点处。线性回归中不必担心局部最小值的问题,损失函数是凸的。

在得到best function之后,我们真正在意的是它在testing data上的表现。选择不同的model,会得到不同 的best function,它们在testing data 上有不同表现。复杂模型的model space涵盖了简单模型的model space,因此在training data上的错误率更小,但并不意味着在testing data 上错误率更小。模型太复杂会出现overfitting。

如果我们收集更多宝可梦进化前后的CP值会发现,进化后的CP值不只依赖于进化前的CP值,还有其它的隐藏因素(比如宝可梦所属的物种)。同时考虑进化前CP值x_cp和物种x_s,之前的模型要修改为
if x_s = pidgey: y = b_1 + w_1 * x_cp
if x_s = weedle: y = b_2 + w_2 * x_cp
if x_s = caterpie: y = b_3 + w_3 * x_cp
if x_s = eevee: y = b_4 + w_4 * x_cp
这仍是一个线性模型,因为它可以写作
y =
b_1 * δ(x_s = pidgey) + w_1 * δ(x_s = pidgey) * x_cp +
b_2 * δ(x_s = weedle) + w_2 * δ(x_s = weedle) * x_cp +
b_3 * δ(x_s = caterpie) + w_3 * δ(x_s = caterpie) * x_cp +
b_4 * δ(x_s = eevee) + w_4 * δ(x_s = eevee) * x_cp
上式中的粗体项都是linear model y = b + Σw_i * x_i 中的feature x_i
这个模型在测试集上有更好的表现。如果同时考虑宝可梦的其它属性,选一个很复杂的模型,结果会overfitting。

对线性模型来讲,希望选出的best function 能 smooth一些,也就是权重系数小一些,因为这样的话,在测试数据受噪声影响时,预测值所受的影响会更小。
所以在损失函数中加一个正则项 λΣ(w_i)^2
越大的λ,对training error考虑得越少。
我们希望函数smooth,但也不能太smooth。
调整λ,选择使testing error最小的λ。

Lecture 2: Where does the error come from?

error有两种来源,分别是bias和variance,诊断error的来源,可以挑选适当的方法improve model。

以进化前的宝可梦为输入,以进化后的真实CP值为输出,真实的函数记为f^。(在上帝视角才能知道f^
从训练数据,我们找到 f f是对f^的一个估计。

bias and variance

简单模型,variance小。复杂模型,variance大。(简单模型更少受训练数据影响。复杂模型会尽力去拟合训练数据的变化。)
bias代表f¯f^ 的距离。简单模型,bias大。复杂模型,bias小。
simple model的model space较小,可能没有包含target。

在underfitting的情况下,error大部分来自bias。
在overfitting的情况下,error大部分来自variance。

如果model连训练样本都fit得不好,那就是underfitting, bias大。
如果model可以fit训练样本,但是testing error大,那就是overfitting, variance大。

在bias大的情况下,需要重新设计model,比如增加更多的feature,或者让model更complex。而此时more data是没有帮助的。
在variance大的情况下,需要more data,或者regularization。more data指的是,之前100个f,每个f抓10只宝可梦,现在还是100个f,每个f抓100只宝可梦。more data很有效,但不一定可行。regularization希望曲线平滑,但它可能伤害bias,造成model space无法包含target f^

在选择模型时,要考虑两种error的折中,使total error最小。

不应该这样做:
what you should NOT do

因为这样做,在public testing set上的error rate,并不代表在private testing set上的error rate。
应该采用cross validation的方法!
cross validation

training set分成training setvalidation set,在training set上训练model 1-3,选择在validation set 上error rate最小的model。
如果嫌training set中data少的话,可以在确定model后在全部training data上再train一遍该model。
这样做,在public testing set上的error rate才会代表在private testing set上的error rate。
不能用public testing set去调整model。

N折交叉验证
N-fold cross validation

training set分成N折,每次只有一折作为validation set,其它折作为training set,在各model中选择N次训练得到的N个validation error rate的均值最小的model。

Lecture 3: Gradient Descent

gradient descent

Tip 1: Tuning your learning rates

在用梯度下降时要画出loss随更新参数次数的曲线(如下图),看一下前几次更新参数时曲线的走法如何。
loss ~ Number of parameters updates

调整学习率的一个思路是:每几个epoch之后就降低学习率(一开始离目标远,所以学习率大些,后来离目标近,学习率就小些),并且不同的参数有不同的学习率。

Adagrad

Adagrad

Adagrad2

如何理解Adagrad的参数更新式子呢?以一元二次函数为例,参数更新的best step是
best step

在参数更新式子中,gt 代表first derivative,分母中的根号项反映了second derivative(用first derivative去估计second derivative)。

Tip 2: Stochastic Gradient Descent

SGD让训练过程更快。普通GD是在看到所有样本(训练数据)之后,计算出损失L,再更新参数。而SGD是每看到一个样本就计算出一个损失,然后就更新一次参数。

Tip 3: Feature Scaling

如果不同参数的取值范围大小不同,那么loss函数等高线方向(负梯度方向,参数更新方向)不指向loss最低点。feature scaling让不同参数的取值范围是相同的区间,这样loss函数等高线是一系列共圆心的正圆,更新参数更容易。
feature scaling的做法是,把input feature的每个维度都标准化(减去该维度特征的均值,除以该维度的标准差)。

Gradient Descent的理论推导(以两个参数为例)

Taylor Series

Taylor Series2

约等式的成立需要the red circle is small enough这个条件,如果η 没有设好,这个约等式可能不成立,从而loss不会越来越小。

也可以考虑Taylor Series中的二阶项,要多很多运算,一般不划算。


李宏毅机器学习课程笔记

李宏毅机器学习课程笔记1:Regression、Error、Gradient Descent
李宏毅机器学习课程笔记2:Classification、Logistic Regression、Brief Introduction of Deep Learning
李宏毅机器学习课程笔记3:Backpropagation、”Hello world” of Deep Learning、Tips for Training DNN
李宏毅机器学习课程笔记4:CNN、Why Deep、Semi-supervised
李宏毅机器学习课程笔记5:Unsupervised Learning - Linear Methods、Word Embedding、Neighbor Embedding
李宏毅机器学习课程笔记6:Unsupervised Learning - Auto-encoder、PixelRNN、VAE、GAN
李宏毅机器学习课程笔记7:Transfer Learning、SVM、Structured Learning - Introduction
李宏毅机器学习课程笔记8:Structured Learning - Linear Model、Structured SVM、Sequence Labeling
李宏毅机器学习课程笔记9:Recurrent Neural Network
李宏毅机器学习课程笔记10:Ensemble、Deep Reinforcement Learning

2017-05-14 09:32:40 xzy_thu 阅读数 4366

台湾大学李宏毅老师的机器学习课程是一份非常好的ML/DL入门资料,李宏毅老师将课程录像上传到了YouTube,地址:NTUEE ML 2016
这篇文章是学习本课程第19-21课所做的笔记和自己的理解。


Lecture 19: Transfer Learning

迁移学习要解决的问题是:假设现在手上有与task不直接相关的data,这些data能否帮助我们完成task呢?
比如现在要做猫狗的分类器,所谓不直接相关的data就可能是
- Similar domain, different tasks(如,大象与老虎的图片,与猫狗图片的分布是相像的)
- Different domain, same task(如,猫狗的卡通图片,与猫狗图片的分布是不像的)

为什么要考虑迁移学习呢?因为我们只有很少的数据是符合任务处理要求的(Target Data),但是类似的数据(Source Data)却有很多。例如,我们的任务是辨识台语,我们只有很少台语数据,但是我们有很多其它语言的数据。

按Target Data与Source Data是labelled还是unlabelled,迁移学习可以分为四类

  • Target Data: labelled, Source Data: labelled ——最常见的是Model Fine-tuning,此外还有Multitask Learning
  • Target Data: labelled, Source Data: unlabelled——Self-taught learning
  • Target Data: unlabelled, Source Data: labelled——Domain-adversarial training, Zero-shot learning
  • Target Data: unlabelled, Source Data: unlabelled——Self-taught Clustering

Model Fine-tuning

fine-tuning
具体解释一下图中的Example, Target data可能是某人说的三句话,而Source data可能有上万小时。
图中的Idea是非常直觉的,先用Source data训练出一个模型,把训练结果作为初始值,再用Target data来Fine-tune 模型。可能存在的问题是,由于target data可能会很少,所以就算用source data训练出的模型很好,再用target data做fine-tune的时候可能会过拟合。避免这个问题就需要技巧。

技巧之一便是Conservative Training.

Conservative Training
Conservative Training的意思就是,为了避免target data 在 fine-tune 模型时造成过拟合,要增加约束,即增加正则化项,让同一笔data经fine-tune前后两个模型的output越接近越好,或两个模型的参数越接近越好。

技巧之二便是Layer Transfer.

Layer Transfer

(左上图)Layer Transfer的意思是,把Source data 训练好的模型中的某些layer直接copy过来,用target data 训练剩下的layer。这样的好处是,target data 只需要训练较少的参数,避免了过拟合。
(右上图)在不同的task上,需要被transfer的layer往往是不一样的。比如在语音识别上,通常copy最后几层,重新训练前几层。这是因为语音识别神经网络前几层是识别语者的发音方式,后几层是识别,后几层与语者没有关系。在图像识别上,通常copy前面几层,重新训练后面几层。这是因为图像识别神经网络的前几层是识别有没有基本的几何结构,因此可以transfer,而后几层往往学到的比较抽象,无法transfer。所以,哪些layer要被transfer是case by case的。
(左下图)Image在Layer Transfer上的实验,出自Bengio在NIPS2014的paper。把ImageNet分成Source、Target两部分,横轴代表Layer Transfer时copy几个layer(0个代表没有Layer Transfer,是Baseline),纵轴是Top-1 accuracy. 曲线4表明,前面几个layer是可以共用的。曲线5表明,Layer Transfer + Fine-tuning 在所有case下,Top-1 accuracy均有提高。这一结果的惊人之处在于,这里的target data已经非常多(ImageNet的一半),但是再加上Source data(ImageNet的另一半)仍然有所帮助。曲线2表示,如果用target domain训练出一个模型,fix住前几个layer,再用target domain训练后几个layer,结果可能坏掉。曲线3表明,在曲线2基础上fine-tune,结果会恢复。
(右下图)红色线是左下图中的曲线4。黄色线表示,如果source和target比较没有关系(比如把所有自然界的图片当做source,所有人工的图片当做target),那么transfer效果会掉很多,但只copy前几个layer影响是比较小的。绿色线表示,如果前几个layer的参数是random的,结果会烂掉。

Multitask Learning

Multitask Learning 与 Fine-tuning 的区别在于, Fine-tuning 在意的是在target domain上做得好不好,不介意fine-tune 之后在source domain 上结果坏掉。而在Multitask Learning 中,要同时在意在target domain与source domain上做得好不好。

这里写图片描述
左边的网络,如果两个task有共通性,则可以共用前面几个layer(用source+target一起训练)。如果两个task连input都不能share,可以各经过几层layer,把输入变换到同一个domain上,中间某几层可以是share的。

这里写图片描述
Multitask Learning的一个成功例子是多语言的语音识别,可训练一个模型同时识别多国语言,几乎所有语言都可以transfer(有人做过实验,多国语言两两transfer,每个case都有进步,哪怕语言之间不是很像)。前几个layer共用参数,后几个layer不同。翻译上也可以类似,如中翻英、中翻日可以同时训练。

这里写图片描述
蓝线表示,没有transfer learning时汉语识别结果。黄线表示,用欧洲语言做Transfer learning,帮助训练汉语识别网络的前几层,在相同汉语训练数据下,错误率要低。所以在这里Multitask Learning的好处是,只需要更少的数据,就可以达到同样好的效果。

Progressive Neural Network

如果两个task很不相关,却又做了transfer,效果可能是负面的。有人提出了Progressive Neural Network,使得两个task即使无关,做transfer效果也不会比不做更差。
这里写图片描述
训练好第一个模型后,第一个模型的参数就fix住。训练第n个模型时,每个隐层都借用前n-1个模型的隐层输出。

Domain-adversarial training

这里写图片描述
适合Target Data: unlabelled, Source Data: labelled的情况,将source data视作training data,将target data视作testing data。问题在于二者之间是mismatch的,在source data上训练出来的模型如何才能在mismatch的target data上也work呢?

这里写图片描述
(左上图)如果对mismatch的问题视而不见,那么结果会烂掉。NN前面几层可以看做在抽feature,我们会发现不同domain 的feature完全不一样:蓝色点MNIST, 红色点MNIST-M(均为t-SNE降维后)。后面几层可看做在做分类,虽然可以把蓝色点分得很好,但是对红色点却无能为力。
(右上图)所以,希望feature extractor可以把domain的特性去除掉,把不同domain的feature都混在一起(Domain-adversarial training)。做法是在feature extractor(Generator)后面接一个domain classifier(Discriminator),它的架构类似GAN,不过在GAN中Generator要产生一张Image来骗过Discriminator,这件事很难;而在Domain-adversarial training中要骗过domain classifier很简单(不管什么input, feature extractor的output都是0,就轻易骗过domain classifier了)。所以只训练domain classifier是不够的,要给feature extractor增加任务难度。
(左下图)feature extractor不仅要骗过domain classifier,还要让label predictor做得好。不只把domain的特性消掉,对这个任务来讲还要保留digit的特性。三个部分组成一个大网络,各个部分目的不同(“各怀鬼胎”,feature extractor要“陷害”队友domain classifier)。
(右下图)feature extractor要如何“陷害”队友domain classifier呢?只要加一个gradient reversal layer就行。Backpropagation时feature extractor做与domain classifier的要求相反的事情,domain classifier要某个值上升,feature extractor就让那个值下降。由于domain classifier看不到input image,所以最后会输掉,无法分辨feature extractor抽出的feature来自哪个domain。但是domain classifier应该要奋力挣扎,否则不能把feature extractor逼到极限,不能把domain information去除掉。

这里写图片描述
paper中给出的实验结果。
source only指的是,只用source data训练模型,然后测试target data。这种方法的效果是比较差的。
proposed approach指的是Domain-adversarial training, 效果有很好的提高。
train on target指的是,直接拿target domain 的 data 训练,是performance的up-bound.

Zero-shot Learning

适合Target Data: unlabelled, Source Data: labelled的情况,将source data视作training data,将target data视作testing data。但二者是不同的task。例如,source data中有猫狗的图片,没有羊驼的图片,而target data中是羊驼的图片。那训练出的模型能认出羊驼吗?语音上常遇到Zero-shot Learning的问题,若把每个word都当做一个class,那么training的时候与testing的时候就可能会看到不同的词汇。解决办法是,不去识别一段声音属于哪个word,而是识别一段声音属于哪个音素(音标),然后根据人的知识建立一个音标和词汇关系的词典。

这里写图片描述
(左上图)在图像上,做法是把图像的类用attributes表示,如图中的database,attributes要足够丰富以使每个类有独一无二的attributes。在training时,不直接识别图像所属类别,而是识别图像具备什么attributes。
(右上图)在testing的时候,就算来了一张没见过的类中的image,输出是attributes,查表就知道与output attributes最接近的类。
(左下图)有时attributes维度很高,可以做attribute embedding. 把training data中每张image都变成embedding space上的一个点,把所有attributes也都变成embedding space上的一个点。图中的gf 都可以是神经网络,训练时希望gf 越接近越好,测试时看image经embedding之后与哪个attributes经embedding之后最接近,那个attributes对应的class就是image所属的class。(图中f(y3) 应改为f(x3)
(右下图)如果没有database、不知道每个class对应的attributes怎么办呢?可以借用word embedding, 把attributes换成 word vector.

这里写图片描述
上面的目标函数是有问题的,因为它只考虑了同一个pair在embedding之后尽可能接近,没有考虑不同pair在embedding之后尽可能拉开,所以可能会把所有的xn,yn 都投到同一点。应改成下面的目标函数。

这里写图片描述
Zero-shot Learning的一个更简单方法,叫Convex Combination of Semantic Embedding, 不需要training.

Self-taught learning, Self-taught Clustering

  • Target Data: labelled, Source Data: unlabelled——Self-taught learning
  • Target Data: unlabelled, Source Data: unlabelled——Self-taught Clustering

    这里写图片描述
    Self-taught learning的意思是,如果现在source data够多,那么可以学习一个feature extractor(在原始Self-taught learning的paper中,feature extractor是sparse coding, 现在可以用autoencoder),然后用这个feature extractor在target data上抽feature.

Lecture 20: Support Vector Machine (SVM)

SVM有两大特色:Hinge Loss和Kernel Method

Hinge Loss

先复习一下Binary Classification.
这里写图片描述

左图中的δ() 是指示函数,不可微分。
右图中横轴是y^f(x) ,希望 y^=+1 时,f(x) 越正越好,y^=1 时,f(x) 越负越好。即y^f(x) 越大,损失函数越小。可微分的损失函数可以自己选,比如蓝线、绿线、红线……

这里写图片描述
(左上图)Square Loss(红色线),是不合理的(y^f(x) 很大时,损失函数很大)。
(右上图)Sigmoid + Square Loss(蓝色线)。对l(f(xn),y^n) , 代入y^n=±1 ,可以理解公式的合理性。逻辑回归时不会用square loss,因为它的performance不好,而是用cross entropy.
(左下图)Sigmoid + cross entropy(绿色线)。指的是σ(f(x)),1σ(f(x)) 这个分布,与ground truth这一分布之间的cross entropy,这是要最小化的目标。这时的损失函数l(f(xn),y^n) 是合理的(一侧趋于0,一侧趋于无穷大),是ideal loss的up-bound(除以ln2),可以通过最小化ideal loss的up-bound来最小化ideal loss。比较绿线和蓝线,可知道为什么在逻辑回归时要用cross entropy作为损失函数,而不用square loss:y^f(x) 从-2变到-1时,蓝色线变化很小,绿色线变化很大;y^f(x) 很负时,应该朝正方向调整,但对蓝色线来讲调整没有回报,而对绿色线调整有回报。
(右下图)Hinge Loss(紫色线).损失函数l(f(xn),y^n) 中的“1”使得曲线过(0,1)(1,0)点,从而是ideal loss的tied up-bound, 可以通过最小化ideal loss的tied up-bound来最小化ideal loss. 当y^f(x) 在0,1之间时,虽然可以正确分类,但是还不够好;当y^f(x) 从1变成2时,loss不降(“及格就好”)。Hinge Loss与Sigmoid + cross entropy相比,区别在于对待已经做好的样本的态度:当y^f(x) 从1变成2时,前者loss不降,后者loss下降(“好还要更好”)。实践中相差不多,Hinge Loss可能会微胜Sigmoid + cross entropy。Hinge loss的好处是不害怕outlier, 学习出的结果比较鲁棒,下面讲kernel时会明显看到这一点。

Linear SVM

这里写图片描述
Linear SVM的function是linear的,如图中公式所示,当f(x)>0 时,x属于class 1, 当f(x)<0 时,x属于class 2。
Linear SVM的loss function是hinge loss + 正则项,由于hinge loss和正则项都是convex的,所以loss function整体也是convex的。曲线有棱棱角角也是可微分的。
Linear SVM与Logistic regression 区别只在于损失函数不同,前者的损失函数是hinge loss,后者的损失函数是cross entropy。
事实上,function (model) 没必要必须是linear的,不过若是linear的则有好的特质;若不是linear的也可以用gradient descent来训练,所以SVM可以有deep的版本(见图中的参考paper). 在DL中把cross entropy改成hinge loss,其实做的就是deep SVM。

这里写图片描述
SVM是可以用gradient descent来训练的。
图中红色方框等于xni , 将划红线的部分定义为cn(w)(依赖于现在的参数w),红线后面的xi 应改为xni.

这里写图片描述
l(f(xn),y^n) 记作εn
上下两个方框本是不等价的(上面可以推出下面,但是下面不能推出上面),但是加上“Minimizing loss function L”之后二者就等价了。下面就是常见的SVM的约束,εn 是松弛因子(不能是负的,否则就不是松弛了)。这是一个二次规划问题(quadratic programming problem),可代入QP solver求解或用gradient descent求解。

Kernel Method

Dual Representation

这里写图片描述
要学Kernel Method, 先要了解Dual Representation,Dual Representation指的是:最小化损失函数的权重参数w 可以表示为数据点xn 的线性组合。一般用拉格朗日乘子法解释这一结论,这里从另外的角度解释。
之前说过,Linear SVM可以用gradient descent来更新参数,根据前面得到的公式,每次更新权重都加上xn 的线性组合,那么如果w 初始化为0向量的话,得到的w 就是xn 的线性组合。其中的权重cn(w) 是损失函数l(f(xn),y^n)f(xn) 的偏导数,由于损失函数采用的是Hinge Loss,所以有的cn(w) 就是0,从而αn 是sparse的,具有非零αn 的数据点xn 是支持向量。这样的好处是模型比较鲁棒:不是支持向量的数据点,就算去掉也不会对结果有影响,outlier只要不是支持向量,就不会对结果有影响。反观logistic regression(用cross entropy作损失函数),它在更新参数时的权重就不sparse,所以每笔data都对结果有影响。

这里写图片描述
w 写成xn 的线性组合,最大的好处是可以使用Kernel trick.
根据w=Xα , f(x) 可写为f(x)=Σnαn(xnx) ,由于用的损失函数是Hinge Loss, 所以αn 是sparse的,只需要算支持向量与数据点x 之间的内积即可。
可以把内积(xnx) 写作Kernel function K(xn,x).
这样,整体损失函数可以改写为图中的式子,我们不需要知道x,只需要知道Kernel function K(x,z) 即可,这就叫Kernel trick. Kernel trick不只可用于SVM,也可用于logistic regression, linear regression等。(图中”project”应改为”product”)

Kernel trick

这里写图片描述
有时需要做特征变换,而直接计算核函数会比“特征变换+计算内积”快。

这里写图片描述
RBF Kernel, x与z越像,则K(x,z) 越大。它是两个无穷维特征向量的内积。将核函数展开并使用泰勒级数,可见核函数是无穷项之和,每项都可写成内积形式,将与x,z有关的向量分别串起来,得到两个无穷维的向量,这两个向量的内积就是RBF核函数。由于使用了无穷维的特征,在用RBF核函数时要小心overfitting(可能在training data 上得到很好的performance, 而在testing data 上得到很糟的performance)。
Sigmoid Kernel. (图中αn,α1,α2 应改为 αn,α1,α2 ). sigmoid kernel可看做一个单隐层网络,neuron个数就是支持向量个数,neuron权重就是支持向量各维度的数值。

这里写图片描述
不是所有的f(x,z) 都可以拆成ϕ(x)ϕ(z), Mercer’s theorem 告诉我们哪些可以。

SVM related methods:

  • Support Vector Regression (SVR) [Bishop, Chapter 7.1.4]
  • Ranking SVM [Alpaydin, Chapter 13.11]
  • One-Class SVM [Alpaydin, Chapter 13.11]

比较Deep Learning 与 SVM:
这里写图片描述
SVM的kernel是learnable的,见图中的reference。可以learn不同kernel组合时的权重。

Lecture 21: Structured Learning - Introduction

Structured Learning

这里写图片描述
目前为止,我们学到的SVM, DL等的输入输出都是向量,而有时我们希望输入输出是带有结构的,比如sequence, list, tree, bounding box…… Structured Learning有很多应用(见图)。

Unified Framework

Structured Learning虽然听起来很难,但是它有一个统一的框架。
这里写图片描述
训练时,找一个函数F:X×YR, X,Y是 input structured objects, R 是 real number, 衡量 x,y 有多匹配。
测试时,对给定的x,穷举所有的y,找令F 最大的y~.
Deep Learning 与 Structured Learning 是有关系的,GAN 就是实践这一 Framework 的方法。

这里写图片描述
可以从联合概率分布的角度来理解Structured Learning的Unified Framework.
其实,Graphical Model就是Structured Learning的一种,把F(x,y) 换成了概率。Believe Network, Markov random field等都是找一个evaluate function (概率)。
用概率的缺点:1、有的场景下谈概率是很奇怪的,比如搜索;2、normalization到1是麻烦且不必要的。
用概率的优点:Meaningful
Yann Lecun 提出的Energy-based Model,讲的也是Structured Learning.

Three Problems

在这个Framework中,要解三个问题。
这里写图片描述
GAN是解决这三个问题的曙光。

这里写图片描述
这三个问题,可以和HMM联系起来,也可以和DNN联系起来。
HMM的三个问题,就是general的Structured Learning的三个问题。
DNN是Structured Learning的特例,例如在手写数字识别中,训练时input x,y , x经过DNN得到N(x), 则F(x,y)=CE(N(x),y) . 测试时,由于分类只有十类,可以穷举,用cross entropy的话,看哪个digit对应的维度的值最大。


李宏毅机器学习课程笔记

李宏毅机器学习课程笔记1:Regression、Error、Gradient Descent
李宏毅机器学习课程笔记2:Classification、Logistic Regression、Brief Introduction of Deep Learning
李宏毅机器学习课程笔记3:Backpropagation、”Hello world” of Deep Learning、Tips for Training DNN
李宏毅机器学习课程笔记4:CNN、Why Deep、Semi-supervised
李宏毅机器学习课程笔记5:Unsupervised Learning - Linear Methods、Word Embedding、Neighbor Embedding
李宏毅机器学习课程笔记6:Unsupervised Learning - Auto-encoder、PixelRNN、VAE、GAN
李宏毅机器学习课程笔记7:Transfer Learning、SVM、Structured Learning - Introduction
李宏毅机器学习课程笔记8:Structured Learning - Linear Model、Structured SVM、Sequence Labeling
李宏毅机器学习课程笔记9:Recurrent Neural Network
李宏毅机器学习课程笔记10:Ensemble、Deep Reinforcement Learning

2017-04-16 18:18:24 xzy_thu 阅读数 7463

台湾大学李宏毅老师的机器学习课程是一份非常好的ML/DL入门资料,李宏毅老师将课程录像上传到了YouTube,地址:NTUEE ML 2016
这篇文章是学习本课程第16-18课所做的笔记和自己的理解。


Lecture 16: Unsupervised Learning - Auto-encoder

Auto-encoder

在手写数字识别任务中,想训练一个NN encoder,得到图像的精简表达。但做的是无监督学习,可以找到很多input image,但是不知道code该长什么样,所以没法learn。所以又提出一个NN decoder(也没法单独learn),把encoder与decoder连接在一起learn。
PCA降维可视为得到了精简表达code,图中input image已去均值。中间那层之所以叫瓶颈层是因为它很窄。
auto-encoder可以有多个隐层,中间的窄层的输出就是code。在PCA中前后系数是tie在一起的(可以减少参数数目,防止overfitting),但是并不必要,直接用BP训练即可。
这里写图片描述

下图是Hinton原始论文中的结果:PCA把784维降到30维再恢复到784维,deep auto-encoder结构见下。如果用PCA降到2维,则digits都混在一起,而deep auto-encoder降到2维可以把digits分开。
这里写图片描述

Auto-encoder应用于文字处理

把文章变成一个code,得到vector space model,把查询词汇也变成一个vector,从而进行查询。
一种方法是词袋,但是这种方法中每个词都独立,不能知道语意。
要把语意考虑进来的话,要用Auto-encoder。词袋经过auto-encoder之后得到code。下图中不同颜色代表文档的不同种类。
这里写图片描述

Auto-encoder应用于以图找图

如果基于像素计算图片之间相似度的话,得到的结果会比较差。比如,会得到迈克尔杰克逊的照片比较像马蹄铁。
而把image经过auto-encoder变成code,基于code计算相似度,结果就会好很多。

Auto-encoder用于预训练DNN

为了在训练NN时找到一组好的初始值,要用到预训练。
预训练过程:
这里写图片描述

在训练第一个auto-encoder时,由于hidden layer的维数大于input维数,要加很强的正则项,e.g.对1000维的output做L1正则化(希望output稀疏)。否则hidden layer可能直接记住input,没有learn到任何东西。
在训练第二个auto-encoder时,要把database中所有digit都变成1000维vector。
以此类推,最后随机初始化输出层之前的权重。然后用BP做fine-tune(W1,W2,W3已经很好,微调即可)。
之前在训练较深的NN时要用到预训练,但是现在没必要了,因为训练技术进步了。
但在有大量unlabelled data、少量labelled data时仍需要预训练,可以先用大量无标注数据先把W1,W2,W3先learn好,最后的labelled data只需稍微调整weight就好。

De-noising auto-encoder 与 Contractive auto-encoder

这里写图片描述
De-noising auto-encoder得到的结果会比较鲁棒。

Auto-encoder for CNN

这里写图片描述

unpooling: 在pooling的时候记得从哪里取的值,unpooling的时候对应位置恢复,其余位置补0。
Keras中unpooling是直接把pooling后的每个值复制4份。

deconvolution: 其实就是convolution。

用decoder生成image

这里写图片描述

784维降到2维,根据vector的分布选择红框,在红框中等间隔采样,作为decoder的input,得到计算机生成的图片。
如果红框选错了位置,比如选在右下方,可能得不到数字。
“需知道vector分布”略麻烦,改进方法:加正则化。
在训练时,对code加L2正则化,这样code比较接近0。采样时在0附近采样,这样采样得到的vector比较有可能都对应数字。

Lecture 17: Unsupervised Learning - Deep Generative Model (Part I)

OpenAI写的关于Generative Models的科普文章[链接]中引用了费曼的一句话:凡我不能创造的,我都没有理解。对AI也是如此。

PixelRNN

根据前面的像素预测接下来的像素。PixelRNN不仅work,而且在各种生成方法中PixelRNN产生的图是最清晰的。
用在图像上有一些tips: 如果RGB三个值相差不大,则得到的颜色灰灰的、不够明亮,可以把众多颜色聚成若干类然后做1-of-N encoding。
如果要计算机从空白开始画,要给一个随机数,以免每次画出来的都一样。

Variational Autoencoder (VAE)

把auto-encoder中的decoder拿出来,随便产生一个vector作为code输入到decoder,得到一张image,这样做performance通常不一定很好,要改用VAE。
VAE的结构:
这里写图片描述

VAE得到的结果不太清楚。VAE与PixelRNN区别在于,理论上VAE可以控制要生成的image。
比如code是10维,固定其中8维、调整剩余2维,看结果,可以解读code的每个维度代表什么意思,从而每个维度就像拉杆一样可以有目的的调整。

用VAE写“诗”:先胡乱选两个句子,经过encoder得到这两个句子的code,在code space上是两个点,连接两点、等距采样、用decoder还原,得到一系列句子。

Lecture 18: Unsupervised Learning - Deep Generative Model (Part II)

Variational Autoencoder (VAE)

Why VAE?

这里写图片描述

为什么要用VAE?一个intuitive的解释是,auto-encoder的encoder与decoder都是非线性的,很难预测问号处是一张介于满月与弦月之间的图像。VAE使得code加上noise之后还能恢复出来,这样问号处既希望恢复出满月、又希望恢复出弦月,最后得到介于满月与弦月之间的图像,既像满月又像弦月。
VAE是在encoder output上加noise,而De-noising auto-encoder是在encoder input上加noise。
如果只最小化重构误差,那么train出来的结果不会是预期的样子,因为variance是学出来的,会学成0。
exp是为了确保variance是正的,右下方的minimize是为了让variance不能太小,其中第一项为蓝色曲线、第二项为红色曲线、二者相减得绿色曲线,这样variance最小为1,第三项是L2正则化,希望参数稀疏避免过拟合。

从数学上解释,VAE是GMM的Distributed representation版本。
要最大化似然函数,似然函数可以拆成下界与KL距离。
下界与两个量有关:P(x|z),q(z|x),下界变大不一定使似然函数变大。要让KL最小,那么下界就是似然函数,得到q(z|x)=p(z|x).
下界又可以拆成两项(一个负的KL距离+一个积分),与网络联系起来:
最小化的那个式子就是要最小化这个KL距离,使得encoder产生的code z 的分布与normal distribution P(z) 越接近越好。
这里写图片描述

VAE的问题

VAE只是模仿,没有创造,对VAE来讲下图中output的两张image一样好,这是不合理的。
这里写图片描述

Generative Adversarial Network (GAN)

用拟态的演化来类比GAN。
这里写图片描述

Discriminator判断image是Generator产生的还是real images, Generator根据Discriminator演化。
Generator从未看过real images, 产生的是database中没有见过的image。

训练:
这里写图片描述

例子(黑点:real,绿线:Generator,蓝线:Discriminator):
这里写图片描述

实际中的问题:
这里写图片描述

Basic tutorial:
An introduction to Generative Adversarial Networks (with code in TensorFlow)
Image Completion with Deep Learning in TensorFlow
Generative Adversarial Nets in TensorFlow


李宏毅机器学习课程笔记

李宏毅机器学习课程笔记1:Regression、Error、Gradient Descent
李宏毅机器学习课程笔记2:Classification、Logistic Regression、Brief Introduction of Deep Learning
李宏毅机器学习课程笔记3:Backpropagation、”Hello world” of Deep Learning、Tips for Training DNN
李宏毅机器学习课程笔记4:CNN、Why Deep、Semi-supervised
李宏毅机器学习课程笔记5:Unsupervised Learning - Linear Methods、Word Embedding、Neighbor Embedding
李宏毅机器学习课程笔记6:Unsupervised Learning - Auto-encoder、PixelRNN、VAE、GAN
李宏毅机器学习课程笔记7:Transfer Learning、SVM、Structured Learning - Introduction
李宏毅机器学习课程笔记8:Structured Learning - Linear Model、Structured SVM、Sequence Labeling
李宏毅机器学习课程笔记9:Recurrent Neural Network
李宏毅机器学习课程笔记10:Ensemble、Deep Reinforcement Learning

2017-07-27 19:22:21 xzy_thu 阅读数 4610

台湾大学李宏毅老师的机器学习课程是一份非常好的ML/DL入门资料,李宏毅老师将课程录像上传到了YouTube,地址:NTUEE ML 2016
这篇文章是学习本课程第27-28课所做的笔记和自己的理解。


Lecture 27: Ensemble

Ensemble类似于“打群架”“大家一起上”,在Kaggle中是重要的方法。
Ensemble的Framework是:

  1. 先找到若干分类器,这些分类器是彼此不同;
  2. 再将这些分类器妥当地集合起来。

Ensemble的不同方法,是为了应对不同的状况。

Ensemble: Bagging

Bagging 是 Bootstrap Aggregation 的简写。

这里写图片描述
model变复杂时,error会先降后升,这是因为简单的model(underfitting)有小的variance、大的bias, 而复杂的model(overfitting)有大的variance、小的bias。如果模型很复杂,可以训练出多个复杂的模型,取平均,以减小variance,提高泛化能力。

这里写图片描述
实际中的做法是Bagging。在模型比较复杂(variance大、bias小)、比较容易overfitting时才用Bagging。其实NN不是很容易overfitting,而是卡在训练集上得不到好的结果,而像decision tree就很容易在训练集上很低(0%)的错误率、容易overfitting。
对decision tree做bagging就是random forest。

这里写图片描述
随机森林的做法:若是对训练数据重采样,那么得到的各棵树太像了。所以在每次分裂节点时随机限制哪些feature可用哪些feature不可用,避免各棵树长得太像。
Out-of-bag方法:假设现在有训练数据x1, x2, x3, x4,每次采样出部分数据训练function,如用x1, x2训练f1,用x3, x4训练f2,用x1, x3训练f3,用x2, x4训练f4。这样,x1没有被用于训练f2, f4,所以可用f2, f4组成随机森林来测试x1, 其余x2, x3, x4同理。
Out-of-bag (OOB) error是对测试集上错误率的一个很好的估计。
之前要切出验证集才知道在测试集上的错误率,而用OOB就不用验证集了,因为部分训练数据没有被包含在训练中,它们可以拿来当做验证集。

OOB样本可以用来估计变量的重要性
这里写图片描述

下面是单棵决策树和100棵决策树组成的随机森林用来拟合“初音函数”的结果:
这里写图片描述
Bagging并不是为了提升在训练集上的performance。在初音这个任务上并没有什么训练、测试,目标是看有多能拟合初音函数,与你的函数的泛化特性无关。所以现在加上随机森林并不能更加拟合初音函数,原来深度为5的单棵决策树不能拟合初音函数,那么加上随机森林还是不能拟合初音函数。但是Bagging可以让variance比较小,得到的function比较平滑。

Ensemble: Boosting

Bagging是要把已经很容易overfitting的model让它不那么容易overfitting。
Boosting是对没法fit训练数据的model, 想办法提升它的performance:Improving Weak Classifiers.

这里写图片描述
如果分类器在训练数据上有大于50%的正确率,那么在Boosting之后会得到100%的正确率。
Boosting的流程是:先有最初的分类器f1, 然后找到与f1互补的分类器f2,……
在Bagging中每个分类器都是独立的,训练时不相干,可以同时训练。而在Boosting中,要先训练完f1,再根据f1的特性训练f2……

这里写图片描述
在不同训练数据上训练就会得到不同的分类器,不同的训练数据一般通过re-weighting training data得到,实际上修改了目标函数。
Adaboost的做法就是,训练好f1后,调整training set的weight,让f1在新的training set上错误率达到50%, 再用新的training set训练f2……
调整training set的weight 的方法是,对f1正确分类的example, 其weight除以一个大于1的值;对f1错误分类的example, 其weight乘以相同的值,这个值可以计算出来。
这里写图片描述

Adaboost算法如下:
这里写图片描述
unt+1unt×exp(y^nft(xn)αt)
在aggregate classifiers时,用uniform weight的方式比较不好,因为不同的分类器有强弱之别。

下面证明随着T 的增大,H(x) 会在训练数据上取得越来越小的错误率。
首先给出训练错误率的upper-bound,然后证明这个upper-bound恰好等于1NZT+1,之后往证T,ZT+1
这里写图片描述

这里写图片描述
随着轮数T 的增加,H(x) 在训练数据上的错误率降为0,但是训练错误率为0之后,测试错误率还在继续下降。
我们将y^g(x) 作为margin,margin越“正”表示越正确。可见,5个分类器的组合已经有0%的训练错误率,但再增加新的分类器margin会被往右推,也就是说就算训练错误率为0,Adaboost也会继续放大margin。放大margin,相当于在减小penalty。

Adaboost是Boosting的特例,一般的Boosting算法是:
这里写图片描述
用gradient descent最小化objective function, 希望下图中两个红框中的项是同向的:
这里写图片描述

exp(...) 作为Gradient Boosting 的 loss function的话,所找出来的ft,αt 就是Adaboost中的ft,αt
Gradient Boosting是更一般化的想法,因为可以改loss function。

Gradient Boosting Interactive Playground

Ensemble: Stacking

这里写图片描述
注意训练数据的划分:前面的四个系统和final classifier要使用不同的训练数据。
final classifier决定各系统的weight.

参考阅读:A Kaggler’s Guide to Model Stacking in Practice

Lecture 28: Deep Reinforcement Learning


李宏毅机器学习课程笔记

李宏毅机器学习课程笔记1:Regression、Error、Gradient Descent
李宏毅机器学习课程笔记2:Classification、Logistic Regression、Brief Introduction of Deep Learning
李宏毅机器学习课程笔记3:Backpropagation、”Hello world” of Deep Learning、Tips for Training DNN
李宏毅机器学习课程笔记4:CNN、Why Deep、Semi-supervised
李宏毅机器学习课程笔记5:Unsupervised Learning - Linear Methods、Word Embedding、Neighbor Embedding
李宏毅机器学习课程笔记6:Unsupervised Learning - Auto-encoder、PixelRNN、VAE、GAN
李宏毅机器学习课程笔记7:Transfer Learning、SVM、Structured Learning - Introduction
李宏毅机器学习课程笔记8:Structured Learning - Linear Model、Structured SVM、Sequence Labeling
李宏毅机器学习课程笔记9:Recurrent Neural Network
李宏毅机器学习课程笔记10:Ensemble、Deep Reinforcement Learning

2017-04-09 14:05:52 xzy_thu 阅读数 6209

台湾大学李宏毅老师的机器学习课程是一份非常好的ML/DL入门资料,李宏毅老师将课程录像上传到了YouTube,地址:NTUEE ML 2016
这篇文章是学习本课程第10-12课所做的笔记和自己的理解。


Lecture 10: Convolutional Neural Network

Why CNN for Image

CNN的参数比全连接神经网络少得多,为什么CNN只用较少的参数就可以用于处理图像呢?这是因为图像具有以下三点特征:
1、一些模式比整张图片小得多,例如“鸟喙”就比整张图片小得多;
2、同样的模式可能出现在图像的不同区域,例如“鸟喙”可能出现在图片的左上方也可能出现在图像的中间;
3、对图像的降采样不会改变图像中的物体。
CNN的卷积层的设计对应着前两点,池化层的设计对应着第三点。
CNN

卷积层

理解卷积操作的动图
卷积是一种神经网络的连接方式:
conv
Shared weights: 同色的weight相等。
max pooling和flatten都很简单。

CNN in Keras

CNN in Keras

What does CNN learn?

上例中第二个卷积层有50个11x11的filter,它们的参数是学出来的,设第k个filter的活跃度为ak,固定参数,用梯度上升法求使ak 最大的input image。
得到的结果是,使各个filter活跃度最大的image是各种条纹。这层filter看的还是局部信息。
而使flatten后的FC层的filter活跃度最大的image,就显示出了各种轮廓,说明这些filter看的是整体信息。
这里写图片描述

固定参数,求input image,让output layer的各neuron的output最大,并没有得到期望中的数字图片,而是很杂乱的图像。(白色表示有墨水。)
对目标output加一个L1正则项,所得结果稍显数字轮廓。
这里写图片描述

Deep Dream 与 Deep Style 有着与之类似的思路。

Deep Dream 与 Deep Style

Deep Dream: 将一张image作为CNN的输入,将CNN某个hidden layer的output(vector)拿出来,让其中正的更正、负的更负,把它作为新的image的target.

Deep Style:
Deep Style
左边CNN filter output代表内容,后边的CNN的filter output之间的correlation代表风格。
要找一张image,其content (filter output)像左,style (output correlation)像右。

CNN的其它应用

阿尔法狗:棋盘作为image,有开篇所讲的前两个特点,但没有第三个特点,所以阿尔法狗没有pooling layer。
语音识别应用,CNN的filter只会在频谱的频率方向扫描,不会在时间方向扫描。
文本分类应用,CNN的filter只会在sentence matrix的时间方向扫描,不会在embedding dimension方向扫描。
所以,在具体场景应用CNN时,如何设计CNN的结构,需要考虑场景本身的性质特点。

Lecture 11: Why Deep?

在比较浅层网络与深层网络时,要让“矮胖”的网络和“高瘦”的网络的参数数目相等,这样比较才公平。
即便是在深层网络参数较少的情况下,深层网络也会比浅层网络表现好。
这是因为“深层”其实相当于“模组化”,第一个隐层是最基本的分类器,第二个隐层是用第一个隐层建造的分类器,以此类推。
modularization

浅层网络确实可以表示任意函数,但是使用深层结构更有效率。
好比逻辑门电路,用两层逻辑门就可以实现任何布尔函数,但是用多层结构更简单、需要的逻辑门更少。
神经网络也是如此,单隐层网络可以表示任何连续函数,但是多层结构表示起来更简单、需要的神经元更少,所以比较不容易overfitting,或只需较少的data。
而且,深层结构可以比较有效率地使用data。
analogy

1层hidden layer与3层hidden layer(相同数目的参数),3层的效果更好。
但理论上,3层可达到的效果,1层也能达到:要在1层learn的时候,target从真实label改为3层的output,这样1层的结果会接近3层的结果。

Lecture 12: Semi-supervised

半监督学习的训练数据,有一部分是标注数据,有一部分是无标注数据。
Transductive learning和Inductive learning都可算是半监督学习,区别在于前者的无标注数据是测试数据(除去label),而后者的无标注数据不包括测试数据。实际中用哪种常取决于是否有测试集。

无标注数据的分布会让我们做出一些假设,半监督学习有没有用就取决于假设是否合理。

生成模型的半监督学习Semi-supervised Learning for Generative Model

无标注数据有助于重新估计生成模型假设中的参数,从而影响决策边界。算法采用EM算法。
ml
EM的每次(E步、M步)都让likelihood增加一点。

低密度分离假设Low-density Separation Assumption

Self-training

从标注数据得到模型f(用什么方法都可以),将模型f 用于无标注数据得到伪标签,将一部分无标注数据连同伪标签移入标注数据中(选择那些无标注数据是开放性的,可以给每个伪标签一个信度),重复训练、再次得到f……
回归问题用self-training不影响f,所以回归问题不能用self-training方法。
self-training类似于生成模型的半监督学习,区别在于:self-training是硬标签,而Semi-supervised Learning for Generative Model是软标签。
对神经网络来讲,用软标签是没有用的。用硬标签就相当于用Low-density Separation Assumption(强制属于某一类,非黑即白)。

Entropy-based Regularization

如果神经网络的输出是一个分布,我们希望这个分布要集中。
Entropy-based Regularization

平滑假设Smoothness Assumption

假设特征的部分是不均匀的(在某些地方集中,某些地方分散),如果两个特征在高密度区域是相近的,那么二者的标签是相同的。
Smoothness Assumption
(两个“2”之间有各种2的变体,两个正侧面之间有45°侧面、正面等)
用聚类再标注的方法,可以,但是用像素做聚类结果不会很好,因为有的同类不像,有的异类相像。应该先用deep autoencoder抽feature,再做聚类。
也可以用图结构来表示高密度区域,图的建立与结果很关键。
这里写图片描述
定义s(xi,xj) 的时候,如果xi,xj 是图像,那么根据像素定义相似度结果应该不会好,用autoencoder抽feature比较好。
exp指数函数是必要的,可以带来比较好的performance,让距离稍远一点s就很小。
用基于图的方法需要data足够多,不然信息传不过去。
need enough data

定义平滑度,将其作为损失函数中的正则项:
smoothness
(计算smoothness不一定是在output算)

更优的表示Better Representation

精神:寻找在表面观察背后隐藏着的更好的表示。
Better Representation


李宏毅机器学习课程笔记

李宏毅机器学习课程笔记1:Regression、Error、Gradient Descent
李宏毅机器学习课程笔记2:Classification、Logistic Regression、Brief Introduction of Deep Learning
李宏毅机器学习课程笔记3:Backpropagation、”Hello world” of Deep Learning、Tips for Training DNN
李宏毅机器学习课程笔记4:CNN、Why Deep、Semi-supervised
李宏毅机器学习课程笔记5:Unsupervised Learning - Linear Methods、Word Embedding、Neighbor Embedding
李宏毅机器学习课程笔记6:Unsupervised Learning - Auto-encoder、PixelRNN、VAE、GAN
李宏毅机器学习课程笔记7:Transfer Learning、SVM、Structured Learning - Introduction
李宏毅机器学习课程笔记8:Structured Learning - Linear Model、Structured SVM、Sequence Labeling
李宏毅机器学习课程笔记9:Recurrent Neural Network
李宏毅机器学习课程笔记10:Ensemble、Deep Reinforcement Learning

没有更多推荐了,返回首页