李宏毅 机器学习 2016 秋:7、Brief Introduction of Deep Learning

2023-11-10

7、Brief Introduction of Deep Learning

Deep learning 现在非常的热门,所以,它可以用在什么地方,我觉得真的还不需要多讲,我觉得大家搞不好都知道得比我更多,我相信如果你随便用 deep learning 当作关键字,胡乱 google 一下,你就可以找到一大堆的、exciting 的 result,所以,我们就直接用这个图呢,来简单地 summarize 一下这个趋势,这个图呢,是 google 的 Jeff Dean,它在 sigmoid 的一个 keynote speech 的一张投影片,那这个图想要表达的事情是这样,横轴代表时间,从 2012 的 Q1 到 2016,纵轴代表说在 google 内部,有用到 deep learning 的 project 的数目,那可以发现说,这个趋势,是从几乎 0 到超过 2000,所以,这个使用 deep learning 的 project 数目呢,是指数成长的,那如果你看它的应用的话,它有各种不同的应用,涵盖几乎你可以想像的领域,比如说,Android, Apps, drug discovery,Gmail, Image understanding, Natural language understanding,Speech, 各种不同的应用,通通有用到 deep learning,那 deep learning 可以做的应用实在是太多了,我们这边就不要花时间来讲这些东西,如果要讲这些东西的话呢,再用两三堂课,其实也是讲不完的,那这个随便 google 就有的东西呢,我们就不要再讲了。

我们来稍微回顾一下,这个 deep learning 的历史,在历史上呢,它是有经过好几次的沉沉浮浮,首先,在 1958 年,有一个技术叫做 Perceptron 被提出来,Perceptron 这个技术,它也是一个 linear 的 model,它非常非常像我们在前一堂课讲的 Logistic Regression,它只是没有 sigmoid 的部分,但它还是 linear 的 model,那一开始,有人提出这个想法的时候,提出 Perceptron 这个想法的时候呢,大家非常非常的兴奋,这个是 Frank Rosenblatt,在海军的 project 里面提出来的,他一开始提出来的时候,大家觉得非常非常兴奋,那个时候要做 Perceptron 的运算呢,如果你看 Bishop 的教科书,里面有一张的机器呢,看起来是房间那么大的机器,那个时候,New York Times 据说还写了一个报道说,从此以后,人工智慧就要产生了,电脑可以自己学习,就像现在这个样子。

可是后来呢,MIT 有一个,有人呢,就写了一本教科书,这本教科书的名字就叫做 Perceptron,这本教科书里面,他就指出了 linear 的 model,是有极限的,就像我们在上一张投影片讲的,linear model 有很多事都办不到,就像是我们刚才举的那么简单的 example,它都办不到,然后大家希望就破灭了。

然后,当时在 1958 年,刚提出 Perceptron 的时候呢,有各种惊人的 application,就像现在 deep learning 一样,有人就说,我用了 Perceptron,结果我可以分辨说,给我一张照片,那照片里面有坦克,或是一般的卡车,那它可以正确地分辨说,哪些照片里面是坦克,哪些照片里面是卡车,就算那些坦克被藏在丛林里面,就算被树木盖住呢,也侦测得出来,那其他人就觉得说,太厉害了,这就是人工智慧,可是既然 Perceptron 有这样的,后来大家就发现说 Perceptron 其实很多 limitation,那怎么可能分辨卡车跟坦克,这么复杂的 object 呢?所以,有人就去把那个 data,再拿出来看了一下,就发现说,原来卡车跟坦克的照片,是在不同的日子所拍摄的,所以,一天是雨天,一天是晴天,所以,这个照片本身的亮度就不一样,所以,Perceptron 它唯一抓到的东西,就只有亮度而已,所以大家就崩溃了,这个方法的名字就臭掉了。

后来就有人想说,既然一个 Perceptron 不行,我能不能连接很多个 Perceptron,就像我们刚才讲的,Logistic Regression,都接在一起,它应该就很 powerful,这个就叫做 Multi-layer 的 Perceptron,事实上,1980 年代,Multi-layer 的 Perceptron 它的技术,基本上在 1980 年代的时候呢,就都开发得差不多了,那个时候已经开发完的技术,其实就跟今天的 deep learning,是没有太 significant 的差别的。

然后,有一个关键的技术是 1986 年的时候,Hinton propose 的 Backpropagation,那其实同时也有很多人 propose Backpropagation,只是大部分人把这个 credit 归给 Hinton 的 paper,他那篇 paper 是比较著名的,但是,在这个时候遇到的问题就是,通常超过 3 个 layer 的 neural network,你就 train 不出好的结果,通常一个还可以,再多你就 train 不出好的结果了。

那后来在 1989 年,有人就发现了一个理论,就是说,一个 hidden layer,其实就可以,model 任何可能的 function,了解吗?只要一个 neural network 有一个 hidden layer,它就可以是任何的 function,它就已经够强了,所以根本没有必要叠很多个 hidden layer,所以,这个 Multi-layer 的 Perceptron 的方法,又臭掉了。然后,大家就比较喜欢做 SVM。

那这个方法就臭掉了,据说那一阵子呢,Multi-layer 的 Perceptron 这个方法,也有人叫它 neural network 这个方法,它就像是一个脏话一样,写在 paper 里面,那个 paper 一定被 reject,后来呢,有人就想到一个突破的点,关键的地方就是,把它改个名字,这个方法已经臭掉了,只好改一个名字,把它改成 deep learning,整个就潮起来了,所以我讲说,改名字其实是有很大的力量的。

