Introduction of deep learning
从逻辑回归引导到深度学习,李宏毅教授在前一节课生动形象地给我们稍微介绍了一下神经网络的模样,今天就正式介绍一下deep learning是什么,它的发展历史,以及deep learning的三板斧,马上进入正题!
深度学习的历史发展
要了解一样东西,我们必须要先从它的历史发展开始,知道它出现的原因以及它对我们产生了什么影响。
上图已经把历史线画出来了,我就简单描述一下内容:
- 1958年:人们感觉人工智能要来了,因为linear model的出现,它可以做到一些稍微复杂的分类和预测问题,当时他们也叫这个技术为Perceptron,感知器
- 1969年:有人终于发现了linear model有缺点,研究了一下为什么“坦克与卡车”的图像分类为什么如此精确,原来是因为两组图片的拍照时间不一样,而机器是通过其亮度作为特征来分类的
- 1980年代:多层感知机,尝试使用多层的感知机(与现在的deep learning基本没有差别)
- 1986年:出现了反向传播,但是发现超过3层就不太有用了
- 1989年:有人认为,一个隐藏层就足够成为任何的function,这段时间多层感知机被各种嫌弃,所以人们才给它换了个名字,就是深度学习
- 2006年:RBM initialization被认为是大突破,这个非常复杂,用于梯度下降初始化值,最后发现复杂但是没啥用
- 2009年:知道要用GPU来加速深度学习的模型训练
- 2011年:被用在语音辨识中,发现很好用
- 2012年:赢得了ILSVRC图像比赛,做图像的人也开始用Deep Learning
深度学习的三板斧
- Step1 : 神经网络
- Step2 : 模型评估
- Step3 : 选择最优函数
你会发现其实和传统机器学习非常相似,就是把第一步从自己定义function set换成了自己设计神经网络的架构
Step1:神经网络Neural Network
之前我们说过,用逻辑回归把它们连接在一起,一个逻辑回归称之为Neuron神经元。神经网络有很多不同的连接方式,从而产生不同结构。
每一个逻辑回归(神经元)都有自己的weight和bias,我们把所有的weight和bias的集合称为network的参数
θ
\theta
θ。
那我们应该怎么把神经元接起来呢?是有多种方式的
完全连接前馈神经网络
feedforward叫前馈,也叫前向,顾名思义,就是信号流动是单方向的,从前面往后流向,直到输出层,其中任意两层之间的连接没有反馈。
上面的图假设神经元是sigmoid函数,已知权重和偏差是多少,直接计算结果,然后放入神经元中,计算出一个新的结果,继续往后传播
- 输入是(1,-1),知道所有的weight和bias,输出的结果
- 输入为(0,0), 知道所有的weight和bias,输出的结果
所以我们可以把一个权重和偏差都知道的神经网络看成一个function,输入是一个向量vector,输出是另一个向量vector。
如果我们不知道参数,只是知道network structure,就等于是定义了一个function set,我们可以给上面的结构的参数设置为不同的数,就是不同的function。
神经网络的特点是它可以包含以前的linear model无法包含的function,因为它的function set很大,能表达出以前不能表达的情况
- 全连接:因为layer1与layer2的神经元是两两互相连接的
- 前馈 : 传递方向是由从后(layer1)往前(layerL)传
输入是个向量 x N x_N xN,每个值都会成为layer1每个神经元的输入,而Layer L后面没有神经元了,所以如果输出需要有M个维度,它的输出就是 y M y_M yM
输入叫input layer,输出叫output layer,它们叫layer但是没有神经元,其实中间的layer叫hidden layers,有神经元。所谓的Deep,就是很多层hidden layers,那究竟多少层才叫Deep呢?
多少层才叫Deep呢?
2012 AlexNet:8层 (图像比赛冠军)
2014 VGG:19层
2014 GoogleNet:22层
2015 Residual Net:152层
101 Taipei:101层
Residual Net不是fully connected的网络,如果是的话,会train不起来,所以会有一些特别的structure在里面。比较深的网络都需要特别的结构
Matrix operation矩阵运算神经网络
随着层数变多,错误率降低,随之运算量增大,通常都是超过亿万级的计算。对于这样复杂的结构,我们一定不会一个一个的计算。所以引入呢矩阵运算来提高效率和速度:
我们把一层的所有weight写成一个矩阵,
[
1
−
2
−
1
1
]
\left[ \begin{array} { c c } { 1 } & { - 2 } \\ { - 1 } & { 1 } \end{array} \right]
[1−1−21]
bias写成一列向量,
[
1
0
]
\left[ \begin{array} { l } { 1 } \\ { 0 } \end{array} \right]
[10]
输入也是向量,
[
1
−
1
]
\left[ \begin{array} { c } { 1 } \\ { - 1 } \end{array} \right]
[1−1]
就能直接计算了,看上图~
其中神经元里的function,不一定是sigmoid function,而我们叫这些function为激活函数activation function,现在已经很少用sigmoid来当做激活函数
所以多层的神经网络,就是把前一层计算出来的结果作为输入,嵌套进入第二层,以此类推:
这样写成矩阵运算的好处是,你可以使用GPU加速
隐藏层和输出层的作用
神经网络通过隐藏层来提取特征,替代了原来的特征工程(即我们手动选择特征),在隐藏层最后一层输出的就是新的特征,而输出层就拿着这些新的特征作为输入,通过一个多分类器(softmax函数),得到最后输出y
例子:手写数字识别
输入:是一张图片,假设是16x16的图片,那么输入是一个256维度的向量。每个pixel对应一个dimension,有颜色用(ink)用1表示,没有颜色(no ink)用0表示
输出:10个维度,每个维度代表一个数字的置信度(属于某个数字的概率),2的概率最大,是0.7,说明这张图片是2的可能性就是最大的
要完成数字识别,我们需要一个function,就是神经网络啦
唯一的限制是,输入是256维,输出是10维,但是我们需要自己决定有多少层layer,一层有多少个neuron,即这个神经网络的结构,神经网络的结构决定了函数集(function set)
- 怎么设计结构?
只能不断尝试+直觉的方法来进行调试。
(DL让我们从手动提特征转化到设计网络结构)
对于语音识别和影像识别,深度学习是个好的方法,因为特征工程提取特征并不容易。 - 能否自动设计结构?
进化人工神经网络(Evolutionary Artificial Neural Networks)但是这些方法并不是很普及 - 可以自己设计网络结构吗?
可以啊!CNN就是不错设计结构,卷积神经网络
Step2:模型评估
评估模型的方法与我们之前使用的方法一样,都是采用Loss function来反映model的好坏,而神经网络采用的是交叉熵函数来对
y
y
y和
y
^
\hat y
y^的损失进行计算,调整参数,使得交叉熵越小越好!
我们有很多training的数据,所以计算的是全部训练数据的Loss,然后加起来,得到Total Loss L,然后从function set中找到一组函数使得L最小,即找到神经网络参数
θ
∗
\theta^*
θ∗使得L最小
Step3: 选择最优函数
又见到了老朋友gradient descent,具体的计算流程是:
- 随机产生初始值给到 θ \theta θ,
- 然后计算每个参数对total loss 的偏微分,偏微分组合起来就是gradient( ∇ L \nabla L ∇L),
- 所有参数减去(学习率乘以偏微分的值),然后迭代迭代迭代…
你会发现这就是人人吹捧的深度学习,其实好像也不是非常的高难度,只是计算量很大,以及计算很复杂,所以我们也不会自己去计算,而是通过一些toolkit去计算
在神经网络中计算损失最好的方法就是反向传播,Backpropagation是计算微分比较有效的方式,而我们有很多工具可以帮助我们计算
最后思考:层数越多越好?
这是一个早年的实验,越deep,错误率越低,其实通过直觉也可以猜测到结果,因为越复杂,参数越多,表现就越好,参数多的model拟合数据很好是很正常的
普遍性定理
这里有一个通用的理论:对于任何一个连续的函数,都可以用足够多的隐藏层来表示。
如果真的是这样,那还要深度学习干嘛,直接一层网络就好了呀?到底这只是可噱头,还是deep真的有用呢?以后的课程会慢慢讲解~
深度学习拓展知识:
•My Course: Machine learning and having it deep and
structured
http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLSD15_2.html
•6 hour version 李宏毅tutorial : http://www.slideshare.net/tw_dsconf/ss62245351
•“Neural Networks and Deep
written by Michael Nielsen
http://neuralnetworksanddeeplearning.com/
•“Deep Learning”
written by Yoshua Bengio , Ian J. Goodfellow and Aaron
Courville
•http://www.deeplearningbook.org