ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자연어 처리] 기계 번역 Seq2Seq
    🤖𝗔𝗜/🤖광주 인공지능사관학교 2020. 8. 11. 15:33

    Seq2Seq

    : 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 분야에서 사용되는 모델

     

    봇(Chatbot)과 기계 번역(Machine Translation), 내용 요약(Text Summarization), STT(Speech to Text) 등에서 쓰인다.

     

    구성 : 

    인코더디코더로 구성된다.

    인코더 : 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에, 마지막에 이 모든 단어 정보들을 압축해서 하나의 벡터로 만든다.

    => 컨텍스트 벡터

    -> 디코더로 전송한다.

    즉, 한글 문장 받아서 LSTM 마지막 시점의 은닉/셀 상태 리턴하도록.

     

    디코더 : 컨텍스트 벡터를 받아서 번역된 단어를 한 개씩 순차적으로 출력한다.

     

    인코더와 디코더는 RNN 형태이다. 성능 문제로 인해 LSTM 셀로 구성.

    인코더 : 입력 문장을 받는 RNN 셀

    -> 입력문장은 단어 토큰화를 통해 단어 단위로 쪼개지고, 단어 토큰 각각은 RNN 셀의 각 시점의 입력이 된다.

    -> 인코더 RNN 셀의 마지막 시점의 은닉 상태를 디코더 RNN 셀로 넘겨준다. ( 컨텍스트 벡터 )

     

    디코더 : 출력 문장을 출력하는 RNN 셀

    -> 컨텍스트 벡터는 디코더 RNN 셀의 첫번째 은닉 상태로 사용된다.

     

     

    디코더는 초기 입력으로 문장의 시작을 의미하는 <start> 들어간다.

    그리고, 다음에 등장할 확률이 높은 단어를 예측한다.

    예측된 단어를 다음 시점의 RNN 셀의 입력으로 입력한다. 

    문장의 끝을 의미하는 <end>가 다음 단어로 예측될 때 까지 반복한다.

     

    훈련 과정과 테스트 과정 작동 방식이 다름.

    훈련 : 디코더에게 인코더가 보낸 컨텍스트 벡터와 실제 정답을 알려주면서 훈련한다.

    테스트 : 디코더는 오직 컨텍스트 벡터와 <start> 만을 입력으로 받은 후에 다음에 올 단어를 예측하고,

    그 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복한다.

     

    나는 개와 산책을 하고 있다. -> 인코더를 거치면서 셀/은닉 상태 리턴

    셀 상태와 은닉 상태 + <start>가 인풋으로 들어가면

     

    지금까지 쌓아진 셀/은닉 상태 값, 현재 단어 -> 다음 단어

     

     

    기계는 텍스트보다 숫자를 잘 처리한다.

    자연어 처리에서 텍스트를 벡터로 바꾸는 방법으로 워드 임베딩이 사용된다.

    seq2seq에서 사용되는 모든 단어들은 워드 임베딩을 통해 나온 임베딩 벡터이다.

    단어 개수 만큼 임베딩 벡터를 만든다. 정수 인코딩 할 때는 1부터 인덱스를 부여.

     

    입력할 때는 임베딩 레이어를, 출력할 때는 소프트맥스 함수를 거친다.

     

     

     

     

     

     

    LSTM 마지막 은닉 상태값, 마지막 은닉 상태값, 마지막 셀 총 3개 리턴. return_state = True라고 하면..!

     

    디코더 모델. 인코더의 상태값(h,c)랑 영어 문장을 입력받아서, LSTM의 출력값(은닉 상태)을 받아서 softmax 통과

     

    Dense( len(tokenizer_en.word_index) + 1,

    모든 단어의 확률값을 출력하고, 그 중에서 가장 높은 확률 값을 얻어야 해서.

     

     

     

    참고 : https://wikidocs.net/24996


    Prediction

    인코더가 출력하는 마지막 시점의 셀/은닉 상태 값 따로 구하고, 

    <start> 라는 인풋을 따로 디코더 모델의 lstm에 집어 넣어서,

    lstm에서 내는 아웃풋 다시 lstm에 계속 집어넣는 형태로 ! 그러다가 <end>가 보이면 그만.

     

    인코더가 출력하는 마지막 시점의 셀/은닉 상태 값 따로 구하고

    h_state, c_state는 아웃풋 레이어 (LSTM)를 명시한 것

    훈련을 하고 나면 레이어 별로 가중치를 학습, 훈련이 되었으니 학습된 가중치를 가진 레이어를 

     

    디코더 모델을 만들 건데, 디코더 모델에 초기값으로 넣을 상태값의 모양을 지정한다.

    우리가 시퀀스를 넣을 게 아니라, 단어 단어를 넣을 것이기 때문에, 한 시점만 존재

    상태값을 자동으로 넘겨주지 않기 때문에, 직접 넘겨줘야 한다.

     

    lstm 셀 통과하면서 예측, softmax 함수를 통과한 출력값 ( 각 단어별 다음 단어일 확률 ) 

    다시 그 단어 + 전 시점의 디코더의 상태 값이 디코더 인풋으로 들어간다.

     

     

    챗봇 만들기 

    질문이 인코더, 답변이 디코더로 들어가는 것이다.

    댓글

ahntoday