티스토리 뷰

강의 : Stanford CS230: Deep Learning | Autumn 2018 | Lecture 10 - Chatbots / Closing Remarks

 

전에 들었던 강의들에서 들어서 알고 있는 내용이었지만 공부한다는 생각으로 내용을 정리해보고자 한다.

 

이 강의는 챗봇에 대해 설명하기 위해 학생들이 원하는 강좌를 찾거나 등록할 수 있는 챗봇을 예제로 설명하고 있다. 우리가 알고 있는 알고리즘이 어떻게 적용되는지 진행 과정을 통해 이해하는 수업이었다.

 

Example1

Student: Hi! I want to enroll in CS106A for Winter 2019 to learn coding.

Chatbot: For sure, I just enrolled you!

 

Example2

Student: Hi! What are the undergraduate-level History classes in Spring 2019?

Chatbot: Here's the list of History classes offered in Spring 2019: ....

 

여기서 나오는 챗봇에 대해 한가지의 가정을 하고 있는데, 매우 제한된 도메인에 대해 다루고 있다는 점이다. 다시 말해, 이 챗봇에는 사용자로부터 입력되는 값(발화, 요청)의 범위가 수업의 등록이나 검색에 한정되기 때문에 여러 종류의 대화주제를 다루는 챗봇을 필요로 하지는 않는다.

 

 

 

이러한 챗봇을 구현하기 위해서는 어떠한 것들을 고려해야 할까?

 

먼저, 이 수업에서는 우선 챗봇에 사용하는 어휘들을 몇 가지 정의하고 있다.

- Utterance: User input

- Intent: Denotes the intention of the user. Here, possibilities are enroll(), inform() etc.

- Slot: Slots are used to gather multiple information from the user about their intent. Oftentimes, the user would provide some initial slots. Those should be saved so that the dialog system asks only for the details they don't have.

For the intent enroll, the slots can be "code", "quarter", "year", "SUid" etc

 

 

1. 의도(intent)를 탐지하는 방법.

어떤 network를 사용하여 탐지할 수 있을까?

두 가지를 고려할 수 있다. 첫번째는, 입력에는 들어오는 순서가 있다는 점을 이용하는 것이다. 그러므로 RNN(Recurrent Neural Networks)을 사용하여 인코딩 하는 것이다.

두번째는, Longterm independency를 위해 CNN(Convolutional Neural Networks)를 사용하는 것이다. 그런데 CNN은 RNN에 비해 얻을 수 있는 이점이 있다. 입력된 sequence 어딘가의 단어는 의도를 가지고 있을 것이다. CNN은 필터를 이용해 스캔하여 이 의도를 감지할 수 있다. 즉, 의도를 탐지하기 위해 훈련된 필터와 인텐트 등록을 탐지하도록 훈련된 또 다른 필터를 통해 등록된 단어 또는 내가 찾고 있는 단어를 감지한다.

 

데이터의 입장에서 보면 Input과 Output의 쌍이 있어야 하는데, 우리가 필요로 하는 것은 발언(Utterance)와 사용자의 의도(Intent)의 쌍이다. 따라서 우리는 데이터에 입력 x와 이에 따른 출력인 레이블y를 지정해줘야 한다. 

 

x= <p><p>Hi! I want to enroll in CS106A for Winter 2019 to learn coding.<p><p>

y= enroll() -> Call Axess

위와 같이 사용자의 의도가 등록이라는 것을 확인하면, 챗봇은 API를 호출하거나 다른 서버에서 정보를 요청하려고 한다. (Axess는 스탠포드 대학 학생들이 수업 등록하는 데 사용하는 플랫폼)

 

x= <p><p>Hi! What are the undergraduate-level History classes in Spring 2019?<p><p>

y= inform() -> Explorecourses

사용자가 수업을 듣기 위해 정보를 검색하려고 하면, API를 활용하여 수업 정보를 탐색해준다.

 

여기서 흥미로운 부분은 등록되어야 하는 부분을 챗봇이 식별해야 한다는 것인데, 그것은 곧 정보이고 슬롯을 채우는 역할도 할 것이다.

그래서 우리는 CNN이나 RNN을 시퀀스 분류(Classifier) 훈련을(Training) 해볼수 있다. (이 내용을 이해하고 싶다면 sequence model 수업을 들으시오)

 

 

2. 슬롯(slot)를 탐지하는 방법.

데이터 측면에서는 이전의 것과 비슷해 보일 수 있다. 하지만 우리는 Seq2Seq문제를 가지게 된다. 여기서 사용자들의 발언의 단어들은 순서가 있고 슬롯 태그 또한 순서있을 것이다.

 

그래서 우리는 슬롯 태그를 식별하기 위해 다음과 같은 형식의 방법을 쓸 수 있다.

B = begin, I = Inside(한 단어가 아닌 여러 단어로 채워질 슬롯을 감지할 수 있어야 함), O = outside

 

여기서는 '언제 갈지', '어디서 갈지', '어디로 갈지' 라는 3가지 정보가 주어져 있기 때문에 day, arrival, departure과 같은 슬롯을 채울 수 있다. 하지만 만약 이 정보 외에 class라던지 number of passengers 슬롯이 존재했고 이들을 채울 수 있는 정보를 받지 못한다면 챗봇이 사용자에게 슬롯을 채우도록 질문을 통해 요청하면 된다.

 

수강신청 챗봇의 example에서 위의 방법을 적용해보면 다음과 같이 라벨링을 할 수 있다.

그 다음 우리는 이러한 모든 태그를 예측하는 알고리즘을 RNN을 이용하여 훈련 시킬 것이다. 

 

이렇게 우리는 챗봇을 실행하는 두 개의 모델(intent, slot tagging)을 이해하게 되었다. 

 

 

그러면 우리는 이 두 개의 모델(intent, slot tagging)에 대해서 공동으로 훈련 시킬 수 있을까?

우리는 입력 시퀀스를 취하여 하나의 클래스를 출력하는 하나의 인텐트 분류기와 그리고 동일한 입력을 받아 시퀀스의 모든 단일 단어에 태그를 붙이는 슬롯 태거가 있다. 그러므로 우리는 두 모델의 훈련을 위해 공동 훈련을 시킬 수 있다. 두 가지를 모두 할 수 있는 이 네트워크는 서로 다른 두 가지 손실 함수(loss function)를 공동 훈련 시킬 것이다. 두 개의 손실 함수는 단순히 더해서 역 전파를 이용해서 두 네트워크를 훈련을 시킨다. 두 네트워크는 공통 기반을 가지고 있을 것이고 나중에 분리가 될 것이다. 예를들어, 사용자의 발화에 대한 정보를 인코딩 한 첫 번째 LSTM 레이어가 있다고 가정 해 보면, 이것은 우리에게 두 개의 다른 아웃풋(intent, slot tagging)을 줄 것이며 따로 훈련될 것이다. 일반적으로 이렇게 공동으로 훈련시키는 것이 자연어 처리에 있어서 크게 도움이 된다. 

 

 

데이터를 생성하는 전략!

비행 예약 가상 챗봇에 대해서 생각해 보자.

우리는 Departure, Arrivals, Days, Class와 User utterances에 대한 데이터 베이스를 가지고 있다. 

User utterances 데이터베이스에서 위와 같은 사용자 발언을 가져오자. 그리고 나서 우리는 나머지 각 데이터 셋에서 슬롯을 무작위로 플러그인 할 수 있다. 이것은 수십 또는 수백가지의 다른 조합을 만들어 자동으로 데이터 셋트와 레이블을 증가시키는 한가지 방법이다. 예를 들어보면 utterance가 10개 Departure가 5개, Arrivals가 3개, Days가 20개, Class가 2개 있다면 10x5x3x20x2개의 조합을 만들 수 있다.
그러나 이것을 하기 위해서는 역시나 데이터를 라벨링 하기위한 수작업은 필수적이다. 왜냐하면 이 모델이 특정한 사용자의 발언에 지나치게 맞춰지면 안되기 때문이다.

 

대학 수강신청 챗봇에서도 마찬가지로 데이터셋을 증가시킬 수 있다.

슬롯을 채우기 위해 Seq2Seq 모델을 훈련하게 되면, 삽입 할 때 자동으로 레이블을 지정할 수 있다.

 

 

더 복잡한 단계로의 한 걸음 (수정중)

Student: Hi! I want to enroll in CS106A to learn coding.

Chatbot: For which quarter would you like to enroll?

Student: Winter 2019!

Chatbot: For sure, I just enrolled you!

 

위 예제의 특징은 학생이 처음 발언했을때 quarter에 대한 정보가 있지않아 quarter에 대한 슬롯을 채우기 위해 챗봇이 되물었다는 것이다.

우리는 여기서 자연어 생성에 대해 어떠한 가정도 하지 않았다.

좋은 챗봇은 언어 생성의 특징이 있을 것이다. 하지만 우리는 단지 하드코딩을 하여 위와 같은 대화를 이끌어 갈 수 있다.

중간에 학생의 Winter 2019!라는 발언은 문맥없이 이해 될 수 없다. 이것을 이해시킬 수 있는 방법으로 컨텍스트 관리 시스템을 만드는 것이다. 그것을 할 수 있는 방법은 많이 있으며 사람들은 여전히 그 방법을 찾고 있다. 그 중 한가지 방법으로는 강화 학습을 이용해 처리하는 것이다. 또다른 직관적인 방법으로는 다음 논문에서 나온 방법을 이용하는 것이다. 

관련 논문 : End-to-End Memory Networks with Knowledge Carryover for Multi-Turn Spoken Language Understanding

사용자와 챗봇의 대화는 history utterances에 저장된다. C는 현재 발화이다. 그리고 현재 학생이 winter 2019라고 말했다. 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함