xgboost多分类原理

假设有M个样本,m个特征,N个类别,即: (X_i,y_i )_{i=1}^M.

其中
X_i=(x_{i,1}, x_{i,2},...x_{i,m}),\\ y_i \in \{0,1,2,3,...,N-1\}.
y_{i,n}表示第i个样本在第n类上的真实得分值,则有:
\begin{equation} y_{i,n} \in \left\{ \begin{array}{**lr**} 1 , if \quad y_i = n, & \\ 0, else. \end{array} \right. \end{equation}
\hat y_{i,n}表示预测的第i类样本在第n类上的得分值。
则多分类的损失函数定义如下:
\begin{align} L(y,\hat y) &= \sum_{i=1}^M L(y_i, \hat y_i) +\Omega(f)\\ &= \sum_{i=1}^M L((y_{i,0},y_{i,1},...y_{i,N-1}), ( \hat y_{i,0}, \hat y_{i,1},... \hat y_{i,N-1}) )+\Omega(f)\\ &= - \sum_{i=1}^M \sum_{n=0}^{N-1}y_{i,n} \log(\frac{e^{\hat y_{i,n}}}{\sum_{c=0}^{N-1} e^{\hat y_{i,c}}})+\Omega(f) \end{align}
其中L是交叉熵损失函数,\Omega(f)是惩罚项。

如何求解?

现假设前t棵树已经生成,为了表述方便,给出如下的几个符号定义:

符号 含义
\hat y_{i,n}^{(t)} 第t个boost第i个样本在第n类上的得分
\hat y_{i,n}^{t-1} = \sum_{k=0}^{t-1} \hat y_{i,n}^{(t-1)} 前t-1个boost的累加得分

由此定义如下的损失函数:
\begin{align} L(y,\hat y^{(t)})&=\sum_{i=1}^M L(y_i, \hat y_{i}^{(t)})\\ &=\sum_{i=1}^M L(y_i, ( \hat y_{i,0}^{t-1} + \hat y_{i,0}^{(t)} , \hat y_{i,1}^{t-1} + \hat y_{i,1}^{(t)},.... \hat y_{i,N-1}^{t-1} + \hat y_{i,N-1}^{(t)} ) )\\ \end{align}
对于\hat y_{i,n}^{(t)}= \hat y_{i,0}^{t-1} + \hat y_{i,0}^{(t)}这个公式,我们给出一个简单的例子来验证。现在假设有树的最高深度是1,限定boost为2,我们打印样本在每个boost上的得分(即落在哪个叶子节点上)
"""
0:[edu4<159.587] yes=1,no=2,missing=1
1:leaf=-0.0608645
2:leaf=0.117652
booster[1]:
0:[edu1<378.454] yes=1,no=2,missing=1
1:leaf=-0.0617213
2:leaf=0.136535
booster[2]:
0:[edu2<166.643] yes=1,no=2,missing=1
1:leaf=-0.0428214
2:leaf=0.14372
booster[3]:
0:[edu3<99.8889] yes=1,no=2,missing=1
1:leaf=0.00749163
2:leaf=0.181717
booster[4]:
0:[edu4<157.801] yes=1,no=2,missing=1
1:leaf=-0.0594841
2:leaf=0.102977
booster[5]:
0:[edu1<363.302] yes=1,no=2,missing=1
1:leaf=-0.0603631
2:leaf=0.116588
booster[6]:
0:[edu2<160.402] yes=1,no=2,missing=1
1:leaf=-0.0428952
2:leaf=0.117361
booster[7]:
0:[edu3<99.3995] yes=1,no=2,missing=1
1:leaf=0.000404452
2:leaf=0.14999
'''

image.png

如上图所示,该样本分别落在了第1 2 1 1 2 2 1 1 个叶子节点上,对应的得分值为:
-0.0608645 0.136535 -0.0428214 0.00749163 0.102977 0.116588 -0.0428952 0.000404452。为了验证我们做如下的实验:(验证代码有点戳)

# 计算sofatmax后的值
def fun(array):
  sum = 0
  for i in range(0, len(array)):
      sum = sum + np.e ** array[i]
  res = []
  for i in range(0, len(array)):
       res.append((np.e ** array[i]) / sum)
 return res
# 将所有叶子节点上的值放到一个数组中
arr2 = [[-0.0608645, 0.117652],
  [-0.0617213, 0.136535],
  [-0.0428214, 0.14372],
  [0.00749163, 0.181717],
  [-0.0594841, 0.102977],
  [-0.0603631, 0.116588],
  [-0.0428952, 0.117361],
  [0.000404452, 0.14999]]
# 计算该样本所对应的得分值
round1_leaf_calue = []
for i in range(len(res1)):
  round1_leaf_calue.append([
      arr2[0][res1[i][0]-1],
      arr2[1][res1[i][1]-1],
      arr2[2][res1[i][2]-1],
      arr2[3][res1[i][3]-1],
  ])
# 计算对应的概率值
print(fun(round1_leaf_calue ))
# [0.24502039 0.302582   0.21561898 0.2367786 ]

可见每类上的的得分值只与其同类别的的得分值有关系。

将损失函数在(y_i, \hat y_{i}^{t-1})处泰勒展开(注意此处是向量函数的泰勒展开,第一次理解该问题的时候以后是标量的,然后就一直推导错误)
\begin{align} L(y,\hat y^{(t)})&=\sum_{i=1}^M L(y_i, \hat y_{i}^{(t)})\\ &=\sum_{i=1}^M L(y_i, ( \hat y_{i,0}^{t-1} + \hat y_{i,0}^{(t)} , \hat y_{i,1}^{t-1} + \hat y_{i,1}^{(t)},.... \hat y_{i,N-1}^{t-1} + \hat y_{i,N-1}^{(t)} ) )\\ &=\sum_{i=1}^M \{ L(y_i, \hat y_i^{t-1} ) +\sum_{n=0}^{N-1} \frac{\partial L(y_{i}, \hat y_{i}^{t-1} )}{\partial \hat y_{i,n}^{t-1} }\hat y_{i,n}^{(t)} + \frac{1}{2} \sum_{n_1=0}^{N-1} \sum_{n_2=0}^{N-1}\frac{\partial^2 L(y_{i}, \hat y_{i}^{t-1} )}{{\partial \hat y_{i,n_1}^{t-1} }{\partial \hat y_{i,n_2}^{t-1} }}\hat y_{i,n_1}^{(t) }\hat y_{i,n_2}^{(t) }+ 高阶项 \} \end{align}
为了后续求解方便,假设惩罚项叶子节点的值的平方和。假设第t个boost的n颗树(对应为第n+1个类别上的得分值)有T_n个叶子节点,第j个叶子节点上的样本结合表示为:
I_j=\{i,| x_i \in j类\}
即第i个样本落在第t个boost的第n类的树上的第j个叶子节点上。故惩罚项定义为:
\Omega(f_t) = \sum_{n=0}^{N-1} [\frac{\lambda_n}{2}\sum_{j=1}^{T_{n}} \omega_{j,n}^2+\gamma_nT_n]
则损失函数二级泰勒近似后有:
\begin{align} L(y,\hat y^{(t)}) \approx &\sum_{i=1}^M \{ L(y_i, \hat y_i^{t-1} ) +\sum_{n=0}^{N-1} \frac{\partial L(y_{i}, \hat y_{i}^{t-1} )}{\partial \hat y_{i,n}^{t-1} }\hat y_{i,n}^{(t)} + \frac{1}{2} \sum_{n_1=0}^{N-1} \sum_{n_2=0}^{N-1}\frac{\partial^2 L(y_{i}, \hat y_{i}^{t-1} )}{{\partial \hat y_{i,n_1}^{t-1} }{\partial \hat y_{i,n_2}^{t-1} }}\hat y_{i,n_1}^{(t) }\hat y_{i,n_2}^{(t) }\\ &+ \sum_{n=0}^{N-1} [\frac{\lambda_n}{2}\sum_{j=1}^{T_{n}} \omega_{j,n}^2+\gamma_nT_n] \\ &=\sum_{i=1}^M \{ L(y_i, \hat y_i^{t-1} ) +\sum_{n=0}^{N-1}\sum_{j=1}^{T_n} \{ { \sum_{i\in I_j}\frac{\partial L(y_{i}, \hat y_{i}^{t-1} )}{\partial \hat y_{i,n}^{t-1} }\omega_{j,n} + \frac{1}{2} \sum_{i \in I_j}\sum_{n_1=0}^{N-1}\ \frac{\partial^2 L(y_{i}, \hat y_{i}^{t-1} )}{{\partial \hat y_{i,n_1}^{t-1} }{\partial \hat y_{i,n}^{t-1} }}\omega_{j,n}\omega_{j,n_1}+\frac{\lambda_n}{2}\omega_{j,n}^2 \} }\\ &+\sum_{n=0}^{N-1}\gamma_nT_n \end{align}
显然损失函数是关于\omega_{j,n}的二次的,由凸优化的理论知,最优点在一阶导数为零处取得,因此有:
\frac {d( \sum_{i\in I_j}\frac{\partial L(y_{i}, \hat y_{i}^{t-1} )}{\partial \hat y_{i,n}^{t-1} }\omega_{j,n} + \frac{1}{2} \sum_{i \in I_j}\sum_{n_1=0}^{N-1}\ \frac{\partial^2 L(y_{i}, \hat y_{i}^{t-1} )}{{\partial \hat y_{i,n_1}^{t-1} }{\partial \hat y_{i,n}^{t-1} }}\omega_{j,n}\omega_{j,n_1}+\frac{\lambda_n}{2}\omega_{j,n}^2) }{\omega_{j,n}}=0\

因此只要求出\frac{\partial L(y_{i}, \hat y_{i}^{t-1} )}{\partial \hat y_{i,n}^{t-1} }\frac{\partial^2 L(y_{i}, \hat y_{i}^{t-1} )}{{\partial \hat y_{i,n}^{t-1} }^2}即可。
重写损失函数如下:
\begin{align} L(y_i,\hat y_i^{t-1}) &= -\sum_{s=0}^{N-1}y_{i,s} \ln(\frac{e^{\hat y_{i,s}^{t-1}}}{\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}}})\\ &=\sum_{s=0}^{N-1}y_{i,s}[-\hat y_{i,s}^{t-1}+\ln(\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}})] \end{align}
若记p_{i,c}^{t-1}=\frac{e^{\hat y_{i,n}^{t-1}}}{\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}}}t-1个boost后第i个样本在第c类上的概率值, 则:

\begin{align} \frac{\partial L(y_{i}, \hat y_{i}^{t-1} )}{\partial \hat y_{i,n}^{t-1} } &=- y_{i,n}+ \sum_{s=0}^{N-1}y_{i,s}\frac{e^{\hat y_{i,n}^{t-1}}}{\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}}}\\ &=-y_{i,n}+\sum_{s=0}^{N-1}y_{i,s}p_{i,n}^{t-1}\\ \frac{\partial^2 L(y_{i}, \hat y_{i}^{t-1} )}{{\partial \hat y_{i,n}^{t-1} }^2}&= -\sum_{s=0}^{N-1}y_{i,s}\frac{ e^{\hat y_{i,n}^{t-1}}\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}} -(e^{\hat y_{i,n}^{t-1}})^2 }{(\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}})^2}\\ &=\sum_{s=0}^{N-1}y_{i,s}\frac{ e^{\hat y_{i,n}^{t-1}} \sum_{c \not= n}e^{\hat y_{i,c}^{t-1}} }{(\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}})^2}\\ &=\sum_{s=0}^{N-1}y_{i,s}\frac{ e^{\hat y_{i,n}^{t-1}} }{\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}}}\frac{\sum_{c \not= n}e^{\hat y_{i,c}^{t-1}}}{\sum_{c=0}^{N-1} e^{\hat y_{i,c}^{t-1}}}\\ &=\sum_{s=0}^{N-1}y_{i,s}p_{i,n}^{t-1}(1-p_{i,n}^{t-1}) \end{align}
假设y_{i,k}=1,即有y_{i,s}=0, s \not= k。上述一阶二阶导即可简化为:
\begin{align} \frac{\partial L(y_{i}, \hat y_{i}^{t-1} )}{\partial \hat y_{i,n}^{t-1} }&= \begin{cases} p_{i,n}^{t-1}-1& n=k\\ p_{i,n}^{t-1}& n\not= k \end{cases}\\ \frac{\partial^2 L(y_{i}, \hat y_{i}^{t-1} )}{{\partial \hat y_{i,n}^{t-1} }^2}&= p_{i,n}(1-p_{i,n}^{t-1}) \end{align}
对比源码中的逻辑


在src/objective/multiclass_obj.cu脚本中

  // Part of Softmax function
//源码中给出注释,实际上就是求一个softmax
bst_float wmax = std::numeric_limits<bst_float>::min();
for (auto const i : point) { wmax = fmaxf(i, wmax); }
double wsum = 0.0f;
for (auto const i : point) { wsum += expf(i - wmax); }
auto label = labels[idx];
if (label < 0 || label >= nclass) {
  _label_correct[0] = 0;
  label = 0;
}
bst_float wt = is_null_weight ? 1.0f : weights[idx];
for (int k = 0; k < nclass; ++k) {
  // Computation duplicated to avoid creating a cache.
  bst_float p = expf(point[k] - wmax) / static_cast<float>(wsum);
  const float eps = 1e-16f;
  const bst_float h = fmax(2.0f * p * (1.0f - p) * wt, eps);
//当所求类别等于真实类别时为p-1否则为p,与所推相符
  p = label == k ? p - 1.0f : p;
  gpair[idx * nclass + k] = GradientPair(p * wt, h);

下一篇分享该部分的源码解读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 选择题部分 1.(),只有在发生短路事故时或者在负荷电流较大时,变流器中才会有足够的二次电流作为继电保护跳闸之用。...
    skystarwuwei阅读 12,887评论 0 7
  • 选择题部分 1.()部门负责日常监督检查工作,安全巡视的同时进行消防检查,推动消防安全制度的贯彻落实。 A: 消防...
    skystarwuwei阅读 15,174评论 0 3
  • 初看Xgboost,翻了多篇博客发现关于xgboost原理的描述实在难以忍受,缺乏逻辑性,写一篇供讨论。 ——以下...
    chaaffff阅读 1,810评论 0 8
  • 今天是什么日子 上班 起床:6点50 就寝:23点40 天气:多云 心情:小烦 纪念日:三九天 任务清单 昨日完成...
    2b4882996f3d阅读 150评论 0 1
  • 幸福是把对你的爱化成文字,装进心里。 你回来了,是凌晨回来的,迷迷糊糊中我也不知是几点。一大早我上课,你还在熟睡,...
    微凉深林雨阅读 461评论 0 0