三. 工艺参数优化算法
(1). 集成学习。
1. Boosting给固定样本加权,串行地生成一系列“weak learners”,再学习样本及分类器的权重,通过“weak learners”组合构造一个“strong learner”。回归算法可以通过残差来实现:每一轮的训练集发生变化(标签变为了残差),即下一个模型要基于新训练集进行学习,学习完毕后,将所有模型简单叠加,就得到了最终模型。
2. Bagging随机有放回均匀取样构造n个训练集,并行训练k个模型(决策树、KNN等)。对于分类问题:由投票表决产生的分类结果;对于回归问题,由k个模型预测结果的均值作为最后预测的结果(所有模型的重要性相同)。例如,随机森林,Random Forest。
(2). Adaboost。
(3). GBDT。
Gradient Boosting Decision Tree,梯度提升树,不同于Adaboost加大误分样本权重的策略,每一次的计算是都为了减少上一次的残差,进而在残差减少(负梯度)的方向上建立一个新的模型。无论是回归、二分类还是多分类问题(设定阈值),GBDT中的决策树都是回归树(传统GBDT使用CART),因为每次迭代要拟合的是梯度值,是连续值。
模型一共训练M轮,每轮产生一个弱分类器
T(x;θm) 。我们希望损失函数能够尽可能快的减小,沿着梯度方向下降。每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度(残差的近似值),整体上,作为回归问题,拟合一个回归树,进而发现多种有区分性的特征以及特征组合。
1. XGBoost。
全称是eXtreme Gradient Boosting,是GBDT的改进版,能自动利用cpu的多线程。作为一个树集成模型,XGBoost将K个树对应的叶节点的值求和进行预测。
我们的目标是学习这K个树,因此,需要最小化带正则项的目标函数:
在XGBoost里,每棵树(fk)是一个一个往里面加的:
每加一个都希望效果能提升,即目标函数(就是损失)的值下降,如果经过t轮训练我们做模型预测,之前的目标函数细化为:
除了损失函数是square loss的情形,还是比较复杂。因此,用泰勒展开(取前三项,二阶)近似原来的目标函数,这里就与GBDT不同了,GBDT利用梯度,即一阶导数来近似,精度显然会差一些。
其中,损失函数l可以是square或者logistic Loss,而第二部分Ω正则项(eg:L1和L2等)针对的是树的复杂度。XGBoost对于树的复杂度定义如下:
我们来图解一下:
这里面,树的复杂度项包含两个部分,叶子节点个数T以及叶子节点得分L2正则化项w(L2平滑避免过拟合)。我们移除常量,定义为每个叶节点 j 上面样本集合Ij = {i|q(xi) = j},并带入上述复杂度函数到正则项中,得到新的目标函数:
g是一阶导数,h是二阶导数,T是叶节点个数,w是叶节点的分数。目标包含了T个相互独立的单变量二次函数,化简为:
求wj最优解(求导=0)并带入目标函数,得到最终的目标函数:
Obj表示在指定的树结构下,我们在目标上最多减多少,因此又叫结构分数(structure score),越小代表树的结构越好。那么如何寻找出一个最优结构的树呢?XGBoost原始论文中给出了两种分裂节点的方法。
Exact Greedy贪心算法:枚举所有不同树结构的贪心法。
枚举所有可能的树结构是不可行的。可以使用贪心算法,从单个叶子开始不断增加分支(分割),计算分割后左右两侧的导数和(提高效率),再计算增益。评估候选分裂方式,寻找最优特征及对应的值:
引入新叶子的惩罚项,控制树的复杂度,同时也作为阈值(增益大于阈值才分裂),起到了预剪枝的作用。论文中的算法:
但在连续特征上枚举所有可能的分割方案,计算损耗还是太大。为了更高效,XGBoost先使用pre-sorted算法对所有数据根据特征数值进行预排序,然后在每次分割时,按顺序访问数据并根据增益找到每个特征的最优分割点,最后找到最优特征及分割点,将数据分裂成左右两个子节点。
近似算法:针对数据量太大的情况。
当数据无法完全加载进内存或是分布式的情况下,贪心算法就不是特别有效了。近似算法根据特征分布的百分位数(weighted quantile sketch算法使候选切分点在数据上均匀分布),提出候选切分点,然后将连续特征映射到被这些候选切分点切分成的”buckets”中,聚集统计值,基于统计值推荐分割点,找到最佳方案。该算法有两种形式:全局近似和局部近似,差别是,全局近似是在创建树的初始阶段提出所有候选切分点,所有的层都使用相同的proposal寻找切分点;局部近似在每个节点分裂之后重新提出候选切分点,这种改进对更深层的树更合适。近似算法的流程:
此外,稀疏自适应分割策略也可以用于分裂节点:
除了在目标函数中引入正则项,XGBoost还引入了缩减(shrinkage)和列抽样(column subsampling),进一步防止过拟合。通过在每一步的boosting中引入缩减系数,降低每个树和叶子对结果的影响;列抽样是借鉴随机森林中的思想,有时甚至比行抽样效果更好,同时能够加速计算。
综上,基于贪心+二次最优化的策略,XGBoost算法流程可以总结为:
2. LightGBM。
LigthGBM由微软提供,也是对GBDT的高效实现,类似XGBoost,采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树。LightGBM比XGBoost快,内存占用率低,准确率也有提升。
动机:
面对工业级海量的数据,传统的boosting算法需要对每一个特征都要扫描所有的样本点来选择最好的切分点,把整个训练数据装进内存会限制训练数据的大小,不装进内存,反复读写训练数据又非常耗时。
算法流程:
解决上述问题的直接方法就是减少特征量和数据量而且不影响精确度。LightGBM结合使用了以下两种算法:
1. GOSS(Gradient-based One-Side Sampling): 基于梯度的单边采样,不使用所用的样本点来计算梯度,而是对样本进行采样来计算梯度。
GBDT不能应用AdaBoost的样本权重采样,但每个数据都有不同的梯度值,丢掉梯度小、被学习得很好的数据,有助于采样。为了避免这样做带来的精确度影响(数据分布改变了),引入GOSS算法。
步骤:
根据样本点的梯度的绝对值对它们进行降序排序; –> 保留top a(大梯度数据的采样率为a)个数据实例作为数据子集A,即前a*100%的样本; –> 对于剩下的数据的实例随机选取比例为b(小梯度数据的采样率为b)的数据子集B,即b*(1-a)*100%个样本点; –> 将小梯度样本乘上权重系数(1-a)/b并与大梯度样本合并来计算信息增益,学习一个新的弱学习器; –> 不断重复之前的步骤直到达到规定的迭代次数或者收敛为止。
估计信息增益的公式如下:
当a=0时,GOSS算法退化为随机采样算法;当a=1时,GOSS算法变为采取整个样本的算法。算法在不改变数据分布的前提减少了计算量、保证了精度,同时增加了基学习器的多样性,提高了泛化能力。
2. EFB(Exclusive Feature Bundling):互斥特征捆绑,不使用所有的特征来进行扫描获得最佳切分点,而是将某些特征捆绑在一起来降低特征的维度。
LightGBM不仅进行了数据采样,也进行了特征抽样,EFB将冲突比率(特征不互斥程度)较小的特征捆绑起来,使模型的训练速度进一步提升。将特征划分为更小的互斥绑定集群是一个NP-hard问题(图着色问题),只能寻求允许小部分冲突的近似解。
步骤:
构造一个图(Graph),特征看作节点(node),特征之间的冲突值(cos夹角)作为边(edge)的权值; -> 通过节点(特征)在图中的度(degree)来降序排序特征/更高效的实现算法是将特征按照非零值的个数进行排序; -> 遍历每个特征,并按阈值K(最大冲突数)合并特征,分配给具有小冲突的现有bundle或创建新bundle。
不同于XGBoost所使用的pre-sorted排序算法,LightGBM最后一步关于互斥特征的合并用到了直方图(Histogram)算法:
基本思想是把连续的特征值离散成k个整数,并构造宽度为k的直方图。遍历数据时,以离散化后的值为索引累积直方图统计量,遍历一次数据后,根据直方图的离散值,遍历寻找最优的分割点。使用bin放弃了数据的细节特征,相似的数据被划分到相同的桶中,差异就消失了,同时,bin相当于增加了正则化,数量越少惩罚越严重,欠拟合风险越高。但对决策树这样的弱学习器的正则化,抵消了离散化的分裂点对最终分割精度的影响,有效防止了过拟合。而且,由于离散化,模型效率上有很大提升。
决策树增长策略:
XGBoost采用的是Level-wise迭代方式,不加区分的一次分裂同一层的叶子,效率低下,可能产生不必要的叶结点。
LightGBM通过leaf-wise策略来生长树。每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。
相比Level-wise,在分裂次数相同的情况下,leaf-wise可以降低更多的误差,精度更好。但当样本量较小的时候,leaf-wise需要引入额外的参数max_depth
来限制树的深度,避免过拟合。
此外LightGBm直接支持类别特征,支持特征并行和数据并行。
3. CatBoost。
CatBoost(categorical boosting)是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库。是一种能够很好地处理类别型特征的梯度提升算法。采用的策略在降低过拟合的同时保证所有数据集都可用于学习。
动机:
CatBoost算法的设计初衷是为了更好的处理GBDT特征中的categorical features。类别数较少的特征,一般利用one-hot编码方法将特征转为数值型用。另一种简单的方式是基于统计,用标签的平均值来表示特征并作为节点分裂的标准(Greedy Target-based Statistics),但在训练和测试集数据结构和分布不同时,容易导致条件偏移问题,造成过拟合。
算法流程:
标准的改进Greedy TS的方式是添加先验分布项,这样可以减少噪声和低频率数据对于数据分布的影响。CatBoost给出了一种解决方案:
1. Ordered TS克服梯度偏差(prediction shift);
在GBDT中,构建下一棵树包含两步,选择树的结构和设置叶子节点的值。基于当前模型中的相同的数据点,叶子节点的值都是被当做梯度或牛顿步长的近似值来计算,这样会造成有偏的点态梯度估计(梯度在特征空间的任何域中的分布与该域中梯度的真实分布相比发生了偏移),导致过拟合。CatBoost和标准GDBT算法一样,第一阶段,通过构建新树来拟合当前模型的梯度,但在每一步,依靠目前已经观察的样本集,对所有样本进行随机排序,在不同的梯度提升步中使用不同的排列,即使用独立的数据集,这样就得到了无偏估计的模型。两种模式的树结构:Ordered/Plain。基本预测器是无关决策树oblivious,将浮点型特征、统计值及one-hot编码的特征二值化并放入向量中,利用二值化的特征快速评分,计算模型的输出。由于整个层次上使用相同的分割标准,oblivious树是平衡的,不容易过拟合。
Ordered模型在学习训练的过程中,对于每个样本,都单独构建一个利用该样本之前的样本点的梯度估计得到的模型,针对这些模型,估计该样本的梯度,然后利用新模型重新对样本打分。在算法中每步迭代中,都在一个随机排列的基础上构建树。第二阶段,在所有树结构都建立好的情况下,对两种模式均采用标准梯度增强程序计算最终模型的叶子节点值。
2. 样本的类别型特征转为数值型;
类别形变量需要使用随机排列,根据排在该样本之前的该类别标签取均值作为节点分裂标准,并加入优先级和优先级的权重系数。
其中P是添加的先验项,a通常是大于0的权重系数。回归问题,一般先验项可取数据集标签的均值。对于二分类,先验项是正例的先验概率。
3. 特征组合;
特征组合可以得到一个新的强大的特征,但受制于特征数量,不可能考虑所有组合。当前树构造新的分割点时,CatBoost会采用贪婪的策略考虑组合。对于树的第一次分割,不考虑任何组合。后面的分割中将所有类别型特征之间的组合考虑进来,组合后的特征就会变成数值型的。对于数值型和类别型特征的组合:树选择的所有分割点都被视为具有两个值的类别型特征,并且组合方式和类别型特征一样。
(4). 提升树算法工业应用。
津南数字制造算法挑战赛——赛场一:原料企业工艺优化。
https://tianchi.aliyun.com/competition/entrance/231695/introduction?spm=5176.12281915.0.0.678010bdUCRYjV
季军方案:nlceyes
https://github.com/nlceyes/TianChi-JinNan
DRL算法:
(1). 组合优化。
运用深度强化学习求解组合优化问题是目前非常火热的一个研究方向,强化学习天生就是做序列决策用的,组合优化问题里边的序列决策问题完全也可以用强化学习来直接求解,其难点是怎么定义state, reward。比较经典的TSP(Traveling Salesman Problem旅行商问题)和VRP(Vehicle Routing Problem车辆路径问题)主要的思路是encoder + decoder。encoder有很多方法,graph embedding, attention, glimpse, multi-head等,decoder也同样。在工业领域,例如对于Job shop问题(加工车间调度问题)就是决定以什么顺序在机器上加工工件。阿里菜鸟物流人工智能部,使用深度强化学习方法求解一类新型三维装箱问题(将若干个长方体物体逐个放入一个箱子中并最小化能够容纳所有物品的箱子的表面积),相对于已有的启发式算法,获得大约5%的效果提升。
1. Pointer Network:
Pointer Networks是一种seq2seq模型,由Google Brain和UC Berkeley联合发表。传统的seq2seq模型无法解决输出序列的词汇表会随着输入序列长度的改变而改变的问题。特定情况下,我们希望输出是输入集合的子集,而Ptr-net在seq2seq基础上引入attention机制并做了简化(传统attention计算权重后对encoder的state进行加权得到一个向量;Pointer Networks计算权重后选择概率最大的encoder state作为输出),类似编程语言中的指针(每个指针对应输入序列的一个元素,可以直接操作输入序列而不需要特意设定输出词汇表),克服了seq2seq模型中“输出严重依赖输入”的问题。网络对比如下:
seq2seq:
seq2seq属于encoder-decoder结构的一种,以LSTM为基本单元,一个RNN作为encoder将输入序列压缩成指定长度的语义向量,另一个RNN作为decoder根据语义向量(只作为初始状态参与运算,与后面的运算无关)生成指定的序列,详细结构如下:
Attention Mechanism:
Attention Mechanism可以帮助模型对输入的X每个部分赋予不同的权重,抽取出更加关键及重要的信息,使模型做出更加准确的判断,同时不会对模型的计算和存储带来更大的开销。
没加入Attention机制时,Y1 = f(C);Y2 = f(C,Y1);Y3 = f(C,Y1,Y2),各阶段的输出Yi用的都是同一个中间语义c表示,而C是由输入的每个元素经过Encoder编码产生的,即C = F(x1,x2,x3,x4),输入序列中的任意单词对目标Yi的影响力是一样的。此外,Encoder不论接收多长的序列,最后输出都是一个中间语义向量C,语句很长时C的表达能力堪忧。引入Attention的Encoder-Decoder框架,每一个输出Yi用不同的中间向量Ci表示,反应每个输入元素不同的影响,即Y1 = f(C1);Y2 = f(C2,Y1);Y3 = f(C3,Y1,Y2)。
Ci定义为:
其中Lx表示输入source长度,aij表示输出第i个元素时source输入序列中第j个元素的注意力分配系数,hj是Source输入序列中第j个元素的语义编码。aij的概率分布值计算方法如下:
在时刻i生成Yi,i-1时刻隐藏层节点的输出值Hi-1是已知的,计算Hi-1和Encoder的每个元素对应的RNN隐藏层节点状态hj的相似性F(hj,Hi-1)来获得“对齐”可能性。函数F可以采用向量点积、Cosine相似性或MLP网络,输出经过Softmax进行归一化就得到了注意力分配系数的概率分布值。综上,Attention机制的本质思想可以表示为:
将Source中的构成元素看作一系列<Key,Value>数据对,Target中的某个元素看作Query,通过计算Query和各个Key的相似性得到每个Key的权重系数,再对Value进行加权求和,最终的得到Attention vector。
Self Attention:
又称Intra(内部) Attention。在机器翻译场景中,可以捕获同一个句子中单词之间的一些句法特征或者语义特征,更容易捕获句子中长距离的相互依赖的特征,同时增加计算的并行性。
在图像描述任务中,输入一张图片,AI系统输出一句描述,语义等价地描述图片所示内容。可以使用Encoder-Decoder框架来解决,Encoder输入一张图片,提取特征后,Decoder使用RNN或LSTM来输出自然语言句子。
这里引入Attention机制,输出某个实体单词时会将注意力聚焦在图片中相应的区域上,能显著提升系统输出效果。
Pointer Networks:
传统Attention机制的公式:
首先整合Encoder和Decoder的隐式状态,再学习分配给输入序列的权重系数a,最后加权求和得到vector来预测下一个输出。Ptr-net没有最后一个公式,直接将softmax结果当成输出,以指针的形式指向输入序列中最有可能是输出的元素。
Ptr-net很适合用来直接复制输入序列中的某些元素给输出序列,本文提到的组合优化场景刚好符合。
应用实践:
https://github.com/higgsfield/np-hard-deep-reinforcement-learning
(2). 工艺参数推荐。
激光机工艺推荐、辅助波形调试、焚烧炉工艺优化等场景,需要逐台进行调试,现场调试技术复杂,有经验的技术人员的培养周期长。基于图嵌入的AI模型自动调参显著提升效率,节约成本。
1. GNN(图神经网络):
参见论文:Learning Combinatorial Optimization Algorithms over Graphs
https://arxiv.org/abs/1704.01665
应用实践:
https://github.com/Hanjun-Dai/graph_comb_opt
四. Reference
https://tianchi.aliyun.com/competition/entrance/231695/introduction?spm=5176.12281915.0.0.678010bdUCRYjV
Learning Combinatorial Optimization Algorithms over Graphs – Hanjun Dai, Elias B. Khalil, Yuyu Zhang, Bistra Dilkina, Le Song