一种面向硬件实现的GBDT分类模型压缩方法与流程

文档序号:13915599阅读:202来源:国知局

本发明涉及信息的压缩技术,具体涉及一种面向硬件实现的gbdt分类模型压缩方法,尤其面向资源受限的硬件系统gbdt分类模型压缩。



背景技术:

gbdt(gradientboostingdecisiontree)由friedman在1999年提出,是一种由弱学习器组合生成强学习器的算法。该算法由多棵决策树(本发明中为cart树)构成,其结果由所有树的结论累加得到。gbdt泛化能力较强,在回归、分类、排序问题上的应用也十分广泛。然而过大的规模导致其在一些资源受限的硬件系统,诸如fpga及dsp上的应用受到了一定制约。特别是对于gbdt分类模型在资源受限的硬件实现来说,还存在以下几个问题:

1)现有的gbdt模型保留了所有弱分类器——每一棵cart决策树的原始信息,而没有考虑树本身所携带的冗余信息。

2)现有的gbdt模型中的节点参数多存为int型或float型,而在实际应用过程中对于其的精度要求则并不是很高,因此数据的存储格式也带来了空间的额外占用。

3)现有的gbdt模型主要通过指针索引的方式构建,若利用硬件运行该模型,则会导致每个节点又额外需要两个指针的存储空间,加重了硬件内存的负担。

由于目前对于压缩gbdt模型的研究较少,因此这些问题都亟待解决。



技术实现要素:

本发明的目的在于针对现有技术中的上述问题,提供一种面向硬件实现的gbdt分类模型压缩方法,利用自定义剪枝方法压缩模型结构,利用自定义编码存储模型参数,利用自定义寻址方式构建模型,来有效降低模型的存储空间、减轻硬件压力。

为了实现上述目的,本发明采用的技术方案包括以下步骤:

一、解析opencv训练所得gbdt分类模型的xml文件以提取每个节点的深度depth、分叉split、属性var、阈值le以及预测值value的信息;

二、将预测值value近似为整数并对原模型中的每一棵树进行剪枝;

三、按出现顺序排列构成模型的决策树,对每棵树按照深度depth由浅到深的顺序排布其节点,令其根节点位置为零,记录树内所有节点较根节点的相对位置,并据此给出所有非叶子节点的左子节点位置add;叶子节点的左子节点由下一棵树的根节点较当前根节点的相对位置替代;

四、将阈值le转换为整数,并将分叉split、属性var、阈值le、预测值value以及节点位置add编写为定长二进制码;

五、对于每个非叶子节点,按分叉split、属性var、阈值le以及节点位置add的顺序将其数据编为一组码字;对于每个叶子节点,按分叉split、补0、预测值value、节点位置add的顺序将其数据编为一组与非叶子节点等长的码字;而后将节点码字按地址顺序排布成树,并将树按照在原模型中出现的先后次序存入相应类别对应的数组中;

六、利用位运算读取节点编码中存储的分叉split、属性var、阈值le、预测值value以及节点位置add的信息,实现分类模型的重建。

所述第一步中分叉split的取值域为0、1,split=1表示节点处有分叉,split=0表示节点为叶子节点。

所述第二步中剪枝操作剪掉预测值value相同的左右分支。

所述第三步中排布每棵决策树的节点时,若深度depth相同,则左节点在前。

所述第四步中,对阈值le做le=rounddown(le,m)×10m运算将其从浮点数变整数,也即对le保留m位小数再将其扩大10m倍,m取模型所需处理数据的有效小数位数,若有效小数位过多,则在保证准确率的情况下减小m的取值;将预测值value替换为value=value-min(value),避免对value符号的编码;

通过下式计算二进制码的长度:

其中,x表示需要编码的值,length表示编码长度。

所述第五步中,通常每类别节点数目不同,所需存储空间的长度不同,因此为避免浪费,存储数据时采用每类别存入一个一维数组而非所有类别存入一个二维数组的做法。

所述第六步中分类模型的重建方法如下:

首先,将输入数据保留m位小数并将小数点右移m位,m为扩大阈值le时右移的位数;然后,访问第一类别第一棵树的根节点,记其地址为tadd=0,并通过位运算读取其编码首位分叉split的值并进行下述判别:

