首页> 中国专利> 具有数量被减少的参数的神经网络

具有数量被减少的参数的神经网络

摘要

提供了一种方法。该方法包括:提供具有权重集(W)并被配置为接收输入数据结构(x)的神经网络,用于根据所述权重集的值来生成对应的输出阵列(y(x,W))‑训练(200)神经网络(100)以获得经训练的神经网络(100”),所述训练包括借助于梯度下降算法来设置权重集的值,该梯度下降算法利用包括损失项和正则化项的成本函数;‑通过通信网络(650)在设备(620)上部署经训练的神经网络(100”);‑在设备上使用已部署的经训练的神经网络(100”),其中:正则化项基于由权重值集的变化造成的输出阵列元素的变化率。

著录项

  • 公开/公告号CN112534445A

    专利类型发明专利

  • 公开/公告日2021-03-19

    原文格式PDF

  • 申请/专利权人 意大利电信股份公司;

    申请/专利号CN201980042726.2

  • 申请日2019-07-18

  • 分类号G06N3/08(20060101);G06N3/04(20060101);

  • 代理机构11038 中国贸促会专利商标事务所有限公司;

  • 代理人高欣

  • 地址 意大利米兰

  • 入库时间 2023-06-19 10:18:07

说明书

技术领域

本发明涉及神经网络领域。

背景技术

在过去的几年中,人工神经网络(下文中简称“ANN”)已引起强烈关注,并成功应用于广泛的应用领域,包括控制系统、机器人技术、模式识别系统、预测、医学、电力系统、制造、优化、信号处理和社会/心理科学。

在ANN的应用领域中,随着诸如智能电话或包括数码相机的其它便携式设备之类的数字图像捕获设备的使用的增长,图像的对象分类(在下文中简称为“对象分类”)变得越来越重要。对象分类是提供用于根据预定义的图像类别将标签分配给(数字)图像中描绘的(一个或多个)对象的过程。对象分类提供了通过分析图像的视觉图案来在可用的预定义图像类别中为图像中描绘的对象选择适当的类别。特别地,对象分类可以基于已知的通常被称为应用于ANN的“深度学习”的机器学习方法。

如本领域技术人员众所周知的,ANN的基本元素是神经元,也称为节点。每个神经元都有单个输出,但它可能有许多输入。神经元的输出是将非线性函数应用于添加到通常称为偏差的恒定值的其输入的线性组合的结果。该线性组合的系数通常被称为权重w,并且非线性函数通常被称为激活函数。ANN根据所谓的“层”序列进行布置。每层包含一组对应的神经元。属于一层的神经元的输出可以用作属于该序列的下一层的神经元的输入。

如例如在Gradient-based learning applied to document recognition,LeCun、Yann等人,Proceedings of the IEEE 86.11(1998),Convolutional NeuralNetwork(卷积神经网络,在下文中简称为“CNN”)中所公开的是一种特别有利于在对象分类领域中利用的ANN。为此,对象分类领域中实际采用的大多数方法都基于CNN。CNN是一种ANN,其包括至少一个卷积层,即,包括共享相同权重w集的神经元的层(在图像分析领域中,所述权重集通常被称为“内核”或“过滤器”)并且其输出由其输入之间的卷积给出。

参考包括布置在h行和h列中的h

-k×k内核被“重叠”在输入图像的对应k×k部分上,以便使输入图像的所述部分的每个源像素与内核矩阵的对应元素相关联,其中内核矩阵的中心元素与所述部分的中心源像素相关联;

-通过将输入图像的所述部分中包括的每个像素的像素值与对应于内核矩阵的相关联元素的权重w相乘来对该像素值进行加权;

-加权的像素值相互求和,并加上对应的偏差;

-应用激活功能,以这种方式获得与输入图像的检查部分相关联的特征;这样的特征被保存在特征图的与中央源像素对应的位置。

-过滤器在水平和垂直方向上移动相当于等于整数值(例如,1个像素)的步幅

-重复上述步骤以覆盖输入图像的所有像素,以便获得完整的特征图。

概括而言,CNN的卷积层具有方的h×h数字信号(通常也称为“输入数据结构”或简称为“输入结构”)作为输入,其包括通过对此类信号进行采样而获得的h

如果输入数据结构和/或内核矩阵具有不同的形状,诸如矩形之类,那么应用类似的考虑。

参考所考虑的示例,可以将k×k内核的权重w设置为表示要在表示输入图像的输入结构中搜索的特定视觉图案。在这种情况下,卷积层的输出是与具有(h-k+1)x(h-k+1)个特征的特征图对应的数据结构,其中所述特征图的每个特征可以具有量化多少这样的特定视觉图案存在于输入图像的对应部分中的值(例如,特征图中的特征的值越高,这样的特定视觉图案存在于输入图像的对应部分中越多)。该操作在通信工程中是众所周知的,其中它被称为“使用匹配滤波器的信号检测”,例如,参见H.Stark和F.B.Tuteur所著的ModernElectrical Communications,第11.6章,Prentice-Hall,1979年(第484-488页)。

在CNN的典型卷积层中,输入结构可以由大小相等的通道CH形成。例如,参考对象分类领域,可以通过RGB模型通过CH=3个不同通道集合来表示h×h数字彩色图像:第一个通道(R通道)是具有h×h个像素并且对应于彩色数字图像的红色分量的数字图像,第二个通道(G通道)是具有h×h个像素并且对应于彩色数字图像的绿色分量的数字图像,并且第三个通道(B通道)是具有h×h个像素并且对应于彩色数字图像的蓝色分量的数字图像。

通常,NF内核集用于单个卷积层。在这种情况下,输出结构将依次包含NF特征图。

因此,考虑通用场景,其中卷积层的输入结构与NF内核卷积,该层中可学习参数的数量NP

NP

其中NC是卷积层的输入通道的数量。

如在例如Pierre Sermanet,David Eigen,Xiang Zhang,Michael Mathieu,RobFergus和Yann LeCun的OverFeat:Integrated Recognition,Localization andDetection using Convolutional Networks,arXiv preprint arXiv:1312.6229,第1-5页,2013年中可以读到的,基于CNN的高效对象分类算法-即,能够以低分类错误将对象分类为正确类别的算法-通常包括多个卷积层,通常与子采样层(例如,所谓的“最大池化(max-pooling)层”)交织,然后是充当最终分类器的最终的、完全连接的(即,非卷积)层序列,这些层作为输出结构输出分类阵列,从而提供关于可用分类类别中对应选定类别的指示。

