0%

When Bert Forgets How To POS: Amnesic Probing of Linguistic Properties and MLM Predictions

http://arxiv.org/abs/2006.00995, by 巴伊兰大学和AI2。

利用一种改进的Probe方法来对黑盒NN模型的行为进行分析,判断。

1.常用的Probe方法及其不足。

什么是probe?增强神经网络模型可解释性的方法。理解这个黑盒子,尝试回答比如BERT的每个head编码了哪些信息?哪些hidden state的维度被实际用在了预测中?如果去掉某些信息会怎么样?等问题。probe是解决这类问题的一种方法,也可以叫做auxilliary prediction【辅助预测】或者diagnostic classification【诊断分类】。

probe的过程?固定pre-train的原始模型的feature层,通过在原始模型的上层训练一个简单的分类网络,以对某种属性property的预测准确率来证明该信息被编码到了原始模型的隐藏表示中。

不足?只能证明信息被encode到了隐藏表示中,无法证明原始模型有效利用了这些信息。

2.这篇文章提出的方法:Amnesic Probing。

改进方式:反事实推理,假设某种属性P被解决任务T的原始模型有效使用了,那么把P去掉肯定会影响原始模型解决T的能力 。因此如果去掉P不影响解决T的能力,那么P中的信息就没有被有效利用。Intervention介入:这个工作和之前一些工作不同的地方在于它通过修改表示层来介入。其实很像是ablation,只是这里不能重新训练原始模型,算是黑盒子版本的ablation。

步骤:

阅读全文 »

Recent Language Model Papers

最近的语言模型和词嵌入的文章,有的读的仔细点,有的略读,不断更新中。

1.AlBert

https://openreview.net/forum?id=H1eA7AEtvS ,ICLR’20, by Google, SOTA in GLUE.

一个轻量级的BERT但是效果更好。它所做的修改主要有:

  • 首先把词向量矩阵分解了,这样使词向量矩阵的维度和hidden_size解耦,否则词向量矩阵参数量太大。

  • 把每层的参数共享了,减少参数数量。

  • 在这个基础上,能够把hidden_size提高到6144这种量级。

  • 为了对句子级别进行建模,ALBERT增加了一个sentence order prediction(SOP)任务而不是被证明太简单基本无效的NSP任务,给定当前句子与其下一句,或者是顺序翻转的两句话,希望模型预测句子序是否准确。

2.GPT-3,一个看看就好的单向语言模型

http://arxiv.org/abs/2005.14165 ,By OpenAI。

回想去年年底,我在尝试在GPT-2 Small(127M参数)模型的基础上搞点东西的时候,还在想这玩意fine-tune有点慢,batch size设不大啊。害,现在拿到论文只能看看人实验结果了,连下载模型的想法都不会有~

GPT-3,一个最大175Billion参数的基于Transformer-decoder的单向自回归语言模型。希望解决的就是pretrain-fineTune这套框架。他们觉得这套框架虽然解决了task-specific Model的问题,但是没有解决task-specific data的问题,所以领域相关数据还是导致应用很受限。

阅读全文 »

稀疏图计算的实现

遇到图中元素很稀疏时可以使用sparse tensor计算所需要的值,然后再转化为dense tensor。假如涉及图的运算中稀疏程度很大、或者中间结果的维度很高,都能够有效的降低时间跟内存开销。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 选择所有非0元素的索引
indices = torch.nonzero(x)
# 从参与计算的tensor中取值
values = x[tuple(indices[i] for i in range(indices.shape[0]))]
# 进行需要的索引变换
j_indices = indices.clone()
value_indices = list(j_indices[i] for i in range(j_indices.shape[0]))
value_indices[1] = value_indices[1].zero_()
# 从某个参与计算的tensor中取相应的值
emb_j = node_j[tuple(value_indices)]
# 进行计算
final_values = func(values, emb_j)
# 最后可能需要再次对索引进行变换(比如加上一维)
extra_indices = torch.arange(0, window_size).to(indices.device).unsqueeze(1).repeat(1, n_num).t().reshape(
(1, n_num, window_size))
indices = torch.cat([indices[0:1], extra_indices, indices[1:]], dim=0)
indices = indices.reshape((4, -1))
# 最后生成sparse tensor,再转换回来
x_typename = torch.typename(x).split('.')[-1]
sparse_tensortype = getattr(torch.sparse, x_typename)
res = sparse_tensortype(indices, final_values, (b, window_size, l, l, 1)).requires_grad_(True).to_dense()

另外,中间尝试了把几个计算涉及的tensor分别转为sparse tensor然后运算最后再转回来,但是在backward的时候会出错,用tensor.contiguous()也没解决。

阅读全文 »

PLUG AND PLAY LANGUAGE MODELS: A SIMPLE APPROACH TO CONTROLLED TEXT GENERATION

https://arxiv.org/pdf/1912.02164.pdf,by Uber AI。

大规模预训练语言模型的效果不错,但如何利用它们生成属性可控的文本(比如说某一领域、某种风格、某种情感),fine-tune是一种方法,本文提出了一种不需要重新训练的方式。

无需fine-tune或者重新训练LM。其具体的做法是根据梯度将Transformer-decoder每一层的hidden state向LM和attribute的方向改变一步。

对于attribute,进行了两类属性的控制,1)情感,通过一个预训练的二分类器判断生成的候选文本的误差;2)主题,通过指定一个中心词,找到wordnet的相关词集合,以multi-hot的方式将这些词列为vocabulary中的ground-truth-labels来计算误差。

分为三步,第一步通过一个前向过程获取$p(a|x),p(x)$,第二步通过反向传播获取相对于H的梯度并更新H,第三步利用更新之后的$\tilde H$来预测此时刻的vocab分布。

计算$H_t$的更新值$\nabla H_t$通过若干次重复计算梯度并衰减求和得到。

为了生成文本的流畅度,增加一项KL项,缩小输出的分布和之前的分布的KL值。

最后,最后采样的分布是未改变的分布和改变后的分布的加权之和。

最后的最后,根据$p(a|x)$,采样出来的候选seq集合还可以根据与attribute一致的程度进行排序。下图来自论文原文。

阅读全文 »

Bilinear Attention Networks

Pub in NeuraIPS’18, by Jin-Hwa Kim, 首尔国立大学。

VQA的任务,主要关注attention部分。下图来自原论文Figure 1。

image-20191117174946648

1.输入矩阵X和Y,分别表示文本和图像两个部分的feature map。

其中文本特征矩阵X的长度是(对应原文的),图像特征图Y的长度是(对应原文的,这里的是图像检测的object数量)。

2.计算Raw Attention Weight。

目标是得到一个矩阵,而后可以从dim1或者dim2进行softmax:

  • dot attention:,需要两个feature的维度相同,而且缺少feature维度的线性变换。
  • bilinear attention:,可以认为线性变换之后的X feature map与Y进行dot attention,但是W参数量可能很大。
  • low-rank bilinear attention: , 把W分解为,其中
  • Optimized:上面的计算等价于,也就是Figure 1中的计算。
  • low-rank bilinear pooling:如果我们把上面一步的矩阵运算分开来,也就是一个向量一个向量的计算,并引入pooling矩阵,那么得到:,这里得到的,也就是得到了G个raw attention weight。

3.计算attention weight并使用。

阅读全文 »