李宏毅深度学习(2017)

5.深度学习模型的基础结构(Basic Structure)

2019-02-18  本文已影响48人  SpareNoEfforts


本节大纲


5.1 全连接层(Fully Connected Layer)

什么是全连接层?
  以下是第l-1和第l层,如图,a_i^l表示在第l层中的第i个神经元的输出,是一个scaler;我们把每一层中所有的神经元集合起来,即:a ^l表示在第l层中的所有神经元的输出,是一个vector;

  在神经网络的层与层之间有一个weight,我们表示为:w_{ij}^l,其中l表示这个权重连接了l-1层和l层,下标ij表示该权重连接了第l-1层的第j个神经元和第l层的第i个神经元。箭头的起始和终止位置是从右向左,具体原因是有深意的,我们接下来探讨。
  这个权重矩阵可以排列如下图所示:矩阵的高是l(第l层有l个神经元),宽是l-1(第l-1层有l-1个神经元)。

  如下图所示:是偏差bias。

  接下来,我们要算两个输出a_i^l a_j^{l - 1}之间的关系。在此之前,我们要计算激活函数的input:z_i^l,即在层 l的神经元i的激活函数的输入;z^l代表:在层 l的所有神经元的激活函数的输入。
  z_i^l与前一个layer的output的关系是这样子的:前一层所有的神经元与其权重相乘再加上bias就是:z_i^l = w_{i1}^la_1^{l - 1} + w_{i2}^la_2^{l - 1} + ... + b_i^l = \sum\limits_{j = 1}^{{N_{l - 1}}} {w_{ij}^la_j^{l - 1} + b_i^l}

  接下来,我们要计算z^l:我们先把每个z列出来,然后做一下整理,变成矩阵向量的形式。如下所示:


下图为推导的过程:

  接下来就是l层的神经元的输入输出的关系,即:a^l=\sigma(z^l) 这是把z^l里面的每一个元素放入激活函数,成为a^l

  最后把这些公式串上来,就得到:



5.2 循环结构(Recurrent Structure)

  过去有一种讲法,是说:Recurrent Structure就是给神经网络加上memory,使之有了记忆。我们今天不用这个讲法。
  所谓Recurrent Structure就是把同一个structure反复的应用。好处就是:就算输入是一个复杂的 sequence,我们需要的不同种类的(?flag?)并不会随着input sequence 的长度而改变。不管输入多少sequence, network需要的参数量永远都是一样的。

  以下这个资料作为参考:


  给定义函数f,这个函数有两个输入向量h,x,输出两个向量h’,y。RNN的精神就是这个函数要反复的被使用,即接下来的输入要经过同样的函数f,把上一个output作为下一个的input。需要注意的是:hh’ 有同样维度的向量。如此循环下去,可见,network需要的参数量永远都是一样的。

  为什么不用feedForward network,因为我们输入的sequence可能会比较长,这样的话feedForward network可能就会参数很多,容易导致过拟合。
  RNN在处理sequence方面比较好的是:可以需要较少的参数来解决问题,不容易造成过拟合,但是比较难train,但是你一旦在training data上获得比较好的结果,在testing data上的效果通常也不会差。
  当然,RNN当然可以是deep的。给定两个多个函数,f_1f_2……注意维度该一样的必须要一样。

  Bidirectional RNN(双向RNN)也没有什么差别。这个需要第三个function,如下图所示,f_3函数存在的目的是合并前两个函数的结果。至于f_1f_2不必一样,你可以随便设计。

  以下是Pyramidal RNN (金字塔型RNN)。我们有一个输入序列x_1,x_2,...,x_T,,非常长,第一层(图中的最底层)是Bidirectional RNN,如下图所示,这个是直接用sqe2sqe的语音识别。第一层是bi-rnn,第二层是将若干个第一层的输出(合起来)作为输出,也是bi-rnn,这样做的好处是可以把后面层的sequence缩短。后面都这样下去。这种结够比单纯的深度bi-rnn更容易训练。第二层block虽然需要处理若干第一层block的输出,但是这种法有利于做并行加速。RNN很难做并行,因为下一个节点必须得等第一个节点的输出才能进行,而pyramidal rnn里高层的block,串行变短了,每个block中虽然运算量较大,但是可以用并行运算加速。

以下是最简单的RNN。我们来看一下f的结构:将输入h,x分别乘上一个矩阵,再经过sigmoid函数得到h’,然后y是通过h’算出的,如下图所示:

  现在流行的RNN是LSTM。对比naive RNN来看,输入不一样。在LSTM中,h^{t-1}c^{t-1}扮演着不同的角色;什么意思呢?c变化是很慢的,也就是说c^{t}c^{t-1}加了一些东西形成的;但是h变化是很快的。c变化较慢,可以记住时间比较久的信息。

  我们来看一下LSTM的架构。
  - 三个inputx^th^{t-1}c^{t-1}
  - 三个outputy^th^{t}c^{t}

  运算的时候,把x^th^{t-1}并在一起,变成一个较长的vector,然后乘上一个矩阵w,结果经过激活函数tanh,得到z,这个得到的结果跟x^th^{t-1}单独乘w的结果是一样的。同理,乘上四个不同的矩阵,得到四个不同的z,z^i,z^f,z^o,作为LSTM 的输入。

  至于c^{t-1},有什么作用呢?有时候可以把c^{t-1}h^{t-1}接在一起,这件事情叫做peephole。理论上此时vector变成三个输入的合并,变长了,那w也要变宽。但是实际上,对应到c的部分,这个橙色部分的矩阵变成diagonal(对角线)的(对角矩阵),简化运算,得到z。同理,可以得到z,z^i,z^f,z^o

  有了以上四个结果z,z^i,z^f,z^o后,接下来,我们要做的事情是:如图所示的运算:其中⊙是指element-wise的相乘(表示两个向量的对应元素相乘)。
  z_i是输入门,决定了z的哪些信息流入,z_f是遗忘门,决定c_{t-1}的哪些信息遗忘。

  如下所示:是由两个LSTM单元的连接方法,反复进行这个操作。

  如下图所示:除了LSTM之外,也许有取代LSTM趋势的单元叫做GRU,(Gated recurrent units )
  大架构来看,他和 naive RNN 很像,但是内部是很像LSTM 的:

  GRU的好处就是:少了一个门,运算量少,避免过拟合。
  (如下图所示:粗的箭头表示一个matrix,左边有四个matrix,GRU只有三个)