具有NU出口并且处理从前一层接收到的N个输入的通用完全连接层的可学习参数(权重加偏差)的NP

NP

CNN的非常重要的方面是如何设置各种卷积层的内核权重。利用CNN的对象分类算法的效率严格取决于权重w值。如果权重w值未正确设置,那么对象被分类为错误的类。为了设置CNN的权重w集,对CNN进行训练过程,诸如所谓的反向传播训练过程,例如在SimonHaykin的Neural Networks and Learning Machines,3/E,Prentice Hall(11/18/2008)的第153页中所公开的。

反向传播训练过程提供两个主要阶段:前向阶段和反向阶段。

前向阶段规定向被训练的CNN输入属于已知类别的训练图像作为输入数据,并且然后将对应的输出(即,与实际权重w值对应的输出分类阵列)与正确的已知输出(即,与正确的已知类别对应的目标分类阵列)进行比较。由于尚未对CNN进行训练,因此输出分类阵列一般与目标分类阵列不同。然后将输出分类阵列与目标分类阵列进行比较,并计算对应的损失(loss)项,这提供了由CNN产生的分类误差的量化(即,输出分类阵列与目标分类阵列有多少差异的量化)。

具有C个不同的类别,并向CNN提供属于所述C个类别之一的输入训练图像x,CNN生成对应的输出分类阵列y(x;W),其中W表示CNN中包括的权重w的整个集合(即,与CNN的所有层中的所有神经元对应的所有权重w)。由CNN生成的输出分类阵列y(x;W)是C个元素y

为了计算上面提到的损失项,可以使用损失函数。损失函数L(y(x;W),t(x))是取决于输入训练图像x和对应的输出分类阵列y(x;W)的函数。广义上讲,损失函数L(y(x;W),t(x))是允许估计分类误差的函数。损失函数L(y(x;W),t(x))使得,在给定特定输入训练图像x并给定CNN响应于这个输入训练图像x而生成的特定输出分类阵列y(x;W)的情况下,与所述输出分类阵列y(x;W)对应的分类误差越大,所述损失函数L(y(x;W),t(x))的值越高。

例如,考虑训练双输出网络以预测平面上的点的水平和垂直坐标值的简单问题,可以将训练这个特定网络的损失函数合理地定义为平面上点的预测坐标和目标坐标之间的欧几里得距离。

一般而言,损失函数必须始终定义为正值或等于零,并且其实际选择取决于ANN或CNN解决的特定问题。考虑到对象分类的特定问题,最常用的损失函数是所谓的均方误差(MSE)损失函数,对此