很多人觉得说,有一个关键的技术是,应该在 2006 年提的,用 Restricted Boltzmann Machine 做 initialization,很多人觉得说,这是个突破这样,甚至有一阵子呢,大家的认知是,到底 deep learning 跟 1980 年代的 Multi-layer Perceptron 有何不同呢?它的不同之处在于,如果你有用 RBM 做 initialization,你在做 Gradient Descent 的时候,不是要找一个,初始的值吗?如果你是用 RBM 找的,叫 deep learning,你没有用 RBM 找的,是传统的 1980 年代的 Multi-layer Perceptron,后来呢,大家逐渐意识到说,因为 RBM 这个方法呢,非常的复杂,假设你是 machine learning 的初学者的话,你看这个 paper,我相信你是看不懂的,它是有用到一些比较深的理论,大家觉得说,哇!这个这么复杂,一定就是非常的 powerful 啊,而且它不是 Neural network base 的方法,它是 graphical model,它这个大家觉得说,这个这么复杂,我们看都看不懂,这个一定是有用的,后来大家逐渐试来试去以后,就发现说,这招其实没什么用这样子,你可以发现说,如果你读 deep learning 的文献,现在已经不太有人用 RBM 做 initialization 了,因为这一招带给我们的帮助呢,并没有说特别大,连 Hinton 自己都知道这点, 他在某篇 paper 里面提过这件事情,只是大家可能都没有注意到那篇 paper 就是了。

但是他有个最强的地方,它最强的地方就是它让大家,重新、再一次对这个 model 有了兴趣,因为它很复杂,所以大家就会开始想要研究,deep learning 是什么样的东西,花很多力气去研究,所以,其实我听过有一个,google 的人对 RBM 的评论,他说这个方法就是石头汤里面的石头,石头汤的故事大家听过吗?就有 有一个士兵,他到一个村庄里面借宿,然后,他说:我要煮一碗石头汤,然后,大家都说:你要怎么煮一碗石头汤?我用石头就可以了,就用石头煮一碗汤,如果再加点盐就更好了,就加点盐,再加点米就更好了,再加点米,再加点菜就更好了,再加点菜,然后,就煮了一锅汤,大家就觉得好好喝,用石头就可以煮汤这样,但是,那个石头其实并没有什么作用,所以,其实 RBM 就类似这种东西。

然后,我觉得有一个关键的突破是在 09 年的时候,我们,知道要用 GPU 来加速,这件事情还颇关键的,过去如果你做 deep learning,train 一次,一周就过去了,然后,结果实验又失败,你就不会想做第 2 次了,其实,我多年前有跟一个学弟试着想要做 deep learning,可是,那个时候还不知道叠很多层,那个时候大家都叠一层,直觉想法就知道说,一定要叠很多层啊,怎么会只有叠一层?所以想说,我们来把它叠很多层吧,然后,我们就开始做,train 一次要一周,train 完以后,结果没有比较好,就没有人想要再继续做下去了,本来想找专题生做,专题生也都不想做,就没有人要做,这个题目就没有人要做了,那个时候我们把他好好做出来的话,我们现在就发了,不过那时候,我们不知道要用 GPU,所以,train 一次要一周,想要做出来也是很难,现在有 GPU 以后,本来要一周的东西,你可能几个小时,就可以马上看到结果了。

那在 11 年的时候,这个方法被引入到语音辨识里面,语音辨识发现说,这招果然很有用,然后,开始疯狂地用 deep learning 的技术,到 12 年的时候呢,这个 deep learning 的技术,赢了一个很重要的 image 的比赛,所以,在 image 那边的人 也疯狂地用 deep learning 的技术。

其实,deep learning 的技术并没有,很复杂,它其实非常简单,我们之前讲说,machine learning 就是 3 个 step,那其实 deep learning 也一样就是这 3 个 step,讲说 deep learning 就这 3 个 step,就好像是在说,把那个大象放进冰箱一样,大象放进冰箱,大家知道吗?把门打开,把大象赶进去,把冰箱门关起来,就把大象放进冰箱了,deep learning 是很简单的,你其实可以非常快的了解,其实你可以秒懂它,其实在 deep learning 里面,我们说,在 machine learning 里面第一个 step,就是要 define 一个 function,这个 function,其实就是一个 Neural network,那这个 Neural network 是什么呢?

我们刚才已经讲说呢,我们把这个 Logistic Regression 呢,前后 content 在一起,然后把一个 Logistic Regression 称之为 Neuron,整个称之为 Neural Network,我们其实就得到了一个 Neural Network,那我们可以用不同的方法,来连接这些 Neural Network,我们就得到了不同的 structure,在这个 Neural Network 里面,我们有一大堆的 Logistic Regression,每个 Logistic Regression,它都有自己的 weight,跟自己的 bias,这些 weight 跟 bias 集合起来,就是这个 network 的 parameter,我们这边用 θ θ θ 来描述它,那这些 Logistic Regression,或这些 Neuron,我们应该怎么把它接起来呢?

