引言
在Quora Question Pairs比赛中,我们的目标是判断给定的两个问题的语义信息是否相同(即是否为重复问题),使用的评估标准是log loss,交叉熵损失函数
\[\frac{1}{N}\sum_{i=0}^{N}{-y_i \log{\widehat{y}_i} - (1-y_i)\log{(1-\widehat{y}_i)}}
\]
在这个比赛中,训练集和测试集的类型存在不平衡的问题,训练集中存在36%的重复问题,而测试集中仅有大约17%的重复问题。因此我们需要处理不平衡的情况。
一、交叉熵损失函数
交叉熵(cross entropy)是用来评估当前训练得到的概率分布与真实分布的差异情况,减少交叉熵损失就是在提高模型的预测准确率。其离散函数形式
\[H(p, q) = - \sum_{\mathbf{x}}{p(\mathbf{x})\log{q(\mathbf{x})}}
\]
这里,\(p(\mathbf{x})\) 是真实分布,\(q(\mathbf{x})\) 是通过数据计算的估计概率。
在二分类问题中,真实的目标要么是 \(1\),要么是 \(0\),\(y_i \in \{0,1\}\)。
当 \(y_i = 1\) 时,
\[P(y_i=1\, |\, \mathbf{x}_i) = 1,P(y_i=0 \,| \,\mathbf{x}_i) = 0
\]
当 \(y_i = 1\) 时,
\[P(y_i=1\, |\,\mathbf{x}_i) = 0,P(y_i=0\, |\mathbf{x}_i) = 1
\]
而估计的概率
\[P(y_i=1\, |\, \mathbf{x}_i) = \widehat{y}_i,P(y_i=0\, |\,\mathbf{x}_i) = 1 - \widehat{y}_i
\]
因此
\[H(p, q) = \frac{1}{N}\sum_{i=0}^{N}{-y_i \log{\widehat{y}_i} - (1-y_i)\log{(1-\widehat{y}_i)}}
\]
二、从信息论的角度理解交叉熵损失函数
信息熵是在结果出来之前对可能产生的信息量的期望。
相对熵表示两个概率分布的差异,即KL散度。当两个分布相同时,相对熵的值为 \(0\),其余情况下都大于 \(0\)。
\[D(p||q) = \int_{\mathbf{x}} {p(\mathbf{x}) log{\frac{p(\mathbf{x})}{q(\mathbf{x})}}} = -\int_{\mathbf{x}} p(\mathbf{x}) \log{q(\mathbf{x})}d\mathbf{x} - (-\int_{\mathbf{x}} p(\mathbf{x}) \log{p(\mathbf{x})}d\mathbf{x})
\]
前者是交叉熵,而后者是真实分布的信息熵。由于真实分布是固定的,所以信息熵的值是固定的。当交叉熵越小,相对熵则越小,估计的概率分布 \(q(\mathbf{x})\) 越接近真实的分布 \(p(\mathbf{x})\)。
三、发现问题
交叉熵损失函数对 \(\widehat{y}_i\) 求导,得到
\[\frac{1-y_i}{1-\widehat{y}_i} = \frac{y_i}{\widehat{y}_i}
\]
当 \(y_i = \widehat{y}_i\) 时可以得到损失函数的最小值。
当训练和测试的数据集中的正例比例不同的时候会影响交叉熵的值。
交叉熵最小化等价于似然函数最大化。假设我们对每个标签为正例的样本都预测一个固定的概率,根据似然函数最大化,得到
\[\widehat{y}_i = \frac{the \, number\, of\, positive \, samples}{the \, number \, of \, samples}
\]
如果测试集的正例的比例也接近这个值,那么在该假设情况下我们得到的损失函数最小。
但是,如果训练集和测试集的正例比例不同,那么模型越复杂,越接近临界值的样本(越难判断结果的样本)就越容易受到训练集中正例比例的影响而偏离真实分布。
注:有些损失函数基本不受训练集和测试集的正例比例不同的影响,比如AUC。
四、处理方法
我们假设训练集来自分布 \((X, Y)\),测试集来自分布 \((X', Y')\)
此时,我们假设两个分布的唯一不同点就是他们碰巧有不同的正例比例,即
\[(X\,|\,Y=0) \sim (X'\,|\,Y'=0),\, \, \, \,(X\,|\,Y=1) \sim (X'\,|\,Y'=1)
\]
即在类别确定的条件下,\(X\) 和 \(X'\) 属于同一分布。
在训练集中:
\[P(y=1\,|\,\mathbf{x}) = \frac{P(\mathbf{x}\,|\,y=1)P(y=1)}{P(\mathbf{x})} = \frac{P(\mathbf{x}\,|\,y=1)P(y=1)}{P(\mathbf{x}\,|\,y=1)P(y=1)+P(\mathbf{x}\,|\,y=0)P(y=0)} = \frac{u}{u+v}
\]
假设当 \(Y'=1\) 时,\(X'\) 在 \(X\) 上以 \(\alpha\) 比例过抽样,当 \(Y'=0\) 时,\(X'\) 在 \(X\) 上以 \(\beta\) 比例过抽样。则在测试集中:
\[P(y'=1\,|\,\mathbf{x}) = \frac{P(\mathbf{x}\,|\,y'=1)P(y'=1)}{P(\mathbf{x}\,|\,y'=1)P(y'=1)+P(\mathbf{x}\,|\,y'=0)P(y'=0)} = \frac{\alpha u}{\alpha u+\beta v}
\]
联立,得
\[P(y'=1\,|\,\mathbf{x}) = \frac{\alpha P(y=1\,|\,\mathbf{x})}{\alpha P(y=1\,|\,\mathbf{x})+\beta (1 - P(y=1\,|\,\mathbf{x}))}
\]
可以解出 \(\alpha\) 和 \(\beta\) 的值。最终损失函数变为
\[\frac{1}{N}\sum_{i=0}^{N}{-\alpha y_i \log{\widehat{y}_i} - \beta (1-y_i)\log{(1-\widehat{y}_i)}}
\]
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 从零开始开发一个 MCP Server!
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档