Perenial youth.

ECNU 2019 NLP Spring_Seminar 第四讲 Introduction of Deep Learning&Backpropagation&Tips for deep learning

ECNU 2019 NLP Spring_Seminar 第四讲 Introduction of Deep Learning&Backpropagation&Tips for deep learning

课件链接:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html

Introduction of Deep Learning

Deep learning的发展史:

  • 1958:提出 Perceptron
  • 1969:指出Perceptron的局限性:无法实现异或,分类有时候很迷(比如要分类汽车模型却根据照片背景的天气不同而分类)
  • 1980:Multi-layer perceptron 多层感知器,其实跟现在的DNN差不多。
  • 1986:Backpropagation 隐藏层超过三层就没意义(train不出好的结果)
  • 1989:有人发现一层隐藏层就能model所有可能的结果,没有必要叠很多layer
  • 2006:RBM initialization(breakthrough)。如果用RBM来找梯度下降的初始点的话,就是现代的deep learning;否则就是80年代的multi-layer。数学虽然很复杂,不过后来发现其实没什么用。。。
  • 2009:GPU 大大加速了模型训练的过程(为什么能加速,是因为GPU的指令问题)
  • 2011:被引入语音识别
  • 2012:win ILSVRC image competition

Deep = Many hidden layers 多少层可以称为是deep其实不好说

其实这么多隐藏层的感觉有点像一连串特征的构建过程

最后一个layer后进行Softmax(把数值概率化)

Q:那么要有多少层,每一层多少个神经元呢?

A: 凭直觉和尝试。有时需要领域知识(domain knowledge)

传统机器学习,我们往往需要构建好的feature function。深度学习则可以直接丢原始input。但是实际上深度学习需要我们去构造好的network structure。因此,深度学习相当于把原本的问题转换成了另外一个问题。对语音识别和计算机视觉来说,深度学习往往要比传统机器学习好,因为语音识别和计算机视觉的特征离人很远,不是那么好构造,十分抽象;因此不如把学习的过程丢给机器。但是NLP上可能只是55开了。因为人对语言的特征抽取能力比较强。

Q:那么可不可以自动学习network structure呢?

A:可以。但是还不是很普及。

Universality Theorem: 一层隐藏层,只要节点个数足够多,就能拟合任何一个函数。所以有人说,deep learning只是一个噱头,“fat learning”即可。那么是不是这样呢?之后会说。

Backpropagation

其实也就是个链式法则。

Forward pass-Backward pass

算前向的过程实际上很简单,就是这一层的input,如下图:

算后向就是把每一项的第一个再提取出来。整个前向+后向的过程就像一个递归。算前面的必须先知道后面的。

但是算后向的过程实际上是有trick的。如果反过来算的话,就是一个动态规划。也就是先算最后面的偏微分的值然后依次存下来,再算前一个。

总结一下。反向传播就是一个前向加一个后向的过程。前向很简单,就是每层的input。后向的计算有trick,不用再分解成前向+后向(递归),而是先直接计算出最后面的值,然后依次往前计算即可(动态规划)。前向和后向都算出来以后直接相乘就OK。

Tips for Deep Learning

train好一个模型以后,要先在训练集上先看一下performance。因为可能会到极小值,在训练集上性能都不好。如果不好的话,再回头看三个步骤,看哪里可以做修改。

传统机器学习上,只要我们想,可以轻松的在训练集上得到100%正确的performance。但在深度学习上,不是那么简单的事情。

dropout的目的是让testing set的performance变好。如果在train上的性能已经不好了,则就不要再用dropout了。

那么如何提升在training data上的性能呢?

  1. 换activation function
  2. train的时候,可能层数越深,性能越差。这不是过拟合,因为在training data上的性能就已经变差了。这是因为梯度消失

归根结底这个是因为sigmoid function。sigmoid会使得input衰减。比如input是[负无穷到正无穷],但是output就变成了[-1,1]。每通过一层,都会衰减一次,因此到后面梯度就会变得非常非常小,小到计算机无法存储就梯度消失。

其实可以用dynamic的learning rate来解决这个问题。但是直接改activation function会更加治本。另一个常用的activation function是ReLU. ReLU在Input大于0的时候,是一个linear function,小于0的时候,就是0.因此更新只存在线性/不更新两种情况。不会梯度消失。虽然大于0的时候ReLU是线性的,但是整体来看不是线性的。

ReLU还有种种变形。比如Leaky ReLU, Parametric ReLU

最近还有一种常用的是Exponential Linear Unit(ELU)

也可以让network自动去learn activation function。(Maxout network)

Maxout function可以通过data来认出activation function。

问题又来了:这样一个函数显然不是所有地方都可以微分的。但是实际上也是可以train的。因为对于每一组input来说,输出就是一个线性的。把值小的z当做不存在,只看值大的z,然后微分。所以微观上也是linear的,宏观上是non linear的。

3. RMSProp. 又一种adaptive的梯度更新方法。

4. Momentum

我们知道,梯度下降只能找到局部最优值,其实这是和物理规律不一样的。物理规律上,得到梯度为0的时候,还会因为惯性再往前找一下。那么我们是否可以借鉴呢?可以。


考虑前一次的移动方向其实就是考虑了之前所有的移动方向。

通过以上的步骤,我们已经可以让training得到一个很好的结果。 那么怎么解决过拟合的问题呢?下面来说。

  1. Early Stopping. 训练的结果是要找到testing error最多的地方,而不是training error最小的情况。
  2. Regularization.
L2的结果里参数都会比较接近0,而L1则是有一些接近0,有一些则很大

regularization希望参数接近0比较好。这一点和early stopping很像。因此二者往往不需要同时用。

3. Dropout

每次dropout的结果都是在上一次dropout后weight更新的基础上进行的。每一个mini-batch都会dropout. M个minibatch可以产生2的M次方种不同的网络。

testing时:
1. 不dropout。只有在训练的时候才dropout。 2. 所有的权重都要乘以(1-p%)

举了很直觉的理由。。比如做小组左右的时候,有一些人会摆烂,因此我们要好好做, 因为有些人会摆烂;但是实际上测试的时候没有人摆烂,因此大家一起做的就很好。。

Dropout is a kind of ensemble。

为什么权重要乘以(1-p%)呢?在activation function是linear的时候,两者成立;

就算不是linear的,不是完全等于,性能也不错。

xinyu

目前为止有一条评论

一天一个机器学习概念(三)——激活函数 – XinyuJiang's Blog 发布于3:20 下午 - 5月 23, 2019

[…] ECNU 2019 NLP Spring_Seminar 第四讲 Introduction of Deep Learning&Backpropagation&Tips … […]