有各种不同的方式,怎么连接,其实是你手动去设计的,是你手动去连接的,最常见的连接方式叫做 Fully Connected Feedforward Network,在 Fully Connected Feedforward Network 里面呢,你就把你的 Neuron 排成一排一排,这边有 6 个 Neuron,就两个两个一排,然后,每一组 Neuron,它都有一组 weight,都有一组 bias,那这个 weight 跟 bias 是根据 training data 去找出来的,假设上面这个蓝色 Neuron 它的 weight 是 1, -2,它的 bias 是 1,下面呢,它的 weight 是 -1, 1,它的 bias 是 0,假设我们现在的输入,是 1 跟 -1,那这两个蓝色的 Neuron 它的 output 是什么呢?这个做一下小学生会做的运算,你就可以得到答案,通过 sigmoid function 以后,你得到的结果呢,就是 0.98,那下面呢,你把 1 ∗ ( − 1 ) + ( − 1 ) ∗ 1 + 0 1*(-1)+(-1)*1 + 0 1(1)+(1)1+0,再通过 sigmoid function 以后,你就得到 0.12。

接下来,假设这一个 structure 里面的每一个 neuron,它的 weight 跟 bias,我们都是知道的,那我们就可以反覆进行刚才的运算,再通过这两个 neuron,变成 0.86 跟 0.11,再通过这两个 neuron,得到 0.62 跟 0.83,所以,输入 1 跟 -1,经过一串很复杂的转换以后呢,就得到 0.62 跟 0.83。

那如果你输入是 0 跟 0 的话,你得到的 output 就是,经过一番一模一样的运算,你得到的是 0.51, 0.85,所以,一个 neural network 你就可以把它看作是,一个 function,如果一个 neural network 里面的参数,weight 跟 bias 我们都知道的话,它就是一个 function,它的 input 是一个 vector,它的 output 是另一个 vector,举例来说,我们刚才看到说 input 是 [1, -1],output 是 [0.62, 0.83],input 是 [0, 0],output 是 [0.51, 0.85],所以,一个 network,如果我们已经把参数设上去的话,它就是一个 function,如果我们今天还不知道参数,我只是定出了这个 network 的 structure,我只是决定好这些 neuron 间,我们要怎么连接在一起,这样子的一个 network structure,它其实就是 define 了一个 function set,对不对?我们可以给这个 network 设不同的参数,它就变成不同的 function,把这些可能的 function 通通集合起来,我们就得到了一个 function set,所以,一个 neural network 你还没有认参数,你只是把它架构架起来,你决定这些 neuron 要怎么连接,你把连接的图画出来的时候,你其实就决定了一个 function set,这跟我们之前做的东西都是一样的,我们之前也是做 Logistic Regression, Linear Regression,我们都是也决定了一个 function set,那这边呢,我们也只是换一个方式,来决定 function set,只是如果我们用 neural network 决定 function set 的时候,你的 function set 是比较大的,它包含了很多原来你做 Logistic Regression,做 Linear Regression 所没有办法包含的 function。

那刚才讲的是一个比较简单的例子,在这个例子里面呢,我们把 neuron 分成一排一排的,然后说每一排的 neuron 都两两互相连接,蓝色 neuron 的 output 都接给红色,红色的都接给绿色,绿色后面没有别人可以接了, 所以它是整个 network 的输出,蓝色前面没有其他人了, 所以它就是整个 network 的输入。

那 in general 而言呢,我们可以把 network 画成这样,你有好多好多排的 neuron,你有第 1 排、第 2 排…到第 L L L 排,很多排 neuron,每一排 neuron 它里面的 neuron 的数目,可能很多,比如 1000 个、2000 个啊,这个 scale,那这边每一颗球,代表一个 neuron,在 layer 和 layer 之间的 neuron,是两两互相连接的,layer 1 它的 neuron 的 output 会接给,每一个 layer 2 的 neuron,那 layer 2 的 neuron 的 input 就是所有 layer 1 的 output,因为 layer 和 layer 间,所有的 neuron 都有两两连接,所以它叫 Fully Connected 的 Network,那因为现在传递的方向是从 1 到 2,从 2 到 3,由后往前传,所以它叫做 Feedforward Network,那整个 network 呢,需要一个 input,这个 input 就是一个 vector,那对 layer 1 的每一个 neuron 来说,每一个 neuron,它的 input,就是 input layer 的每一个 dimension,那最后第 L L L 的那些 neuron,它后面没有接其他东西了,所以,它的 output 就是整个 network 的 output。

假设第 L L L 排有 M M M 个 neuron 的话,它的 output 就是 y 1 , y 2 y_1, y_2 y1,y2 y M y_M yM,这边每一个 layer,它是有一些名字的,input 的地方,我们叫做 input layer,严格说起来,input 其实不是一个 layer,它跟其他 layer 不一样,它不是由其他 neuron 所组成的,但是,我们也把它当作一个 layer 来看,所以,叫它 input layer,output 的地方,我们叫它 output layer,其余的部分,就叫做 hidden layer,那所谓的 deep 是什么意思呢?

