神经网络进行二分类时,输出层使用两个神经元和只使用一个神经元,模型的性能有何差异,为什么?
3 个回答
理论上两者是没有差异的。分析如下:
1) 先引入Logistic函数和softmax函数的定义
logistic函数定义为: \[\operatorname{sigmoid} \left( x \right) = \frac{1}{{1 + {e^{ - x}}}}\] 。
logistic函数还可以称为sigmoid函数,expit函数(SciPy中即采用此名称)。
softmax函数定义为: \[\operatorname{softmax} \left( {\vec x} \right) = \frac{{{{\left[ {\exp \left( {{x_0}} \right), \cdots ,\exp \left( {{x_{n - 1}}} \right)} \right]}^T}}}{{\sum\nolimits_{i = 0}^{n - 1} {\exp \left( {{x_i}} \right)} }}\] 。
softmax函数是多元向量值函数。
2)再引入sigmoid和softmax交叉熵损失函数的数学形式
设数据集 \[S = \bigcup\nolimits_{i = 1}^N {\left\{ {\left\langle {{x_i},{y_i}} \right\rangle } \right\}} \] , \[{y_i} \in \left\{ {0,1} \right\}\] 为label, \[{x_i}\] 为feature。
sigmoid交叉熵损失函数的数学形式:
\[\operatorname{sigmoid\_loss} \left( S \right) = - \frac{1}{N}\sum\limits_{i = 1}^N {\left[ {{y_i}\log \left( {\operatorname{sigmoid} \left( {{x_i}} \right)} \right) + \left( {1 - {y_i}} \right)\log \left( {1 - \operatorname{sigmoid} \left( {{x_i}} \right)} \right)} \right]} \]
softmax交叉熵损失函数的数学形式:
\[\operatorname{softmax\_loss} \left( S \right) = - \frac{1}{N}\sum\limits_{i = 1}^N {{{\vec e}^T}\left( {{y_i}} \right){{\log }^ \circ }\operatorname{softmax} \left( {{{\vec x}_i}} \right)} \]
其中 \[{f^ \circ }\left( \cdot \right)\] 表示按元素函数,例如 \[{\exp ^ \circ }\left( {\vec x} \right) = {\left[ {\exp \left( {{x_0}} \right){\text{,}}\exp \left( {{x_1}} \right){\text{,}} \cdots {\text{,}}\exp \left( {{x_{n - 1}}} \right)} \right]^T}\] 。 \[\vec e\left( y \right) = {\left[ {1\left\{ {y = 0} \right\}, \cdots ,1\left\{ {y = n - 1} \right\}} \right]^T}\] 是标签y的one-hot编码, \[1\left\{ {{x_i} = {x_j}} \right\} = \left\{ {\begin{array}{*{20}{c}} 1&{{x_i} = {x_j}} \\ 0&{{x_i} \ne {x_j}} \end{array}} \right.\] 是指示函数。
3)下面推导对于二分类上述两个loss的等效性
当 \[n = 2\] 时,因为 \[1\left\{ {y = 0} \right\} = \left\{ {\begin{array}{*{20}{c}} 1&{y = 0} \\ 0&{y \ne 0} \end{array}} \right. = \left\{ {\begin{array}{*{20}{c}} 1&{y = 0} \\ 0&{y = 1} \end{array}} \right. = 1 - y\] ,同理 \[1\left\{ {y = 1} \right\} = y\] ,所以 \[\vec e\left( y \right) = {\left[ {1 - {y},{y}} \right]^T}\] 。令 \[\vec x = {\left[ {{x_0},{x_1}} \right]^T}\] ,则
\[\operatorname{softmax} \left( {\vec x} \right) = \frac{{{{\left[ {\exp \left( {{x_0}} \right),\exp \left( {{x_1}} \right)} \right]}^T}}}{{\exp \left( {{x_0}} \right) + \exp \left( {{x_1}} \right)}} = \left[ {\begin{array}{*{20}{c}} {1 - \mathrm{sigmoid}\left( {{x_1} - {x_0}} \right)} \\ {\mathrm{sigmoid}\left( {{x_1} - {x_0}} \right)} \end{array}} \right]\] 。
所以
\[\begin{align} \operatorname{softmax\_loss} \left( S \right) &= - \frac{1}{N}\sum\nolimits_{i = 1}^N {{{\vec e}^T}\left( {{y_i}} \right){{\log }^ \circ }\operatorname{softmax} \left( {{{\vec x}_i}} \right)} \hfill \\ &= - \frac{1}{N}\sum\nolimits_{i = 1}^N {\left( {1 - {y_i}} \right)\log \left( {1 - \operatorname{sigmoid} \left( {{x_{{\text{1,}}i}} - {x_{{\text{0,}}i}}} \right)} \right) + {y_i}\log \operatorname{sigmoid} \left( {{x_{{\text{1,}}i}} - {x_{{\text{0,}}i}}} \right)} \hfill \\ \end{align} \]
这在形式上已经和 \[\operatorname{sigmoid\_loss} \left( S \right)\] 一样了。又由于深度学习可以自动学习特征,在最终性能上可以认为两者是等效的。
XGBoost使用神经网络中间层输出特征的思路
上篇文章,我写了关于XGBoost的数据缺点探讨,指出了xgboost在什么情况下的预测是完全无效的: 心火试新茶:XGBoost等决策树的巨大缺陷-哪些问题上预测精度甚至不如回归,更不如神经网络?
在上篇文章中,我们详细探讨了XGBoost等决策树模型的一些缺点,例如在某些问题上预测精度甚至不如回归模型,更无法与神经网络相媲美。然而,这并不意味着我们应该完全摒弃XGBoost,因为在某些场景下它仍具有一定的优势。相反,我们可以尝试将深度神经网络(DNN)与XGBoost等决策树模型相结合,发挥各自的长处,从而提高整体的预测性能。
有很多方法可以实现DNN和XGBoost的结合。例如,我们可以利用深度神经网络在特征提取方面的强大能力。具体来说,可以将DNN作为特征提取器,将它的中间层的输出作为特征输入到XGBoost模型中与原特征表连接后进行训练和预测。这样一来,XGBoost就可以从神经网络提取到的高阶特征中进行训练和预测。这种方法不仅可以提高预测精度,还可以让我们充分利用它们各自的优势。
将DNN与XGBoost结合使用可能在某些情况下具有优势。与直接使用DNN输出进行预测相比,这种结合方案可能在以下几个方面提供改进:
- 鲁棒性:XGBoost和DNN具有不同的假设和训练方法,结合它们可能提高模型在不同数据分布和噪声条件下的鲁棒性。
- 解释性:XGBoost模型通常比深度神经网络更具解释性,因为它们基于树模型。将DNN的中间层输出用作特征输入到XGBoost模型中,可能使得整个预测过程更容易理解和解释。
- 模型效果:在某些情况下,这种结合方案可能提高模型性能。DNN在提取复杂特征方面非常有效,而XGBoost可能对这些特征进行更有效的组合和选择。这可能导致更好的泛化和预测准确性。
本思路的风险提醒
然而,这种结合方案并非在所有情况下都具有优势。在某些任务中,纯DNN或纯XGBoost可能已经足够好,结合它们可能不会带来显著的改进。此外,这种方法可能会导致更复杂的模型和更长的训练时间。
将DNN与XGBoost结合使用可能在某些情况下具有优势,但这取决于具体任务和数据。在实际应用中,可以尝试这种结合方案,并与单独使用DNN或XGBoost进行比较,以确定最佳模型。
实验过程
在上文: 心火试新茶:XGBoost等决策树的巨大缺陷-哪些问题上预测精度甚至不如回归,更不如神经网络?
的后半部分,我举了一个例子以说明神经网络在什么数据上比xgboost更有优势,在那个案例中,xgboost基本毫无预测能力。接下来,让我们用新的方法重新用xgboost来做一遍。
# 定义中间层模型
hidden_layer_model = Model(inputs=model.input, outputs=model.layers[3].output)
# 获取中间层的输出
hidden_output_train = hidden_layer_model.predict(X)
X_train_concat = np.concatenate((X, hidden_output_train), axis=1)
# 训练XGBoost模型