RoBERTa-A Robustly Optimized BERT Pretraining Approach
预训练的语言模型在这俩年取得了巨大的突破,但是如何比较各预训练模型的优劣显然是一个很有挑战的问题,主要是太烧钱了。本文研究了一些预训练参数和训练批大小对BERT模型的影响。发现,BERT远远没有被充分训练,用不同的预训练参数,都会对最后的结果产生不同的影响,并且最好的模型达到了SOTA。
介绍
预训练模型,例如 ELMo、GPT、BERT、XLM、XLNet 已经取得了重要进展,但要确定方法的哪些方面贡献最大是存在挑战的。训练在计算上是昂贵的,很难去做大量的实验,并且预训练过程中使用的数据量也不一致。
本文对 BERT 预训练过程进行了大量重复实验研究,其中包括对超参数调整效果和训练集大小的仔细评估。 发现 BERT 的训练不足,并提出了一种改进的方法来训练BERT模型(称之为RoBERTa),该模型可以匹敌或超过所有后 BERT 方法的性能。模型的修改很简单,它们包括:
训练模型更大,具有更大的训练批次,更多的数据
删除下一句预测的目标
对更长的序列进行训练
动态改变应用于训练数据的masking形式
总的来说,本文贡献如下
提出了一组重要的 BERT 设计选择和训练策略,并 ...
Pointer Networks
我们知道,Seq2Seq的出现很好地解开了以往的RNN模型要求输入与输出长度相等的约束,而其后的Attention机制(content-based)又很好地解决了长输入序列表示不充分的问题。尽管如此,这些模型仍旧要求输出的词汇表需要事先指定大小,因为在softmax层中,词汇表的长度会直接影响到模型的训练和运行速度。
Pointer Networks(指针网络)同样是Seq2Seq范式,它主要解决的是Seq2Seq Decoder端输出的词汇表大小不可变的问题。换句话说,传统的Seq2Seq无法解决输出序列的词汇表会随着输入序列长度的改变而改变的那些问题,某些问题的输出可能会严重依赖于输入,在本文中,作者通过计算几何学中三个经典的组合优化问题:凸包(Finding convex hulls)、三角剖分(comupting Delaunay triangulations)、TSP(Travelling Salesman Problem),来演示了作者提出的PtrNets模型。
论文地址: https://arxiv.org/pdf/1506.03134.pdf
上图,我们求解凸包问题 ...
MASS-Masked Sequence to Sequence Pre-training for Language Generation
BERT通常只训练一个encoder用于自然语言理解,而GPT的语言模型通常是训练一个decoder。如果要将BERT或者GPT用于序列到序列的自然语言生成任务,通常只有分开预训练encoder和decoder,因此encoder-attention-decoder结构没有被联合训练,attention机制也不会被预训练,而decoder对encoder的attention机制在这类任务中非常重要,因此BERT和GPT在这类任务中只能达到次优效果。
如上图 所示,encoder将源序列 XXX 作为输入并将其转换为隐藏表示的序列,然后decoder通过attention机制从encoder中抽象出隐藏表示的序列信息,并自动生成目标序列文本 YYY。
本文针对文本生成任务, 在BERT的基础上,提出了Masked Sequence to Sequence pre-training(MASS),MASS采用encoder-decoder框架以预测一个句子片段,其中encoder端输入的句子被随机masked连续片段,而decoder端需要生成该masked的片段,通过这种方式MASS能够 ...
Transformer-XL Attentive Language Models Beyond a Fixed-Length Context
目前在自然语言处理领域,Transformer的编码能力超越了RNN,但是对长距离依赖的建模能力仍然不足。在基于LSTM的模型中,为了建模长距离依赖,提出了门控机制和梯度裁剪,目前可以编码的最长距离在200左右。在基于Transformer的模型中,允许词之间直接self-attention,能够更好地捕获长期依赖关系,但是还是有限制,本文将主要介绍Transformer-XL,并基于PyTorch框架从头实现Transformer-XL。
原始Transformer
细想一下,BERT在应用Transformer时,有一个参数sequence length,也就是BERT在训练和预测时,每次接受的输入是固定长度的。那么,怎么输入语料进行训练时最理想的呢?当然是将一个完整的段落一次性输入,进行特征提取了。但是现实是残酷的,这么大的Transformer,内存是消耗不起的。所以现有的做法是,对段落按照segment进行分隔。在训练时:
当输入segment序列比sequence length短时,就做padding。
当输入segment序列比sequence length长时就做切 ...
Ubuntu 18.04环境下搭建SSR
本篇博文主要记录在ubuntu 18.04环境下搭建SSR过程。
下载ssr客户端
12cd ~git clone https://github.com/ssrbackup/shadowsocksr
配置ssr文件
123cd shadowsocksrsudo cp config.json /etc/shadowsocks.jsonsudo gedit /etc/shadowsocks.json
配置信息如下
1234567891011121314151617181920212223{ "server": “0.0.0.0”, //服务器ip地址 "server_ipv6": "::", "server_port": 443, //服务器端口 "local_address": "127.0.0.1", "local_port": 1080, "password" ...
Multi-Sample Dropout for Accelerated Training and Better Generalization
论文"Multi-Sample Dropout for Accelerated Training and Better Generalization"提出了一种Dropout的新用法,Multi-Sample Dropout可以加快训练速度以及产生更好的结果,本文我们将使用pytorch框架进行实验.
Dropout是一种简单但有效的正则化技术,能够使深度神经网络(DNN)产生更好的泛化效果,因此它广泛用于基于DNN的任务。在训练过程,Dropout随机丢弃一部分神经元以避免过拟合。Multi-Sample Dropout可以说是原始Dropout的一种增强版本.即多次丢弃一部分神经元,并求平均获得最终结果.整个结构如下所示:
实验
本节,我们将对Multi-Sample Dropout进行实验,使用数据主要是CIFAR10,模型为ResNet,优化器为Adma.文件说明:
12345├── nn.py # 模型文件├── progressbar.py # 进度条文件├── run.py #主程序├── tools.py # 常用工具├── traini ...
标签平滑
在机器学习或者深度学习实验中,我们通常使用大量的正则化技术,比如L1,L2,Dropout等来防止模型发生过拟合问题,在分类问题中,模型往往可以正确的预测训练样本,但是泛化能力比较弱,本文将讨论作为分类问题经常使用的正则化技术–标签平滑。
方法
假设有一个分类模型,预测观测样本xxx属于KKK个类别的概率。对于观测样本xxx,采用qθ(y∣x)q_{\theta}(y|x)qθ(y∣x)表示模型对xxx的预测的概率分布,且∑y=1Kqθ(y∣xi)=1\sum_{y=1}^K q_{\theta}(y|x_i)=1∑y=1Kqθ(y∣xi)=1,其中θ\thetaθ为模型参数。p(y∣x)p(y|x)p(y∣x)表示模型输出yyy的真实分布,且∑y=1Kp(y∣xi)=1\sum_{y=1}^K p(y|x_i)=1∑y=1Kp(y∣xi)=1。
通常进行分类任务时,我们采用交叉熵损失函数,使模型预测的概率分布qθ(y∣x)q_{\theta}(y|x)qθ(y∣x)尽量接近真实的概率分布p(y∣x)p(y|x)p(y∣x),即:
Hi(p,qθ)=−∑y=1Kp(y∣ ...
深度学习权重初始化
神经网络训练过程中的参数学习是基于梯度下降法进行优化的。梯度下降法需要在开始训练时给每一个权重赋一个初始值。这个初始值的选取十分关键。
权重初始化
在感知器和logistic回归的训练中,我们一般将权重全部初始化为0。但是这在神经网络的训练中会存在一些问题。因为如果权重都为0,在第一遍前向计算时,所有的隐层神经元的激活值都相同。这样会导致深层神经元没有区分性。这种现象也称为对称权重现象。
随机初始化权重的一个问题是如何选取随机初始化的区间。如果权重取的太小,一是会导致神经元的输入过小,经过多层之后信号就慢慢消失了;二是还会使得Sigmoid 型激活函数丢失非线性的能力。以Logistic 函数为例,在0 附近基本上是近似线性的。这样多层神经网络的优势也就不存在了。如果权重取的太大,会导致输入状态过大。对于Sigmoid 型激活函数来说,激活值变得饱和,从而导致梯度接近于0。
因此,要高效地训练神经网络,给权重选取一个合适的随机初始化区间是非常重要的。一般而言,权重初始化的区间应该根据神经元的性质进行差异化的设置。如果一个神经元的输入连接很多,它的每个输入连接上的权重就应该小一些,以避 ...
训练神经网络不得不看的33个技巧
据说开始训练神经网络很容易,许多库和框架都以可以用30行的奇迹代码片段解决你的数据问题而自豪,给人一种即插即用的(错误)印象。常见的做法是:
123>>> your_data = # plug your awesome dataset here>>> model = SuperCrossValidator(SuperDuper.fit, your_data, ResNet50, SGDOptimizer)# conquer world here
通常可以获得简洁的API和抽象。比如:
123>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))>>> r.status_code200
这很酷!开发者勇敢地承担了理解查询字符串、url、GET/POST请求、HTTP连接等重担,并在很大程度上隐藏了几行代码背后的复杂性。这是我们所熟悉和期望的。
不幸的是,神经网络不 ...
Contextual String Embeddings for Sequence Labeling
文章在CoNLL03 NER的F1值超过BERT达到了93.09左右,名副其实的state-of-art。考虑到BERT训练的数据量和参数量都极大,而该文方法只用一个GPU训了一周,就达到了state-of-art效果,值得花时间看看,总的来说,作者基于词的上下文字符级语言模型得到该词的表示,该模型的主要好处有:
可以在大型无标签数据集下进行训练。
利用上下文字符嵌入,可以更好地处理罕见和拼写错误的单词。
利用上下文字符嵌入,可以得到多义词的不同语境嵌入。
总的来说,使用BiLSTM模型,用动态embedding取代静态embedding,character-level的模型输出word-level的embedding. 每个词的embedding和具体任务中词所在的整句sequence都有关,算是解决了静态embedding在一词多义方面的短板,综合了上下文信息。另外该模型产生的隐藏状态输出可以用于下游任务中,比如NER任务,如下所示;
目前三种主流embedding:
A. 经典embedding
B. character-level 基于特定任务的embedding,不 ...