所谓的 deep 就是有很多 hidden layer,就叫做 deep,那有人就会问一个问题,说要几个 hidden layer,才叫做 deep learning,这个就很难说了,有人会告诉你说,要 3 层以上才叫做 deep,有人会告诉你说,要 8 层以上才叫做 deep,所以就看每一个人的定义,都不一样,本来没有 deep learning 这个词的时候,大家都说:我在做 neural network,通常都只有一层,自从有 deep learning 这个词以后,有一层的人,都说他在做 deep learning 这样,所以,现在基本上只要是 neural network base 的方法呢,大家都会说是 deep learning 的方法,那到底可以有几层呢?在 2012 年的时候,参加 ImageNet 比赛得到冠军的 AlexNet,它有 8 层,它的错误率是 16.4 %,大家可能都知道说,它比第二名的好非常多,第二名的 error rate 是 30%,到 14 年的时候,VGG 有 19层,它的 error rate 降到 7%,GoogleNet 有 22 层,它的 error rate 降到 6.7%。

但是,这个都还不算什么,Residual Network 152 层这样,如果它跟 GoogleNet, VGG, AlexNet 比起来,它大概是长这个样子,它的 error rate 是 3.57%,如果你看 Benchmark Corpus 的话,其实,它这个 performance 是比人在同一个 test 上做的还要好,你可能会很怀疑说,人怎么可能会在影像辨识上输给机器呢?

因为那个 test 其实还满难的,它给你一张图,一张狗的图,你光回答狗并不是正确答案,你要回答哈士奇这样子,那个 test 其实还蛮难的,但其实为了要公平的比较,当时,在人跟机器比较的时候,那些人是有事先看过 training data 的,也就是说,你有先让它训练辨识不同狗的种类,不同花的种类、不同猪的种类,只是经过训练以后,它还是没有机器那么强就是了,那这个是跟 101 做一下比较,这个我们之后再讲,那 Residual Network 呢,它不是一般的 Fully Connected Feedforward Network,如果你用一般 Fully Connected Feedforward Network,搞在这个地方,其实结果是会有问题的,它不是 overfitting,而是 train 都 train 不起来,所以,你其实要特别的 structure,才能搞定这么深的 network,这个我们之后再讲。

那 network 的运作呢,我们常常会把它用 Matrix Operation 来表示,怎么说呢,我们举刚才的例子,假设第一个 layer 的两个 neuron,他们的 weight 分别是 1, -2, -1, 1,那你可以把 1, -2, -1, 1 排成一个 matrix,把这个 1, -2, -1, 1 排成一个 matrix,那当我们 input 1, -1 要做运算的时候,运算过程如图所示,算出来就是 [4, -2],就是通过 activation function 之前的值,就是 4, -2,然后,通过这个 sigmoid function,然后在这个 neural network 的文件里面,我们把这个 function 称之为 activation function,事实上,它不见得是 sigmoid function,因为到现在,大家都换成别的 function,如果你是从 Logistic Regression 想过来的话,你会觉得它是一个 sigmoid function, 但现在已经较少用 sigmoid function,假设我们这边用的是 sigmoid function 的话呢,我们就是把 4, -2 丢到 sigmoid function 里面,接下来算出来,就是 0.98, 0.12, 所以,一个 neural network,一个 feedforward network,它的一个 layer 的运算,你从 1, -1 到 0.98, 0.12,你做的运算就是把 input 乘上 weight,加上一个 bias 所成的 vector,再通过一个 sigmoid function,得到最后的结果。

所以,以 general 来说,一个 neural network,假设我们说第一个 layer 的 weight,全部集合起来,当作一个 matrix, W 1 W^1 W1,这个 W 1 W^1 W1 是一个 matrix,把它的 bias 全部集合起来,当作一个 vector, b 1 b^1 b1,把第二个 matrix 的 weight 全部集合起来,当作 W 2 W^2 W2,把它的每一个 neural 的 bias 集合起来,当作 b 2 b^2 b2,到第 L L L 个 layer,所有的 weight 集合起来,变成 W L W^L WL,bias 集合起来,变成 b L b^L bL,那你今天给它一个 input x x x 的时候,output 的这个 y y y 要怎么算出来呢?

我们假设我们把 x 1 , x 2 x_1, x_2 x1,x2, 到 x N x_N xN,接起来,变成一个 x x x,那这个 output 的 y y y 要怎么把它算出来呢?你就这样算, x ∗ W 1 + b 1 x * W^1 + b^1 xW1+b1,再通过 activation function,然后,你就算出第二排这些 neuron 的 output,我们称之为 a 1 a^1 a1,接下来呢,你做一样的运算,把 a 1 ∗ W 2 + b 2 a^1 * W^2 + b^2 a1W2+b2,再通过 activation function 以后,就得到 a 2 a^2 a2,然后,就这样一层一层的做下去到最后一层,你把 a L − 1 ∗ W L + b L a^{L-1} * W^L + b^L aL1WL+bL 通过 activation function 以后,得到这个 network 的最终 output y y y,所以,整个 neural network 的运算其实就是,一连串 matrix 的 operation,就是这个 function。

所以,一个 neural network,实际上做的事情就是一连串的,vector 乘上 matrix ,再加上 vector,就是一连串我们在线性代数就有学过的:矩阵运算,那把这件事情写成矩阵运算的好处就是,你可以用 GPU 加速,实际上呢,现在一般在用 GPU 加速的时候,这个 GPU 的加速并不是,真的有去对 neural network 做什么特化,现在有一些特别的技术有做特化,但是,如果你 general 是买那种玩游戏的显卡的话,那它是没有对这个 neural network 做什么特化,那你实际上拿来加速的方式是,当你需要算矩阵运算的时候,你就 call 一下 GPU,叫它帮你做矩阵运算,这会比你用 CPU 来算还要快,所以,我们在写 neural network 式子的时候,我们习惯把它写成 matrix operation 的样子,那里面如果有需要用到矩阵运算的时候,就 call GPU 来做它,那这整个 network,我们怎么看待呢?

