ElMo?
ElMo는 sesame street 모델 중 가장 첫 번째로 등장한 모델 BERT는 Elmo를 unidirectional LM이라고 말하였으나, BERT의 bi-directional까지는 아니어도 shallow bi-directional한 모델로 소개됨
중요한 것들만 간략하게 정리하고자 한다.
Bidirectional Language Model
Elmo의 log-likelihood는 다음과 같다. 여기서 화살표는 forward / backward를 구분짓는 기호로 생각하면 된다. 즉, forward / backward에 대한 likelihood를 동시에 maximize한다는 것. 그리고 이전(이후) token이 이후(이전) token에 영향을 끼치지 않는다 (각각의 모델은 분리되어있기 때문에)
실질적으로 위에 대한 것을 모델-시각화하면 다음과 같다.
ELMo vector
Representaion을 Rk로 표시한다면 다음과 같다. 즉, ELMo vector는 어떤 token k에 대한 Representaion layer에 대한 weighted average라는 것 위는 Hypercolumns로 생각할 수 있다. 어떤 token에 대해서 특징적인 부분들을 추출하여 하나의 특정한 (모든 정보들이 축약된) vector로 나타내기 때문이다.
why ELMo vector?
ELMo는 그럼 왜 ? 모든 Representation layer에 대한 정보를 축약한다는 것일까? 이는 lower layer는 syntax에 대한, higher layer는 context-dependent한 부분들을 capture하기 때문이다. 그러면, context-dependent한 higher layer는 실제 Elmo가 context-dependent한 task에 대한 정보들을 더 많이 제공하지 않을까 생각한다.
그러면 ELMo parameter의 역할은?
Elmo parameters : s^task : softmax-normalized weights γ : the scalar parameter allows the task model to scale the entire ELMo vector
s^task는 각 layer에 대해 weigthed sum을 위한 weight 그리고 γ ElMo Vector에 대한 scale parameter다 위 파라미터들은 trainable 일 수도 fixed value 일 수도 있다.
From allennlp
class ScalarMix(torch.nn.Module):
"""
Computes a parameterised scalar mixture of N tensors, ``mixture = gamma * sum(s_k * tensor_k)``
where ``s = softmax(w)``, with ``w`` and ``gamma`` scalar parameters.
In addition, if ``do_layer_norm=True`` then apply layer normalization to each tensor
before weighting.
"""
self.scalar_parameters = ParameterList(
[
Parameter(
torch.FloatTensor([initial_scalar_parameters[i]]), requires_grad=trainable
)
for i in range(mixture_size)
]
)
self.gamma = Parameter(torch.FloatTensor([1.0]), requires_grad=trainable)