Navigation

    Gpushare.com

    • Register
    • Login
    • Search
    • Popular
    • Categories
    • Recent
    • Tags

    基于去噪Transformer的无监督句子编码【EMNLP 2021】

    语音识别与语义处理领域
    1
    1
    27
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • 155****7220
      155****7220 last edited by Alice_恒源云

      EMNLP2021 Findings上有一篇名为TSDAE: Using Transformer-based Sequential Denoising Auto-Encoder for Unsupervised Sentence Embedding Learning的论文,利用Transformer结构无监督训练句子编码,网络架构如下所示

      具体来说,输入的文本添加了一些确定的噪声,例如删除、交换、添加、Mask一些词等方法。Encoder需要将含有噪声的句子编码为一个固定大小的向量,然后利用Decoder将原本的不带噪声的句子还原。说是这么说,但是其中有非常多细节,首先是训练目标
      1beede6d-e918-4615-baee-8eb70c571928-image.png
      其中,DDD是训练集;x=x1x2⋯xlx = x_1x_2\cdots x_lx=x1​x2​⋯xl​是长度为lll的输入句子;x~\tilde{x}x~是xxx添加噪声之后的句子;ete_tet​是词xtx_txt​的word embedding;NNN为Vocabulary size;hth_tht​是Decoder第ttt步输出的hidden state

      不同于原始的Transformer,作者提出的方法,Decoder只利用Encoder输出的固定大小的向量进行解码,具体来说,Encoder-Decoder之间的cross-attention形式化地表示如下:
      3da272aa-3262-4ba1-b72d-b680c0d5fb89-image.png
      其中,H(k)∈Rt×dH^{(k)}\in \mathbb{R}^{t\times d}H(k)∈Rt×d是Decoder第kkk层ttt个解码步骤内的hidden state;ddd是句向量的维度(Encoder输出向量的维度);[sT]∈R1×d[s^T]\in \mathbb{R}^{1\times d}[sT]∈R1×d是Encoder输出的句子(行)向量。从上面的公式我们可以看出,不论哪一层的cross-attention,KKK和VVV永远都是sTs^TsT,作者这样设计的目的是为了人为给模型添加一个瓶颈,如果Encoder编码的句向量sTs^TsT不够准确,Decoder就很难解码成功,换句话说,这样设计是为了使得Encoder编码的更加准确。训练结束后如果需要提取句向量只需要用Encoder即可

      作者通过在STS数据集上调参,发现最好的组合方法如下:

      1. 采用删除单词这种添加噪声的方法,并且比例设置为60%
      2. 使用[CLS]位置的输出作为句向量

      Results

      从TSDAE的结果来看,基本上是拳打SimCSE,脚踢BERT-flow

      个人总结

      如果我是reviewer,我特别想问的一个问题是:“你们这种方法,与BART有什么区别?”

      论文源码在UKPLab/sentence-transformers/,其实sentence-transformers已经把TSDAE封装成pip包,完整的训练流程可以参考Sentence-Transformer的使用及fine-tune教程,在此基础上只需要修改dataset和loss就可以轻松的训练TSDAE

      # 创建可即时添加噪声的特殊去噪数据集
      train_dataset = datasets.DenoisingAutoEncoderDataset(train_sentences)
      
      # DataLoader 批量处理数据
      train_dataloader = DataLoader(train_dataset, batch_size=8, shuffle=True)
      
      # 使用去噪自动编码器损失
      train_loss = losses.DenoisingAutoEncoderLoss(model, decoder_name_or_path=model_name, tie_encoder_decoder=True)
      
      # 模型训练
      model.fit(
          train_objectives=[(train_dataloader, train_loss)],
          epochs=1,
          weight_decay=0,
          scheduler='constantlr',
          optimizer_params={'lr': 3e-5},
          show_progress_bar=True
      )
      
      1 Reply Last reply Reply Quote 3
      • Referenced by  Alice_恒源云 Alice_恒源云 
      • Referenced by  Alice_恒源云 Alice_恒源云 
      • Referenced by  Alice_恒源云 Alice_恒源云 
      • First post
        Last post