若split=1,该节点为非叶子节点,利用位运算读取其属性var、阈值le、左子节点相对位置add的值,将输入数据的第var个特征值feature(var)与阈值le进行比较;若feature(var)≤le,则访问位于address=tadd+add地址上的左子节点;否则,访问位于address=tadd+add+1地址上的右子节点;若split=0,则该节点为叶子节点,利用位运算读取其预测值value、左子节点相对位置add的值,将预测值value的值计入本类别的总预测值valsum,而后访问位于tadd=tadd+add地址上的下一棵树的根节点,读取其分叉split的值并继续上述判别,循环该判别直至此类别中的所有树均被访问完毕;

随后,对其余类别中的数据也做上述运算;

最终,选取valsum最大值对应的类别为预测类别。

与现有技术相比,本发明的优点如下:

首先,通过对预测值value取整并依据取整后的值进行剪枝的操作,能够使得原始的模型参数得到大幅减少,从而使模型的结构复杂度得到降低。其次,实验证明本发明通过组合编码的方式能够将原模型运行所需的分叉split、属性var两int型数据以及阈值le和预测值value两float型数据共16个字节的数据降至4个字节甚至更少(此处压缩倍数根据模型、所需处理数据以及对准确率要求的不同而有所区别),可见,本发明能够在很大程度上降低模型的存储空间。最后,本发明通过对地址编码减少了运行内存的占用。通常情况下,决策树子节点的寻址有两种办法,一是通过指针实现,一是将树以完备形式存入数组直接访问相应的数组元素实现。然而指针法需对每个节点额外分配两个指针,也就是8个字节的空间来实现左右节点的寻址;数组法需存入完备二叉树,而构成模型的决策树均非完备树这样会导致大量冗余信息的存入。与这两者相比,本发明将地址编入节点码字的办法大大避免了内存浪费。

附图说明

图1本发明的整体流程图;

图2自定义寻址方式示意图;

图3节点编码格式示意图;

图4存储方式示意图;

图5模型重建的算法流程图。

具体实施方式

下面结合附图对本发明做进一步的详细说明。

本发明针对gbdt分类模型提出了一种对模型结构进行剪枝、对节点参数进行编码并对编码进行翻译来重构模型的方法,这种方法能够在一定程度上解决gbdt分类模型的硬件实现过程中出现的内存不足的问题。本发明首先需要获取opencv训练所得的gbdt分类模型的xml文件,通过处理该文件,提取出所需的深度depth、分叉split、属性var、阈值le以及预测值value数据。对预测值value进行取整,并利用取整后的预测值value值进行剪枝。利用深度depth对每棵树内的节点进行排序,导出每个节点的树内地址信息及相应的左子节点位置add。之后需要将分叉split、属性var、阈值le、预测值value、节点位置add数据取整编为二进制码并按照分叉split、属性var、阈值le、节点位置add及分叉split、0、预测值value、节点位置add的顺序分别对叶子节点和非叶子节点进行组合。按地址序将每个节点的组合编码存入相应树并按次序将树存入相应类别数组便实现了模型的压缩。以码字内的左子节点位置add为索引进行模型结构重建,并利用码字内的其他数据填充节点信息即可完成gbdt分类模型的复原。

本方法不仅对原始模型进行了剪枝,而且对模型参数及自定义地址进行了组合编码,一方面大大缩减了模型的存储空间,另一方面根据自定义地址构建决策树结构的过程也减少了模型的运行内存,在对大规模数据集的分类过程中有良好的表现。

本方法主要包括解析xml文件、剪枝、自定义节点地址、节点信息编码以及模型重建几部分工作。方法流程图如图1所示。具体包括以下几步:

一、解析原始gbdt分类模型参数文件,获取节点的深度depth、是否分叉split、特征属性var、特征阈值le及预测值value数据。

二、对预测值value进行取整后剪枝。

由于模型参数中的value是预测值,作用是通过各类预测值value之和的大小比较进行类别区分,因此预测值value实际上反映了输入数据归属于某一类别的可能性。预测值value的取值域覆盖了整个实数域,当数据属于某类别的可能性较大时,预测值value取较大正值;不属于某类别的可能性较大时,预测值value取较小负值。预测值value的小数有效位数较多,但由于在大多数(超过90%)情况里,最大预测值value之和与第二大预测值value之和间的差值均远大于10,可见单个预测值value小数部分的值对结果的影响十分微小,因此选择直接将预测值value四舍五入为整数。若需要更高的准确率,可以保留一到两位有效小数。

