2024年1月

大家好,我是 frank ,「 Golang 语言开发栈」公众号作者。

01 介绍

defer 的使用方式是在其后紧跟一个函数调用或方法调用,确保在其所在的函数体返回之前执行其调用的函数或方法。

在 Go 语言中,defer 一般用于资源释放,或使用 defer 调用一个匿名函数,在匿名函数中使用
recover()
处理异常
panic

在使用
defer
时,也很容易遇到陷阱,本文我们介绍使用
defer
时有哪些陷阱。

02
defer
陷阱

defer 语句不可以在 return 语句之后。

示例代码:

func main() {
	name := GetUserName("phper")
	fmt.Printf("name:%s\n", name)
	if name != "gopher" {
		return
	}
	defer fmt.Println("this is a defer call")
}

func GetUserName(name string) string {
	return name
}

输出结果:

name:phper

阅读上面这段代码,我们在
return
语句之后执行
defer
语句,通过输出结果可以发现 defer 语句调用未执行。

虽然
defer
可以在函数体中的任意位置,我们也是需要特别注意使用
defer
的位置是否可以执行。

defer 语句执行匿名函数,参数预处理。

示例代码:

func main() {
	var count int64
	defer func(data int64) {
		fmt.Println("defer:", data)
	}(count + 1)
	count = 100
	fmt.Println("main:", count)
}

输出结果:

main: 100
defer: 1

阅读上面这段代码,首先我们定义一个类型为
int64
的变量
count
,然后使用
defer
语句执行一个匿名函数,匿名函数传递参数为
count + 1
,最终
main
函数输出
100
,defer 执行的匿名函数输出
1

因为在执行
defer
语句时,执行了
count + 1
,并先将其存储,等到
defer
所在的函数体
main
执行完,再执行
defer
语句调用的匿名函数的函数体中的代码。

03 总结

本文主要介绍在使用
defer
语句时可能会遇到的陷阱。分别是
defer
语句不可以在
return
语句之后;
defer
语句执行的匿名函数,匿名函数的参数会被预先处理。

读者朋友们在使用 Go 语言的
defer
语句时,还遇到过哪些陷阱?


  • ICLR 2020,6 6 6。
  • 材料:
  • 总结:
    • 是 2020 年的 offline RL 算法。
    • 算法框架:Policy Iteration,即先搞出一个 policy,再算 policy 的 Q function,再 a = argmax Q(s,a) 搞出新 policy,再算 policy 的 Q function,…
      • ① 在 policy evaluation 时,使用 offline dataset 里的 transition 来更新。
      • ② 在 policy improvement 时,maximize Q(s,
        \(\pi\)
        (s)) ,同时约束
        \(\pi\)
        与一个 prior policy 的 KL 散度,这是为了不要与 in-distribution 的 state-action 离太远,离得越远,Q 的 over-estimate 越严重。
    • 核心 idea 是 prior policy 如何得到。在先前的 BCQ 和 BEAR-QL 中,直接去学 offline dataset 的总的 policy,maximize Σ_{offline dataset} log(a|s)。
    • 这篇文章的核心 trick 叫做 ABM(Advantage-weighted Behavior Model)。
      • 在从 offline dataset 里提取 policy 的过程中,对 log(a|s) 进行一个基于 advantage 的加权。对 (s0, a0) 的 advantage = Q - V = Return(s0,a0,s1,...,sn,V(sn)) - V(s0) 。
      • 若 advantage ≥ 0,则 加权 = 1,否则加权 = 0。即,只在具有正 advantage 的环境转变的“好”数据上拟合模型。(这个加权函数还尝试了 exp 之类,但效果差异不大)。
  • 思考:
    • advantage weighted 的思想,感觉好像 performance 非常好…
    • offline RL 有两种主要思想,一种是 Q update 时拉低 OOD 的 Q value(CQL PBRL),或在 policy update 添加不要离 behavior policy 太远的正则项(TD3+BC),另一种是对 offline dataset 的 policy 进行 advantage-weighted(AWR)。IQL 是一股清流,用 (s,a,r,s',a') 来做 Q update。

0 abstract

  • background:
    • off-policy RL 适用于只有固定数据集(batch)且无法获得新 experience 的 setting,对机器人控制等现实世界的问题很有吸引力。然而在实践中,标准的 off-policy RL 在 continuous control 的 batch 设置中失败。
  • method:
    • 在本文中,我们提出了简单解决方案:承认使用任意 behavior policy 生成的数据,并使用学习的先验(优势加权行为模型 (ABM))将 RL 策略偏向于先前已执行并可能在新任务上取得成功的操作。我们的方法可以看作是最近 batch RL(offline RL)工作的扩展,可以从冲突的数据源中稳定地学习。
  • results:
    • 在各种 RL 任务中,performance 比起强 baseline 都有所改进,包括在标准的 continuous control benchmark 以及 simulation 和真机的 multi-task learning。

1 intro

  • Stay close to the relevant data:① 学习一个先验,哪些候选策略可能得到数据支持(同时确保先验 focus on 相关轨迹),② 进行 policy improvement,stay close to the learned prior policy。
  • 提出了一种 policy iteration 算法,学习先验,建立 behavior data 的优势加权模型,使 RL 策略偏向于以前经历过的、并且在当前任务中也很可能成功的 action。
  • 我们还发现,利用适当的先验足以稳定学习;证明当使用 policy iteration 算法时, policy evaluation 步骤是 implicitly stabilized 的 —— 只要忠实评估 TD-error 式 update 的值函数。这导致了比以前的工作更简单的算法(Fujimoto 等人,2018;Kumar 等人,2019 年)。
  • advantage-weighted behavior model(ABM)。

3 method

A learned prior for offline off-policy RL from imperfect data - 从不完美数据中学习 offline RL 的先验。

使用策略迭代(policy iteration)框架,在 policy improvement 步骤中有约束(参见 appendix A 的 Algorithm 1)。

  • 首先,从迭代 i 中的给定策略
    \(\pi_i\)
    开始,去找一个近似的 action-value 函数
    \(Q^{\pi_i}(s,a)\)
  • 然后,使用
    \(\hat Q^{\pi_i}\)
    来优化
    \(\pi_{i+1}\)
    ,同时约束 确保接近 empirical state-action distribution。

notation:D_μ 是 offline dataset,θ 是 policy 的参数,φ 是 Q function 的参数。

3.1 Policy Evaluation

  • 同时学 value function 和 Q function。
  • \(\arg\min \big[ r(s_t,a_t) + γ\hat V(s_{t+1})-\hat Q_{new}(s_t,a_t)\big]^2\)
    ,其中 V hat 为前一个 Q hat (s,
    \(\pi\)
    (s)) 。(公式 1)

3.2 Prior Learning and Policy Improvement

  • 把 policy learning 当作约束优化问题:maximize Q hat(s,
    \(\pi\)
    (s)),同时约束 policy 与 prior policy 的 KL 散度<ε。(公式 2)
  • 考虑两种算法来得到 prior policy:
    • 类似于 BCQ 和 BEAR-QL 的方法:直接 argmax Σ log(a | s) ,这里面的 s a 来自于 offline dataset。(公式 3)
    • weighted advantage 方法:argmax Σ log(a | s) f(Return - V hat) 。(公式 4)
      • Return 用
        \(Σγ^{N-i} r(s,a) + γ^{N-t}\hat V\)
        来算,f 是一个递增的非负函数。
      • 这里采用 f(x) = 1 if x≥0 else 0。还尝试了 f(x) = exp x 之类,但实验结果差不多。
      • 只在“好”数据上拟合模型(即具有正 advantage 的环境转变, 其中 advantage 是使用当前策略估计的)
  • (如果 offline dataset 质量足够高,可以直接在 dataset 里学
    \(\pi_{abm}\)
    和 Q abm ,作为输出策略:用
    \(\pi_{abm}\)
    计算 advantage,然后用 advantage-weight 计算新的 Q abm)
  • 如何优化公式 2 | EM-style optimization:(两步方法)
    • 首先,公式 2 的
      \(\arg\max\pi\)
      最优解可以写为,
      \(\hat \pi(a|s)\propto \pi_{prior}(a|s)\exp(\hat Q^{\pi_i}\big(s,a\big)/\eta)\)
      ,其中 η 可用凸优化确定。没有听懂,非常神秘……
    • 然后,去用
      \(\pi_{prior}\)
      来查询
      \(\hat Q^{\pi_i}\)
      的值,等价于 maximize 一个 weighted log likelihood,用梯度下降 + 约束 KL 散度(trust-region constraint)来实现。(没懂)
  • 如何优化公式 2 | Stochastic value gradient optimization:
    • 把 KL 散度的约束用 Lagrange 松弛塞到目标函数里。
  • 算法流程:

