👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er
🌌上期文章:机器学习&&深度学习——非NVIDIA显卡怎么做深度学习(坑点排查)
📚订阅专栏:机器学习&&深度学习
希望文章对你们有所帮助
我们之前讨论的多层感知机十分适合处理表格数据,其中行对应样本,列对应特征。对于表格数据,我们寻找的模式可能涉及特征之间的交互,但是我们不能预先假设任何与特征交互相关的先验结构。
之前猫狗分类的例子中:假设我们有一个足够充分的照片数据集,数据集中是拥有标注的照片,每张照片具有百万级像素,这意味着网络的每次输入都有一百万个维度。如果我们将隐藏层的维度降低到1000,也会有109个参数,用多层感知机训练这玩意,这还不如直接记忆得了。
现如今的卷积神经网络可以帮助实现这个问题,是机器学习利用自然图像中一些已知结构的创造性方法。
从全连接层到卷积
- 不变性
- 多层感知机的限制
- 平移不变性
- 局部性
- 卷积
- 沃尔多在哪里
- 通道
不变性
假设我们想从一张图片中找到某个物体,无论哪种方法找到这个物体,都应该和物体的位置无关。
我们可以从儿童游戏”沃尔多在哪里”得到灵感:尽管沃尔多的装扮很有特点,但是在混乱场景中找到他也不容易。然而沃尔多的样子并不取决于他潜藏的地方,因此我们可以使用一个“沃尔多检测器”扫描图像。该检测器将图像分割成多个区域,并为每个区域包含沃尔多的可能性打分,卷积神经网络就是将空间不变性的这一概念系统化。
总结一下两个原则:
1、平移不变性:不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应。
2、局部性:神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系。
多层感知机的限制
首先,多层感知机的输入是二维图像X,隐藏表示H(也就是第一层的输出)在数学上是一个矩阵,在代码中表示为二维张量。
使用X(i,h)和H(i,j)分别表示输入图像和隐藏表示中位置(i,j)的像素。为了使每个隐藏神经元都能接收到每个输入像素的信息,我们将参数从权重矩阵替换为四阶权重张量W。假设U包含偏置参数,我们可以将全连接层表示为:
[ H ] i , j = [ U ] i , j + ∑ k ∑ l [ W ] i , j , k , l [ X ] k , l = [ U ] i , j + ∑ a ∑ b [ W ] i , j , a , b [ X ] i + a , j + b [H]_{i,j}=[U]_{i,j}+\sum_k\sum_l[W]_{i,j,k,l}[X]_{k,l}\\ =[U]_{i,j}+\sum_a\sum_b[W]_{i,j,a,b}[X]_{i+a,j+b} [H]i,j=[U]i,j+k∑l∑[W]i,j,k,l[X]k,l=[U]i,j+a∑b∑[W]i,j,a,b[X]i+a,j+b
其中,从W到V是希望索引a和b通过在正偏移和负偏移之间移动覆盖了整个图像,只是形式上的转换。
平移不变性
检测对象在输入X中的平移,仅导致隐藏表示H中的平移。也就是说V和U实际上不依赖于(i,j)的值(这当然也是我们的目的),即:
[ V ] i , j , a , b = [ V ] a , b [V]_{i,j,a,b}=[V]_{a,b} [V]i,j,a,b=[V]a,b
因此我们可以简化H为:
[ H ] i , j = u + ∑ a ∑ b [ V ] a , b [ X ] i + a , j + b [H]_{i,j}=u+\sum_a\sum_b[V]_{a,b}[X]_{i+a,j+b} [H]i,j=u+a∑b∑[V]a,b[X]i+a,j+b
这就是卷积了,使用系数V(a,b)对位置(i,j)附近的像素(i+a,j+b)进行加权得到H(i,j)。注意:V(a,b)的系数比V(i,j,a,b)少很多,前者不再依赖于图像的位置了。
局部性
我们为了收集训练参数H(i,j)的相关信息,不应该偏离他很远。因此我们做个限制:令|a|>△和|b|>△的范围的V都置0,这样就可以把偏离它很远的地方都去掉了。所以我们可以把H重写为:
[ H ] i , j = u + ∑ a = − △ △ ∑ b = − △ △ [ V ] a , b [ X ] i + a , j + b [H]_{i,j}=u+\sum_{a=-△}^△\sum_{b=-△}^△[V]_{a,b}[X]_{i+a,j+b} [H]i,j=u+a=−△∑△b=−△∑△[V]a,b[X]i+a,j+b
上式就是一个卷积层,而卷积神经网络是包含卷积层的一类特殊神经网络,V被称为卷积核。
卷积
为啥上面操作被称为卷积,从数学中的卷积说起,两个函数f,g的卷积被定义为:
( f ∗ g ) ( x ) = ∫ f ( z ) g ( x − z ) d z (f*g)(x)=∫f(z)g(x-z)dz (f∗g)(x)=∫f(z)g(x−z)dz
对于二维张量,则为:
( f ∗ g ) ( i , j ) = ∑ a ∑ b f ( a , b ) g ( i − a , j − b ) (f*g)(i,j)=\sum_a\sum_bf(a,b)g(i-a,j-b) (f∗g)(i,j)=a∑b∑f(a,b)g(i−a,j−b)
和之前写的i+a、j+b其实一个意思的。
沃尔多在哪里
如图所示,卷积层根据滤波器V选取给定大小的窗口,并加权处理图片。
通道
这个方法有一个问题,我们忽略了一个图像一般包含三个通道(R、G、B)。实际上,图像不是二维的,而是一个由高度、宽度和颜色组成的三维张量,前两个轴与像素的空间位置有关,而第三个轴可以看作每个像素的多维表示。因此我们将X索引为X(i,j,k),由此卷积相应地调整为V(a,b,c)。
由于输入图像是三维的,我们的隐藏表示H也最好采用三维张量(对于每一个空间位置,我们想要采用一组而不是一个隐藏表示)。这样一组隐藏表示可以想象成一些互相堆叠的二维网格。我们可以把隐藏表示想象为一系列具有二维张量的通道。这些通道有时被称为特征映射(因为每个通道都向后续层提供一组空间化的学习特征)。
为支持输入X和隐藏表示H中的多个通道,我们可以在V中添加第四个坐标即V(a,b,c,d),则:
[ H ] i , j , d = ∑ a = − △ △ ∑ b = − △ △ ∑ c [ V ] a , b , c , d [ X ] i + a , j + b , c [H]_{i,j,d}=\sum_{a=-△}^△\sum{b=-△}^△\sum_c[V]_{a,b,c,d}[X]_{i+a,j+b,c} [H]i,j,d=a=−△∑△∑b=−△△c∑[V]a,b,c,d[X]i+a,j+b,c
其中H中的索引d表示输出通道,随后的输出将继续以三维张量H作为输入进入下一个卷积层。