一种模型联合训练的方法和系统
技术领域
本说明书涉及机器学习领域,特别涉及一种模型联合训练的方法和系统。
背景技术
多方联合建模,即多个参与方在保护各自私有数据的基础上,共同建立一个机器学习模型。但在这个场景下,多个参与方中的一方或者多方可能会为了自己的利益,对训练数据下毒,使得最终训练得到的模型有偏,例如:模型会对于某些样本做出错误的判断,从而下毒的参与方可以从中获益。
因此期待一种模型联合训练的方法和系统,在多方联合建模的场景下,可以抵御多个参与方中的一方或者多方对训练数据下毒。
发明内容
本说明书实施例之一提供一种模型联合训练的方法,所述方法包括:
多个联合训练的参与终端分别基于所述终端自身持有的样本数据进行模型联合训练,多个联合训练的参与终端分别使用基于梯度的优化算法生成各自的梯度;所述多个参与终端分别将所述各自的梯度发送给服务器;所述服务器从多个所述梯度中选取可信任梯度,并且根据选取的所述可信任梯度更新所述联合训练模型的参数;所述样本数据为文本数据、语音数据或者图形数据。
本说明书实施例之一提供一种模型联合训练的系统,所述系统包括:
梯度生成模块,用于使得多个联合训练的参与终端分别基于所述终端自身持有的样本数据进行模型联合训练,多个联合训练的参与终端分别使用基于梯度的优化算法生成各自的梯度;梯度发送模块,用于使得所述多个参与终端分别将所述各自的梯度发送给服务器;参数更新模块,用于使得所述服务器从多个所述梯度中选取可信任梯度,并且根据选取的所述可信任梯度更新所述联合训练模型的参数;所述样本数据为文本数据、语音数据或者图形数据。
本说明书实施例之一提供一种模型联合训练的装置,所述装置包括:
至少一个处理器以及至少一个存储器;所述至少一个存储器用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令中的至少部分指令以实现模型联合训练的方法。
本说明书实施例之一提供一种计算机可读存储介质,所述存储介质存储计算机指令,当计算机读取存储介质中的计算机指令后,所述计算机执行指令中的至少部分指令以实现模型联合训练的方法。
附图说明
本说明书将以示例性实施例的方式进一步说明,这些示例性实施例将通过附图进行详细描述。这些实施例并非限制性的,在这些实施例中,相同的编号表示相同的结构,其中:
图1是根据本说明书一些实施例所示的模型联合训练的系统的模块图;
图2是根据本说明书一些实施例所示的模型联合训练的方法的示例性流程图;
图3是根据本说明书一些实施例所示的模型联合训练的应用场景图;以及
图4是根据本说明书一些实施例所示的根据梯度更新模型的参数的的示意图。
具体实施方式
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本说明书的一些示例或实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图将本说明书应用于其它类似情景。除非从语言环境中显而易见或另做说明,图中相同标号代表相同结构或操作。
应当理解,本文使用的“系统”、“装置”、“单元”和/或“模组”是用于区分不同级别的不同组件、元件、部件、部分或装配的一种方法。然而,如果其他词语可实现相同的目的,则可通过其他表达来替换所述词语。
如本说明书和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其它的步骤或元素。
本说明书中使用了流程图用来说明根据本说明书的实施例的系统所执行的操作。应当理解的是,前面或后面操作不一定按照顺序来精确地执行。相反,可以按照倒序或同时处理各个步骤。同时,也可以将其他操作添加到这些过程中,或从这些过程移除某一步或数步操作。
图1是根据本说明书一些实施例所示的模型联合训练的系统的模块图。
如图1所示,该模型联合训练的系统可以包括生成模块110、发送模块120、更新模块130。
生成模块110可以用于使得多个联合训练的参与终端分别基于所述终端自身持有的样本数据进行模型联合训练,多个联合训练的参与终端分别使用基于梯度的优化算法生成各自的梯度。关于多个联合训练的参与终端分别基于所述终端自身持有的样本数据进行模型联合训练,多个联合训练的参与终端分别使用基于梯度的优化算法生成各自的梯度的详细描述可以参见图2,在此不再赘述。
发送模块120可以用于使得多个参与终端分别将梯度发送给服务器。关于多个参与终端分别将梯度发送给服务器的详细描述可以参见图2,在此不再赘述。
更新模块130可以用于使得所述服务器从多个所述梯度中选取可信任梯度,并且根据选取的所述可信任梯度更新所述联合训练模型的参数。关于所述服务器从多个所述梯度中选取可信任梯度,并且根据选取的所述可信任梯度更新所述联合训练模型的参数的详细描述可以参见图2,在此不再赘述。
应当理解,图1所示的系统及其模块可以利用各种方式来实现。例如,在一些实施例中,系统及其模块可以通过硬件、软件或者软件和硬件的结合来实现。其中,硬件部分可以利用专用逻辑来实现;软件部分则可以存储在存储器中,由适当的指令执行系统,例如微处理器或者专用设计硬件来执行。本领域技术人员可以理解上述的方法和系统可以使用计算机可执行指令和/或包含在处理器控制代码中来实现,例如在诸如磁盘、CD或DVD-ROM的载体介质、诸如只读存储器(固件)的可编程的存储器或者诸如光学或电子信号载体的数据载体上提供了这样的代码。本说明书的系统及其模块不仅可以有诸如超大规模集成电路或门阵列、诸如逻辑芯片、晶体管等的半导体、或者诸如现场可编程门阵列、可编程逻辑设备等的可编程硬件设备的硬件电路实现,也可以用例如由各种类型的处理器所执行的软件实现,还可以由上述硬件电路和软件的结合(例如,固件)来实现。
需要注意的是,以上对于模型联合训练的系统及其模块的描述,仅为描述方便,并不能把本说明书限制在所举实施例范围之内。可以理解,对于本领域的技术人员来说,在了解该系统的原理后,可能在不背离这一原理的情况下,对各个模块进行任意组合,或者构成子系统与其他模块连接。例如,在一些实施例中,图1中披露的生成模块110、发送模块120、更新模块130可以是一个系统中的不同模块,也可以是一个模块实现上述的两个或两个以上模块的功能。例如,生成模块110、发送模块120可以是两个模块,也可以是一个模块同时具有生成梯度和发送梯度的功能。诸如此类的变形,均在本说明书的保护范围之内。
图2是根据本说明书一些实施例所示的模型联合训练的方法的示例性流程图。
步骤210,多个联合训练的参与终端分别基于终端自身持有的样本数据进行模型联合训练,多个联合训练的参与终端分别使用基于梯度的优化算法生成各自的梯度。具体的,该步骤可以由生成模块110执行。
在一些实施例中,多个参与终端需要联合训练一个机器学习模型,每个参与终端持有的训练数据具有相同的特征空间,但样本不同。例如:一个参与终端是社交平台,另一个参与终端是电商平台,由于二者的某些业务相似,因此特征空间可以是相同的,例如,都收集用户的爱好、历史消费记录等特征,但是由于两个平台的客户群体不同,因此收集的样本数据不一样。
在一些实施例中,服务器初始化联合训练模型的参数。例如:对于逻辑回归模型,可以将权重参数初始化成均值为0、标准差为0.01的正态分布随机数,并将偏差参数清零。在一些实施例中,多个参与终端分别从服务器获取联合训练模型,基于终端自身持有的样本数据,训练该模型。在一些实施例中,样本数据可以为文本数据、语音数据或者图形数据。例如:如果模型用于文本识别,则样本数据可以为短语或句子形式的文本数据。又例如:如果模型用于图像分类,则样本数据可以为猫、狗等各种动物的图片,或者花、草以及树木等植物的图片。再例如:如果模型用于语音识别,则样本数据可以为语音数据。
在一些实施例中,联合训练模型可以是使用基于梯度的优化算法更新参数的任意模型。包括但不限于:逻辑回归(Logistic Regression,LR)模型、梯度提升树(GradientBoosting Decison Tree,GBDT)模型和卷积神经网络(Convolutional Neural Networks,CNN)模型等。
梯度的本意是一个矢量,表示某一函数在该点处的方向导数沿着该方向取得的最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。具体的:如果对一个多元函数求偏导,会得到多个偏导函数,这些偏导函数的值组成的矩阵或者向量就是梯度。例如,对于一个多元函数:
其梯度可以为:
即函数F(θ)的梯度为两个元素(
和
)的向量。在一些实施例中,可以使用基于梯度的优化算法生成与模型的参数对应的梯度,该梯度与模型的参数具有相同的维度。例如:模型有10个参数,则梯度为10个元素的向量。基于梯度的优化算法是机器学习中常用的优化算法。例如:梯度下降(Gradient Descent)算法,在求解损失函数的最小值时,可以通过梯度下降算法来一步步的迭代求解,得到最小化的损失函数和模型最终的参数值。根据训练周期使用的数据量的不同,梯度下降优化算法又可以分为批量梯度下降(BGD,Batch Gradient Descent)、随机梯度下降(SGD,Stochastic GradientDescent)和小批量梯度下降(MBGD,Mini-Batch Gradient Descent)等。
下面以联合训练模型为多元线性回归模型为例说明多个参与终端如何生成各自的梯度:
为了便于描述,假设该线性回归模型有5个权重参数:θ
1~θ
5,以及一个偏置参数:θ
0。则该模型可以表示为:
其中,x
(i)表示第i个样本(x
(i),y
(i))中的输入向量,
表示该输入向量中的第1个特征,…,
表示该输入向量中的第5个特征。输入向量x
(i)对应标签为:y
(i),用于表示将x
(i)输入模型后,期望模型输出的结果。在一些实施例中,在模型的训练过程中,模型可以被称为假设函数(Hypothesis function),将x
(i)输入假设函数,得到的预测值可能与标签y
(i)并不一致。因此,在一些实施例中,需要建立损失函数。损失函数又称为代价函数,是用来评估假设函数的预测值与对应标签不一致的程度,损失函数的值越小,说明模型的预测值就越接近期望值,模型训练的过程就是不断调整模型的参数,使得损失函数最小化的过程,假设函数、损失函数以及模型的参数之间的关系如图4所示。在本示例中,选用均方误差函数作为损失函数:
在公式(2)中,m为参与计算的样本的个数,对于批量梯度下降算法,所有的样本都会参加计算,例如:参与终端C1拥有5000个样本,则m可以为5000。公式(2)中的1/2是一个常数,用于后续计算梯度的时候,与二次方抵消,在不影响结果的情况下方便计算。本示例中,可以使用批量梯度下降算法计算损失函数J(θ)的梯度,由梯度的定义可知:
即,梯度
为6个元素
组成的一个向量,其对应于模型的参数:θ
0~θ
5,具体的,元素
为以θ
0为变量,其他参数(θ
1~θ
5)为常量,求J(θ)的偏导数所得的值,…,元素
为以θ
5为变量,其他参数(θ
0~θ
4)为常量,求J(θ)的偏导数所得的值。在一些实施例中,可以将公式(2)分解为
和f(u)=h
θ(x
(i))-y
(i)两个函数,根据复合函数求导法则,可得:
然后分别以θ
0、…、θ
5为变量,其他参数为常量,求J(θ)的偏导数,得到:
假设共有5个参与终端:C1~C5。在本示例中,参与终端C1~C5计算出的梯度可以表示为:g1、g2、g3、g4和g5。
步骤220,多个参与终端分别将梯度发送给服务器。具体的,该步骤可以由发送模块120执行。
在一些实施例中,各个参与终端可以将在步骤210中计算出来的梯度发送给服务器。发送的方式包括但不限于:网络传输、控制台推送、硬盘拷贝等。
步骤230,服务器从多个梯度中选取可信任梯度,并且根据选取的可信任梯度更新联合训练模型的参数。具体的,该步骤可以由更新模块130执行。
在一些实施例中,可能会存在参与终端中有一方或者多方对数据下毒的情况,例如:模型用于图像识别,在训练的过程中,某一个参与方将图片中的一些数据作细微的改动,例如,将图片中的某个像素值由“000”改为“010”或者“100”等,从而使得训练得到的模型对于某些样本的识别结果发生改变。为了防止在上述情况下模型中毒,在一些实施例中,服务器需要从多个梯度中选取可信任梯度。在一些实施例中,可信任梯度可以是使用理论推导或者大量实验得出的一些规律,判断出的由没有被下毒的训练数据所产生的梯度。在一些实施例中,可以认为某一个参与终端使用被下毒的数据计算出来的梯度,其值会大于其他参与终端使用正常训练数据计算出来的梯度。因此,在一些实施例中,选取可信任梯度的步骤可以为:
(1)计算多个梯度的第一平均值。第一平均值指的是本说明书一些实施例中计算的一个平均值,用以区分本说明书后文中描述的其他平均值,例如,第二平均值。在一些实施例中,服务器可以计算步骤220中多个参与终端发送的多个梯度的平均值,作为第一平均值。具体的,可以将多个梯度相加后做除法运算,作为多个梯度的平均值。例如,步骤210的示例中获取的梯度g1~g5的第一平均值可以为:g_bar=(g1+g2+g3+g4+g5)÷5。
(2)分别比较多个梯度与第一平均值,获取多个比较结果。具体的,分别对步骤220中接收的多个梯度与上述步骤中计算得到的第一平均值作减法运算,并取运算结果的模,获取多个差值。例如:步骤210的示例中获取的梯度g1~g5,与步骤(1)的示例中获取的第一平均值g_bar之间的多个差值为:diff1=|g1-g_bar|、…、diff5=|g5-g_bar|。
(3)将多个比较结果排序得到可信任梯度。具体的,将上述步骤获取的多个差值按照由小到大的顺序排列,将前L个差值对应的梯度作为可信任梯度。在一些实施例中,可以将与第一平均值偏差最大的梯度作为可疑梯度剔除掉,其余梯度作为可信任梯度。例如:将步骤(2)的示例中计算得到的5个差值,按照值由小到大的顺序排列为diff5、diff2、diff4、diff1、diff3,则前4个差值对应的梯度:g5、g2、g4和g1可以作为可信任梯度。在一些实施例中,被剔除的梯度也可以为2个。例如:上述示例中,则前3个差值对应的梯度:g5、g2和g4可以作为可信任梯度。在一些实施例中,被剔除的梯度也可以为3个或者3个以上,可以视参与终端的个数或者其他情况而定,不受本说明书的表述所限。在一些实施例中,如果可以确定一个阈值,梯度与第一平均值的偏差大于该阈值,就可以认为该梯度为可疑梯度,则本步骤可以替换为下述步骤:
(3_1)分别比较多个所述比较结果与预设阈值得到所述可信任梯度。具体的,将多个差值中值小于预设阈值的K个差值对应的梯度作为可信任梯度。例如,预设阈值为0.2,步骤(2)中获取的diff1~diff5分别为:0.16、0.12、0.23、0.15,0.18,则可信任梯度为4个:g1、g2、g4和g5。又例如,预设阈值为0.17,则可信任梯度为3个:g1、g2和g4。
在一些实施例中,各个参与终端与服务器互不信任,因此在步骤220中发送的梯度是使用加密算法(例如,同态加密算法)加密后的梯度。服务器可以将第一平均值返回到各个参与终端,由各个参与终端在本地计算各自的梯度与第一平均值的差值。服务器可以通过安全求极值的方法来确定哪一个参与终端计算出的差值最大,然后将该参与终端计算的梯度剔除掉,其他梯度作为可信任梯度。
在一些实施例中,可以计算上述获取的可信任梯度的第二平均值。具体的,可以将多个可信任梯度相加后做除法运算,获取多个可信任梯度的平均值。例如,在步骤(3_1)示例中获取的可信任梯度g1、g2、g4和g5的第二平均值可以为:g_bar1=(g1+g2+g4+g5)÷4。
在一些实施例中,可以使用步骤210中使用的基于梯度的优化算法更新联合训练模型的参数。例如,使用梯度下降算法更新该模型的参数:
其中,θ
j为模型的第j个参数,α被称为学习率(Learning rate),学习率用于调整梯度的值,其决定着损失函数能否收敛到局部最小值以及何时收敛到最小值,学习率的数值可以在模型的训练过程中进行调整,如果取到一个正确的值,则损失函数的值会越来越小。在现有的一些实施例中,可以将步骤(1)中获取的第一平均值作为联合训练模型的参数对应的梯度来更新该模型的参数。为了防止模型在训练过程中中毒,在本说明书所述的实施例中,可以将第二平均值作为联合训练模型的参数对应的梯度来更新该模型的参数。因为第二平均值是在剔除可疑梯度后,基于多个可信任梯度计算得出的结果,因此本说明书所述的实施例可以避免因为多个参与终端中的一方或者多方对数据下毒而造成模型中毒。下面以步骤210中的示例来说明如何更新模型的参数,为了便于描述,将第二平均值g_bar1(若为现有的一些实施例,此处为第一平均值g_bar)表示为:<aver0,aver1,aver2,aver3,aver4,aver5>,其中,aver0对应于
aver1对应于
…,aver5对应于
则模型的参数更新如下:
θ0=θ0-α*aver0;
θ1=θ1-α*aver1;
θ2=θ2-α*aver2;
θ3=θ3-α*aver3;
θ4=θ4-α*aver4;
θ5=θ5-α*aver5。
在一些实施例中,更新后的联合训练模型的参数会在下一轮训练的时候被多个参与终端从服务器下载到各个参与终端本地,按照步骤210~230进行下一轮参数的更新,如图4所示,直至梯度的值小于一个阈值,例如:10-5,此时损失函数在训练集上收敛,即损失函数的值基本不再减小,模型训练结束。
本说明书实施例可能带来的有益效果包括但不限于:服务器在更新模型的参数之前,剔除偏离平均梯度最大的梯度或者剔除偏离平均梯度超过设定阈值的梯度,从而抵御了多个参与终端中的一方或者多方对训练数据下毒。需要说明的是,不同实施例可能产生的有益效果不同,在不同的实施例里,可能产生的有益效果可以是以上任意一种或几种的组合,也可以是其他任何可能获得的有益效果。
应当注意的是,上述有关流程200的描述仅仅是为了示例和说明,而不限定本说明书的适用范围。对于本领域技术人员来说,在本说明书的指导下可以对流程200进行各种修正和改变。然而,这些修正和改变仍在本说明书的范围之内。例如,步骤230可以拆分为两个步骤230_1和230_2,在230_1中选取可信任梯度,在步骤230_2中更新模型的参数。
图3是根据本说明书一些实施例所示的模型联合训练的应用场景图。
如图4所示,参与终端1~参与终端4均为电商平台,各个终端拥有的数据特征相同,但是样本不同,例如,各个终端都收集用户的年龄、性别以及历史消费记录等特征,但是各个终端的用户群体不同。参与终端1~参与终端4需要使用各自持有的数据联合建立一个风险识别模型,为了抵御训练过程中有某一方或者多方对训练数据下毒,使用本说明书所述的方法进行联合训练。详细联合训练的方法请参见图2,这里不再赘述。
本说明书所述的方法还可以应用于其他应用场景,不受本说明书的表述所限。
上文已对基本概念做了描述,显然,对于本领域技术人员来说,上述详细披露仅仅作为示例,而并不构成对本说明书的限定。虽然此处并没有明确说明,本领域技术人员可能会对本说明书进行各种修改、改进和修正。该类修改、改进和修正在本说明书中被建议,所以该类修改、改进、修正仍属于本说明书示范实施例的精神和范围。
同时,本说明书使用了特定词语来描述本说明书的实施例。如“一个实施例”、“一实施例”、和/或“一些实施例”意指与本说明书至少一个实施例相关的某一特征、结构或特点。因此,应强调并注意的是,本说明书中在不同位置两次或多次提及的“一实施例”或“一个实施例”或“一个替代性实施例”并不一定是指同一实施例。此外,本说明书的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。
此外,本领域技术人员可以理解,本说明书的各方面可以通过若干具有可专利性的种类或情况进行说明和描述,包括任何新的和有用的工序、机器、产品或物质的组合,或对他们的任何新的和有用的改进。相应地,本说明书的各个方面可以完全由硬件执行、可以完全由软件(包括固件、常驻软件、微码等)执行、也可以由硬件和软件组合执行。以上硬件或软件均可被称为“数据块”、“模块”、“引擎”、“单元”、“组件”或“系统”。此外,本说明书的各方面可能表现为位于一个或多个计算机可读介质中的计算机产品,该产品包括计算机可读程序编码。
计算机存储介质可能包含一个内含有计算机程序编码的传播数据信号,例如在基带上或作为载波的一部分。该传播信号可能有多种表现形式,包括电磁形式、光形式等,或合适的组合形式。计算机存储介质可以是除计算机可读存储介质之外的任何计算机可读介质,该介质可以通过连接至一个指令执行系统、装置或设备以实现通讯、传播或传输供使用的程序。位于计算机存储介质上的程序编码可以通过任何合适的介质进行传播,包括无线电、电缆、光纤电缆、RF、或类似介质,或任何上述介质的组合。
本说明书各部分操作所需的计算机程序编码可以用任意一种或多种程序语言编写,包括面向对象编程语言如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB.NET、Python等,常规程序化编程语言如C语言、Visual Basic、Fortran 2003、Perl、COBOL 2002、PHP、ABAP,动态编程语言如Python、Ruby和Groovy,或其他编程语言等。该程序编码可以完全在用户计算机上运行、或作为独立的软件包在用户计算机上运行、或部分在用户计算机上运行部分在远程计算机运行、或完全在远程计算机或服务器上运行。在后种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或在云计算环境中,或作为服务使用如软件即服务(SaaS)。
此外,除非权利要求中明确说明,本说明书所述处理元素和序列的顺序、数字字母的使用、或其他名称的使用,并非用于限定本说明书流程和方法的顺序。尽管上述披露中通过各种示例讨论了一些目前认为有用的发明实施例,但应当理解的是,该类细节仅起到说明的目的,附加的权利要求并不仅限于披露的实施例,相反,权利要求旨在覆盖所有符合本说明书实施例实质和范围的修正和等价组合。例如,虽然以上所描述的系统组件可以通过硬件设备实现,但是也可以只通过软件的解决方案得以实现,如在现有的服务器或移动设备上安装所描述的系统。
同理,应当注意的是,为了简化本说明书披露的表述,从而帮助对一个或多个发明实施例的理解,前文对本说明书实施例的描述中,有时会将多种特征归并至一个实施例、附图或对其的描述中。但是,这种披露方法并不意味着本说明书对象所需要的特征比权利要求中提及的特征多。实际上,实施例的特征要少于上述披露的单个实施例的全部特征。
一些实施例中使用了描述成分、属性数量的数字,应当理解的是,此类用于实施例描述的数字,在一些示例中使用了修饰词“大约”、“近似”或“大体上”来修饰。除非另外说明,“大约”、“近似”或“大体上”表明所述数字允许有±20%的变化。相应地,在一些实施例中,说明书和权利要求中使用的数值参数均为近似值,该近似值根据个别实施例所需特点可以发生改变。在一些实施例中,数值参数应考虑规定的有效数位并采用一般位数保留的方法。尽管本说明书一些实施例中用于确认其范围广度的数值域和参数为近似值,在具体实施例中,此类数值的设定在可行范围内尽可能精确。
针对本说明书引用的每个专利、专利申请、专利申请公开物和其他材料,如文章、书籍、说明书、出版物、文档等,特此将其全部内容并入本说明书作为参考。与本说明书内容不一致或产生冲突的申请历史文件除外,对本说明书权利要求最广范围有限制的文件(当前或之后附加于本说明书中的)也除外。需要说明的是,如果本说明书附属材料中的描述、定义、和/或术语的使用与本说明书所述内容有不一致或冲突的地方,以本说明书的描述、定义和/或术语的使用为准。
最后,应当理解的是,本说明书中所述实施例仅用以说明本说明书实施例的原则。其他的变形也可能属于本说明书的范围。因此,作为示例而非限制,本说明书实施例的替代配置可视为与本说明书的教导一致。相应地,本说明书的实施例不仅限于本说明书明确介绍和描述的实施例。