ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자연어처리] 기계 번역 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 해당 강의를 참고하여 정리하였습니다.

Designed by Tistory.