引言
高质量的单词表示注重建模
- 单词的语法、语义特征(由浅层网络捕捉)
- 单词的上下文特征(一词多义、polysemy)(由深层网络捕捉)
传统的词嵌入:
通过整个输入句子的函数,来给每一个token分配一个向量表示(what?- 只支持单一的、上下文无关的词向量表示
改进的词嵌入: - 使用子词信息来丰富特征
- 给每一个word sense而不是word学习一个单词的向量
EMLo的词嵌入:
- 使用language model训练目标,使用深层的双向LSTM
- 通过使用 character convolutions来导入子词信息
- 并没有显式地预测定义好的word sense,而是隐式地(无缝的、seamlessly)融合了word sense信息
- 预训练好biLM,然后固定权重,并添加额外的task-specific model
模型
Bi LM
forward LM:
backward LM:
bi LM
对于position k,把前向预测、后向预测的loss加起来
特别的,
θ
x
(
t
o
k
e
n
e
m
b
e
d
d
i
n
g
s
)
和
θ
s
(
s
o
f
t
m
a
x
l
a
y
e
r
)
θ_x(token embeddings)和θ_s(softmax layer)
θx(tokenembeddings)和θs(softmaxlayer)共享参数
ELMo
把ELMo应用到下游任务时,对于每一个token,首先得到2L+1个representaion:
然后:
- 可以只选用第L层的hidden state
- 也可以加权求和L+1层的state(第1层是token embeddings)
其中,s是一个task-specific的可训练权重(?),用于加权求和所有的state;r是一个缩放参数,用于加快optimization process
有监督NLP任务
首先定义一个task-specific模型,该模型除了原始参数,还有一个线性层(就是上面的s)。在模型的输入部分,首先使用预训练的词嵌入
x
k
x_k
xk来给每一个token一个向量,然后计算上面的
E
L
M
o
k
t
a
s
k
ELMo_{k}^{task}
ELMoktask,和
x
k
x_k
xk做拼接,作为模型的真实输入。
ELMo不仅可以用在模型的输入部分,在模型为每一个token计算了隐向量
h
k
h_k
hk后,也可以做拼接。
另外
- 给ELMo增加dropout能够提升性能
- 在loss中加上ELMo权重的L2范式,来进行正则化
- 以上两点能够:给ELMo的权重施加一个归纳偏置(inductive bias),让其更接近于所有biLM layers的平均
预训练模型
组成:
- 两层biLSTM+512维的映射层+中间的残差连接(才两层?)
- 2048个字符级别的n-gram卷积滤波器+两个highway层+512维的映射层(这个不懂)
这里的finetune意味着:首先忽略下游任务,让预训练好的ELMo在training data上做一轮的finetune,然后固定参数,做和“有监督NLP任务”一样的操作。
评估
QA:回答是给定段落中的一个span
Textual entailment
Semantic role labeling:预测谓词的论元(主语、宾语)
Coreference resolution:给实义相同的单词聚类
Named entity extraction:PER\LOC\ORG\MISC
Sentiment analysis:五类细粒度的情感分类
分析
不同层的权重:
- 使用所有层>仅使用最后一层
- λ=0.001 > λ=1
EMLo加在哪里:
- SQuAD和SNLI中,inp和oup layer都加上,效果更好
- 其它任务中,仅加载inp layer效果更好
BiLM捕捉到了什么信息?
- WSD:首先计算所有word sense的向量表示,然后给每一个word做预测。second layer > first layer
- POS tagging: first layer > second layer
采样高效性
- 加入了EMLo,达到最好结果所需要的epoch大大减小
- 所需要的training set的规模也可以减小
补充材料
finetune:
- 忽略下游任务,现在训练集上fine tuned一轮,然后固定参数,进行下游任务
- finetune之后,困惑度(perplexity)大大下降;但下游任务的性能并不都提高
其它任务:略