본문 바로가기

자연어 처리

자연어처리_챗봇_23-08-14

tqdm은 생략해도 성능에 문제가 없고

for문이 어느정도로 어떻게 진행되고 있는지 확인하기 위해 사용했었다,

 

enc_processing , dec_output_processing 함수 눈여겨볼 필요가 있습니다 

 

예제4. 데이터를 불러오고 가공하는 다양한 기능 구성하기 및 테스트

  • 판다스를 통해서 데이터를 불러온 후, question, answer로 분리하는 함수
  • 한글 텍스트를 토크나이징하기 위해 형태소로 분리하는 
  • 단어 사전을 만들기 위해서, 데이터를 전처리한 후 단어리스트를 만드는 함수
  • 단어 사전을 만드는 함수
  • 인코더에 적용될 입력값을 만드는 전처리 함수
  • 디코더의 입력으로 사용될 입력값을 만드는 전처리 함수
  • 디코더의 결과로 학습을 위해 필요한 라벨인 타깃값을 만드는 전처리 함수 

File name : workspace/step12/exam4.py

File name : workspace/step12/preprocess.py

File name : workspace/step12/ChatBotData_short.csv

 

extend 함수는 질문(Q)과 답변(A)을 리스트 하나에 통합할 때 사용되었다.

 

형태소 단위로 데이터를 자르는게 아니라 공백문자 기준으로 자르는게 필요하다

이유: 형태소단위로 잘라서 진행하는게 수월합니다. 

평소에 필요했던 게 좋을 것 같아요 

-> 평소 에 필요했 던 게 좋을 것 같아요로 나오게 됩니다

 

  • 문자열 또는 리스트의 곱하기

리스트도 곱하면 리스트도 숫자만큼 반복되어진다.

‘-‘  *  10 => ‘-‘ 문자를 10번 반복해서 문자열을 완성 

‘————-‘

 

  • 리스트의 합

리스트 더하기 리스트 = 결합된 리스트가 됩니다.

[1, 2, 3] + [4, 5, 6]

=> [1, 2, 3, 4, 5, 6]

 

# len(sequence_index) = 15 라고 가정

sequence_index += (MAX_SEQUENCE - len(sequence_index)) * [dictionary[PAD]]

sequence_index = sequence_index + (25-15) * ['<PAD>']

 

그냥 아무 생각 없이,, 타자만 칠 것이 아니라, 의미적으로 생각하면서 짜는 습관을 갖기 

 

(4) 디코더 부분 전처리 함수 1

  • 디코더의 입력으로 사용될 입력값을 만드는 전처리 함수

 

(5) 디코더 부분 전처리 함수 2

  • 디코더의 결과로 학습을 위해 필요한 라벨인 타깃값을 만드는 전처리 함수

 

  1. dec_target_processing(..)
  • 디코더 타깂값으로 종료 토큰이 들어온다 

 

<반드시 기억하기!!> 

  • 1줄로 작업해야할 명령어를 여러 줄로 작업할 때

=>  \ : 1줄 명령이 아직 끝나지 않음을 나타내는 기호

 

 

  1. 트랜스포머 모델
  • 시퀀스 투 시퀀스 계열 모델 중에서 ..?

 

5.1 모델 소개

(1) 셀프 어텐션(Self-Attention)

  • (중요) **문장에서 각 단어끼리 얼마나 관계가 있는지를 계산해서 반영하는 방법이다**
  • 셀프 어텐션을 이용하면 문장안에서 단어들간의 관계를 측정할 수 있다.

=> 각 단어를 기준으로 다른 단어들과의 관계값을 계산한다.

=> 각 단어들과의 관계값을 어텐션 스코어(attention score)라고 한다

=> 어텐션 스코어 값을 하나의 테이블로 만든 것을 어텐션 맵이라고 한다

  • 관계도가 큰 단어 간의 어텐션 점수(score)는 높게 나온다.

 

  1. 단어 간의 어텐션 점수와 어텐션 맵