简化版的语音识别任务,每一段声音识别成一个因素即可,多分类问题。
使用单项RNN有一个有效的trick是 Target Delay
在原始声音信号(frame)右端补若干个零(图中是3个),在识别时标签向后延后若干位开始做识别。


以上任务在若干种方法的实验效果


纵轴是分类正确率,横轴Window size是(如果是MLP)是指:如果input是一排frame(每个frame的声音信号可能只有0.01秒),每次判断时将前后若干frame拼接起来作为一个比较长的vector去判断中间一个frame的标签是什么。图中MLP方法的Window size为10时效果最好。
横轴target delay是(如果是RNN或LSTM)是指label往右shift几个frame。

上面这个图的横轴是训练的轮数,从图中可以看出LSTM的训练速度比RNN更快
下面这个图是LSTM的各种架构跑的结果。论文名字叫LSTM 漫游。尝试了各种各样的LSTM架构和参数。

横轴是错误率,纵轴是训练时间。不同的颜色代表不同的LSTM架构,相同的颜色不同的点代表同样的架构,不同的参数。


后面三个MUT1、MUT2、MUT3使用基因算法去寻找最佳的RNN结构,使用LSTM和GRU的结构为初始基因,使用不同的组合去找。


还有一个比较经典的RNN结构,普通的RNN受输入长度的限制。输入过长时,内存或显存放不下。而下面这个结构Stack RNN输入可以无限长,它是将输入每N个取出来放到一个function里,输出需要放入stack存储的information(下图绿色的方块),同时输出push、pop、nothing操作。具体详见论文吧。



5.3 卷积/池化层(Convolutional/Pooling Layer )

  卷积/池化层的设计目的也是为了简化我们的神经网络。所需的参数量比全连接层要少。

5.3.1 卷积层

  卷积层有2个特性:Sparse ConnectivityParameter Sharing
  举个例子:如下图所示:1-5是前一层的output,1-4是后一层的output;
  如果是全连接层,后一层的output会考虑前一层所有的output。
  如果是卷积层,第一个特性Sparse Connectivity,每一个神经元只连接部分前一层的输出:

  第二个特性Parameter Sharing,具有不同感受野(receptive fields)的神经元可以使用相同的参数集,远比全连接层更少的参数:

  将神经元1和3视为“过滤器1”(内核1);【filter又叫做kernel】同理,将神经元2和4视为“过滤器2”(内核2);如下图所示,filter的大小是3;滑动的步长是2。
如下面的图中,我们定义了两个feature map,红橙黄连线上的参数是共享的,蓝绿连线上的参数是共享的。


  接下来举一些例子。教科书有六类,分别为:输入是1、2、3维,然后每一种状况分别分为单通道和多通道;
  下面,我们来看看1维输入和单通道的情况~
  比如声音信号和股票价值波动即为1维输入和单通道的情况。

  下面,我们来看看1维输入和多通道的情况~
  比如输入是一个文档,多通道是指在一个dimension上的时间点,我们并不是用一个值value去描述,而使用一个向量去描述,这个向量的每一个dimension就代表了不同的channel。eg:每一个词汇( 比如like)可以用word embeding或者one hot encoding 去描述。
  滑动窗口在整个向量上滑动。

  下一个例子,我们来看看2维输入和单通道的情况:
  


以下是padding,如果没有做padding的话,做卷积的时候会少考虑一些边缘的地方,所以image会越做越小,因此可以做zero padding。

上面是卷积的概念,在卷积神经网络中,还有一个重要的概念是池化:Pooling,即将前一个layer的k个神经元的输出变为一个输出,池化的方法有平均法、最大值法和L2法。

视频中还讨论的一个点是,我们该拿前一个layer的哪些output 进行池化呢,可以是同一个feature map出来的,也可以组合不同feature map出来的。

同一个feature map出来

组合不同feature(其实就是Maxout Network)的好处是:可以把长的不像的pattern,但是是同一类的东西归类在一起,举个例子来说,火车从前面和左边看是不一样的,不同的feature可以组合在一起。如下图所示,神经元1,2负责侦测手写体数字1,神经元3,4负责侦测手写体数字7。

这个时候我们就会有一个疑问,那么怎么知道是否侦测同样的pattern的呢
其实这个是这样子的:我们要反过来想这个问题,并不是因为他们能侦测到同一个pattern我们把他们group到一起,而是因为我们把他们group到一起,经过training后,他们会侦测同样的pattern。

不同feature map出来

接下来,我们来做一个总结:以下是用来做语音辨识的,结合了好几层的架构。


3/10: TAs will teach TensorFlow
TensorFlow for regression
TensorFlow for word vector
word vector: https://www.youtube.com/watch?v=X7PH3NuYW0Q
TensorFlow for CNN
If you want to learn Theano
http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/Theano%20DNN.ecm.mp4/index.html
http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/Theano%20RNN.ecm.mp4/index.html

上一篇下一篇

猜你喜欢

热点阅读