LLD: 内部数据指导的标签去噪方法

很多数据集中的标签都存在错误,即便它们是由人来标注的,错误标签的存在会给模型训练带来某些负面影响。目前缓解这种影响有诸如删除错误标签、降低其权重等方法。ACL2022有一篇名为《A Light Label Denoising Method with the Internal Data Guidance》的投稿提出了一种基于样本内部指导的方法解决这个问题

先前有研究表明同一类别的样本在本质上是相似和相关的,不同类别的样本存在明显差异。在文本分类任务中,两个有着相似内容的句子应该被预测为同一个类别,但是实际情况并不总是这样。当训练数据面临一定程度的噪声时,这个问题可能会更加严重,因为模型只受到标签的指导/监督。这就自然而然提出了一个问题:除了标签之外,我们能否从训练样本之间的关系寻求指导?

以文本分类数据为例,有 n n n个样本的数据集可以被定义为
D = { ( x 1 , y 1 ) , . . . , ( x n , y n ) } D = \{(x_1, y_1),...,(x_n, y_n)\} D={(x1,y1),...,(xn,yn)}
其中, y i ∈ { c 1 , c 2 , . . . , c m } y_i\in \{c_1, c_2,...,c_m\} yi{c1,c2,...,cm}表示共有 m m m

Contextual Representation

我们首先需要一个指标判断两个句子是否相似。目前有两大类文本相似度计算方法,第一种是基于传统的符号表征,例如编辑距离、Jaccard Similarity Coeffieient以及Earth Mover’s Distance;第二种是将文本映射为稠密的向量,然后计算它们的向量相似度。第一种方法过于依赖token的表面信息,第二种方法需要使用外部数据对模型进行预训练,而这个外部数据和我们的任务数据可能不是同一领域的。因此作者基于Postive Pointwise Mutual Information (PPMI)提出了一个新的上下文表征方法

首先,我们用一个长度为2的滑动窗口统计数据集中所有token的共现矩阵 C C C C w i , w j C_{w_i, w_j} Cwi,wj表示前一个词是 w i w_i wi,后一个词是 w j w_j wj出现的次数,然后我们计算 C C C的PPMI矩阵 E E E
E i j = max ⁡ ( log ⁡ P ( w i , w j ) P ( w i ) ⋅ P ( w j ) , 0 ) (1) E_{ij} = \max (\log \frac{P(w_i, w_j)}{P(w_i)\cdot P(w_j)}, 0)\tag{1} Eij=max(logP(wi)P(wj)P(wi,wj),0)(1)
其中, P ( w i ) , P ( w j ) , P ( w i , w j ) P(w_i), P(w_j), P(w_i, w_j) P(wi),P(wj),P(wi,wj)分别是从共现矩阵 C C C中计算得到的。最终,向量 E w i E_{w_{i}} Ewi是词 w i w_i wi的表示

Word Weight

由于不同的词对于句子含义的贡献不同,我们更关注那些对分类更有帮助的词,而不是一些常见的词(例如a, the, of)。作者提出一个计算词 w i w_i wi权重的算法:
q w i = log ⁡ ( p c w i + α ) / ∣ ∣ p c ∣ ∣ 1 ( p c ~ w i + α ) / ∣ ∣ p c ~ ∣ ∣ 1 (2) q_{w_{i}} = \log \frac{(p_c^{w_i} + \alpha) / ||p_c||_1}{(p_{\tilde{c}}^{w_i} + \alpha) / || p_{\tilde{c}}||_1} \tag{2} qwi=log(pc~wi+α)/∣∣pc~1(pcwi+α)/∣∣pc1(2)

其中, c c c是词 w i w_i wi出现频率最高的类别, p c w i p_c^{w_i} pcwi是类别 c c c中单词 w i w_i wi的样本数, p c ~ w i p_{\tilde{c}}^{w_i} pc~wi是除了类别 c c c之外所有类别中单词 w i w_i wi的样本数, ∣ ∣ p c ∣ ∣ 1 ||p_c||_1 ∣∣pc1是类别 c c c的样本数, α \alpha α是一个小的平滑值(例如0.1)。

Guiding the Training

给定包含 d d d个单词的句子 a a a,以及包含 e e e个单词的句子 b b b,它们的相似度为:
T sim ( a , b ) = cos ⁡ ( ∑ i = 1 d q w i E i , ∑ j = 1 e q w j E j ) (3) T_{\text{sim}}(a,b) = \cos (\sum_{i=1}^d q_{w_i}E_{i}, \sum_{j=1}^eq_{w_j}E_j)\tag{3} Tsim(a,b)=cos(i=1dqwiEi,j=1eqwjEj)(3)
很明显, T sim ( a , b ) T_{\text{sim}}(a,b) Tsim(a,b)总是大于0的,因为 q w i q_{w_i} qwi一定大于等于0,向量 E i E_{i} Ei中的元素根据计算公式也都是大于等于0的, cos ⁡ ( A , B ) \cos(A,B) cos(A,B)中,当向量 A A A B B B中的元素都大于等于0时,结果一定大于0