我们可以把它到 output layer 之前的部分,看作是一个 feature 的 extractor,这个 feature extractor 就 replace 我们之前,要手动做 feature transformation 这件事情,所以,你把一个 x x x input,通过很多很多 hidden layer,在最后一个 hidden layer 的 output,每一个 neuron 的 output, x 1 , x 2 x_1, x_2 x1,x2, 到 x K x_K xK,你就可以把它想成是一组新的 feature,那 output layer 做的事情呢?

output layer 就是一个 Multi-class 的 Classifier,这个 Multi-class Classifier,它是拿前一个 layer 的 output,当作 feature,这个 Multi-class Classifier, 它用的 feature 不是直接从 x x x 抽出来的,它是经过很多个 hidden layer,做很复杂的转换以后,抽出一组特别好的 feature,这组好的 feature 可能是能够被 separable,经过这一连串的转换以后呢,它们可以被用一个简单的 layer 的,Multi-class Classifier 就把它分类好,那我们刚才其实有讲过说,Multi-class Classifier 它要通过一个 sigmoid function,而不要通过一个 Softmax function,对不对?因为我们把 output layer 也看作是 一个 Multi-class Classifier,所以,我们最后一个 layer 也会加上 Softmax,一般你在做 neural network 的时候呢,是会这样做。

示范一下做这个例子,就 input 一张 image,它是一张手写的数字,然后 output 说这个 input 的 image,它对应的是什么?,那在这个问题里面,你的 input 是一张 image,但对机器来说,一张 image 就是一个 vector,假设这是一个解析度 16 ∗ 16 16*16 1616 的 image,那它有 256 个 pixel,对 machine 来说,它就是一个 256 维的 vector,那在这个 image 里面呢,每一个 pixel 就对应到其中的 dimension,所以,右上角这个 pixel 就对应到 x 1 x_1 x1,这个就对应到 x 2 x_2 x2,右下角的就对应到 x 256 x_{256} x256,如果你可以说,有涂黑的地方就是 1,那没有涂黑的地方,它对应的数字就是 0,那 output 呢?

neural network 的 output,如果你用 Softmax 的话,那它的 output 代表了一个 probability distribution,对不对?所以,今天假设 output 是 10 维的话,你可以把这个 output 看成是,对应到每一个数字的机率, y 1 y_1 y1,代表了 input 这张 image,根据这个 neural network 判断,它是属于 1 的机率,那你就实际上让 network 帮你算一下说,每一个 input 加上数字属于 image 的机率是多少?假设属于数字 2 的机率最大是 0.7,那你的 machine 就会 output 说,这张 image 它是属于数字 2。

那在这个 application 里面, 假设你要解这个手写数字辨识的问题,那你唯一需要的就是一个 function,这个 function input 是一个 256 维的 vector,output 是一个 10 维的 vector,而这个 function 就是 neural network。

所以,你只要兜一个 neural network,你可以用简单的 feedforward network 就好了,兜一个 neural network, 它的 input 有 256维、是一张 image,它的 output 你特别设成 10 维,这 10 维里面,每一个 dimension,都对应到一个数字,如果你做这样的设计,input 是 256 维,output 固定是 10 维的话,那这一个 network,它其实就代表了一个可以拿来做手写数字的 function,这个 function set 里面呢,这个 network 的 structure 就 define 了一个 function set,这个 function set 里面,每一个 function 都可以拿来做手写数字辨识,只是有些做出来结果比较好,有些做出来结果比较差,那接下来你要做的事情就是,用 Gradient Descent 去找一组参数,去挑一个最适合拿来做手写数字辨识的 function,那在这个 process 里面呢,我们需要做一些 design,之前在做 Logistic Regression,或是 Linear Regression 的时候,我们对 model 的 structure 是没有什么好设计的,但是,对 neural network 来说,我们现在唯一的 constraint 只有 input 要是 256 维,output 要是 10 维,但是中间要有几个 hidden layer,每一个 hidden layer 要有多少的 neuron,是没有限制的,你必须要自己去设计它,你必须自己去决定说,我要什么 layer,每个 layer 要有多少的 neuron,那决定 layer 的数目,和每一个 layer 的 neuron 数这件事情,就等于是决定了你的 function set 长什么样子,你可以想像说,如果我今天决定了一个差的 function set,那里面没有包含任何好的 function,那你之后在找最好的 function 的时候,就好像是,大海捞针,结果针不在海里这样,怎么找都找不到一个好的 function,所以,决定一个好的 function set,其实很关键,你就决定这个 network 的 structure,是很关键的。

讲到这边,总是会有人问我一个问题,假设我们今天让 machine 来听我的 talk,然后,叫它 predict 之后会有什么问题的话,它一定可以预测接下来的问题,那我们到底应该要怎么决定 layer 的数目,还有每一个 layer 的 neuron 的数目呢,这个答案,就是我不知道这样子,这个问题很难,就好像问说怎么成为宝可梦大师一样,这只能够凭著经验和直觉这样,这个 network structure 要长什么样子,就是凭着直觉还有多方的常识啊,然后,后续想办法找一个最后的 network structure。

