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
- 디코더의 결과로 학습을 위해 필요한 라벨인 타깃값을 만드는 전처리 함수
- dec_target_processing(..)
- 디코더 타깂값으로 종료 토큰이 들어온다
<반드시 기억하기!!>
- 1줄로 작업해야할 명령어를 여러 줄로 작업할 때
=> \ : 1줄 명령이 아직 끝나지 않음을 나타내는 기호
- 트랜스포머 모델
- 시퀀스 투 시퀀스 계열 모델 중에서 ..?
5.1 모델 소개
(1) 셀프 어텐션(Self-Attention)
- (중요) **문장에서 각 단어끼리 얼마나 관계가 있는지를 계산해서 반영하는 방법이다**
- 셀프 어텐션을 이용하면 문장안에서 단어들간의 관계를 측정할 수 있다.
=> 각 단어를 기준으로 다른 단어들과의 관계값을 계산한다.
=> 각 단어들과의 관계값을 어텐션 스코어(attention score)라고 한다
=> 어텐션 스코어 값을 하나의 테이블로 만든 것을 어텐션 맵이라고 한다
- 관계도가 큰 단어 간의 어텐션 점수(score)는 높게 나온다.
- 단어 간의 어텐션 점수와 어텐션 맵
=> 딥러닝 자연어 처리 아주 좋아요 라는 문장이 주어졌을때
=> 우선 ’딥러닝’ 이라는 단어를 기반으로 나머지 단어와의 관계를측정하여
‘딥러닝’에 대한 각 단어의 어텐션 스코어를 구한다.
=> 다음 단어인 ‘자연어’라는 단어에 대해서도 어텐션 스코어를 구한다
=> 나머지 단어들도 각각 어텐션 스코어를 구한다
=> 어텐션 스코어 값을 하나의 테이블로 어텐션 맵을 만든다
=> 어텐션 맵을 활용해 문장을 서로의 관계를 반영한 값으로 바꿔야한다
머신러닝 개념을 파악하고, 수학 식이 따로 있겠지 ..? 라고 생각하기
- 문장에 대한 단어 벡터와 어텐션 맵과의 가중합 (weighted sum)
=> ‘딥러닝 자연어 처리 아주 좋아요’ 라는 문장이 모델에 적용될 때는 각 단어가 임베딩된 벡터형태로 입력된다
=> 트랜스포머 모델에서는 단어 벡터끼리 내적 연산을 함으로써 어텐션 스코어를 구한다
=> ...
- 이러한 방식으로 나머지 단어에 대해서도 동일하게 진행하면, 해당 문장에 대한 셀프 어텐션이 끝난다.
- 트랜스포머 모델 구현
- 트랜스포머 모델의 경우 큰 틀은 인코더와 디코더로 구성돼 있다.
- 입력이 인코더에 들어가면 셀프 어텐션 기법을 활용해 해당 문자의 정보를 추출하고, 이 값을 토대로 디코더에서 출력 문장을 만들어낸다.
(1) 트랜스포머 네트워크 전체 구조
구현해야할 모듈 목록
- 멀티 헤드 어텐션 (Multi-head attention)
- 서브시퀀트 마스크 어텐션 (Subsequent masked attention)
- 포지션-와이스 피드 포워드 네트워크 (Position-wise feed forward network)
- 리지듀얼 커넥션 (ADD&NORM) (Residual connection)
내적 어텐션 구조가 중첩된 형태이다
- 스케일 내적 어텐션
- 셀프 어텐션을 만ㄹ한다
- 스케일 내적 어텐션 구조
- 함수 코드
=> 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
'자연어 처리' 카테고리의 다른 글
JinCoding 실무형 NLP Course 4강 : Transformer_23-08-19 (0) | 2023.08.19 |
---|---|
자연어처리_챗봇_23-08-16 (0) | 2023.08.16 |
자연어처리_챗봇_23-08-11 (0) | 2023.08.14 |
JinCoding 실무형 NLP Course 3강: 문서 검색 시스템 예제 (0) | 2023.08.14 |
자연어처리_챗봇_23-08-09 (2) | 2023.08.10 |