Skip to content

Commit

Permalink
#28 : 번역투 -> 맥락에 맞는 매끄러운 문맥 재구성. 개인 comment 및 어색한 단어 교체 예정정
Browse files Browse the repository at this point in the history
  • Loading branch information
mike2ox committed Sep 8, 2018
1 parent f2f2895 commit f6c6ff7
Showing 1 changed file with 9 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,23 @@ sequence-to-sequence(Seq2Seq)은 한 도메인(예: 영어 문장)에서 다른
```

이 모델은 기계 번역 혹은 자유로운 질의응답에 사용됩니다. (주어진 자연어 질문에 대한 자연어 응답 생성)
--일반적으로, 텍스트를 생성할 때마다 적용 가능합니다.
--일반적으로, 텍스트를 생성해야 할 경우라면 언제나 적용할 수 있습니다.

해당 작업을 다루기 위해 여러 가지 방법이(**RNN**을 사용하거나 **1D convnets**를 사용) 있습니다.
해당 작업을 다루기 위해 여러 가지 방법이(**RNN** 혹은 **1D convnets**) 있습니다.
> 이번 문서에선 **RNN**을 사용해서 Seq2Seq를 구현하고 있습니다.
#### 자명한(명확한) 사실 : 입출력 문장이 같은 길이일 때
입출력 두 가지 문장이 같은 길이일 경우, 케라스의 Long Short-Term Memory(LSTM) models 혹은 GRU 계층(혹은 stack thereof) 같은 모델들을 구현할 수 있습니다. [예제 스크립트](https://github.com/fchollet/keras/blob/master/examples/addition_rnn.py)에선 어떻게 RNN으로 문자열로 인코딩된 숫자들에 대한 덧셈 연산을 학습할 수 있는지 보여주고 있습니다.
#### 자명한(명확한) 사례 : 입출력 문장이 같은 길이일 때
입력과 출력, 두 문장의 길이가 같을 경우, 간단하게 케라스 Long Short-Term Memory(LSTM)이나 GRU 계층(혹은 다수의 계층) 같은 모델들을 구현할 수 있습니다. [예제 스크립트](https://github.com/fchollet/keras/blob/master/examples/addition_rnn.py)에선 어떻게 RNN으로들 문자열로 인코딩된 숫자들에 대한 덧셈 연산을 학습할 수 있는지 보여주고 있습니다.

![The trivial case](media/28_0.png)

이러한 접근법의 주의사항은 주어진 `input[...t]`으로 `target[...t]`을 생성 가능하다고 추정하는 것입니다. 일부의 경우(예: 숫자 문자열 추가)에선 정상작동하지만, 대다수의 경우에는 아닙니다. 일반적일 때, 전체 입력 문장에 대한 정보는 목표 문장 생성을 시작하기 위해 필수적입니다.
접근법의 주의점은 주어진 `input[...t]`으로 `target[...t]`을 생성 가능하다고 추정하는 것입니다. 일부의 경우(예: 숫자 문자열 추가)에선 정상작동하지만, 대부분의 경우에는 작동하지 않습니다. 일반적으론, 목표 문장을 생성하기 위해 전체 입력 문장에 대한 정보가 필요합니다.

#### 일반적인 사례 : 표준 sequence-to-sequence
일반적일 때, 입출력 문장이 다른 길이이고(예: 기계 번역) 전체 입력 문장은 목표 문장 예측을 시작하기 위해 필요합니다. 이를 위해 더는 문맥 없이 일반적으로 "Seq2Seq models"를 언급할 때 참조하는 고급 설정이 필요합니다. 하단에 어떻게 동작하는지 나와 있습니다.
일반적일 때, 입력과 출력 문장의 길이가 다르고(예: 기계 번역) 목표 문장을 예측하기 위해 전체 입력 문장을 필요로 합니다. 이를 위해 고급 설정이 필요하며, 일반적으로 "Seq2Seq models"를 언급할 때 참조하는 것입니다. 하단에 동작 방법이 나와 있습니다.

- 하나(혹은 여러 )의 RNN 계층은 "encoder" 역할을 띱니다 : 입력 문장을 처리하고 자체 내부 상태를 반환합니다. 여기서, encoder RNN의 결과는 사용하지 않고 상태만 복구시킵니다. 이 상태가 다음 단계에서 decoder의 "문맥" 혹은 "조건"으로 역할을 띕니다.
- 또 하나(혹은 여러 개)의 RNN 계층은 "decoder" 역할을 띱니다 : 목표 문장의 이전 문자들에 따라 목표 문장의 다음 문자들을 예측하도록 훈련이 됩니다. 상세히 말하면, 목표 문장을 같은 문장으로 바꾸지만 후에 "teacher forcing"이라는 학습 과정인, 한 개의 time step만큼 offset 되도록 훈련됩니다. 중요한 건, encoder은 encoder의 상태 벡터들을 초기 상태로 사용하고 이는 decoder가 생성되어야 하는 정보를 구하는 방법입니다. 사실, decoder는 주어진 `target[...t]`을 입력 문장에 맞춰서 `target[t+1...]`을 생성하는 법을 학습합니다.
- 하나(혹은 여러 개의)의 RNN 계층은 "encoder" 역할을 합니다 : 입력 문장을 처리하고 자체 내부 상태를 반환합니다. 여기서, encoder RNN의 결과는 사용하지 않고 상태만 복구시킵니다. 이 상태가 다음 단계에서 decoder의 "문맥" 혹은 "조건" 역할을 합니다.
- 또 하나(혹은 여러 개)의 RNN 계층은 "decoder" 역할을 합니다 : 목표 문장의 이전 문자들에 따라 목표 문장의 다음 문자들을 예측하도록 훈련이 됩니다. 상세히 말하면, 목표 문장을 같은 문장으로 바꾸지만 후에 "teacher forcing"이라는 학습 과정인, 한 개의 time step만큼 offset 되도록 훈련됩니다. 중요한 건, encoder은 encoder의 상태 벡터들을 초기 상태로 사용하고 이는 decoder가 생성되어야 하는 정보를 구하는 방법입니다. 사실, decoder는 주어진 `target[...t]`을 입력 문장에 맞춰서 `target[t+1...]`을 생성하는 법을 학습합니다.


![seq2seq-teacher-forcing](media/28_1.png)
Expand Down

0 comments on commit f6c6ff7

Please sign in to comment.