ELMo
论文:《Deep contextualized word representations》
1. word2vector
我们先简单回顾下word2vector。我们想解的问题的是:如何将一个词语用向量来表示?
1.1 one-hot
首先想到的是使用one-hot来表示,如我们有一个词典:【a,apple,…,zoo,】,词典有n个词语,那么就用n维向量表示某个词。向量中词语下标位的值为1,其余为0:
该方法的主要缺点为:
- 向量太长,词汇量增加,向量维度增加。
- 该向量无法表达出词汇之间的关系:
模型学不到“I want a glass of apple _____”该填什么的。
“orange”和“apple”的特征表示没有任何的关系。
1.2 Neural Architecture of language model
语言模型简单可以理解是某一句话是合理的概率模型。如给出“I want a glass of orange __”,通过语言模型我们可能得到空格处最可能的单词为“juice”。基于神经网络结构的语言模型如下所示:
- 第一层:绿色方块为onehot向量
- 第二层:各个one-hot向量(10000维)会乘以共享矩阵C,即词向量矩阵(10000*300)。
- 第三层:乘完的向量(300维)连接(3*300=900维),并代入tanh函数
- 第四层:第三层到第四层(10000维)使用的是全连接
- Softmax:Vi表示输出V中的第i个元素,那么这个元素的Softmax为
1.3 word2vector
Neural Architecture of language model 非常重,一个比较轻巧训练词向量的方式就是最流行的word2vector:
- CBOW模型:获得中间词两边的的上下文,然后用周围的词去预测中间的词。经过词嵌入后,将向量按位素数相加。
- Skip-gram模型正好和CBOW模型相反,输入为中间的词,使用预测两边的的上下文的单词。
为了加速训练,还做了优化: - hierarchical softmax:不使用one-hot,而是利用哈夫曼编码。节点数logV。
- 负采样:将模型变成2分类任务模型:
相邻: [V orange ,V juice ] -> 1
非相邻:[ V orange ,V man ] - > 0
word2vector的显而易见的缺点是没考虑上下文含义。比如说“我 用 苹果 手机 上网 买了 一箱 苹果”,这里的两个“苹果”我们从词向量矩阵中lookup出来的是相同的向量,但是显然这两个苹果的含义的不同的。这个问题之前的解法有如,训练多个词向量矩阵,可参阅《improving word representations via global context and multiple word prototypes》。但是,这个方法存在比较大我问题是,如何确定一个词有多少种意思(多少个矩阵)?如何更好的确定选哪个词向量的矩阵?
2. ELMo
2.1 核心创新
ELMo 借鉴CV中低、中、高特征的表示,如图:
ELMo用多层的BiLSTM语言模型,也想训练出多层次的文本表示:
可认为,低层特征表示是词语级别的特征,中层特征表示是句法级别的特征、高层特征表示是语义级别的特征。
2.2 核心公式
-
各层的表示向量为:
其中:, -
各层的表示向量加权求和得到该token的ELMo表示:
其中:为各层表示的权重,为改次任务的权重。
2.3 实验效果
如下表所示,ELMo能非常好的找到相同语境含义的“play”: