Lec-6 Why Deep - Machine Learning (台大李宏毅)
本文为台大李宏毅的机器学习入门课程笔记。
第六章:什么是深度学习
重点:
- 深度学习与机器学习的区别
Deep learning的热度就不再赘述了
History 深度学习的沉沉浮浮

有趣的点
- 一开始perceptron刚出现的时候,有人用它来识别卡车和汽车,发现识别的效果非常好,即使当车被树遮盖的时候,也能识别。但是之后人们渐渐意识到perceptron是个线形model,存在局限时,就开始反思为什么这个工作能这么机智的识别连人都很难识别的遮挡物体呢?于是发现,原来卡车和汽车的拍摄时间不同,所以光线不同,机器只是单纯的识别图片的光线就能对卡车和汽车进行分类。所以大家对perceptron的幻想就破灭了
- 后来就想到要用多层神经网络。但是发现最多加到3层,不然计算不出来,所以又卡住了
- 再后来有人发现,只要一层就够了。一层就能模拟任意多层的行为,所以为什么要有这么多层呢?
- 后来人们将努力的方向转向起始点的选择。因为一开始梯度下降的起始点是任意的,后来就想到用RBM作为初始的选择点。但是其实是换汤不换药,因为并没有本质上的提高
- 直到GPU的应用,才使得多层神经网络又火了起来。因为原本需要一个星期才能跑出来的结果,现在只需要几个小时,大大提升了效率;而且层数也可以往上增加了
深度学习三步走
还记得机器学习的三个步骤嘛?

其实深度学习也是这三个步骤,只是在此基础上做了一些调整。

其实可以看到也就是第一层的model变成了NN而已。。
Step 1 Neural Network
Fully Connected Network-Feedforward
以全连接前向网络为例。
如果一个NN的参数都知道的话,就可以把NN看作一个function;如果参数未知,只定义了NN的结构时,就当作了一个function set。这与原来机器学习的function set其实是一样的,只是比较复杂而已 :p

所以我们就可以把它们抽象成这样:

其中,每一个圆圈都是一个neuron,代表一种运算;第一层称为input layer,最后一层称为output layer,中间的所有层既有输入、也有输出,称为hidden layers。
那Deep learning的Deep到底是什么呢?
Deep = Many hidden layers
现在到底几层才算deep呢?这是depend on 你的定义的。毕竟deep learning也只是NN改了个名字而已。。最高的塔已经堆到了152层了,所以就像是搭积木一样

那么我们可以把每一层的运算看作一个矩阵操作:

可以看到,一个input矩阵(蓝色)经过hidden layer的权重(黄色)再加上bias(绿色),最后经过激活函数$\sigma$ (activated function),就可以得到这一层的输出(也就是下一层的输入,蓝色)。
这样的话,把整个NN结合起来看就是:

就是一连串的矩阵运算。 那之所以用矩阵运算的方式的时候,就可以用到GPU来做加速就好了
中间的hidden layers就可以当作feature extractor,可以使我们免于繁杂的feature engineering。
一般会把最后的输出加上一层softmax,使得最后分类的结果再一次加强,让大的更大,小的更小。

一个例子
假设有一个手写识别的问题。输入是一个16*16的像素图,要输出这个手写数字是多少。那么每一个输入的像素(总共256个)就看作256维的特征,然后经过deep learning,输出的是该输入属于每一个class的概率(总共有10个分类:0-9)。可以看到,输出的概率中,第二类的概率为0.7,是最高,所以判定为类别2。


在这个example中,我们只知道限制输入为256维,输出是10维,但是中间的结构是需要设计的。那么如何设计中间的结构呢?
Q1: 那么,如何设计中间的结构呢?
A1: 基于经验/ 基于误差/ 基于常识或本能
Q2: 那么Deep learning是不是比machine learning更简单呢?
尽管deep learning不用feature engineering了,但是它带来了新的问题,就是如何设计中间的结构。比如手写识别和图像,因为人类做这个问题,是比较基于潜意识的,我们并不是很知道具体我们用到了什么特征,是数拐点的个数嘛?还是看弧线呢?我们不知道我们具体看到了什么特征,但是只知道我们就是能知道这是什么字。所以我们就把这个问题丢给NN,让它自己去尝试参数去理解。
Step 2 & 3 Gradient descent & Find best

那怎么找这个total loss 的最优解呢?还是用gradient descent!

但是现在不太可能自己手动去算,而是有很多现成的toolkit可以直接用:

So, why deep?
有一个universality theorem说,只要一层的神经网络就能模拟其他所有层了,那还要这么多层干什么呢?

那原因呢,会在以后的lecture中讲到 :p