티스토리 뷰

 

2주도 전에 들은 수업을 지금 정리하는 클라스.. 기억을 더듬어 가며 다시 해보자. 

 

이번 수업에서는 5가지 포인트를 중점으로 얘기한다. 

 

1. NLP 과거 - 현재 

엄청 간략하게 말하자면 NLP 문제를 해결하기 위한 여러 연구자의 공헌이 있었다. 그 덕분에 deep learning이 있기 전에도 이미 많은 NLP의 문제에 대한 해답을 찾을 수 있었다. 특히나 BiLSTM 이 등장하면서는 비약적으로 발전한 NLP. 하지만 그럼에도 여전히 부족한 점들이 있다. 

 

우선, long term memory 는 여전히 취약한 부분. 극단적으로 인간과 비교를 해볼 때, 인간은 몇 년 전에 읽었던 문장도 기억하는 한편 deep learening 이 아무리 long term memory 가 좋아졌다고 해도 최대 몇십 문장정도임.  그리고 문장을 이해하고 해석하는데 필요한 ‘상식’이 없고, 다른 문장 사이를 연결해서 이해하는 것에 약함. 예를 들어, 문장 A 와 문장 B의 인과 관계 파악 등에 취약함. 

2.  Recursive Neural Networks 

Recursive Neural Networks 는 이전 수업에서도 배운 적이 있는데 문장을 hierarchical structure 즉 tree 구조로 표현하는데 쓰는 뉴럴넷. 교수님은 자신이 언어학자로서 여전히 문장의 의미 구조를 표현하는데 트리 구조가 좋다는 의견을 밝힘. 

 

하지만 트리 구조를 사용해서 문장을 표현하는 것이 한계는 일단 속도이다. 굉장히 느린 데다가, 외부의 파서에 의존한다는 것도 문제다. 그리고 트리 구조로는 설명할 수 없는 문장들도 있는데 이런 문장을 표현하기 어렵다. 

 

Tree sturcutre 를 사용하는 recursive network 는 왜 sequence model (LSTM) 에 비해서 이렇게 느린걸까? GPU 를 이용한 batch computation에 최적화 되지 않아서 그렇다. Sequence model 의 경우 하나의 구조만 가진다. Input sentence 를 왼쪽 -> 오론쪽 으로 순차적을 읽으면서 hidden state 를 계산한다. 그런데 tree structure 를 사용할 경우 문장마다 구조가 다르기 때문에 GPU 를 사용하더라도 각 batch 에 있는 문장 구조가 다르다면 하나의 thread 가 돌아가는 동안 나머지 threads 는 idle 한 상태가 된다. 

 

그래서 이 문제를 해결하기 위해서 GPU 의 성능을 잘 활용하면서 tree structure 의 이점도 가질 수 있는 SPINN (the Shift-Reduce Interpreter-parser network) 가 고안되었다. 우선 기본부터 말하자면 우리가 이전에 배웠던 dependency parser 랑 상당히 유사한다. Buffer 와 stack 이 있고, 각 step  에서 shift 와 reduce 중에 하나를 선택하는 binary classification 이다. 

 

각 스텝에서 어떤 선택을 하냐에 따라 최종적으로 다른 트리 구조를 만들어 낼 수 있다. 

 

일단 buffer 가 있고, 각 step 에서 buffer 의 가장 왼쪽 (오른쪽부터 인가? 정확하진 않음) 부터 차례대로 처리한 다는 점에서 가운데에 빨간 박스 부분은 sequence model 처럼 작동한다고 할 수 있다. 그리고 각 step 에서 reduce 냐 shift 냐에 대한 분류를 진행하고 buffer 와 stack 에 있는 값이 업데이트 되겠지.

 

 

그리고 여기서부터 이해가 안 되는데... (데이터에 대한 이해가 부족해서 그런가 ㅜㅜ). 일단 단순하게 각 타임스텝마다 stack을 업데이트 ㅏ면 모든 스텝에 대해 각기 다른 stack 이 있게 되고 이렇게 되면 나중에 back propagation 을 계산할 때 많은 상당히 많은 memory 가 필요하게 된다. 모든 stack 의 state 를 다 저장하고 있어야 하므로. 이것보다는 모든 문장에 대해서 단 하나의 array 만을 갖게 해서 메모리 사용을 줄이는 게 좋다. 그렇게 하기 위해서 back pointer 를 사용하는데, each step 에서 stack 에는 단 하나의 값만을 두고 back pointer 를 이용해서 뭐가 stack 의 어느 부분에 있나 기록한다 (뭔말이냐..) 

 

아무튼 이 아키텍쳐 등을 이용해서 문장에서 정치색 분류, 혹은 fake news detection 등에 효율적으로 쓰일 수 있다 (문장 2개를 각각 트리 구조로 표현한 다음 비교 네트워크를 사용하여 두 문장의 관계를 분류하기도) -> 하지만 실제로는 해당 task 의 SOTA 는 그냥 문장 A 와 문장 B에 있는 각각의 단어들을 단순히 align 해서 비교하는 모델이라고 한다. 

 

3. Research highlight

 

4. Model with copying/ pointer

 이전 수업에서 본 적 있는 구조. 특히나 기계번역 같은 경우에 이 전에 나온 적 없는 단어를 소스 센텐스에서 그냥 붙여넣기 함으로써 해결하는 방식 (특히나 사람 이름이나 entity 번역에 효과적). 그림을 설명하자면 St 라는 타겟 hidden state 를 계산하기 위해서 previous hidden state St-1 이용. 그리고 타겟인 z 를 generate 하기 위해서는 소스 시크원스에서 어텐션을 이용해서 복사해서 붙여넣거나, hidden state 가지고 softmax 계산해서 vocabulary 에서 선택하거나... 

 

그런데 구글 기계번역팀에서 발표한 바로는 이 포인터를 이용해서 소스 센텐스에서 그대로 붙여넣기 하는 방법이 그렇게 효과적인 방법은 아니라고.. 뭐 이게 자기한테 맞는 모델인지는 해봐야 알겠쥬? 

 

5. Character embeddin

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함