ratsgo / embedding

한국어 임베딩 (Sentence Embeddings Using Korean Corpora)
https://ratsgo.github.io/embedding
MIT License
455 stars 130 forks source link

ELMo 파인튜닝 단계에서 BOS/EOS제거에 관한 질문 + pointwise vs positionwise #55

Closed hccho2 closed 4 years ago

hccho2 commented 4 years ago

질문 1.

ELMo 파인 튜닝에서 BidirectionalLanguageModel._build_ops()를 보면, BOS/EOS token을 제거하기 위해 양끝을 잘라내고 있습니다.

lm_graph.embedding, lm_graph.lstm_outputs가 이미 각각 colvolution, LSTM을 거치면서 옆 token의 영향을 받은 상태여서, 정확하게 BOS/EOS라고만 볼 수도 없을 것 같습니다.

그리고, 양 끝의 잘라내는 과정도 batch단위로 이루어집니다. shape이 (N,T,258)이라면, sequence 길이인 T는 가장 긴 문장의 길이에 맞춰집니다.

그래서, 대부분의 문장 끝은 padding이 붙어 있습니다. 따라서 EOS을 제거하는 것이 아니라 끝에 붙은 padding 하나 제거하는 것에 불과합니다.

그럼에도, 양 끝을 제거하는 특별한 이유가 있을까요?

질문 2. 그리고, 질문이 하나 더 있습니다. page 226 Transformer 의 Positionwise Feedforward Networks(코드 5-34)을 설명하였고.

BERT에서는 Pointwise방식임을 강조했습니다(page 232) 그런데, 구현 코드 modeling.py -> transformer_model() 를 보면.

Positionwise와 Pointwise의 차이가 뭔지 모르겠습니다.

ratsgo commented 4 years ago

@hccho2 님, 질문 주셔서 감사드립니다. 순서대로 제가 아는대로 답변드리겠습니다.

import sys
sys.path.append('models')

import tensorflow as tf
from bilm import Batcher

vocab_fpath = "data/sentence-embeddings/elmo/pretrain-ckpt/elmo-vocab.txt"
max_characters_per_token = 30

ids_placeholder = tf.placeholder(tf.int32, shape=(None, None, max_characters_per_token), name='input')

batcher = Batcher(lm_vocab_file=vocab_fpath, max_token_length=max_characters_per_token)
dummy_data = batcher.batch_sentences([["a", "b", "cd"], ["ef", "g"]])

mask = tf.reduce_any(ids_placeholder > 0, axis=2)
sequence_lengths = tf.reduce_sum(tf.cast(mask, tf.int32), axis=1)

sess = tf.Session()

sess.run(sequence_lengths, feed_dict={ids_placeholder: dummy_data})
스크린샷 2019-12-10 오후 9 24 33
hccho2 commented 4 years ago

padding을 제거한다는 것은 제가 코드를 잘못 이해했습니다. sequence_length를 고려해서 reverse_sequence를 구하기 때문에, EOS 부분이 제거되는게 맞네요.

상세한 설명 감사합니다.