-
[자연어처리] 기계 번역 seq2seq Encoder-Decoder Model (2) Inference step자연어처리 공부 2023. 12. 26. 15:28
▶︎ 기계번역 seq2seq를 (1) train step, (2) Inference step 로 굳이 나눈 이유가 있나요?
→ train 디코딩 과정에서 이전 time step의 output을 input으로 사용하는 대신 실제 정답(ground truth)을 input으로 사용하는 teacher forcing을 사용합니다. inference할 때는 이전 time step의 output을 input으로 사용하는 text generation 기법을 사용해야 합니다. 그렇기 때문에 decoder model을 train 할 때와 inference 할 때 따로 만들어줘야 합니다.
1. time step의 output을 input으로 사용하는 decoder model을 만든다.
# Decoder for inference decoder_state_input_h = Input(shape=(512,), name='Decoder_hidden_h') decoder_state_input_c = Input(shape=(512,), name='Decoder_hidden_c') decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c] decoder_inputs_single = Input(shape=(1,), name='Decoder_input') x = decoder_embedding(decoder_inputs_single) # output, hidden states 를 저장 decoder_outputs, h, c = decoder_lstm(x, initial_state=decoder_states_inputs) decoder_states = [h, c] decoder_outputs = decoder_dense(decoder_outputs) decoder_model = Model( [decoder_inputs_single] + decoder_states_inputs, [decoder_outputs] + decoder_states ) decoder_model.summary()
2. decoder model 시각화
plot_model(decoder_model, show_shapes=True)
3. 번역하기
def decode_sequence(input_seq): # encoder model을 이용하여 input을 state vector로 encoding states_value = encoder_model.predict(input_seq) # Generate empty target sequence of length 1. target_seq = np.zeros((1, 1)) # target sequence 의 첫번째 character 를 start character (<sos>) 로 설정 target_seq[0, 0] = word2idx_kor['<sos>'] # <eos> token이 decode 에서 생성되면 loop 에서 break eos = word2idx_kor['<eos>'] # 번역문 생성 output_sentence = [] for _ in range(max_len_kor): output_tokens, h, c = decoder_model.predict([target_seq] + states_value) # argmax 로 가장 확률 높은 단어 선택 --> greedy selection idx = np.argmax(output_tokens[0, 0, :]) if eos == idx: # <EOS> token break if idx > 0: # idx 0 은 zero padding 된 sequence 이므로 '' word = tokenizer_kor.index_word[idx] output_sentence.append(word) # 생성된 word 를 decoder 의 다음 input 으로 사용 target_seq[0, 0] = idx # Update states states_value = [h, c] return ' '.join(output_sentence)
4. 만들 모델들을 가지고 최종 번역기 모델 만들기
def Eng_Kor_translation(txt): input_sequence = tokenizer_eng.texts_to_sequences([txt]) encoder_input = pad_sequences(input_sequence, maxlen=max_len_eng) return decode_sequence(encoder_input) test_text = [ "Your lips are red.", "French is interesting.", "I like you.", "Let's go to home." ] for text in test_text: translation = Eng_Kor_translation(text) print('----') print('Input:', text) print('Translation:', translation)
참고 자료 : 인프런 [딥러닝을 활용한 자연어 처리 (NLP) 과정 (기초부터 ChatGPT까지)] : 실습 - Transformer 번역기 분석 - Part1 지식공유자: YoungJea Oh 해당 강의를 참고하여 정리하였습니다.
'자연어처리 공부' 카테고리의 다른 글
[자연어처리] N-gram으로 아이오아이 너무너무너무 언어모델 학습하기. 다음에 올 가사 생성하기 (0) 2024.01.03 [자연어처리] Text-CNN 구현하기 (코드 위주) (0) 2024.01.02 [자연어처리] 문자를 숫자로 변환하는 방법 (BOW, TF-IDF, Word-Embedding) (0) 2024.01.02 [자연어처리] Word2Vec 의 모든 것 (1) 2023.12.26 [자연어처리] 기계 번역 seq2seq Encoder-Decoder Model (1) Train step (1) 2023.12.26