找 network structure 这件事情,并没有那么容易,它有时候是满困难的,有时候甚至需要一些 domain knowledge,所以,我觉得从非 deep learning 的方法,到 deep learning 的方法,我并不认为 machine learning 真的变得比较简单,而是我们把一个问题转化成另一个问题,就本来不是 deep 的 model,我们要得到好的结果,你往往需要做 Feature Engineering,也就是做 Feature Transform,然后找一组好的 feature,但是,如果今天是做 deep learning 的时候,你往往不需要找一个好的 feature,比如说,做影像辨识的时候,你可以直接把 pixel 丢进去,过去做影像辨识的时候,你需要对影像抽一些 feature,抽一些人定的 feature,这件事情就是 Feature Transform,但是有 deep learning 之后,你可以直接丢 pixel 硬做。

但是,今天 deep learning 制造了一个新的问题,它所制造的新的问题就是, 你需要去 design network 的 structure,就你的问题变成本来抽 feature,转化成怎么抽、怎么 design network structure,那我觉得 deep learning 是不是真的好用就 depend on,你觉得哪一个问题比较容易,我个人觉得如果是,语音辨识或是影像辨识的话,design network structure 可能比 Feature Engineering 容易,因为,虽然说我们人工会看、会听,但是,这件事情它太过潜意识了,它离我们意识的层次太远,我们其实不知道,我们无法意识到,我们到底是怎么做语音辨识这件事情,所以,对人来说你要抽一组好的 feature,让机器可以用很方便的用 linear 的方法做语音辨识,这件事对人来说很难,因为根本不知道好的 feature 长什么样子,所以,还不如 design 一个 network structure,或是尝试各种 network structure,让 machine 自己去找出好的 feature,这件事情反而变得比较容易,我觉得对影像来说,也是一样,那对其他 case 来说,我觉得就是 case by case。

那再来就是有人会问说,能不能够自动学 network 的 structure,其实是可以的,你可以去问余天立老师,就是在基因演算法那边,有很多的 technique,是可以让 machine 自动的去找出 network structure,不过这些方法,目前还没有非常的普及,你看到那些非常惊人的应用,比如说,AlphaGo 什么的阿,都不是用这些方法所做出来的,那还有一个常问的问题就是,我们能不能自己去设计 network 的 structure,我可不可以不要 fully connected,我可不可以说,第一个连到第三个,第二个连到第四个,就自己乱接,可以,一个特殊的接法就是 Convolutional Neural Network,这个我们下一堂课再讲。

那接下来,第二步,第二步跟第三步真的很快,我们等一下就秒讲这样子,第二步是什么呢?

要定义一个 function 的好坏,在 Neural Network 里面,怎么决定一组参数它的好坏呢?就假设给定一组参数,我要做手写数字辨识,所以,我有一张 image,跟它的 label,然后,把这张 image 呢,这个 label 告诉我们说,因为你现在是一个 Multiclass classification 的问题,所以,今天这个 label 1,告诉我们说,你现在的 target 是一个 vector,你现在的 target 是一个 10 维的 vector,只有在第一维,对应到数字 1 的地方,它值是 1,其他呢,都是 0,那你就 input 这张 image 的 pixel,然后,通过这个 neural network 以后呢,你会得到一个 output,那这个 output,我们就称之为 y y y,我把我们的 target,称之为 y ^ \hat y y^,接下来你要做的事情就是,计算这个 y y y y ^ \hat y y^ 之间的 cross entropy,就跟我们在做 Multiclass classification 的时候,是一模一样的,我们就计算 y y y y ^ \hat y y^ 之间的 cross entropy。

然后,接下来我们就是要调整 network 的参数,去让这个 cross entropy 越小越好,当然你整个 training data 里面, 不会只有一笔 data,你有一大堆的 data,你有第一笔 data,那它所算出来的 cross entropy 是 C 1 C^1 C1,第二笔 data 算出来是 C 2 C^2 C2,到第 N N N 笔 data 算出来是 C N C^N CN,那你会把所有 data 的 cross entropy 全部 sum 起来,得到一个 total loss, L L L

然后,你接下来要做的事情就是,在 function set 里面,找一个 function,它可以 minimize 这个 total loss,或者是找一组 network 的 parameter,现在写成 θ ∗ θ^* θ,它可以 minimize 这个 total loss,怎么解这个问题?

怎么找一个 θ ∗ θ^* θ minimize 这个 total loss 呢?你用的方法就是 Gradient Descent,Gradient Descent 大家已经太熟了,没有什么好讲的,实际上,在 deep learning 里面用 Gradient Descent,跟 Linear Regression 那边没有什么差别,就一模一样,所以,你要做的事情,只是 function 变复杂而已,其他东西都是一样的,也就是说,你的 θ θ θ 里面是一大堆的参数,一大堆的 weight 跟一大堆的 bias,你先 random 找一个初始值,random 给每一个数字一个初始值,接下来呢,去计算一下它的 Gradient,计算每一个参数,对你 total loss 的偏微分,那把这些偏微分全部集合起来呢,叫做 Gradient,有了这些偏微分以后,你就可以更新你的参数,你就把所有的参数,都减掉一个 learning rate,这边写成 μ μ μ,乘上偏微分的值,你就得到一组新的参数。