在含有 m m m个类别的文本分类任务中,模型对于第 i i i个样本的预测概率分布可以记为
l i = [ l i 1 , l i 2 , . . . , l i k , . . . , l i m ] l_i = [l_{i1}, l_{i2},...,l_{ik},...,l_{im}] li=[li1,li2,...,lik,...,lim]
其中, l i k > 0 l_{ik}>0 lik>0并且 ∑ k = 1 m l i k = 1 \sum_{k=1}^m l_{ik}=1 k=1mlik=1。因此模型对于样本 a a a b b b预测概率分布的相似度为
L sim ( a , b ) = cos ⁡ ( l a , l b ) (4) L_{\text{sim}}(a, b) = \cos (l_a, l_b)\tag{4} Lsim(a,b)=cos(la,lb)(4)
在训练过程中,损失函数定义为:
L = ∑ k = 1 s CE ( y k , l k ) + ∑ i = 1 s ∑ j = 1 s γ ( T sim ( i , j ) − L sim ( i , j ) ) 2 (5) \begin{aligned} \mathcal{L} = &\sum_{k=1}^s \text{CE}(y_k, l_k)\\& + \sum_{i=1}^s \sum_{j=1}^s \gamma(T_{\text{sim}}(i,j) - L_{\text{sim}}(i,j))^2 \end{aligned}\tag{5} L=k=1sCE(yk,lk)+i=1sj=1sγ(Tsim(i,j)Lsim(i,j))2(5)
其中
γ = { 1 , if  T sim ( i , j ) > β 0 , otherwise \gamma = \begin{cases}1, \quad {\text{if }}T_{\text{sim}}(i,j) > \beta\\ 0,\quad \text{otherwise} \end{cases} γ={1,if Tsim(i,j)>β0,otherwise
换言之,当两个句子的相似度大于阈值 β \beta β时,我们就认为它们非常相似,那么它们的标签大概率应该是相同的,反映到预测概率分布上,它们预测概率分布向量的余弦相似度应该接近于1才对,如果单纯这么考虑的话,实际上我们有如下定义的损失函数
L = ∑ k = 1 s CE ( y k , l k ) + ∑ i = 1 s ∑ j = 1 s γ ( 1 − L sim ( i , j ) ) 2 (6) \begin{aligned} \mathcal{L} = &\sum_{k=1}^s \text{CE}(y_k, l_k)\\& + \sum_{i=1}^s \sum_{j=1}^s \gamma(1- L_{\text{sim}}(i,j))^2 \end{aligned}\tag{6} L=k=1sCE(yk,lk)+i=1sj=1sγ(1Lsim(i,j))2(6)
极端情况下,当 L sim ( i , j ) = 1 L_{\text{sim}}(i,j)=1 Lsim(i,j)=1时,加法后面所带来的损失就为0了;当 L sim ( i , j ) = 0 L_{\text{sim}}(i,j)=0 Lsim(i,j)=0时,后面是有损失的

Result

论文的实验阵容还算豪华,某种程度上来说让人比较意外的地方是这种简单修改损失函数的办法居然超过了R-Drop。其中LLD-DW将矩阵 E E E用Word2vec进行替换,其他步骤保持不变,结果发现用Word2vec反而没有作者提出的简单统计方法好

个人总结

这篇文章本质上来讲,可以看作是多目标联合训练,除了传统的分类任务,引入了一个新的任务,这个任务的目标是希望两个句子的相似度与它们预测概率分布的相似度比较接近。反映到损失函数中来看就是在传统损失的后面添加了一项。阅读完这篇论文之后,说实话我不太确定它能否被ACL录用

### 链接器错误 `ld.lld: undefined symbol` 原因分析 当遇到类似于 `ld.lld: error: undefined symbol` 的链接错误时,这意味着链接器无法找到某些符号的定义。具体到当前情况中的 `fcntl64` 符号未定义问题[^1]。 此类问题可能由以下几个方面引起: - **缺失依赖库**:编译过程中缺少必要的静态或动态库文件。 - **库顺序不当**:多个库之间存在依赖关系时,指定这些库的顺序不正确。 - **目标平台差异**:不同操作系统版本间API实现有所区别,可能导致特定函数不可用。 - **宏定义冲突**:预处理器指令配置不当影响了头文件内部分功能的选择性包含。 针对上述可能性,可以采取如下措施来排查并解决问题: #### 检查所需外部库的存在性和路径设置 确认项目构建脚本已经包含了所有必需的第三方库,并且其安装位置已被正确加入到编译选项中。对于Linux环境下可能出现的`fcntl64`相关问题,需特别注意glibc版本以及对应的ABI兼容性。 ```bash # 查看已安装的 glibc 版本 ldd --version ``` 如果发现确实是因为缺少相应的支持而导致该符号未能解析,则应考虑更新系统的标准C库或是调整应用程序所使用的工具链环境。 #### 调整链接阶段参数 确保在最终生成可执行程序之前,所有的对象模块都被恰当地传递给了链接器;同时也要留意各个输入项之间的先后次序是否合理。有时仅仅改变`.a/.so`文件列表里的排列方式就能有效消除这类警告信息。 ```makefile LDFLAGS += -Wl,--start-group $(LIBRARY_PATH)/libfoo.a $(LIBRARY_PATH)/libbar.a -Wl,--end-group ``` 通过使用`--start-group ... --end-group`语法可以让GCC重复扫描成员直到不再有新的引用被满足为止,从而提高成功几率。 #### 审核源码及其关联资源 仔细审查涉及调用`fcntl64()`的地方,验证是否存在拼写失误或者是无意之中引入了条件编译开关使得这部分代码仅限于特定条件下才会被执行。另外还需关注是否有自定义的wrapper封装层覆盖掉了原始接口的行为模式。 #### 替代方案探索 鉴于并非所有发行版都会提供对大文件操作的支持(即64位变体),或许可以直接改用更为通用的形式——比如普通的`fcntl()`函数来进行替代处理。当然这样做前要充分评估由此带来的性能损耗及其他潜在风险因素。 ```c #include <unistd.h> #include <fcntl.h> // 使用 fcntl 代替 fcntl64 int result = fcntl(fd, cmd, arg); if (result == -1) { perror("fcntl"); } ``` 以上方法能够帮助定位并修复由于未定义符号引发的一系列难题。值得注意的是,在实际开发过程中往往需要综合运用多种手段才能彻底根治这一类顽疾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学家是我理想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值