Closed hccho2 closed 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})
Position-wise
입니다. 2쇄에는 수정했는데 정오표 반영이 누락된 것 같습니다. 혼란 드려 송구스럽습니다. 반영해 두겠습니다.padding을 제거한다는 것은 제가 코드를 잘못 이해했습니다. sequence_length를 고려해서 reverse_sequence를 구하기 때문에, EOS 부분이 제거되는게 맞네요.
상세한 설명 감사합니다.
질문 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의 차이가 뭔지 모르겠습니다.