模型整体架构和实现思路看知乎大佬的总结:
自己的理解:
ELMo的预训练是训练各层LSTM内部参数,以及各层的输出上下文矩阵的参数值。
ELMo的输出:


以三层ELMo为例,当输入一个文本,并确定一个中心词后,那么在E1~En层会输出一个中心词原来的embedding向量,在第一个LSTM层的前向会输出一个同样维度的向量,在后向也会输出一个同样维度的向量,第二层也一样。例如embedding输出512维向量,那么第一层LSTM就是1024维度的(两个向量拼接),第二层是1024维度。
那么如何使用这些向量呢?
ELMo计算出的最终向量是:vELMo=γ(s0⋅h0+s1⋅h1+s2⋅h2)
让我们来解析这个公式:
- h0,h1,h2: 分别对应我们上面得到的第0层(初始嵌入)、第1层(第一个LSTM)、第2层(第二个LSTM)的表示向量。
- s0,s1,s2: 任务特定的软权重。这些权重是在将ELMo应用到下游任务时,根据任务数据学习出来的。
- 这意味着,对于不同的任务,模型会自动决定哪一层的表示更重要。
- 例如,一个语法敏感的任务(如句法分析)可能会给第一层LSTM(s1)更高的权重。
- 一个语义敏感的任务(如文本蕴含)可能会给第二层LSTM(s2)更高的权重。
- 初始词嵌入层(s0)的权重也可能不为零,它保留了词最原始的信息。
- γ: 缩放因子。也是一个可学习的参数。因为加权求和后向量的尺度可能会发生变化,γγ 帮助模型调整最终向量的规模。
注意:在原始论文中,为了统一维度以便后续加权求和,有时会对LSTM层的输出(1024维)进行一个线性变换,将其投影到与词嵌入层(512维)相同的维度。但为了理解核心思想,我们可以暂时忽略这个投影,认为它们在概念上是不同的表示。
所以在我们自己的模型中可以训练参数s0,s1,s2,γ。