=> 딥러닝 자연어 처리 아주 좋아요 라는 문장이 주어졌을때

=> 우선 ’딥러닝’ 이라는 단어를 기반으로 나머지 단어와의 관계를측정하여

‘딥러닝’에 대한 각 단어의 어텐션 스코어를 구한다.

 

 

=> 다음 단어인 ‘자연어’라는 단어에 대해서도 어텐션 스코어를 구한다

=> 나머지 단어들도 각각 어텐션 스코어를 구한다

=> 어텐션 스코어 값을 하나의 테이블로 어텐션 맵을 만든다

=> 어텐션 맵을 활용해 문장을 서로의 관계를 반영한 값으로 바꿔야한다

 

머신러닝 개념을 파악하고, 수학 식이 따로 있겠지 ..? 라고 생각하기 

 

  1. 문장에 대한 단어 벡터와 어텐션 맵과의 가중합 (weighted sum)

=> ‘딥러닝 자연어 처리 아주 좋아요’ 라는 문장이 모델에 적용될 때는 각 단어가 임베딩된 벡터형태로 입력된다

=> 트랜스포머 모델에서는 단어 벡터끼리 내적 연산을 함으로써 어텐션 스코어를 구한다

=> ...

 

 

  1. 이러한 방식으로 나머지 단어에 대해서도 동일하게 진행하면, 해당 문장에 대한 셀프 어텐션이 끝난다.

 

  1. 트랜스포머 모델 구현
  • 트랜스포머 모델의 경우 큰 틀은 인코더와 디코더로 구성돼 있다.
  • 입력이 인코더에 들어가면 셀프 어텐션 기법을 활용해 해당 문자의 정보를 추출하고, 이 값을 토대로 디코더에서 출력 문장을 만들어낸다.

(1) 트랜스포머 네트워크 전체 구조

 

 

구현해야할 모듈 목록

  1. 멀티 헤드 어텐션 (Multi-head attention)
  2. 서브시퀀트 마스크 어텐션 (Subsequent masked attention)
  3. 포지션-와이스 피드 포워드 네트워크 (Position-wise feed forward network)
  4. 리지듀얼 커넥션 (ADD&NORM) (Residual connection)

 

내적 어텐션 구조가 중첩된 형태이다

  1. 스케일 내적 어텐션 
  • 셀프 어텐션을 만ㄹ한다 
  • 스케일 내적 어텐션 구조

  1. 함수 코드

=> q(query), k(key), v(value)에 대한 입력값을 모두 함수의 인자를 통해 받는다.

=> 각 인자값은 모두 문장이고, 각 단어가 벡터로 되어있고, 이것들이 모여서 행렬로 된 구조이다.

=> query 행렬과 key에 대한 전치행렬과 행렬곱 연산을 수행한다면 어텐션 맵으로 만들 수 있다.

=> 리턴값으로 문맥 벡터와 어텐션 맵을 리턴한다

 

Def scaled_dot_product_attention(q, k, v, mask):

matmul_qk = tf.matmul(q, k, transpose_b = True)

 

dk = tf.cast(tf.shape(k)[-1], tf.float32)

scaled_attention_logits = matmul_qk / tf.math.sqrt(dk)

 

if mask is not None :

scaled_attention_logits += (mask * -1e9) 

 

 

예제 5, 챗봇 준비 1

File Name : workspace/step12/exam5.py

File Name : workspace/step12/preprocess.py

File Name : workspace/step12/data_in/ChatBotData_short.py

File Name : workspace/step12/data_in/vocabulary.py

 

예제 6. 챗봇, 트랜스포머 이용

  • ChatBotData.csv 파일 사용시 코랩에서 1시간 정도 걸림 (epoch =30)

File Name : workspace/step12/exam6.py

File Name : workspace/step12/transformer6.py

File Name : workspace/step12/preprocess.py