这个 process 就反覆进行下去,你有了新的参数,再计算一下它的 Gradient,然后,再根据你的 Gradient,再更新你的参数,你就得到一组新的参数,按照这个 process,继续下去,这个都是我们讲过的东西,你就可以找到一组好的参数,你就做完 neural network 的 training 了。

所以,其实就这样子啦,deep learning 的 training 就这样子,就算是最潮的 AlphaGo,也是用 Gradient Descent train 的啦!所以,大家可能会想像说,如果是 deep learning 的话,machine 的 learning 应该是这样子,其实上,我们知道说,Gradient Descent 就是玩世纪帝国,所以其实是这个样子,然后,希望你不要觉得太失望,然后,你可能会问说,那这个 Gradient Descent 的 function 式子长什么样子呢?之前我们都手把手的把那个算式算出来给大家看,但是,在 neural network 里面,因为 function 比较复杂,所以,如果我们要手把手的算出来给大家看,是比较难,需要花一些时间。

其实,在现代这个时代,我还记得几年前,在做 deep learning 很痛苦,因为你要自己 implement Backpropagation,那现在呢,你应该已经没有人自己 implement Backpropagation 了,因为有太多太多太多的 toolkit,可以帮你算 Backpropagation,所以,你就算不会算这个微分,Backpropagation 就是算这个微分的一个比较有效的方式,因为参数非常多嘛,你有 million的参数,你没有办法为每个 million 的参数都算微分,这太花时间了,Backpropagation 是一个比较有效率的算这个微分的方式。

那最后,我们有一个最后的问题,为什么我们要 deep learning?

你可能直觉地说这个答案很简单啊,因为越 deep,performance 就越好,这个是一个很早年的实验,这个是 2011 年,Interspeech 里面的某一篇 paper,他做的是 word error rate,word error rate 是越小越好,你会发现,每个 hidden layer,2k 个 neuron,word error rate 是24.2,那越来越 deep 以后,它的 performance,error rate 就越来越低,但是,如果你稍微有一点 machine learning 的常识的话,这个结果并没有让你太 surprise 啊,因为,本来,model 越多的 parameter,它 cover 的 function set 就越大,它的 bias 就越小,对不对?你今天如果有越多的 training data,你有够多的 training data 去控制它的 variance,一个复杂的 model,一个参数比较多的 model,它 performance 比较好,是很正常的啊,那变 deep 有什么特别了不起的地方?

有一个理论是这样告诉我们,这个理论是这样说的,任何连续的 function,假设任何连续的 function, 它的 input 是一个 N N N 维的 vector,它 output 是一个 M M M 维的 vector,它都可以用一个 hidden layer 的 neural network 来表示,只要你这个 hidden layer 的 neuron 够多,它可以表示成任何的 function,那既然一个 hidden layer 的 neural network,它可以表示成任何 function,而我们在做 machine learning 的时候, 我们需要的东西就只是一个 function 而已,既然 hidden layer 就可以表示任何 function,那做 deep 的意义何在呢?

没有什么特别的意义啊,所以有人说,deep learning 就只是一个噱头而已,就是做 deep 感觉比较潮,如果你只是把它变宽,变成 fat neural network,那感觉就太虚弱了,所以它没有办法引起大家的注意,所以,我们要做 deep learning,真的是这样吗?这个我们在往后的 lecture,再来告诉大家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

李宏毅 机器学习 2016 秋:7、Brief Introduction of Deep Learning 的相关文章

  • Kafka拉取某一个时间段內的消息

    一般来说我们都使用Kafka来记录用户的操作记录以便后续分析 但是通常使用的时候需要按天来统计每天的去重用户数 点击量之类的 这个时候如果直接拉某个topic的数据的话 就需要判断每个消息的时间戳 还要兼顾把所有的Partition都拉完才
  • 考试系统服务器考试机,考试系统

    考试系统为 B S 结构 考试中心需具备 Win2000 服务器且安装 IIS5 0 的软件环境和一定规模的局域网硬件环境 视参加考试的学员人数决定 客户端须安装 IE5 0 或以上浏览器版本 本系统从技术上充分考虑了考试过程的完整性和安全
  • 为自己量身打造一个 Rust 项目模板/脚手架

    摘要 quick start rs quick start a rust project 是用于快速创建一个 rust 项目的脚手架 模板 标题 为自己量身打造一个 Rust 项目模板 脚手架 深度参考 Rust Code Quick St
  • 【运维工程师笔试试题】

    一 选择题 1 下列系统默认端口号错误的是 A SSH端口22 B mysql端口3306 C Telnet端口20 D Https端口443 2 linux系统中查看ip地址的命令是 A ipconig B ifconfig C icmp