image-20240121103416693

5 experiment

实验环境:DeepMind control suite,(multi-task setting)Mujoco 的 Sawyer robot arm(以及对应的真机)。



代码

原文地址

预备知识:

1.什么是K-L散度(Kullback-Leibler Divergence)?

K-L散度,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布来替代观察数据或太复杂的分布。K-L散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息量。

2.什么是自训练(self-training)?

自训练算法是一种半监督学习算法,在这种算法中,学习者不断标记未标记的样本,并在一个扩大的标记训练集上对自己进行再训练。由于自训练过程可能会错误地标记一些未标记的示例,因此有时学习到的假设不能很好地执行。

摘要

文档级关系抽取(DocRE)的目标是从文档中找出所有实体之间的关系。为了提高DocRE的效果,需要利用证据,也就是包含实体关系线索的句子,来筛选出相关的文本。但是,DocRE中的证据检索(evidence retrieval,ER)存在两个主要挑战:内存消耗过大和缺乏标注数据。本文针对这些问题,提出了一种提升ER在DocRE中应用的方法。首先,本文设计了DREEAM,这是一种节省内存的模型,它利用证据信息作为监督信号,指导DocRE模型的注意力机制更加关注证据。其次,采用了一种自训练的策略,让DREEAM能够从大量无标注的数据中自动学习ER,而不需要人工标注证据。实验结果显示,DREEAM在DocRED数据集上,在DocRE和ER两个任务上都达到了最优的性能。

1 Introduction

证据句:包含实体对之间关系线索的一组句子。
如图1所示,确定Prince Edmund和Blackadder之间的关系,只需阅读第1句和第2句,它们就是证据句。第5句和第6句虽然也提到了Edmund,但与它们二者的关系无关。
提取证据句面临的两个问题:
(1)现有的ER方法都占用太多内存
以前的系统把ER和DocRE当作两个独立的任务,需要额外的神经网络层来同时学习ER和DocRE(
Huang等人, 2021a
;
Xie等人, 2022
;
Xiao等人, 2022
)。ER模块一般用一个双线性分类器,输入是实体对的嵌入和句子的嵌入。为了得到每个句子对每个实体对的证据分数,该模块要遍历所有的(实体对,句子)组合。这样的计算大大增加了内存的消耗,尤其是在句子和实体很多的文档中。
(2)人工标注证据的资源很少
DocRE的金标准数据比句子级的数据更难获得。人工标注的成本很高,而低成本的证据标注方法还缺乏研究。即使利用远程监督自动生成RE的银标准数据,从文档中筛选出与RE实例相关的证据也是一项挑战。
为了节省内存,本文提出了一种结合DocRE和ER的高效方法,即基于证据引导的注意机制的文档级关系抽取(DREEAM)。本文基于ATLOP(
Zhou等人, 2021
),这是一种广泛应用于前人研究的基于Transformer的DocRE系统。本文不需要外部的ER模块,而是直接让DocRE系统专注于证据。具体来说,本文对实体对的局部上下文嵌入进行监督学习。局部上下文嵌入是根据编码器的注意力机制,对所有词嵌入进行加权平均得到的,它被训练为对证据赋予更高的权重,对其他部分赋予更低的权重。
为了解决证据标注的不足,本文提出了一种
弱监督的ER方法
,它基于DREEAM在大量的无标注数据上进行自训练。这些无标注数据是通过远程监督自动添加关系标签的,但没有证据标签。目标是利用人工标注数据的指导,让ER知识在无标注数据上逐渐积累和扩展。具体来说,先用一个在人工标注数据上预训练的教师模型,从无标注数据中筛选出可靠的证据作为银色证据。然后,用这些银色证据来训练一个学生模型,同时实现RE和ER的目标。最后,在人工标注数据上对学生模型进行微调,以优化其效果。在DocRED数据集上的实验表明,本文的方法在RE和ER方面都取得了最佳的性能。

