简介
从DL的历史开始,结合机器学习的三板斧,讲解了FC的前向计算,最后给出了手写数字识别的例子。
DL很火,老师大概说了一下它能用的场景,给出了Jeff Dean(2009年当选美国工程院院士,2018年 4月3日,出任谷歌旗下搜索与人工智能(AI)业务部门的高级副总裁。)的一张ppt。
图中显示的是DL在谷歌内部的项目数量。
在线Latex公式
DL的发展
• 1958: Perceptron (linear model)
• 1969: Perceptron has limitation
• 1980s: Multi-layer perceptron
• Do not have significant difference from DNN today
• 1986: Backpropagation
• Usually more than 3 hidden layers is not helpful
• 1989: 1 hidden layer is “good enough”, why deep?
• 2006: RBM initialization (breakthrough),这里RBM相当于换了名字的NN,但是后来证明没啥用
• 2009: GPU
• 2011: Start to be popular in speech recognition
• 2012: win ILSVRC image competition
里面有些生词:
受限玻尔兹曼机,英文名字是Restricted Boltzmann Machine,简称RBM。
https://blog.csdn.net/u013631121/article/details/76652647
ImageNet Large Scale Visual Recognition Challenge是图像分类领域的比赛,也叫人工智能“世界杯”之称的ImageNet大规模视觉识别挑战赛。
DL三部曲
第一步
NN的结构
到这里接上一节课内容
Different connection leads to different network structures
Network parameter 𝜃: all the weights and biases in the “neurons”
总的来说,一个NN结构就是一个函数空间(function set)参数不一样得到的函数也不一样,不同的函数预测的效果也不一样。下面是要从这个NN结构代表的函数空间中找到一种衡量函数好坏的方法,最终选出最好的function。
不同的连接方式可以得到不同的网络结构,在这个神经网络里面,有一大堆的logistics regression,每个logistics regression都有它们自己的weight和bias,这些weight和bias集合起来就是这个神经网络的参数,记为:
θ
θ
θ
NN的结构中神经元neurons如何连接是我们自己设计的,最常见的是FC( 全连接前馈网络 Fully Connect Feedforward Network)NN
下面是输入经过第一层计算的结果(这里过了sigmoid函数):
上面0.98的计算是:算z=(11+(-1)(-2)+1)=4,带入σ函数即可。同理可以算出下面的结果:
当然,如果输入不一样,结果也不一样:
当一样NN的结构和参数都定了,就是定了一个function,它的输入和输出都是向量。上面的两个例子可以写为:
确定一个NN结构如果没有定参数就是一组函数(function set)
可以看到整个网络(包含参数)就是定义了一个function(这里没有复数s),它的输入和输出是向量。
如果只给出网络结构,没有给参数,就是定义了一个function set。参数当然是要learn出来的咯,不然为什么叫机器学习。
也就是说第一板斧和机器学习一样,也是决定一个function set,而且这个function set比之前学的linear regression或者logistics regression的function set更加复杂,按老师的说法是涵盖它们的。
FC小结
小结一下全连接前馈网络,并讲了神经网络里面的基本概念(输入层,隐藏层,输出层,神经元)
- 相邻两层每个neuron之间两两连接
- 输入到输出方向是从后向前的。
深度就是指隐藏层很多,现在只要是神经网络都归类于深度学习(隐藏层只有一层也算),上面给出了近几年网络层数的变化。
坑:152层的神经网络,当然不可能使用全连接的方式,需要使用特殊的连接方式(残差连接),以后会讲。
NN中的矩阵运算
NN这个结构之所以流行的一个非常重要的原因就是矩阵,在GPU上矩阵运算超快。
神经网络的计算可以转换为矩阵的操作,把之前的例子进行转换如下图所示:
可以写为:
一般化后,第一层的权重和bias可以集合起来写成
w
1
,
b
1
w^1,b^1
w1,b1,第二层写成
w
2
,
b
2
w^2,b^2
w2,b2,第L层写为:
w
L
,
b
L
w^L,b^L
wL,bL
输入:
x
1
,
x
2
,
.
.
.
,
x
N
x_1,x_2,...,x_N
x1,x2,...,xN可以写为
X
X
X
(这里和ng的深度学习课程里面符号用的差不多。)
可以看到最后的输出y实际上就是矩阵的递归,写成矩阵运算的方式可以方便GPU进行加速。
整个构架可以看做:
隐藏层:特征提取器,对输入层的特征提取、替换等特征工程操作
输出层:多分类器,对前面处理好的特征进行分类。这里用的softmax如果不记得可以看上一课笔记。
实例:手写数字识别
终于不是宝可梦拉。ppt对问题的输入和输出都讲得很清楚,就不多解释了。
输入:图片看做是向量
输出:
整个构架我们只定下来输入和输出,中间结构啥样还没定。和前面的传统机器学习不一样的是,这里我们需要决定网络的结构(有几个隐藏层,每个隐藏层有几个神经元)。
决定神经网络结构非常关键,如果网络结构不好,也就意味function set不好,如果function set没有包含好的function,那也没办法从中找到最优解!
如果用FC:
整个FC构架实际上是:A function set containing the candidates for Handwriting Digit Recognition.
我们需要:decide the network structure to let a good function in your function set.
FAQ
那我们如何选择隐藏层的数量,每层神经元的个数?这两个决定了结构,也就决定了function set。
答案:Trial and Error+Intuition
DL并没有比机器学习简单,只不过是将原来的问题换一个角度来看,原来传统机器学习会需要花大量的时间来进行特征处理或变换,而在神经网络中则不需要对特征进行特别处理,例如在图像处理的时候一般都直接把图像的像素作为特征直接作为输入层。在神经网络中主要工作在于确定网络的结构。
究其原因,类似语音识别或图像识别问题,特征自动提取往往比较困难,不如把工作放在确定网络的结构上反而比较容易。
从大局上来看,如果一个问题(语音识别、图片识别)的特征不好抽取,那我们选择让机器来帮我们抽取,我们只负责来决定如何定义NN模型的结构即可。如果问题的特征(类似NLP中的情感识别,我们手工定义正向词汇和负面词汇就可以获得不错的结果)很明显,那我们可以手工进行特征工程。
Q: Can the structure be automatically determined?
E.g. Evolutionary Artificial Neural Networks
Q: Can we design the network structure?
Convolutional Neural Network (CNN)
第二步
这里实际上还是要计算Loss,计算方式和之前上一节中讲的多分类(multi classification)问题是一样的,用的是交叉熵:
我们要调整参数,使得整个交叉熵越小越好。
也就是对所有的训练数据:
然后累加得到:
然后:
Find a function in function set that minimizes total loss L.
或者:Find the network
parameters
θ
∗
\theta^∗
θ∗ that minimize total loss L.
方法就是梯度下降
第三步
梯度下降的思路是用损失函数分别对每个参数进行偏导,然后得到梯度,结合学习率,进行参数的更新。这里的梯度下降和前面讲的梯度下降算法过程一样,但是这里的函数复杂一些(神经网络参数多啊)。
1.参数
θ
θ
θ中包含很多个参数
w
1
,
w
2
,
.
.
.
.
.
.
b
1
.
.
.
.
.
.
w_1,w_2,......b_1......
w1,w2,......b1......,先给它们一个随机初始值;
2. 接下来计算梯度(也就是每个参数对于total loss L的偏导数(
∂
L
/
∂
w
1
,
∂
L
/
∂
w
2
,
.
.
.
.
.
.
∂
L
/
∂
b
1
.
.
.
.
.
.
\partial{L}/\partial w_1,\partial{L}/\partial w_2,......\partial{L}/\partial b_1......
∂L/∂w1,∂L/∂w2,......∂L/∂b1......)),把所有的偏导(为什么老师叫偏微分-。-)集合起来就是梯度了。
集合起来写成向量形式:
最后问题就变成如何计算复杂函数中的偏导,其实就是下一节课的内容(反向传播:backpropagation)老师非常贴心的给出一些已经实现了的库,说在做作业的时候可以直接调用。
另外还给出一个链接:反向传播讲解专题(30mins)
还没详细看这个链接的内容,大概看了一下,应该是讲得很清楚,就是不知道这个讲解和下节课的内容有什么不一样。
最后的总(da)结(keng):为什么要深度学习?
2011年的实验表明,越深(层数越多)error越小(老师原话:performance越好,这里应该不能翻译为性能),究其原因是因为,层数越多,神经网络包含的参数越多,意味着model越复杂,说涵盖的function越多(函数空间越大),bias越小,如果training data足够多,variance可以控制得比较好,因此越deep越好~!
有这么一个已证明的理论:任何连续的函数(输入输出见下图),只要有足够的隐藏层神经元,就可以用一个隐藏层来表示这个函数。
那既然一个隐藏层就可以表达函数了,为什么还要deep learning呢?且听下回分解
参考资料
最后给出一些参考资料,都来自大牛:
Yoshua Bengio(深度学习三巨头之一,18年图灵奖获得者)
花书
另外一个,这个貌似有pdf版本,有兴趣的可以自己搜一下:
Michael Nielsen的神经网络与深度学习入门教程