随机推荐

  • java编写es搜索程序

    开发环境 java8 springboot pom文件导入依赖
  • 前端HTML网页之间传递数据多种办法,附代码案例

    先看效果 目前常用的有三种办法 session传递 cookie传递 url传递 url会暴露参数 其余的两个是保存在服务端和浏览器中 不会暴露在地址栏里面 使用url 下面依次介绍 一 session传递 index html h1 We
  • 微服务连接云端Sentinel 控制台失败及连接成功后出现链路空白问题(已解决)

    sentinel控制台服务器部署在云端 首先打算在本地启动微服务连接云上的sentinel 发现仅能注册进服务 却不能显示监控信息和链路信息 查询日志后发现 云上的sentinel只能从注册中心拿到微服务 但是还是没有真正的连上8179端口
  • CSS—— @keyframes 动画关键帧

    disc 动画名 可自定义 keyframes disc from transform rotate 0deg to transform rotate 360deg 说明 keyframes 1 from to 用于简单动画 只有起始和结束
  • 我是如何从不知道怎么写,到完成二十万字书稿的?

    一 去年过年的时候 父母从乡下来到我在洛阳的家 晚上陪他们看完新闻联播后 我忍不住激动的心情 特意把北航出版社给我签的书稿 Web全栈开发进阶之路 合同捧出来给他们看 并郑重其事地介绍了一番 我以为他们会大吃一惊 像孙权对吕蒙那样对我刮目相
  • 双层双向长短期记忆神经网络(bi-LSTM)的多输入时间序列回归预测——附代码

    目录 摘要 研究背景 滑动时间窗口的构建 双层双向长短期记忆神经网络构造 程序计算结果 本文Matlab代码分享 摘要 为了充分挖掘电力负荷与多维特征因素的非线性关系 提高负荷预测精度 提出了一种基于随机森林和双向长短期记忆 Bi LSTM
  • hp服务器显示完logo就黑屏,惠普电脑开机出现惠普标志后 便黑屏了是为什么

    惠普电脑开机出现惠普标志后黑屏的原因及解决办法 一 原因 1 内存条 显示器 显卡等硬件设备接触不良 2 电脑灰尘比较多使得散热不良致使CPU或显卡芯片温度过高而死机 3 恶意病毒入侵 破坏系统 4 系统文件损坏 二 解决办法 1 检查显示
  • 数据传输-零拷贝机制

    传统 IO 在开始谈零拷贝之前 首先要对传统的 IO 方式有一个概念 基于传统的 IO 方式 底层实际上通过调用read 和write 来实现 通过read 把数据从硬盘读取到内核缓冲区 再复制到用户缓冲区 然后再通过write 写入到so
  • Tensorflow新手通过PlayGround可视化初识神经网络

    北京 上海巡回站 NVIDIA DLI深度学习培训 2018年1月26 1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 gt
  • 【网络基础】通俗易懂的搞明白什么是IP地址(小白向)

    目录 前言 IP协议 IP地址 查看IP地址的方法 公有IP地址与私有IP地址 IP地址的分类 网络路由传输流程简化版 IP地址过去的分类 过去分类带来的问题 前言 由于博主是一个刚转行没多久的前端 所以本次的文章也是面向像我一样的小白 内
  • ADS1220调试

    最近在调试ADS1220已经调试成功 后续补全此文 有问题联系我qq625895734
  • 电子病历与HIS的区别以及发展前途

    电子病历与HIS的区别以及发展前途 袁永福 http www xdesigner cn 2006 12 16 以下是我个人观点 可能有不足或错误 基本介绍 医院信息管理系统 History Information System 简称HIS
  • SimpleFOC移植STM32(七)—— 移植STM32F405RGT6

    目录 说明 一 点亮LED 1 1 原理图 1 2 硬件准备 1 3 烧写 二 开环控制 2 1 硬件准备 2 2 硬件连接 2 3 打开工程 2 4 修改参数 2 5 编译下载 观察运行 三 角度读取 3 1 硬件准备 3 2 硬件连接
  • 概要设计文档编写规范

    原文链接 https blog csdn net nengyu article details 3758312 做软件到一定层次了 就要考虑到设计了 设计了很久 就是不系统 系统的设计需要一个记录 记录就用文档 那么对项目所有包括技术上的设
  • HTML5-长按事件

    div style width 100 div style width 90 height 200px background color CCC font size 48px 长按我 div div
  • OpenGL编程入门

    1 用Ubuntu开发OpenGL程序 http www linuxidc com Linux 2011 09 42146 htm 2 Ubuntu下搭建OpenGL开发环境 HelloWorld http eddiezh iteye co
  • 最近接触的技术汇集帖

    最近在网上查资料碰到好多没接触过的技术 先汇总在这里备用 以后慢慢吸收 1 JNA JNI的替代品 调用方式比JNI更直接 不再需要JNI那层中间接口 几乎达到Java直接调用动态库 2 SmallSQL 基于JDBC3 0转为Deskto
  • vue中动态修改style(修改伪元素样式),样式中使用data里面的数据

    需求 伪元素高度使用data中的变量 对其进行动态修改 实现 css less中使用变量的方式 声明css变量的时候 变量名前面要加两根连词线 变量名大小写敏感 header color和 Header Color是两个不同变量 var 函
  • C++中的类——构造函数

    一 什么是构造函数 每个类都分别定义了它的对象被初始化的方式 类通过一个或几个特殊的成员函数来控制其对象的初始化过程 这些函数叫构造函数 构造函数的任务是初始化类对象的数据成员 无论何时只要类的对象被创建 就会执行构造函数 二 构造函数的定
  • 李宏毅 机器学习 2016 秋:7、Brief Introduction of Deep Learning

    文章目录 7 Brief Introduction of Deep Learning 7 Brief Introduction of Deep Learning Deep learning 现在非常的热门 所以 它可以用在什么地方 我觉得真