文章起源 | 恒源云社区

原文地址 | 论文小记

原文作者 | Mathor


这几天忙里偷闲去社区看了看各位版主一开始发的文章。重点找了我最喜爱的版主Mathor的文章,认真一查,居然曾经发了90多篇,不愧是社区大佬本佬了!

想着看都看了,那就棘手搬运一下大佬的文章吧!

接下来跟着小编的脚步,一起看上来吧~

注释开始

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

具体来说,输出的文本增加了一些确定的噪声,例如删除、替换、增加、Mask一些词等办法。Encoder须要将含有噪声的句子编码为一个固定大小的向量,而后利用Decoder将本来的不带噪声的句子还原。说是这么说,然而其中有十分多细节,首先是训练指标

其中,\( D \)是训练集;\( x = x_1x_2\cdots x_l \)是长度为lll的输出句子;\( \tilde{x} \)是\( x \)增加噪声之后的句子;\( e_t \)是词\( x_t \)的word embedding;\( N \)为Vocabulary size;\( h_t \)是Decoder第\( t \)步输入的hidden state

不同于原始的Transformer,作者提出的办法,Decoder只利用Encoder输入的固定大小的向量进行解码,具体来说,Encoder-Decoder之间的cross-attention形式化地示意如下:

其中,\( H^{(k)}\in \mathbb{R}^{t\times d} \)是Decoder第\( k \)层\( t \)个解码步骤内的hidden state;\( d \)是句向量的维度(Encoder输入向量的维度);\( [s^T]\in \mathbb{R}^{1\times d} \)是Encoder输入的句子(行)向量。从下面的公式咱们能够看出,不管哪一层的cross-attention,\( K \)和\( V \)永远都是\( s^T \),作者这样设计的目标是为了人为给模型增加一个瓶颈,如果Encoder编码的句向量\( s^T \)不够精确,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)