2 Preliminary

2.1 Problem Formulation

给定一个文档

,它由一组句子


和一组实体

组成。
DocRE的目标是预测文档中每一对实体之间的所有可能的关系
。文档中的每一个实体

至少有一个专有名词指称,用

表示。文档中的每一对实体

可以有多种关系,构成一个关系子集

,其中

是一个预定义的关系集合。用

表示两个实体之间没有关系,

也属于

。另外,如果两个实体

之间有一个有效的关系

,ER的目标是从文档中找出能够支持预测三元组

的证据句子集合

2.2 ATLOP

Text Encoding

编码前,在每个实体提及的首尾加上一个特殊的标记“*” 。然后,用一个基于Transformer的预训练语言模型对文档

中的词元

进行编码,得到每个词元的嵌入和跨词元的依赖。
虽然原始的ATLOP只使用了最后一层的输出,但本文采用了最后三层的平均值(试点实验表明,使用最后3层比只使用最后一层的性能更好)
。具体来说,对于每个Transformer层有d个隐藏维度的预训练语言模型,词元嵌入

和跨词元依赖

的计算公式如下:
其中

是每个词元在最后三层的隐藏状态的平均值,


是最后三层所有注意力头的注意力权重的平均值。

Entity Embedding

ATLOP用


表示每个实体

的嵌入,它是由它的所有提及

的信息汇总而来的。具体而言,ATLOP采用了logsumexp池化方法。logsumexp池化的公式是:
其中

是提及

开始位置的特殊标记“*”的嵌入。

Localized Context Embedding

ATLOP提出了一种利用长文本信息的局部上下文嵌入方法,它根据实体对

的重要性来选择词语。直观地说,对



都有贡献的词语应该被更多地考虑

。每个词语的重要性由公式1得到的词语之间的依赖关系

决定。对于实体

,它的所有提及

的词语依赖关系被收集并平均,得到每个词语对

的重要性

。然后,每个词语对实体对

的重要性

,由



计算得到:
其中

表示哈达玛积。

是一个分布,反映了每个词语对实体对

的重要性
。接下来,ATLOP执行一个局部上下文池化:
其中

是所有词语嵌入的加权平均,权重由

决定

Relation Classification

为了预测实体对

之间的关系,ATLOP 首先生成了考虑上下文的头实体和尾实体表示:

表示两个向量的拼接,其中

为可训练参数。然后,在上下文感知表示上应用双线性分类器来计算关系分数

:
其中,



是可训练参数。因此,实体



之间关系

成立的概率为


,其中

为sigmoid函数。

Loss Function

ATLOP 提出了一种自适应阈值损失(ATL),它在训练过程中学习一个虚拟的阈值类

,作为每个关系类

的动态阈值。对于每一对实体

,ATL 强制模型对正向关系类

产生高于


的分数,对负向关系类

产生低于

的分数,如下式所示:
设置阈值类的想法类似于Flexible threshold (
Chen等人, 2020
)。

3 Proposed Method: DREEAM

为了进行信息过滤,ATLOP利用基于Transformer的编码器计算了一个基于注意力权重的局部上下文嵌入。这是基于这样一个基本原理:Transformer层中的注意力权重能够编码跨词依赖关系。
本文提出的DREEAM通过引入证据信息来增强ATLOP的效果。
具体来说,它对注意力模块进行了监督,使其在确定关系时,更多地关注有用的证据句子,而不是其他无关的句子。DREEAM可以用于有监督和自监督的训练,它们的架构相同,但使用了不同的监督信号,如图2(a)所示。另外,本文还参考了Tan等人(
2022a
)的工作,提出了一个实现ER自监督的流程,其数据流如图2(b)所示。该流程包括以下几个步骤:
首先,在人工标注的数据上训练一个带有金标准关系和证据标签的教师模型;然后,用教师模型预测远程监督的数据的银标准证据;接着,在远程监督的数据上训练一个学生模型,用银标准证据来监督ER;最后,在人工标注的数据上对学生模型进行微调,以优化其知识

3.1 Teacher Model

本文用一个证据分布

来为每一对实体

生成一个基于证据的局部上下文嵌入。

可以给出



的词级别的重要性,但句级别的证据

只能从人工标注中得到
,如图1所示。
为了弥补这个差距,本文对每个句子中的每个词的权重求和
。具体来说,对于一个由词

组成的句子

,计算句子级别的重要性为:
然后把所有句子的重要性汇总成一个分布

,它反映了文档中每个句子对实体对

的重要性。本文还用人工标注的证据分布来指导

。首先,对于每个有效的关系标签

,定义一个二值向量

,它标记了文档中的每个句子

是否是关系三元组

的证据。如果是,就设为1,否则为0。例如,如果



的证据,那么

就设为1,否则为0。
然后,对所有有效的关系求和,并归一化,得到

其中

是一个全1向量。公式9的原理是,
在关系分类器之前的模块并不显式地知道具体的关系类型

因此,引导编码器中的注意力模块产生与关系无关的词依赖。

Loss Function

为了生成一个能够反映实体对

之间关系的局部上下文嵌入

,本文利用人工标注的证据

来指导每个实体对的证据分布

。用K-L散度损失来训练模型,使
尽可能地接近

,从而减少两者之间的统计差异:
同时,用一个超参数

来调节ER损失和RE损失的权重,使模型能够同时优化两个目标:

3.2 Student Model

为了在大规模数据上进行ER自训练,本文使用在人工标注数据上训练的系统作为教师模型。这些大规模数据是通过关系远程监督得到的,它们只有RE的噪声标签,没有ER的信息。本文在这些数据上训练一个学生模型,它的监督由两部分组成:一个是RE的二元交叉熵损失,另一个是ER的自训练损失。本文用教师模型的预测作为ER训练的监督信号。具体来说,
先让教师模型在远程监督数据上进行推理,得到每个实体对

的证据分布

。然后,让学生模型学习复现每个实体对

的证据分布

Loss Function

自训练目标是和有监督训练一样的。用KL散度损失来训练学生模型的ER,公式如下:
其中

是学生模型对实体对

的证据分布,由公式2得出。



有两点不同。第一,

是用句子级别的监督信号,而

是用词级别的监督信号

。这是因为词级别的证据分布更容易获得。在人工标注的数据上,要从句子级别的标注中得到词级别的证据分布很困难。在远程监督的数据上,词级别的证据分布可以从教师模型的预测中直接得到。所以,本文用词级别的证据分布来给ER自训练提供微观的监督。第二,

只在有有效关系的实体对上计算,而

在文档中的所有实体对上计算

。这是因为远程监督数据上的关系标签不太可靠。这些关系标签是自动收集的,可能有些标注的关系和文档无关。所以,从自动标注中很难分辨哪些关系是有效的,哪些是无效的。为了避免漏掉重要的实例,本文对所有实体对计算损失。总的损失是由公式11中的超参数

来平衡的,公式如下:
在远程监督的数据上训练后,学生模型再用人工标注的数据进行微调,用可靠的监督信号来改进它对DocRE和ER的知识。

3.3 Inference

本文根据
Zhou等人(2021)
的方法,用自适应阈值法得到RE的预测,选出得分超过阈值的关系类别。对于ER,用静态阈值法,选出重要性超过阈值的句子作为证据。本文还采用了
Xie等人(2022)
提出的推理阶段融合策略。具体来说,对于每个预测的关系三元组

和它的证据预测

,从

中收集证据句子

,构建一个伪文档

。然后,把伪文档输入训练好的模型,重新给关系三元组评分。为了把伪文档和整个文档的预测结合起来,用一个只有一个参数

的混合层,

是一个阈值。只有当一个三元组

在整个文档和伪文档上的得分之和大于

时,才把它作为最终的预测结果。调整

,让RE在开发集上的二元交叉熵损失最小。

4 Experiments

4.1 Setting

Dataset

本文实验是在DocRED这个具有人工标注的DocRE数据集上进行的。表1显示,DocRED包含了一小部分人工标注的数据和一大部分远程监督的数据。这些远程监督的数据是通过把维基百科文章和Wikidata知识库对齐而得到的。本文直接使用了DocRED提供的远程监督的数据。

Configuration

为了实现DREEAM,本文基于Hugging Face的Transformers框架,使用



作为预训练语言模型(PLM)编码器。参考前人的工作,通过网格搜索从


中选取了合适的参数,分别为

的0.1和

的0.05,来平衡ER损失和RE损失。在训练和评估DREEAM时,使用单个Tesla V100 16GB GPU来运行

,使用单个NVIDIA A100 40GB GPU来运行

。超参数和运行时间的细节见附录A。

Evaluation

本文在推理阶段,根据公式8得到的

值,筛选出

大于0.2的句子

,作为证据的来源。在评估阶段,使用DocRED的官方评估指标,分别对RE和ER进行Ign F1和F1、Evi F1的评估。Ign F1是在去除了训练集中已有的关系后,对开发集和测试集进行的评估,以消除训练集的影响。用不同的随机种子,对系统进行了五次训练,并给出了这些训练的平均分数和标准误差。

4.2 Main Results

Performance of the Student Model

表2显示,利用远程监督数据的学生模型在RE上优于现有系统。尤其是,当使用BERTbase作为PLM编码器时,DREEAM在开发集上的Ign F1/F1比先前的最先进系统KD-DocRE高出0.6/1.0个百分点。在测试集上,Ign F1和F1都提高了1.1个百分点。值得注意的是,DREEAM使用

甚至能够与在弱监督设置下使用

的SSAN (
Xu等人, 2021a
)相比肩。当使用

作为PLM编码器时,DREEAM在开发集和测试集上仍然保持优势。这些结果证明了本文的假设,即ER自训练能够改善RE,这是之前的工作未能展示的。

Performance of the Teacher Model

表2的上半部分显示,用人工标注数据训练的教师模型在RE和ER两个任务上与EIDER相媲美。尽管DREEAM和SAIS在性能上有一定差距,但本文认为这主要是由于监督信号的不同造成的。
DREEAM只是将RE和无关联的ER结合在一起,而SAIS则在此之上增加了三个额外的任务:共指消解、实体类型和关联特定的ER (
Xiao等人, 2022
)

。这些附加的监督信号可能有助于提升SAIS的性能。除了性能外,DREEAM还在内存效率方面优于以前的ER-incorporated DocRE系统。在第4.4节中对此进行了详细的讨论。

Effectiveness of ER Self-Training

学生模型在ER任务上远远超过了其他现有的系统。DREEAM是第一个采用弱监督ER训练的方法,它通过自我训练有效地利用了大量无需证据标注的数据。实验结果显示,DREEAM在Evi F1指标上比目前最好的监督方法高出了约2.0个百分点。因此,本文认为,ER自我训练方法能够成功地从无需证据标注的关系远程监督数据中学习到证据知识。

4.3 Ablation Studies

Teacher Model

本文探索了如何利用证据指导注意力来提升人工标注数据的RE训练效果,训练了一个不包含ER训练的教师模型,并在DocRED开发集上进行了评估。结果显示,如果关闭ER训练,教师模型的RE性能会降到与ATLOP相似的基线水平。如表3(a)所示,没有ER训练的情况下,DREEAM的RE性能有所下降。这一观察验证了利用证据指导注意力可以提高RE性能的假设。本文还进一步可视化了一些实例的词元重要性

,以分析证据指导训练的影响,发现本文的方法能够有效地将注意力集中在相关的上下文上。更多细节可以参见附录B。此外,本文还从关闭ER训练的教师模型中检索出证据,作为重要性超过预设阈值的句子。通过这种方式,发现Evi F1与开启ER训练的教师模型相差无几。这一观察说明,ER是一个与RE紧密相关的任务。

Student Model

本文研究了在远程监督数据上训练并在人工标注数据上微调的学生模型。目的是检验在不同训练阶段用证据指导注意力的效果。为了实现这一目的,本文去掉了学生模型在远程监督和人工标注数据上的训练过程中的ER监督信号。基线模型也同样排除了ER监督,它只在远程监督数据上预训练,然后在人工标注数据上仅为RE微调。
如表3(b)所示,没有ER自训练的DREEAM与基线模型表现相当,而没有ER微调的DREEAM与没有任何消融的原始模型表现相当。这些结果表明,ER自训练对于学生模型的效果比ER微调更重要。一方面,可以观察到,在大量数据上禁用ER自训练会导致证据知识的巨大损失,而这种损失无法通过在更小的证据标注数据集上的微调来恢复。另一方面,可以得出结论,DREEAM能够成功地从没有任何证据标注的数据中检索出证据知识,证明了ER自训练策略的有效性。

4.4 Memory Efficiency

这一小节分析了之前的ER方法存在的内存效率问题,以及DREEAM如何克服它。之前的方法把ER当作一个与RE相独立的任务,需要额外的神经网络层来完成。为了进行ER,它们都采用了一个双线性证据分类器,它的输入是一个实体对相关的嵌入和一个句子嵌入。例如,EIDER用以下公式计算句子

对于实体对

的证据分数:
其中

是一个句子嵌入,

是根据公式3得到的局部上下文嵌入,



是可训练的参数。EIDER和其他现有的系统因此需要对所有的(句子,实体对)组合进行计算。具体来说,假设一个文档



个句子

,和

个实体

,则有

个实体对。为了得到证据分数,EIDER必须通过公式14进行

次双线性分类,导致巨大的内存消耗。相比之下,DREEAM直接用注意力权重在词上的求和作为证据分数,因此无需引入新的可训练参数,也无需进行昂贵的矩阵计算。因此,可以看到,DREEAM比它的竞争对手更节省内存。
表4展示了当使用

作为预训练语言模型(PLM)编码器时,现有方法和提出的方法的内存消耗和可训练参数的数量。数值是在使用相应的官方仓库和批量大小为四的情况下训练系统时测量的。本文发现,DREEAM的内存消耗只有EIDER的27.4%和SAIS的25.5%。值得注意的是,DREEAM的内存消耗也比KD-DocRE少,突出了本文提出的方法的内存效率。

4.5 Performance on Re-DocRED

尽管DocRED是一个广泛使用的基准,但最近的一些工作指出,该数据集的标注存在不完整性。也就是说,DocRED中有很多关系三元组没有被人类标注出来,导致数据集有很多假负例的问题。为了解决这一问题,
Tan等人(2022b)
提出了ReDocRED,一个更可靠的DocRE的基准,对DocRED进行了修正和补充。本文在ReDocRED上评估了DREEAM,以验证其有效性。
与第4.2节类似,本文在两种不同的设置下进行了实验:(a)不使用远程监督数据的全监督设置和(b)使用远程监督数据的弱监督设置。需要注意的是,ReDocRED增加了一些新的关系三元组,但没有给出相应的证据句子。如表5所示,与DocRED相比,ReDocRED的训练集中有更多的关系三元组缺少证据句子。这可能导致基于ReDocRED训练的DREEAM在证据关系(ER)上不够准确,受到缺失证据的影响。因此,在学生模型的ER自训练过程中,本文使用了基于DocRED训练的教师模型预测的记号证据分布作为监督信号。然后,在ReDocRED上对学生模型进行了微调,以提高其关系抽取(RE)的能力。
表6展示了DREEAM与现有方法的性能比较。可以发现,DREEAM在全监督设置和弱监督设置下都超过了现有方法。这一结果证明了本文提出的方法的合理性。

转载请注明出处:

1.定义

Canal 组件是一个基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费,支持将增量数据投递到下游消费者(如 Kafka、RocketMQ 等)或者存储(如 Elasticsearch、HBase 等)的组件。


Canal 感知到MySQL数据变动,然后解析变动数据,将变动数据发送到MQ或者同步到其他数据库,等待进一步业务逻辑处理。

2.工作原理

2.1 mysql 主从复制原理

  • MySQL master 将数据变更写入二进制日志binary log,简称Binlog。

  • MySQL slave 将 master 的 binary log 拷贝到它的中继日志(relay log)

  • MySQL slave 重放 relay log 操作,将变更数据同步到最新。

2.2 mysql binlog日志

使用场景:

MySQL 的Binlog可以说 MySQL 最重要的日志,它记录了所有的 DDL 和 DML语句,以事件形式记录。

MySQL默认情况下是不开启Binlog,因为记录Binlog日志需要消耗时间,官方给出的数据是有1%的性能损耗。

具体开不开启,开发中需要根据实际情况做取舍。

一般来说,在下面两场景下会开启Binlog日志:

      • MySQL 主从集群部署时,需要将在 Master 端开启 Binlog,方便将数据同步到Slaves中。

      • 数据恢复了,通过使用 MySQL Binlog 工具来使恢复数据。

binlog分类:

MySQL Binlog 的格式有三种,分别是 STATEMENT,MIXED,ROW。在配置文件中可以选择配
置 binlog_format=
statement
|
mixed
|
row

分类 介绍 优点 缺点
STATEMENT 语句级别,记录每一次执行写操作的语句,相对于ROW模式节省了空间,但是可能产生数据不一致如update tt set create_date=now(),由于执行时间不同产生饿得数据就不同 节省空间 可能造成数据不一致
ROW 行级,记录每次操作后每行记录的变化。假如一个update的sql执行结果是1万行statement只存一条,如果是row的话会把这个1万行的结果存这。 持数据的绝对一致性。因为不管sql是什么,引用了什么函数,他只记录执行后的效果 占用较大空间
MIXED 是对statement的升级,如当函数中包含 UUID() 时,包含 AUTO_INCREMENT 字段的表被更新时,执行 INSERT DELAYED 语句时,用 UDF 时,会按照 ROW的方式进行处理 节省空间,同时兼顾了一定的一致性 还有些极个别情况依旧会造成不一致,另外statement和mixed对于需要对binlog的监控的情况都不方便

综合上面对比,Canal 想做监控分析,选择 row 格式比较合适。

3.Canal工作原理

  • Canal 将自己伪装为 MySQL slave(从库) ,向 MySQL master (主库)发送dump 协议

  • MySQL master(主库) 收到 dump 请求,开始推送 binary log 给 slave (即 canal )

  • Canal 接收并解析 Binlog 日志,得到变更的数据,执行后续逻辑

4.应用场景:

1.
数据同步:
Canal 可以帮助用户进行多种数据同步操作,如实时同步 MySQL 数据到 Elasticsearch、Redis 等数据存储介质中。

2.
数据库实时监控:Canal 可以实时监控 MySQL 的更新操作,对于敏感数据的修改可以及时通知相关人员。

3.
数据分析和挖掘:
Canal 可以将 MySQL 增量数据投递到 Kafka 等消息队列中,为数据分析和挖掘提供数据来源。

4.数据库备份:Canal 可以将 MySQL 主库上的数据增量日志复制到备库上,实现数据库备份。

5.数据集成:
Canal 可以将多个 MySQL 数据库中的数据进行集成,为数据处理提供更加高效可靠的解决方案。

6.数据库迁移:
Canal 可以协助完成 MySQL 数据库的版本升级及数据迁移任务。

5.Canal安装

5.1.下载

下载 解压安装即可。

5.2配置

1.
修改canal.properties的配置

canal.port = 66666611# tcp, kafka, rocketMQ, rabbitMQ, pulsarMQ
canal.serverMode
=tcp

canal.destinations
= example

canal.port:默认端口 66666611

canal.serverMode:服务模式,tcp 表示输入客户端,xxMQ输出到各类消息中间件

canal.destinations:canal能可以收集多个MySQL数据库数据,每个MySQL数据库都有独立的配置文件控制。具体配置规则: conf/目录下,使用文件夹放置,文件夹名代表一个MySQL实例。canal.destinations用于配置需要监控数据的数据库。如果是多个,使用,隔开

2.
修改MySQL实例配置文件instance.properties

canal.instance.mysql.slaveId=20# position info
canal.instance.master.address
=127.0.0.1:3306# username/password
canal.instance.dbUsername
=root
canal.instance.dbPassword
=admin

canal.instance.mysql.slaveId:使用canal 从阶段id

canal.instance.master.address:数据库ip端口

canal.instance.dbUsername:连接mysql账号

canal.instance.dbPassword:连接mysql密码

3.启动