预测值value确定之后,即可将原模型树中预测值value相等的左右分支剪掉,将分支的预测值value赋于其根节点,并改该根节点为叶子节点,从而实现对原模型的结构压缩。

三、将构成模型的决策树按出现顺序排列,将树中的节点按深度depth由浅到深的顺序排布成一维向量,令其根节点位置为零,记录树内所有节点较根节点的相对位置,并据此给出所有非叶子节点的左子节点位置add;叶子节点的左子节点由下一棵树的根节点较当前根节点的相对位置替代,由于模型中树按顺序排列,因此下一棵树较当前根节点的相对位置为本棵树的最大位置加1。自定义寻址过程如图2所示。

四、在考虑模型准确率的情况下,将分叉split、属性var、阈值le、预测值value以及节点位置add数据转为整数后编为定长二进制码。具体如下:

split表示某节点处是否有分叉,取值域为{0,1},因此分叉split编为1位二进制码。

var表示输入数据的特征属性个数,若输入数据有1个特征属性,则不考虑属性var,也无需对其编码;若输入数据有x个特征属性,则属性var编为位二进制码。

le是输入数据的阈值,其作用是对输入数据进行划分,因此阈值le的小数有效位数只要大于或等于大部分输入数据的小数有效位数即可,若le有效小数位过多,则在保证准确率的情况下适当减少其小数有效位。此后,需将阈值le值由浮点型转变为整型,本发明采取的做法是将阈值le的小数点右移m位至最右,将其完全变为整数integer_le,而后再编为位二进制码。另外,由于阈值le需与输入数据进行比较,因此,输入数据也需保留m位小数并将小数点右移m位。

预测值value经过步骤二中的取整,若存在小数,则利用le的做法将其转换为整数。为避免对预测值value的符号编码,通过value=value-min(value)将所有预测值value转为正数,并编为位二进制码。由于类别判定需要将各预测值value之和比较,因此将所有value值同时增大的操作不会对预测结果产生影响,本发明做法合理。

add为自定义左子节点地址,其值为正整数,直接编为位二进制码即可。

五、组合编码及存储。对于每个非叶子节点,按分叉split、属性var、阈值le及节点位置add的顺序将其相应二进制码组合为一组码字;对于每个叶子节点,按分叉split、补0、预测值value、节点位置add的顺序将其相应二进制码组合为一组与非叶子节点等长的码字。其中,补0也即在其他位对齐的情况下将空缺位填补为0。节点的编码示例如图3所示。

编码完成后将节点码字按自定义地址顺序排布成树,将树以在原模型中出现的先后次序存入相应类别中,将每一类别的所有数据存入一个数组中,如图4所示。

六、模型重建。按照图5所示的流程,利用位运算访问节点编码中蕴含的分叉split、属性var、阈值le、预测值value、节点位置add信息实现模型重建。图5中classnum为总类别数,n为当前类别,treenum为总树数,i为当前树,array为编码的存储数组。具体实现过程如下:

首先,将输入数据保留m位小数并将小数点右移m位,m为扩大le时右移的位数。

然后,访问第一类别第一棵树的根节点,地址为tadd=0,通过位运算读取其编码首位也即分叉split的值。位运算包括位与运算(读出特定位的值)和移位运算(只保留特定位的值)。

若split=1,该节点为非叶子节点,利用位运算读取其属性var、阈值le以及节点位置add值,将输入数据的第var个特征值feature(var)与阈值le进行比较。若feature(var)≤le,则访问该节点的左子节点,也即位于address=tadd+add地址上的节点;否则,访问该节点的右子节点,也即位于address=tadd+add+1地址上的节点。

若split=0,该节点为叶子节点,利用位运算读取其预测值value、节点位置add的值,将预测值value计入本类别总预测值valsum,访问位于tadd=tadd+add地址上的下一棵树的根节点,读取分叉split值并继续上述判别,循环该判别直至此类别中的所有树均被访问完毕。

而后,对其余类别中的数据也做上述运算。

最终,选取valsum最大值对应的类别为预测类别。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1