李宏毅深度学习笔记(全连接、CNN、RNN)一
摘要
最近在学习台大李宏毅老师的深度学习课程,感觉受到了醍醐灌顶式的学习。在这里记录一下学习笔记,一方面希望和大家多交流学习,一方面如果有不足的地方希望大家能指正。我将从三个最basic的网络连接:全联接层、卷积神经网络到循环神经网络三个方面结合李老师的PPT和自己的理解向大家展示。
目录
(1)Fully connected layer(全联接层)
(2)Convolutional/pooling layer(卷积/池化层)
(3)Recurrent structure(循环神经网络结构)
1.Fully connected layer
(1) 全连接网络基本结构
顾名思义,全联接层就是两个layer之间的神经元都是俩俩相连的。例如,现在有两层神经网络,如下图1所示
两层神经网络分别为Layer l-1,Layer l。他们分别有N个结点,只是在这里为了表示区分,我们分别用
N
l
N_l
Nl和
N
l
−
1
N_{l-1}
Nl−1来表示。每一层的 每一个结点的输出用
a
i
l
a
y
e
r
a_i^{layer}
ailayer表示,例如,
a
i
l
a_i^l
ail,表示layer l层第i 个结点的输出。每一层的输出用向量
a
l
a
y
e
r
a^{layer}
alayer表示,例如layer l的输出可以表示为
a
l
a^{l}
al。
以上就是全联接层的基础结构,那么全联接层两个神经层之间的神经元是如何两两相连的呢?——通过weight和bias来形成连接:具体表现如下图2所示:
layer l-1 中每一个神经元都通过不同的权值和下一层的所有神经元相连。神经中间的连线可以理解为乘上了权值weight,这里需要说明的是
W
i
j
l
W_{ij}^l
Wijl:下标ij代表weigth的方向由神经元j指向i(仅仅是为了方便后文推导公示),也就是前一个神经元结点指向后一个神经元结点。上标l:代表layer l-1指向layer l 。举个例子:layer l-1中1号神经元和layer l中各个神经元相连的weight可以表示为:(
W
11
l
W_{11}^l
W11l
W
21
l
W_{21}^l
W21l
W
31
l
W_{31}^l
W31l…
W
i
1
l
W_{i1}^l
Wi1l…),有
N
l
N_l
Nl个。那么layer l-1中每个神经元和下一层的连接就可以表示为上图3所示:
W
l
W^l
Wl的每一列,代表layer l-1中每一个结点和layer l中的连接,总共有
N
l
−
1
N_{l-1}
Nl−1列,因为layer l-1有
N
l
−
1
N_{l-1}
Nl−1个结点。每一列的长度为
N
l
N_l
Nl个,因为layer l有
N
l
N_l
Nl个结点。
biase是在上一层结点乘以权重之后加上的一个偏置值。如下图4所示:
现在我们清楚了weight和biase之后,可以来开始运算了。我们设
z
i
l
z_i^l
zil为layer l输入到第i个结点之前的值,也就是上一层的结点经过weight和biase运算之后的值。例如,layer l 中输入到第一个结点的
z
1
l
z_1^l
z1l值为:
z
1
l
=
w
11
l
a
1
l
−
1
+
w
12
l
a
2
l
−
1
+
.
.
.
+
b
1
l
z_1^l=w_{11}^la_1^{l-1}+w_{12}^la_2^{l-1}+...+b_1^l
z1l=w11la1l−1+w12la2l−1+...+b1l
依次类推:
z
2
l
=
w
21
l
a
1
l
−
1
+
w
22
l
a
2
l
−
1
+
.
.
.
+
b
2
l
z_2^l=w_{21}^la_1^{l-1}+w_{22}^la_2^{l-1}+...+b_2^l
z2l=w21la1l−1+w22la2l−1+...+b2l
z
i
l
=
w
i
1
l
a
1
l
−
1
+
w
i
2
l
a
2
l
−
1
+
.
.
.
+
b
i
l
z_i^l=w_{i1}^la_1^{l-1}+w_{i2}^la_2^{l-1}+...+b_i^l
zil=wi1la1l−1+wi2la2l−1+...+bil
这就是上一层结点和下一层结点的连接方式,为了总结出公示,我们做一个矩阵运算,如图5所示:
得到z、a、b、w的关系:
z
l
=
W
l
a
l
−
1
+
b
l
z^l=W^la^{l-1}+b^l
zl=Wlal−1+bl进一步,得到下一层输出和上一层输出的关系:
a
l
=
α
(
z
l
)
a^l=\alpha(z^l)
al=α(zl)
等价带换为向表示:
a
l
=
α
(
W
l
a
l
−
1
+
b
l
)
a^l=\alpha(W^la^{l-1}+b^l)
al=α(Wlal−1+bl)
其中
α
\alpha
α为激活函数。
(2)总结:
两个全联接层之间的神经元是通过乘以weight和加上biase来实现两两连接的,参数数量较多,例如,如果输入图像是1001003,中间隐层神经元1000个,那么其中的参数就是:100 *100 *3 *1000 + 1000个,这样的参数是本来神经元的很多倍,如果神经元数目和隐层数量较多,参数数量将指数增加。为了减少参数数量,引出CNN。
2.Convolutional/pooling layer
(1)概述:
那么卷积神经网络(convolutional Neural network)是如何实现减少参数的呢——通过局部感受野 和权值共享以及pooling来减少网络需要训 练的参数个数,下文做具体阐述。
我们先来看一个CNN的整体结构,其实就是fully connected的简化版,如图所示:
输入一张图片,经过多个convolution和pooling的循环叠加,最后记过全联接层输出判断的结果。接下来我们对convolution和pooling做详细说明。
(2)convolution特性
卷积层有两个特征,这两个特性决定CNN适合处理图像相关的问题,也是用于 减少参数的关键技术。
特性一(局部感受野):some paterns are much smaller than the whole image.
a neuron does not have to see the whole image to discover the pattern:比如说现在有一个neuron来判断是否有鸟嘴,只需要看到鸟嘴,就可以去判断出图片中是否有鸟的存在。那么只需要将image中的一部分像素丢给neuron, 只需要将图片中一部分丢给neuronn,就可以做需要做的事情。
特性二(权值共享):The same patterns appear in different regions
就是同样是鸟嘴,如果用一个neuron去诊断左上有没有鸟嘴,一个neuron去诊断中间有没有鸟嘴,就太冗杂了,其实只需要用同一个neuron同一组参数可以诊断处出来,这样就可以减少layer中neuron的个数。这么说有点抽象,举一个例子:
现在有一个33的filter,也就是过滤器,其对角线都为1,其余地方为-1。有一个66的image,我们开始做卷积,也就是用filter中的元素和image中的像素点对应位置相乘相加,就是一个内积(inner products)的操作。设置步长stride= 1,也就是做一次内积之后移动步长为1的距离在做内积操作。就会得到右边4*4的矩阵。
需要注意的是:因为filter的特性,如果image中有一部分区域对角线全为1,那么内积出来的值就会很大。比如image左上和左下区域,内积之后的值都为3。也就是说,在同一个图片的不同区域,用同一个filter同一组参数就检测出来了。
(3)convolution实现过程
卷积过程也就是特征提取的过程。卷积的特征提取由卷积核(Convolution Kernel),也叫过滤器filter来实现,filter是一个矩阵,它以步长为任意长度的方式在图像上移动,并且做点乘加和运算,就是先做点乘,之后再求和。下图是3x3的卷积核(黄色部分)在5x5的图像上做卷积的过程(步长为1):
需要注意的是:filter的个数以及其大小,都是我们自己决定的,但是并不是乱取的,举一个例子,要找到图片中某个pattern,其大小是33,那么这里用的filter就必须大于33。与之相反的是,filter里面的值是学出来的,也就是weight的值,是训练出来的。
feature map和原图像的区别:
1、经过卷积后得到的convolved feature 中每一个位置用一个或多个value来描述原图像的对应位置。比如上图中,feature map中左上角的一个value值4描述了原图像左上角33的部分。
2、如果filter是多个,就会得到较深的feature map,这样就会出现多个value值来描述原图像对应的位置。如下图所示:
此时filter为2,就会得到两张特征图,每一个位置就会有两个value值来描述原图像中对应的位置。
对彩色图片卷积:
彩色图片拥有三个channel,分别是R、G、B,也就意味着卷积核也需要和原图保持同样的通道数,这时候filter的形状像一个立方体,同样一个filter就会得到三张feature map,如下图所示:
卷积核越多,提取图片的特征就越深,可以更好的做分类和识别。
convolution vs fully connected:
卷积网络是全连接网络的简化版,如下图所示
我们把image的每一个像素排成一个向量的形式(一列),全连接层的隐层每一个神经元都连接了image中所有的像素。
然而,在convolution中,隐层中的每一个神经元只连接image中的部分神经元,而且连接的权值便是filter中的值。如下图所示:
如果采用33的filter,那么每一个神经元连接的image像素点就为9,也就是9个权重参数,并不想全连接层中那样,需要连接整个image。
### pooling
池化也叫做下采样,它是把卷积过后提取之后的特征看做一个矩阵,并在这个矩阵上划分出几个不重合的区域,然后在每个区域上计算该区域内特征的均值或最大值,然后用这些均值或最大值参与后续的训练。
这里介绍两种主要使用的池化方式:1,找出区域内的最大值。2.找每个区域的平均值。如下图所示:
max-pooling就是找出区域内的最大值,作为池化的输出。这个区域大小可以自己设定。与之相对应的mean-pooling就是找出区域内的均值。
(3)总结:
卷积层后面通常就会接一个池化层,池化层的作用就是将特征图缩小,目的也是为了减少计算量。通常一个CNN结构都是卷积和池化的不断迭代,然而经过每一次卷积池化操作后,都可以看成是新的image,然后再由下一层的卷积池化来提取特征,这样不断提取特征,就会得到更深的更好的特征,最后将得到的特征排列成向量做全连接,如下图所示: