基于Attention机制的Bi-LSTM关系抽取(分类)读书报告

本人DL4NLP课程作业,摘录于此,拒绝转载,谢谢。

课上听了Attention机制相关的内容,非常感兴趣,认为这是一个非常值得学习研究的内容。于是找了相关的论文进行阅读,这里总结一下Peng Zhou等发表在ACL2016的一篇论文《Attention-Based Bidirectional Long Short-Term Memory Networks for
Relation Classification》。论文主要介绍了在关系分类任务中应用双向LSTM神经网络模型并加入Attention机制,从而避免了传统工作中复杂的特征工程,并在该任务中取得比较优秀的效果。

研究背景

关系抽取(分类)是自然语言处理中一个重要的任务,也即从自然语言文本中提取两个实体之间的语义关系。关系抽取属于信息抽取的一个部分。信息激增的时代,快速、准确获取关键信息的需求也日益激增,相比于传统的信息检索,信息抽取能够快速、准确提取出海量非结构化信息中的结构化知识,它也逐渐成为搜索引擎发展的方向。而关系抽取同命名实体识别、事件抽取等任务一起,都是信息抽取的一部分或者中间过程,可应用于结构化知识抽取、知识图谱构建、自动问答系统构建等。

研究动机

关系抽取从本质上看是一个多分类问题,对于这样一个问题来说最重要的工作无非特征的提取和分类模型的选择。传统的方法中,大多数研究依赖于一些现有的词汇资源(例如WordNet)、NLP系统或一些手工提取的特征。这样的方法可能导致计算复杂度的增加,并且特征提取工作本身会耗费大量的时间和精力,特征提取质量的对于实验的结果也有很大的影响。因此,这篇论文从这一角度出发,提出一个基于Attention机制的双向LSTM神经网络模型进行关系抽取研究,Attention机制能够自动发现那些对于分类起到关键作用的词,使得这个模型可以从每个句子中捕获最重要的语义信息,它不依赖于任何外部的知识或者NLP系统。

解决思路

  • 模型结构

    模型一共包括5层结构:

    • 输入层:将句子输入到模型中
    • Embedding层:将每个词映射到低维空间
    • LSTM层:使用双向LSTM从Embedding层获取高级特征
    • Attention层:生成一个权重向量,通过与这个权重向量相乘,使每一次迭代中的词汇级的特征合并为句子级的特征。
    • 输出层:将句子级的特征向量用于关系分类

    模型结构如下图:

在这里插入图片描述

  • 词向量层

    对于一个给定的包含T个词的句子S: S = x 1 , x 2 , . . . , x T S={x_1,x_2,...,x_T} S=x1,x2,...,xT。每一个词 x i x_i xi都是转换为一个实数向量 e i e_i ei。对于S中的每一个词来说,首先存在一个词向量矩阵: W w r d ∈ R d w ∣ V ∣ W^{wrd}\in\mathbb{R}^{d^w|V|} WwrdRdwV,其中V是一个固定大小的词汇表, d w d^w dw是词向量的维度,是一个由用户自定义的超参数, W w r d W^{wrd} Wwrd则是通过训练学习到的一个参数矩阵。使用这个词向量矩阵,可以将每个词转化为其词向量的表示:

    e i = W w r d v i e_i=W^{wrd}v^i ei=Wwrdvi

    其中, v i v^i vi是一个大小为$ |V|$ 的one-hot向量,在下表为 e i ei ei处为1,其他位置为0。于是,句子S将被转化为一个实数矩阵:$ e m b s = { e 1 , e 2 , … , e T } emb_s = \{e_1, e_2, …, e_T\} embs={e1,e2,,eT},并传递给模型的下一层。

  • 双向LSTM

    LSTM最早由Hochreiter和Schmidhuber (1997)提出,为了解决循环神经网络中的梯度消失问题。主要思想是引入门机制,从而能够控制每一个LSTM单元保留的历史信息的程度以及记忆当前输入的信息,保留重要特征,丢弃不重要的特征。这篇论文采用了Graves等人(2013)提出的一个变体,将上一个细胞状态同时引入到输入门、遗忘门以及新信息的计算当中。该LSTM模型也同样包含四个部分:

    • 输入门。包含了当前输入、上一个隐状态、上一个细胞状态,组成权重矩阵,以决定加入多少新信息 :

      i t = σ ( W x i x t + W h i h t − 1 + W c i c t − 1 + b i ) i_t=\sigma(W_{xi}x_t+W_{hi}h_{t-1}+W_{ci}c_{t-1}+b_i) it=σ(Wxixt+Whiht1+Wcict1+bi)

    • 遗忘门。同上,决定丢弃多少旧信息 :

      f t = σ ( W x f x t + W h f h t − 1 + W c f c t − 1 + b f ) f_t=\sigma(W_{xf}x_t+W_{hf}h_{t-1}+W_{cf}c_{t-1}+b_f) ft=σ(Wxfxt+Whfht1+Wcfct1+bf)

    • 细胞状态。包含了上一个细胞状态以及基于当前输入和上个隐状态信息生成的新信息 :

      c t = i t g t + f t c t − 1 c_t=i_tg_t+f_tc_{t-1} ct=itgt+ftct1

      g t = t a n h ( W x c x t + W h c h t − 1 + W c c c t − 1 + b c ) g_t=tanh(W_{xc}x_t+W_{hc}h_{t-1}+W_{cc}c_{t-1}+b_c) gt=tanh(Wxcxt+Whcht1+Wccct1+bc)

    • 输出门。包含了当前输入、上一个隐状态、当前细胞状态,组成权重矩阵,以决定哪些信息被输出 :

      o t = σ ( W x o x t + W h o h t − 1 + W c o c t + b o ) o_t=\sigma(W_{xo}x_t+W_{ho}h_{t-1}+W_{co}c_t+b_o) ot=σ(Wxoxt+Whoht1+Wcoct+bo)

    最终,输出的当前隐状态则由当前细胞状态乘以输出们的权重矩阵得到:

    h t = o t t a n h ( c t ) h_t=o_ttanh(c_t) ht=ottanh(ct)

    对于序列建模的任务来说,每一个时刻的未来信息和历史信息同等重要,标准的LSTM模型按其顺序并不能捕获未来的信息。因而这篇论文采用了双向LSTM模型,在原有的正向LSTM网络层上增加一层反向的LSTM层,可以表示成:
    KaTeX parse error: Limit controls must follow a math operator at position 45: …ratorname*{h_i}\̲l̲i̲m̲i̲t̲s̲^\gets}]

  • Attention机制

    将LSTM层输入的向量集合表示为H: [ h 1 , h 2 , … , h T ] [h_1, h_2, …, h_T] [h1,h2,,hT]。其Attention层得到的权重矩阵由下面的方式得到 :

    M = t a n h ( H ) M=tanh(H) M=tanh(H)

    α = s o f t m a x ( w T M ) \alpha=softmax(w^TM) α=softmax(wTM)

    r = H α T r=H\alpha^T r=HαT

    其中, H ∈ R d w × T H\in\mathbb{R}^{d^w\times T} HRdw×T d w d^w dw为词向量的维度, w T w^T wT是一个训练学习得到的参数向量的转置。最终用以分类的句子将表示如下 :
    h ∗ = t a n h ( r ) h^*=tanh(r) h=tanh(r)

  • 分类

    使用一个softmax分类器来预测标签 y ^ \hat y y^ 。该分类器将上一层得到的隐状态作为输入:
    y ^ ( y ∣ S ) = s o f t m a x ( W ( S ) h ∗ + b S ) \hat y(y|S) = softmax(W^{(S)}h^* + b^{S}) y^(yS)=softmax(W(S)h+bS)
    y ^ = a r g m a x y p ^ ( y ∣ S ) \hat y = arg max_y \hat p(y|S) y^=argmaxyp^(yS)
    成本函数采用正样本的负对数似然:
    J ( θ ) = − 1 m ∑ i = 1 m t i l o g ( y i ) + λ ∣ ∣ θ ∣ ∣ F 2 J(\theta)=-\frac{1}{m}\sum^m_{i=1}t_ilog(y_i)+\lambda||\theta||^2_F J(θ)=m1i=1mtilog(yi)+λθF2
    其中 t ∈ R m t\in \mathfrak{R}^m tRm为正样本的one-hot表示, y ∈ R m y\in \mathfrak{R}^m yRm为softmax估计出的每个类别的概率(m为类别个数), λ \lambda λ是L2正则化的超参数。这篇论文中使用了Dropout和L2正则化的组合以减轻过拟合的情况 。

试验过程和结果

实验使用了SemEval-2010 Task 8数据集。该数据集包括9个双向的实体关系和一个无向的其他关系。共计10717个标注样本,其中8000个句子作为训练集,2717个句子作为测试集。使用了基于宏平均F1值的标准评价方法。

为了与其他工作进行对比,文章还采用了与之相同的预训练的词向量进行词向量层的初始化。

由于没有标准的开发集,这篇论文中作者随机选择了800个样本作为验证集以调整训练中的超参数。

模型训练采用了AdaDelta优化方法,学习率为0.1,minibatch大小为10。经过测试,在词向量层,LSTM层和倒数第二层分别采用0.3,0.3,0.5的dropout时,效果最好。实验结果对比如下:
在这里插入图片描述

可以发现,在这些实验中,这篇论文所使用的基于Attention机制的双向LSTM模型的结果好于绝大多数其他方法。仅次于Zhang等人(2015)提出的BLSTM方法,不过该方法是在加入了大量来自NLP系统和词汇资源的特征的前提下达到了84.3的F1值,而本篇论文中的方法则简单很多,也同样达到了84.0的F1值 。

结论

这篇论文用最简单的方式,巧妙地在双向LSTM模型中加入Attention机制,用于关系抽取任务,避免了传统的任务中复杂的特征工程,大大简化了实验过程并得到相当不错的结果,也为相关的研究提供了可操作性的思路。

由于数学基础还有所欠缺,其中一些细节部分的理解可能还存在一些偏差(尤其是作者所使用的LSTM的变体那一部分)。但是这篇论文的整体的逻辑十分清晰,紧紧围绕研究动机,向我们阐述了大道至简的观念。确实,整篇论文的思路十分简单,模型也一目了然,但是结果表现优秀。个人认为这也正是科学研究在不断地更新换代中所追求的目标:简单有效。

另外,论文在一些表达中,可能还有值得改进的地方。例如关于LSTM层的阐述中,作者使用了大段地陈述加一堆公式的堆叠,其实增加了读者阅读的难度。在总结的过程中,我是结合课程中LSTM模型相关的讲解进行梳理,才有了比较清晰的理解。最后个人认为,论文的初衷在于简化实验过程,节省人力物力时间等,并同时取得较好的效果。那么其实有一些特征比如命名实体等是样本中本身就包含的,也不需要耗费太多的成本,模型是否还可以加入这样一些简单的特征,然后看是否对于结果有一个提升。从而可以在效果的提升与成本上取得一个平衡,也许是相对来说更优的结果。

参考文献

Zhou P, Shi W, Tian J, et al. Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification[C]// Meeting of the Association for Computational Linguistics. 2016:207-212.

Sepp Hochreiter and J¨urgen Schmidhuber. 1997. Long short-term memory. Neural computation, 9(8):1735–1780.

Alex Graves. 2013. Generating sequences with recurrent neural networks. arXiv preprint arXiv: 1308.0850.

Shu Zhang, Dequan Zheng, Xinchen Hu, and Ming Yang. 2015. Bidirectional long short-term memory networks for relation classification.

  • 13
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
这里是一个使用BERT-BiLSTM-CRF模型进行中文实体抽取的代码示例: ```python import tensorflow as tf from transformers import BertTokenizer from tensorflow.keras.layers import Input, Embedding, Bidirectional, LSTM, TimeDistributed, Dense from tensorflow.keras.models import Model from tensorflow.keras.optimizers import Adam from tensorflow.keras.callbacks import ModelCheckpoint from tensorflow.keras.utils import to_categorical from seqeval.metrics import f1_score # 加载BERT tokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') # 定义模型输入 input_ids = Input(shape=(None,), dtype='int32') input_mask = Input(shape=(None,), dtype='int32') segment_ids = Input(shape=(None,), dtype='int32') # 加载BERT模型 bert_model = TFBertModel.from_pretrained('bert-base-chinese') bert_output = bert_model(input_ids, attention_mask=input_mask, token_type_ids=segment_ids)[0] # BiLSTMlstm = Bidirectional(LSTM(units=128, return_sequences=True))(bert_output) # 全连接层 dense = TimeDistributed(Dense(units=128, activation='relu'))(lstm) # CRF层 crf = CRF(num_labels + 1) output = crf(dense) # 定义模型输入和输出 model = Model(inputs=[input_ids, input_mask, segment_ids], outputs=[output]) model.summary() # 编译模型 optimizer = Adam(lr=1e-4) model.compile(optimizer=optimizer, loss=crf.loss_function, metrics=[crf.accuracy]) # 训练模型 checkpoint = ModelCheckpoint('model.h5', monitor='val_loss', save_best_only=True) history = model.fit([train_input_ids, train_input_mask, train_segment_ids], to_categorical(train_labels, num_classes=num_labels + 1), validation_data=([val_input_ids, val_input_mask, val_segment_ids], to_categorical(val_labels, num_classes=num_labels + 1)), batch_size=32, epochs=10, callbacks=[checkpoint]) # 预测测试集 test_pred = model.predict([test_input_ids, test_input_mask, test_segment_ids]) test_pred = np.argmax(test_pred, axis=-1) test_labels = np.argmax(to_categorical(test_labels, num_classes=num_labels + 1), axis=-1) # 计算F1分数 print(f1_score(test_labels, test_pred)) ``` 在这个示例中,我们使用了BERT模型和BiLSTM-CRF模型来进行中文实体抽取。我们首先使用BERT tokenizer对中文文本进行分词,然后将分词结果输入到BERT模型中,获取BERT的输出。接着,我们将BERT的输出输入到一个BiLSTM层中,再将BiLSTM的输出输入到一个全连接层中,最后使用CRF层来进行标签预测。我们使用seqeval库中的f1_score函数来计算模型的F1分数。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值