在定义了适当的损失函数L(y(x;W),t(x))之后,可以通过以下方式定义成本函数J(

J(W;x,t(x))=ηL(y(x;W),t(x))+λR(W) (3)

其中η是称为学习率的正实数,λ是称为衰减率的正实数,并且R(W)是正则化函数。如本领域技术人员众所周知的,正则化函数R(W)是通过提供关于应当应如何分配和设置CNN的权重W的规则(例如,通过发出适当的约束)来影响成本函数J(W;x,t(x))的函数。添加由正则化函数R(W)给出的规则,以影响由损失函数(y(x;W),t(x))给出的分类误差估计。

例如,这种规则可以提供使权重

对于本领域技术人员而言,使用正则化函数R(W)的效果是减少CNN在训练图像上的过度拟合的效果。如果在训练过程期间CNN与实际信息以及不期望的噪声一起学习,那么称CNN过度拟合训练数据。正则化为设置和分配CNN权重的方式提供了限制,有助于对比过度拟合,从而使类别之间的边界更加清晰(参见

基于权重

L1正则化函数(参见Park、Mee Young和Trevor Hastie。“L1-regularizationpath algorithm for generalized linear models”Journal of the Royal StatisticalSociety:Series B(Statistical Methodology)69.4(2007):659-677)或L2正则化函数(参见Bilgic、Berkin等人的“Fast image reconstruction with L2-regularization”,Journal of Magnetic Resonance Imaging 40.1(2014),第181-191页)。

训练过程的反向阶段规定计算从最后一层到第一层的所有层的成本函数J(W;x,t(x))相对于权重w的梯度。

使用非常大量的训练图像(例如,从训练数据库中取得的图像),将前向阶段和反向传播阶段重复很多次。

紧接在每个反向传播阶段之后,可以使用梯度下降操作来更新权重w,以便最小化成本函数(W;x,t(x))。以这种方式,每当将训练数据库的新训练图像输入到要训练的CNN时,就完成权重w的更新。可替代地,可以通过在更新权重w之前首先将前向和反向相位应用于训练数据库的所有训练图像以产生梯度的平均值来完成权重w的更新。中间替代方案也可以是预期的,其中,每当对包括训练数据库的固定数量的训练图像的子集(称为“小批量”)执行前向和反向阶段时,都执行权重w的更新。

在本上下文中,术语“时期(epoch)”是指在训练过程期间将整个训练数据库已经输入到CNN的次数。通常,要使CNN收敛到其最大分类准确度,需要数百个时期。

权重w通常由托管在用于通过上面提到的训练过程训练CNN的处理系统(例如,计算机)的主存储器中的实际值表示。这样的值可以在训练过程的中间步骤(例如,在处理每个小批量之后或在训练过程的每个时期之后)或在训练过程结束时永久性地保存到例如处理系统的存储存储器中。

CNN拓扑的知识和相关的学习到的权重w可以完全表示经训练的CNN。一旦训练完CNN,就可以在同一个计算机上使用经训练的CNN来处理不同的数据样本,或者可以将经训练的CNN传送到不同的计算机。

根据上述过程训练CNN是个资源密集型过程,其实际上仅由于自组织(ad hoc)硬件资源的可用性而成为可能。这些资源包括配备有大量计算核心的自组织设计的IC或现场可编程门阵列(FPGA)或图形处理单元(GPU),并且最重要的是,这种硬件包括数十亿个以致力于托管CNN学习到的权重w的单元格存储器形式的数据存储单元。例如,专为训练深度CNN而设计的现代GPU包括数十GB的快速专用存储器,以永久地存储CNN的大量权重w(以及反向传播时的相对误差梯度)。

下表提供了Simonyan Karen和Andrew Zisserman,arXiv预印本arXiv:1409.1556(2104)的论文“Very deep convolutional networks for large scale imagerecognition”中公开的示例性VGG体系架构的16层中的每一层的参数(W,权重加上偏差)计数和相关存储器要求。

CNN包括超过1亿个可训练的参数,用于经训练的CNN的存储器总占用量约为132*k兆字节(其中k是参数的以字节为单位的尺寸)。该表显示,参数的大部分包括在第一个完全连接的层中。这一发现不足为奇,因为第一个完全连接的层的参数的数量与由最后一个卷积层输出的特征的数量成比例。

为了提高由CNN提供的图像分类准确度,应当增加层数,例如最多152。这种体系架构涉及训练非常大量的权重w,从而导致甚至更大的存储器要求,这会容易地超过训练过程所使用的处理系统上可用的存储器量。出于这个原因,已知并行使用多个GPU来训练CNN,其中每个GPU训练CNN的子集(例如,每个GPU训练层的子集)。例如,Shazeer、Noam、AzaliaMirhoseini、Krzysztof Maziarz、Andy Davis、Quoc Le、Geoffrey Hinton和Jeff Dean,arXiv预印本arXiv:1701.06538(2017)的论文“Outrageously large neural networks:The sparsely-gated mixture-of-experts layer”描述了在布置在计算集群中的多个GPU的阵列上进行训练的CNN。这种体系架构的参数总数非常高,等于1370亿。

虽然出于上述原因通常在服务器等级GPU上对CNN进行训练,但人们对在移动设备(诸如平板电脑或智能电话之类)上使用先前训练的CNN表现出极大的兴趣。

在下文中,在处理设备上使用先前训练的CNN来对图像进行分类的过程将被称为在这种处理设备上“部署”(先前训练的)CNN。在其上部署CNN的处理设备可以是用于训练CNN的相同处理设备(例如,功能强大的服务器计算机),或者可以是不同的设备(例如,膝上型PC或智能电话)。必须认识到的是,用于训练CNN的训练图像一般与当CNN部署在用于其正常使用的处理设备上时应当分类的图像不同。

例如,在典型的应用对象分类场景中,具有无线通信能力的电池操作的移动设备可以借助于CNN本地处理由本地传感器获取的数据,并且在不与中央服务器通信的情况下做出自主决定,并且因此节省电池电量。在另一种场景中,移动电话的用户可以拍摄对象的快照。然后,可以通过在移动设备GPU上运行经训练的CNN使用经过预先训练的CNN来确定对象类型和品牌。最后,用户将通过移动web浏览器重定向到电子购物站点,在该站点中,用户将能够购买对象,并可能在不同的可能选项之间进行比较。

从上面的示例中清楚的是,人们有兴趣在移动设备和其它嵌入式设备上部署经训练的CNN。

本发明解决了当在智能电话和其它嵌入式设备上部署经训练的网络时出现的主要问题之一。

实际上,虽然现代移动设备通常包括自组织IC或GPU,该自组织IC或GPU为它们提供了足够的计算能力来执行甚至复杂的CNN,由于与功耗、价格和物理尺寸相关的约束,此类设备的存储存储器能力有限。类似地,通常在移动设备中发现的GPU的工作存储器的量通常比其服务器同类产品的工作存储器的量低一个数量级。而且,在移动设备中,这种存储器常常不是专用于GPU专用的,而是由中央CPU共享的,中央CPU可以将其很大一部分永久地用于其它设备核心功能。

鉴于以上所述,可以理解的是,当必须将CNN(或通用神经网络)部署在移动设备上时,移动设备的有限存储器能力强烈地限制了CNN或通用神经网络的最大参数数量。

为了减少用于部署经训练的CNN的存储器要求,以便允许将CNN也部署在具有低存储器能力的设备中,已经提出了几种简单的解决方案。

例如,根据第一个已知的解决方案(参见Gupta、Suyog等人,“Deep learning withlimited numerical precision”,International Conference on Machine Learning,2015年),经训练的参数(是实数)可以以降低的精度存储。例如,可以根据最近标准化的IEEE半精度格式而不是典型的单精度格式来存储经训练的参数。

另一种已知方法(参见Han、Song、Jeff Pool、John Tran和William Dally“Learning both weights and connections for efficient neural network”,InAdvances in Neural Information Processing Systems,第1135-1143页,2015年)包括在执行训练过程期间简化网络拓扑(例如,通过从层中移除层或单元),直到经训练的CNN满足要部署CNN的目标移动设备的能力为止。

在不影响CNN拓扑的情况下减少CNN存储器要求的可能选项是执行针对增加CNN的稀疏度的训练过程。如本领域技术人员众所周知的,CNN的稀疏度被定义为等于零的CNN的参数数量与CNN的参数总数之比(参见Tewarson,Reginald P.(1973年5月),SparseMatrices(Part of the Mathematics in Science&Engineering series),AcademicPress Inc.第1-13页)。

大量参数等于零(即,具有高稀疏度)的CNN被说成是稀疏的。CNN越稀疏,对存储器空间的要求越低。

已经观察到,如果通过使用上面提到的L1正则化函数R(w)来执行训练过程,那么CNN的几个权重w取非常低的值,接近于零。

Han Song、Jeff Pool、John Tran和William Dally的论文提出了一种三阶段方法来训练稀疏网络拓扑。首先,经由反向传播对网络进行训练,但是代替通过最小化一些目标损失函数来设置实际权重,对每个连接的重要性执行粗略的测量。然后,将重要性指数低于某个阈值的所有连接都设置为零(修剪)。最后,以设置实际权重的方式以标准反向传播训练所得网络。

在Nitish Srivastava、Geoffrey Hinton、Alex Krizhevsky、Ilya Sutskever、Ruslan Salakhutdinov在Journal of Machine Learning Research 15(2014)上的“Dropout:A Simple Way to Prevent Neural Networks from Overfitting”中,示出了信号丢失(dropout)用法如何增强学习并造成稀疏化。

在2015年6月7日至12日召开的2015 IEEE Conference on Computer Vision andPattern Recognition(CVPR)上Baoyuan Liu、Min Wang、Hassan Foroosh的“SparseConvolutional Neural Networks”中,提出了一种用于CNN的卷积层的分解方法,其介绍了“稀疏卷积神经网络”的概念。特别地,将4维卷积变换成2维矩阵乘法。由这种提出的分解产生的2D矩阵非常稀疏(报告的稀疏度为90%),这意味着对于高维内核存在高参数冗余性。根据这种高稀疏度,还提出了一种定制的稀疏乘法算法以最大化高速缓存命中率。

发明内容

申请人已经发现,上面提到的用于减少CNN或通用神经网络的存储器占用以便允许将这种CNN部署在配备有低存储器能力的处理设备上的已知解决方案效率不高。

例如,已经观察到由Gupta、Suyog等人提出的以降低的精度来存储经训练的参数的已知解决方案仅提供非常有限的存储器节省。

Han、Song、Jeff Pool、John Tran和William Dally的在执行训练过程时简化了网络拓扑的已知解决方案的缺点是要求训练具有特定(简化)网络拓扑的单独CNN用于移动设备。而且,这种解决方案还损害CNN的性能或者严重限制CNN能够处理的输入数据结构(例如,要分类的图像)的尺寸。

而且,申请人已经发现,即使在利用上面提到的L1正则化函数的训练过程结束时获得的非常低的权重w被设置为零(例如,借助于基于阈值的修剪操作),结果所得的修剪后的CNN的性能也会受到损害。

Han、Song、Jeff Pool、John Tran和William Dally的论文公开了一种方法,该方法通过避免网络过度参数化来降低复杂度以获得更好的性能。但是,这种方法在学习步骤之后强制执行优化过程。这将不利地将较低参数化的新网络带入最低能耗,而能耗极大地取决于“过度参数化的”网络的学习动态。此外,在不考虑取决于参数的实际活动的情况下执行参数修剪。

Nitish Srivastava、Geoffrey Hinton、Alex Krizhevsky、Ilya Sutskever、Ruslan Salakhutdinov的论文公开了一种产生过度参数化的网络的方法。

Baoyuan Liu、Min Wang、Hassan Foroosh的论文仅提供关于卷积层稀疏度的结果。

鉴于以上所述,申请人已经解决了提供神经网络训练过程(和对应的训练系统)的问题,该过程生成具有减少的存储器占用量(即,要求减少的存储器量来存储其参数)的经训练的神经网络,同时能够以足够高的性能操作。

申请人已经发现,这可以通过适当地修改用于训练神经网络的成本函数的正则化函数来实现。

在这方面,申请人已经设计了一种正则化函数,其通过考虑由权重的变化造成的神经网络输出的变化率来促进神经网络中权重的低值而不降低网络本身的性能。

本发明的一方面涉及一种方法。

根据本发明的实施例,该方法包括提供具有权重集并被配置为接收输入数据结构的神经网络,用于根据所述权重集的值来生成对应的输出阵列。

根据本发明的实施例,该方法还包括训练神经网络以获得经训练的神经网络。

根据本发明的实施例,所述训练包括借助于梯度下降算法来设置权重集的值,该梯度下降算法利用包括损失项和正则化项的成本函数。

根据本发明的实施例,该方法还包括通过通信网络在设备上部署经训练的神经网络。

根据本发明的实施例,该方法还包括在设备上使用已部署的经训练的神经网络。

根据本发明的实施例,所述正则化项基于由权重值集的变化造成的输出阵列的元素的变化率。

根据本发明的实施例,所述正则化项基于惩罚的总和,每个惩罚惩罚权重集的对应权重,每个惩罚基于第一因子和第二因子的乘积。

根据本发明的实施例,所述第一因子基于所述对应权重的幂,特别是对应权重的平方。

根据本发明的实施例,所述第二因子基于输出阵列对对应权重的变化的灵敏度的函数。

根据本发明的实施例,所述函数与输出阵列的输出元素相对于权重的导数的绝对值的平均值对应。

根据本发明的实施例,所述训练包括,针对多个训练输入数据结构当中的每一个训练输入数据结构,将由神经网络根据所述训练输入数据结构生成的输出阵列与仅具有一个非零元素的对应目标输出阵列进行比较。

根据本发明的实施例,所述函数与对应于目标输出阵列的所述一个非零元素对应的输出阵列的元素相对于权重的导数的绝对值对应。

根据本发明的实施例,所述训练包括通过从所述权重中减去以下各项来从权重集中的每个权重计算对应的更新后的权重:

-基于损失项相对于权重的导数的第一项,以及

-基于所述权重与另一个函数的乘积的第二项,如果所述函数不大于一,那么所述另一个函数等于一减去所述函数,而如果所述函数大于一,那么所述另一个函数等于零。

根据本发明的实施例,所述训练还包括将权重集中具有低于对应阈值的值的权重设置为零。

根据本发明的实施例,该方法还包括将所述阈值设置为以下之间所选择的阈值:

-基于非零权重的均值的阈值;

-使得第一集合尺寸与第二集合尺寸之比等于常数的阈值,其中,所述第一集合尺寸是绝对值小于或等于所述阈值的非零权重的数量,并且所述第二集合尺寸等于所有非零权重的数量。

根据本发明的实施例,所述在设备上部署经训练的神经网络包括通过所述通信网络将经训练的神经网络的非零权重发送到设备。

根据本发明的实施例,所述在设备上使用已部署的经训练的神经网络包括将已部署的经训练的神经网络与在设备上运行的用于视觉对象分类的应用一起使用。

根据本发明的实施例,所述设备是移动设备。

根据本发明的实施例,所述设备是自驾驶车辆的控制系统的处理设备。

附图说明

通过下面要结合附图阅读的对本发明的一些示例性和非限制性实施例的描述,将使本发明的这些和其它特征和优点变得显而易见,其中:

图1图示了适于在对象分类过程中使用的CNN的一部分,其中可以应用根据本发明的实施例的概念;

图2是根据本发明的实施例的根据功能块图示针对设置图1的CNN的层的权重的训练过程的流程图;

图3-5是根据本发明实施例的根据功能框图图示图2的训练过程的子过程的主要阶段的流程图;

图6以非常简化的功能块的方式图示了根据本发明实施例的解决方案的示例性应用场景。

具体实施方式

图1图示了适于在对象分类过程中使用的CNN 100的一部分,其中可以应用根据本发明的实施例的概念。

CNN 100被配置为接收描绘对象的数字图像x(输入图像)作为输入,并在多个C个预定义图像类别IC(c)(c=1,2,...,C)中为输入图像x中描绘的对象选择适当的类别,诸如:

-IC(1)=人图像类别;

-IC(2)=猫图像类别;

-IC(3)=狗图像类别;

-IC(4)=汽车图像类别;

-IC(5)=房屋图像类别,

-...

为此,CNN 100被设计为处理输入图像x,以便生成对应的分类阵列,该分类阵列提供关于可用的预定义图像类别当中所选择的图像类别IC(c)的指示。分类阵列将由y(x;W)表示。在此,W表示CNN的权重w的整个集合W={w

例如,分类阵列y(x;W)包括C个元素y

为了简化描述,图1的CNN 100适于处理具有单个通道的输入图像(例如,灰度级图像),其中CNN 100的每一层提供单个内核,并且其中每一层输出单个通道。但是,如果输入图像具有多于一个通道并且在至少一些层中使用多于一个内核,那么类似的考虑适用。

输入图像x是具有h×h像素的数字图像(例如,h可以等于112)。如果输入图像x具有不同的分辨率(即,它包括不同数量的像素),那么类似的考虑适用。在这方面,即使已经参考了方形的输入图像,在输入图像具有不同形状(诸如矩形之类)的情况下,类似的考虑也适用。

CNN 100包括L层120(l)的有序序列(l=1,2,...L),该序列的通用层120(l)被配置为:

-从序列的前一层120(l-1)接收包括h(l-1)×h(l-1)个特征的对应集合的对应输入结构110(l-1);

-通过利用内核130(l)来处理所述接收到的输入结构110(l-1),该内核130(l)包括k(l)×k(l)个权重w的对应集合,并且

-生成包括h(l)-k(l)+1×h(l)-k(l)+1个特征的对应集合的对应输出结构110(l)。

CNN 100的第一层120(1)被配置为接收包括h(0)×h(0)个像素的对应集合的输入图像x作为输入结构。

序列的每个层120(l)是卷积层,其被配置为执行卷积过程,用于使用内核130(l)从接收到的输入结构110(l-1)生成输出结构110(l),如本领域技术人员众所周知的。

序列的卷积层120(l)中的一些之后可以跟随对应的最大池化层(未图示),该层被配置为执行旨在生成从卷积层120(l)接收到的结构110(l)的子采样版本的子采样过程。子采样过程提供了跨越结构110(l)的可移动选择窗口,以便选择对应的特征集并且为每个选择的特征集生成在所选择的各特征集中的特征集当中具有最高值的对应特征。这种子采样过程的目的是允许一定程度的翻译不变性并减少序列的后续层120(l)的计算要求。如果以不同的方式执行子采样过程,诸如例如通过计算所选择的特征集的值当中的平均值,那么类似的考虑适用。

CNN 100还包括完全连接的类型的r个附加层150(1),150(2),…,150(r),即,被设计为从输入结构生成输出结构的非卷积层,其中输出结构的每个输出值是输入结构的所有输入值的函数。附加层150(1),150(2),…,150(r)充当最终的分类器,其具有等于可能的预定义图像类别IC(c)的数量的多个输出神经元,从而使每个输出神经元关联到预定义图像类别IC(c)中的特定类别。

第一附加层150(1)被设计为接收由最后一层120(L)生成的输出结构110(L)作为输入结构,而最后一个附加层150(r)被设计为生成分类阵列y(x;W)作为输出结构。

图2是根据本发明的实施例的根据功能块图示针对CNN 100的层的权重集W

在这方面,必须认识到的是,虽然在本描述中将参考CNN(即,卷积神经网络),但是根据本发明的实施例的训练过程200可以直接应用于任何种类的非卷积神经网络。

训练过程200包括三个主要子过程210、220、230的序列。

第一子过程210针对根据标准反向传播训练过程来初始训练CNN 100,该过程利用成本函数J(W;x,t(x))-其中t(x)是与输入图像x对应的目标分类阵列t(x)-没有任何正则化函数。

第二子过程220针对用反向传播训练过程进一步训练经受了第一子过程210的训练过程的CNN 100,该过程利用根据本发明的实施例的具有正则化函数R(W;x)的成本函数J(W;x,t(x))。如将在本说明书的以下部分中更详细描述的,根据本发明的实施例,与已知的仅取决于权重集W的正则化函数R(W)不同,正则化函数R(W;x)既取决于权重W又取决于输入图像x。

第三子过程230针对用反向传播训练过程进一步训练经受了第二子过程220的训练过程的CNN 100,该过程利用在第二子过程220中使用的相同成本函数J(W;x,t(x))。但是,与前两个子过程210、220不同,根据本发明的实施例,在第三子过程230期间,还执行修剪操作,针对将具有低于对应阈值的权重w设置为零。

第一子过程210(其利用不具有正则化函数的成本函数)的目的是加速处理并以更快的方式达到结果。但是,根据本发明的另一个实施例,可以跳过第一子过程210。因此,根据本发明的该另一个实施例,训练过程200可以直接以第二子过程220(其利用根据本发明的实施例的包括正则化函数的成本函数)开始。

在训练过程200应用于已经经过训练的CNN的情况下,跳过第一子过程210可以是有用的。这是在深度学习领域中非常普遍的情况,其中起点常常是已经经过训练的CNN,然后再对其进行进一步训练以使其适应不同的类别。可以有利地跳过第一子过程210的另一种情况是当要训练的CNN刚刚用随机权重初始化时。但是,在这种情况下,将衰减率(decayrate)参数λ(参见等式(3))设置为比通常更低的值可以是有用的。

现在将参考图3-5更详细地描述子过程210、220、230。这三个子过程210、220、230在每次对属于训练数据库的输入图像x的集合TI(p)(p=1,2,3...)(在这种情况下,也称为“输入训练图像”)执行了前向和反向阶段时更新权重W。每个集合TI(p)包含|TI(p)|个图像。

应该认识到的是,在以下描述中,假设每次对训练数据库的单个输入训练图像执行了前向和反向阶段时,权重W都会更新,从而生成成本函数的梯度(即,集合TI(p)仅包含单个图像)。但是,在处理训练图像的通用集TI(p)之后更新权重W的情况下,类似的考虑适用,在这种情况下,将对TI(p)中每个训练图像计算梯度,并借助于跨TI(p)的平均梯度来更新W中的权重。因此,在存在包括训练数据库的所有训练图像的输入训练图像的单个集合TI(p)的情况下,这些考虑也适用,以便每次对训练数据库的所有训练图像执行了前向和反向阶段时,权重W都会被更新。

图3是根据功能块图示子过程210的主要阶段的流程图。

子过程210的第一阶段提供用于从属于训练数据库的输入训练图像的集合TI(p)中选择输入训练图像x,并将这种输入训练图像x作为输入数据结构提供给要训练的CNN100(方框310)。训练数据库包括已知的训练图像,即,已知其中所描绘的对象属于可用类别IC(c)中的哪个类别IC(c=c*)的图像。

在下一阶段(方框320),CNN 100处理接收到的输入训练图像x,以便生成对应的输出分类阵列y(x;W)。

如上面已经提到的,在具有C个不同的类别IC(c)的情况下,输出分类阵列y(x;W)是包括C个元素y

在接下来的阶段(方框330),计算成本函数J(W;x,t(x))=ηL(y(x;W),t(x))(参见等式3)。为了计算成本函数J(W;x,t(x)),可以使用任何已知的损失函数L(y(x;W),t(x)),比如MSE损失函数,对此

或交叉熵损失函数,对此

其中t(x)是与输入训练图像x对应的分类阵列

属于类别IC(c*)并且包括C个元素t

与方框310、320、330对应的阶段与子过程210的前向部分对应。

子过程210的反向部分(方框340)提供了根据以下等式从最后一层到第一层递归计算所有层的成本函数J(W;x,t(x))相对于权重W的梯度:

然后,CNN 100的权重W的集合被更新(方框370)。为了使成本函数J(W;x,t(x))最小化,根据以下等式使用梯度下降操作执行权重W的更新:

其中w

此时,进行检查(方框380),以便检查所考虑的图像x是否是训练集中的最后一个。

在所考虑的图像不是最后一个图像的情况下(方框380的退出方框N),选择下一个训练图像x(方框390),并且使用这个新的训练图像执行所有先前描述的操作(返回到方框310)产生具有更新后的权重W

在所考虑的图像是最后一个图像的情况下(方框380的退出方框Y),那么意味着已经使用了训练数据库的所有训练图像。在这种情况下,说训练阶段的时期已经过去。

本文描述的子过程210可以重复几个时期,诸如几十个时期,以便多次向CNN 100提供整个训练数据库。

图4是根据本发明的实施例的根据功能块图示子过程220的主要阶段的流程图。

根据本发明的实施例,子过程220基本上等于先前在图3中描述的子过程210,主要区别在于所使用的成本函数J(W;x,t(x))不同,包括取决于输入图像x和权重阵列W的正则化函数R(W;x)。

子过程220的第一阶段提供选择输入训练图像x,并将这种输入训练图像作为输入数据结构提供给要训练的CNN 100(方框410)。

在下一阶段(方框420),CNN 100处理接收到的输入训练图像x,以便生成对应的输出分类阵列y。

根据本发明的实施例,训练基于以下成本函数

J(W;x,t(x))=ηL(y(x;W),t(x))+λR(W;x) (8)(参见等式3)。根据本发明的实施例,这个成本函数包括正则化函数R(W;x)。

正则化函数R(W;x)是输入图像x和权重阵列W的函数。根据本发明的实施例,只要可以在不降低CNN 100性能的同时获得,正则化函数就在CNN 100中促进权重的低值。根据本发明的实施例的正则化函数R(W;x)通过为CNN 100的任何权重提供选择性惩罚来影响成本函数J(W;x,t(x))。

正则化函数是与包括两个因子的乘积成比例指派给每个权重的成本(或惩罚)之和。第一个因子是权重的平方值;第二个因子是输出对权重变化的敏感程度的函数,即,第二个因子提供输出相对于权重的改变变化多少的量化。如果两个因子都大,那么产生的惩罚将大:当权重具有大值并且对变化的灵敏度低时,会发生这种情况。相反,当权重具有小值或者对变化的灵敏度高时,惩罚将小,或者甚至为零。正则化函数在权重w上是连续的,并且取非负惩罚值。在实施例中,正则化函数是W中所有权重的惩罚之和:

在这里,上面讨论的两个因子是权重的平方w

为了引入这样的正则化函数,必需定义函数S(w;x,W),下文中称为“灵敏度函数”。这个函数量化CNN 100的输出(例如,输出分类阵列y(x;W))的变化率,这个变化率是由权重w的变化造成的。可以将灵敏度函数定义为分类阵列y(x;W)的元素y

给定特定的权重配置W

必须观察到的是,从权重在两个不同的权重值w=a和w=b处可以具有不同的灵敏度值的意义上说,S(w;x,W)是局部测量。

根据本发明的实施例,正则化函数R(W;x)是其相对于权重w的导数等于以下的函数:

其中

鉴于以上所述,根据本发明的实施例的过程的下一阶段(方框440)提供了根据以下等式计算成本函数J(W;x,t(x))相对于权重w的导数:

使用梯度下降操作执行权重集W中每个权重w的更新,以便根据以下等式最小化成本函数J(W;x,t(x))

其中W

根据等式(14),从先前的权重w

从这个讨论中应当清楚的是,正则化因子λ的值应当介于0和1之间。由于灵敏度是局部测度,因此正则化因子λ比接近一更接近于零是有利的;在这种情况下,具有高灵敏度的任何权重都会小幅地朝着零改变,使得可以在权重的新值上计算新的灵敏度值。如果在梯度下降的一些迭代之后灵敏度值变大,那么由于正则化引起的更新将停止。如果给定权重的灵敏度值在梯度下降的迭代过程中从未变大,那么这个权重的值很可能接近零。

此时,进行检查(方框480)以便检查所考虑的训练图像x是否是最后一个。

在所考虑的训练图像x不是最后一个的情况下(方框480的退出方框N),选择下一训练图像x(方框490),并且使用这个训练图像返回到方框410执行所有先前描述的操作,并将其输入到具有更新后的权重W

在所考虑的训练图像x是最后一个的情况下(方框480的退出方框Y),意味着已经使用了训练数据库的所有训练图像。在这种情况下,说训练阶段的时期已经过去。

像在子过程210的情况下一样,本文描述的子过程220也可以重复几个时期,诸如几十个时期,以便向CNN 100提供整个训练数据库几次。

申请人已经发现,通过最小化上面提到的成本函数J(W;x,t(x))=ηL(y(x;W),t(x))+λR(W;x),可以得到假设其值接近零的大量权重w。其它权重的绝对值仍要大得多,即,其灵敏度在训练过程即将结束时仍保持大的那些权重。应当清楚的是,在像素(或特征)的加权总和中,其中一些权重非常小,而其它权重相对大,具有非常小的权重的项作为因子对总和的贡献很小。此外,如果将那些非常小的权重替换为零,那么所得的加权总和是所有权重保持不变的情况下获得的原始总和的良好近似。

这个观察建议将权重分离为两个不相交的子集,一个子集包含小权重,并且一个子集包含相对大的权重。可以通过将权重的绝对值与阈值进行比较来实现这种分离。

这导致申请人研发了一种修剪方法,即,将绝对值低于给定阈值的所有权重确切地设置为零的方法。

图5是根据本发明的实施例的根据功能块图示子过程230的主要阶段的流程图,该子过程230提供上面提到的修剪。

子过程230的第一阶段提供用于设置(方框510)修剪阈值TH,该修剪阈值TH用于将已经假设足够低的值的那些权重w设置为零。

根据经验,已经观察到,在没有修剪过程的情况下,CNN 100的权重W是根据均值零和标准偏差σ的高斯分布来分布的。在这种分布中,权重取绝对值小于给定阈值TH的概率是σ和TH的函数。在一些权重已被设置为零并且像等式(11)和方框470一样相继应用更新步骤的替代情况下,可以观察到一些权重保持刚好为零,而其它权重则聚集在正和负值附近。在这种替代情况下,所有权重的分布都不具有简单的参数化形式。申请人因此研发了一种非参数化过程,以便执行权重的进一步修剪。

通过观察那些不同于零的权重的绝对值|w|的直方图,申请人发现这些权重的绝对值的分布是近似单峰的,即,它具有一个峰,并且这个峰出现在非零权重的平均绝对值附近。因此,确定哪些权重将被设置为零的阈值可以有利地与这个平均绝对值成比例。可替代地,可以设置阈值以便将非零权重分离为两个集合,其元素的数量具有恒定的比例。

根据本发明的示例性实施例,将修剪阈值设置为:

其中均值是通过考虑CNN 100的具有不同于零的值的所有权重来计算的,并且θ是小于1的正常数,例如

根据本发明的第二示例性实施例,将修剪阈值设置为

TH,使得P(|w|≤TH)=θ (16)

其中P(|w|≤TH)指示两个集合的尺寸之比:一个是其绝对值小于或等于TH的非零权重的数量,一个是所有非零权重的数量。

下一阶段(方框520)提供将绝对值低于修剪阈值TH的CNN100的权重w设置为零。

由于用于计算正则化项R(W;x)的梯度的灵敏度函数S(w;x,W)是局部测量,因此对于W的非常小的变化都确保了其有效性。由于修剪过程迫使一些权重为零,因此有利地选择修剪阈值TH以便最小化由于修剪本身而引起的这种类型的干扰。

此时,使用等于与子过程220对应的过程的训练过程来训练CNN 100一个时期(方框530)。

作为修剪操作的副作用,预期性能会有所下降(例如,相对于分类准确度)。因此,完整的方法包括停止标准;例如,当性能达到预定义的下限时,该过程可以被中断。下面描述这种机制。

可以关于图像的集合(称为验证集)来定义分类准确度。验证集通常不包含任何用于训练的图像。以与训练集相同的方式,验证集中的每个图像还必须配备有目标类别,使得验证图像x具有目标分类阵列t(x)。现在可以将用于验证集VS的分类准确度定义为100%的分数,其中分子是由CNN正确分类的图像的数量,而分母是验证集中包含的图像的数量。清楚的是,分类准确度是CNN中权重W的函数。

现在可以定义停止标准。假定参考性能已经固定,例如,通过测量尚未经过修剪的先前训练的CNN的分类性能A(W

在已经对CNN 100进行了一个时期的训练之后,得出了权重W,可以将其性能与参考性能进行比较(方框540)。如果

A(W)<(1-Z)·A(W

那么训练被中断,并且由先前训练时期产生的权重被保留(方框540的退出分支Y)。否则,存储权重和分类性能值,并且可以开始训练的新时期(方框540的退出分支N,返回到方框510)。

在本发明的替代实施例中,灵敏度函数具有不同的定义。在此,仅对于与目标图像的类别对应的输出分类阵列的元素,才用绝对导数代替平均绝对导数。因此,这个替代灵敏度函数可以写为

由于目标分类阵列t(x)在与正确类别对应的元素中具有值1,而所有其它元素都为0。

与已知的解决方案相比,根据本发明的实施例的上述训练过程200允许获得具有数量被减少的不同于零的参数(权重w)的CNN100,并且因此要求减少的存储器占用。

用根据本发明的实施例的训练过程训练的CNN 100的减少的存储器占用在不同的应用场景中是特别有利的。

例如,具有减少的存储器占用的CNN可以有利地部署在由于与功耗、价格和物理维度相关的约束而具有有限存储存储器能力的设备上(诸如在提供有用于视觉对象分类的应用的移动设备上部署CNN的情况下)。

此外,借助于通信网络(诸如具有减小的带宽能力的移动通信网络),可以有利地将具有减少的存储器占用的CNN部署在设备上。例如,在一些场景中,要求周期性地在设备上远程部署复杂的CNN,诸如例如用于网络更新目的(例如,用于更新部署在自动驾驶车辆的控制系统的处理设备上的CNN的权重W,该系统要求周期性更新以提高自动驾驶性能)。

图6根据非常简化的功能块图示了根据本发明的实施例的解决方案的示例性应用场景。所考虑的应用场景提供了在服务器模块610上的CNN的训练,并且然后在运行用于对象分类目的的应用的移动设备620上部署经训练的CNN。

在附图中用标号100'识别的(未训练的)CNN被提供给服务器模块610以进行训练。如图6中所示,服务器模块610包括训练引擎630,诸如在处理器上运行的进程、处理器、对象、可执行文件、执行的线程、程序和/或实现根据本发明实施例的训练过程200的计算设备软件应用。训练引擎630还与训练数据库640耦合,训练数据库640包括属于相应已知类别的训练图像的训练数据集,训练引擎630将使用该训练数据集来使用根据本发明实施例的训练过程200训练CNN 100'并获得对应的经训练的CNN 100”。

然后,借助于通信网络650(诸如移动通信网络之类),将经训练的CNN 100”的权重集W传输到移动设备620。

通过将权重集W存储到移动设备620的存储单元660中来执行经训练的CNN 100”的部署。

此时,部署的经训练的CNN 100”可以由移动设备620的分类引擎670使用,诸如在处理器上运行的进程、处理器、对象、可执行文件、执行的线程、程序和/或移动设备620处的用于实现图像x(诸如由移动设备620的相机模块680捕获的图像)的分类并生成对应的分类阵列y(x;W)的计算设备软件应用。

已经在许多众所周知的神经网络体系架构上以及在许多不同的图像数据集上将根据上述本发明的实施例提出的训练过程200与由Han等人提出的方法进行了比较。对于每个经训练的模型,已根据IEEE-754标准在将每个参数(权重w)存储为4字节单精度浮点数的假设下测量了结果所得的稀疏度和对应的存储器占用量。从以下比较中可以看出,根据本发明实施例的训练过程200提高了网络稀疏度,并因此在不损害其性能的情况下减少了所部署的模型占用量。

已经使用Lenet-300体系架构在MNIST数据集上比较了根据本发明所描述的实施例的训练过程200。MNIST数据集由28×28个8位手写数字的灰度级图像(C=10个类别)组成。该数据库包含50000个训练样本和10000个测试样本。

LeNet-300体系架构是简单的完全连接的网络,设计用于手写字符识别并且包括具有300、100和10个神经元的三个完全连接的层。已经使用根据本发明实施例的训练过程200(其中灵敏度函数是等式10中公开的灵敏度函数)并使用根据本发明实施例的训练过程200(其中灵敏度函数是等式18中公开的灵敏度函数)训练了CNN。

下表对于LeNet-300网络体系架构的每一层示出每种考虑的方法的原始参数数量和剩余参数数量(越低的数字指示越稀疏的网络拓扑,并且因此存储器需求越低)。在原始体系架构中大约266k的参数当中,Han等人提出的方法能够将这个数字减少到约21k参数。结果表明,与等式10对应的本发明的实施例实现了更好的稀疏度,而与等式18对应的本发明的实施例实现了更低的总误差(在我们的实验中约为0.1%)并且要求更少的训练时间(相应的地1k相对于2.5k训练迭代)。

在LeNet5网络体系架构上使用MNIST数据库重复先前的实验。LeNet5体系架构是用于隐藏字符识别的简单卷积网络,它包括两个卷积层和两个完全连接的层,共有约431k可学习的参数。

使用根据本发明实施例的训练过程200(其中灵敏度函数是等式10中公开的灵敏度函数)并使用根据本发明实施例的训练过程200(其中灵敏度函数是等式18中公开的灵敏度函数)对LeNet5网络进行了训练。然后,在下表中将经训练的网络的性能与Han等人的性能进行了比较。该表示出类似于针对LeNet-300体系架构所示的结果的趋势。在原始体系架构的430k参数中,Han等人提出的方法能够将这个数字减少到约37k参数。对于分别与等式10和18对应的实施例,在其两个不同实施例中所提出的训练过程200能够将这个数字减少到仅9k和11k参数。结果表明,根据等式10的本发明实施例实现了更好的稀疏度,而根据等式18的本发明实施例实现了相同的误差。

已在Fashion-MNIST数据集上重复了先前的实验(https://github.com/zalandoresearch/fashion-mnist)。这种数据集包含尺寸为28×28的单色图像,作为原始MNIST数据集。但是,图像包含诸如包、衣服、鞋等物品。

这个进一步实验的目的是评估所提出的训练过程200是否也能够在更密集的信号上稀疏化网络操作。实际上,MNIST数据集是稀疏数据集,即,输入图像的大量像素具有等于0的值。众所周知,稀疏信号往往在训练期间促进网络稀疏度。相反,Fashion-MNIST数据库的稀疏度要低得多,因此实现稀疏网络体系架构更具挑战性。MNIST数据集相当稀疏,因为像素的值或者在0(黑色像素)附近或者在255(白色像素)附近。相反,Fashion-MNIST数据集沿着表示不同灰度阴影的中间像素强度值具有更多信息。

下表示出了在原始MNIST数据集上进行训练时与针对LeNet-5体系架构示出的结果相似的趋势。在原始体系架构的430k参数当中,Han等人提出的方法能够将这个数字减少到约46k参数。对于分别与等式10和18对应的实施例,在其两个不同的实施例中,所提出的训练过程200能够将这个数字减少到仅37k和61k参数。结果表明,与等式10对应的实施例允许获得更好的稀疏度,而与等式18对应的实施例实现了相同的误差。这个实验证实,越不稀疏的图像产生自然具有更有意义的参数的网络。不过,即使对于非稀疏信号,所提出的训练过程200也仍然能够增加网络稀疏度。

作为最终实验,已使用VGG-16网络体系架构上的Imagenet数据库重复了先前的实验。

ImageNet数据集由224×224个24位彩色图像组成,这些图像包含1000种不同类型的对象(C=1000个类别)。该数据库包含1M训练样本和100k个测试样本。对于MNIST数据集,ImageNet数据集表示更接近实际的大规模对象识别问题。

VGG-16体系架构是复杂得多的用于通用对象字符识别的卷积网络体系架构,其包括13个卷积层和三个完全连接的层,如下表中所示,总共约有138M的可学习参数。关于参数的数量,VGG-16的参数比LeNet5体系架构多约250倍,更接近地表示实际部署以解决大规模对象识别问题的网络的规模。

根据与等式10对应的实施例并且根据与等式18对应的实施例,用提出的训练过程200对VGG-16网络进行了训练。然后在下表中将这两种情况下经训练的网络的性能与Han等人的性能进行比较。该表示出了与针对LeNet-300体系架构示出的结果类似的趋势。在原始体系架构中的138M参数当中,Han等人提出的方法能够将这个数字减少到约10.3M参数。在其两个不同实施例中,提出的训练过程200能够将这这个数字减少到约11.3M和9.8M参数。最后,实验表明,提出的训练过程200能够在增加网络稀疏度的同时将网络错误减少约1%。

前面的描述提出并详细讨论了本发明的几个实施例;不过,在不脱离由所附权利要求定义的范围的情况下,可能对描述的实施例以及不同的发明实施例进行若干改变。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号