독학/[책] 딥러닝 실습

[혼공학습단 14기 혼만딥🧠] 혼자 만들면서 공부하는 딥러닝 week6

최연재 2025. 8. 13. 15:03

📝 기본 숙제

Ch.04(04-2) KerasNLP 또는 허깅페이스 BERT 모델로 영화 리뷰 감성 분석 후 결과 캡처하기

아래 내용 정리에서 확인하실 수 있습니다! 

📘 추가 숙제

Ch.04(04-2) 감성 분석에 사용된 토큰화 과정 살펴보고 입력과 출력 비교해 보기

🔍 토큰화가 일어나는 코드

prep_data = classifier.preprocessor(feature)

🔍 토큰화 입력 : 원래 문장의 앞 100글자 출력

print(feature.numpy()[:100])

 
🔍 토큰화 출력 : 토큰 ID 출력

print(len(prep_data['token_ids']), prep_data['token_ids'][:10])
prep_data['token_ids'][-10:]

 
🔍 토큰화 출력 : 토큰 ID ➡️ 토큰 (단어) 변환

tokens = []
for id in prep_data['token_ids'][:10]:
    tokens.append(bert_tokenizer.id_to_token(id))
print(tokens)

 
🔍 토큰화 출력 : 토큰 ➡️ ID 확인 (역변환)

for token in tokens:
    print(bert_tokenizer.token_to_id(token), end=' ')

 
🔍 직접 문자열 토큰화 테스트

bert_tokenizer.tokenize('"pandemonium" is a horror movie')

 

🗂️ 내용 정리

Chap04-1 트랜스포머 인코더 모델 이해하기

1. 어텐션 매커니즘

1) 어텐션
- 모델에 입력된 데이터의 모든 단어들 중에서 특정 단어와 관련이 높은 단어에 집중해 데이터를 처리하도록 설계된 기법
- 셀프 어텐션 (self attention) : 문장의 모든 단어가 서로를 참고해 각각 다른 단어와의 관련성을 파악하는 방법
- 멀티 헤드 어텐션 (multi-head attention) : 여러 개의 셀프 어텐션(헤드)을 동시에 수행해 이 관련성을 다양한 관점에서 깊이 이해할 수 있도록 확장
- 문맥 벡터(context vector) : 기계 번역에서 인코더 RNN은 먼저 입력된 문장을 처리해 최종 은닉 상태(hidden state)로 만듦
- 디코더 RNN이 인코더로부터 받은 문맥 벡터를 이용해 새로운 문장(번역된 문장)을 만듦.
 

- 긴 문장일수록 문맥 벡터만으로는 오래된 단어의 정보를 기억하기 어려움 = 그레이디언트가 타임스텝에 걸쳐 전파되며 점점 약해짐
- 인코더의 마지막 타임스텝에서 얻은 은닉 상태뿐만 아니라 인코더의 모든 은닉 상태를 디코더가 텍스트를 생성할 때마다 참고하도록 만듦. = 디코더가 모든 타임스텝에서 인코더의 은닉 상태를 참고해 문맥 벡터를 만듦.

관련 수식

- 트랜스포머 (transformer)

  • 순환 신경망에 어텐션을 추가하는 것이 아니라 어텐션만으로 만드는 인코더-디코더 모델

 
2) 셀프 어텐션
- 입력 토큰 : 모델에 입력하련느 텍스트를 잘게 나눈 단위
- 임베딩 : 신경망이 입력토큰을 처리할 수 있도록 고정 크기의 벡터로 변환
➡️ 디코더의 은닉 상태 없이 입력 토큰만으로 어텐션 점수를 계산하기 때문에 셀프 어텐션이라 함.
- 스케일드 점곱 어텐션을 사용함. 
1️⃣ 입력을 세 개의 다른 벡터로 변환

  • 쿼리, 키, 값 벡터로 만듦.
  • 쿼리 : 이 단어가 어떤 정보를 찾고 있는지 ; 계산의 기준
  • 키 : 가지고 있는 정보가 무엇인지 ; 비교의 기준
  • 값 : 이 정볼르 제공하면 어떤 결과가 나오는지 ; 실제 정보의 내용

2️⃣ 벡터 간 관계 (유사도) 및 최종 결과 계산

  • 각각의 벡터들이 얼마나 관련 있는지 계산
  • 키에 대한 점곱 수행
  • 임베딩 길이의 제곱근으로 나눠 스케일링
  • 각 단어에 계산된 중요도를 확률처럼 확인할 수 있도록 소프트맥스 함수에 통과시켜 합이 1이 되도록 어텐션 함수를 정규화
  • 마지막으로 계산된 어텐션 점수와 값 벡터를 곱함. 

 
3) 멀티 헤드 어텐션
1️⃣ 어텐션 계산 : 각각의 헤드가 독립적으로 셀프 어텐션을 수행하고, 각 헤드에서 계산된 출력을 하나로 연결
2️⃣ 최종 변환 : 하나로 연결될 멀티 헤드 어텐션의 결과를 밀집층에 통과시켜 원본 임베딩 크기로 변환

 
 

2. 위치 인코딩과 층 정규화

1) 순서 정보 더하기 - 위치 인코딩 (PE; Positional Encoding)
- 토큰과 토큰 사이의 거리르 감지하지 못함 ➡️ 단어의 순서에 대한 정보를 보완하기 위해 토큰 임베딩에 위치 인코딩 추가

 
2) 훈련 안정화하기 - 층 정규화 (layer normalization)
-  배치 단위가 아니라 각 샘플의 특성을 정규화
- 텍스트 시퀸스에 있는 토큰마다 정규화하는 것으로 자연어 처리 작업에 더욱 적합

 
 

3. 트랜스포머 인코더 모델 만들기

- 멀티 헤드 어텐션층 다음에는 과대적합을 막기 위해 훈련 단계에서 뉴런의 일부를 무작위로 비활성화하는 드룹아웃 층이 놓임
- 드롭아웃층의 출력은 어텐션의 입력과 더해져 층 정규화를 통과함
- 위치별 피드 포워드 네트워크 또는 피드 포워드 네트워크

  • 첫 번째 밀집층 : 입력 벡터의 차원을 확장, 렐루 활성화 함수 사용
  • 두 번째 밀집층 : 다시 원래의 임베딩 차원으로 축소, 활성화 함수 미사용

- 스킵 연결 직전에 토과하는 드롭아웃층은 잔차 드롭아웃이라고 함.
- 원본 트랜스포머 모델은 어텐션층에서 소프트맥스 함수의 출력에도 드롭아웃을 적용 ; 어텐션 드롭아웃

 

Chap04-2 전이 학습으로 영화 리뷰 텍스트의 감정 분류하기

1. 트랜스포머 인코더 기반 언어 이해 모델 - BERT

- BERT : 트랜스포머 인코더 기반의 대규모 언어 모델 (LLM)
- 훈련

  • 마스크드 언어 모델링(MLM) : 입력 데이터의 일부 토큰을 가린(마스킹) 다음, 모델이 가려진 단어를 예측
  • 다음 문장 예측(NSP) : 두 문장이 제시됐을 때 두 번째 문장이 첫 번째 문장에 이어지는 다음 문장인지를 예측

- 백본(backbone) : 학습된 출력 벡터를 기반으로 수행되는 별도의 분류기
 

 
- KerasNLP

 

2. KerasNLP로 영화 리뷰 텍스트의 감성 분류하기

(1) KerasNLP로 BERT 모델 로드하기

 
(2) BERT 모델 미세튜닝하기

 
(3) 텍스트 전처리하기 - BERT 토크나이저
- 토큰화 : 언어 모델이 텍스트 문자열을 모델이 처리할 수 있는 작은 부분(토큰)으로 분리하는 과정
- 어휘사전 : 고유한 토큰의 집합
- 토크나이저 : 토큰화를 수행하는 방법 또는 객체 
- BERT 토크나이저는 워드피스 토큰화를 사용

 

3. 허깅페이스로 영화 리뷰 텍스트의 감성 분류하기

1) 네이버 영화 리뷰 데이터셋 준비하기

여기에서 에러가 났었는데 !pip install -U datasets 해주고 나니까 잘 됐습니다!

 
2) 백본 모델 선택하기

 
3) 입력 데이터 토큰화하기

 
4) BERT 모델 미세 튜닝하기

 

4. 미세 튜닝된 모델로 감성 분석하기

 

Chap04-3 BERT 후속 모델로 영화 리뷰 텍스트의 감성 분류하기

1. BERT의 성능 개선 모델 - RoBERTa

1) RoBERTa
- BERT의 사전 훈련 방식을 재구성해 더 많은 데이터를 활용하고, 훈련 설정을 최적화함으로써 성능을 크게 개선
- 사전 훈련 방식에서 다음 문장 예측(NSP) 작업을 제거하고, 마스크드 언어 모델링만 사용하여 모델을 훈련
- BERT의 워드피스 토크나이저 대신, 바이트 수준의 바이트 페어 인코딩(BPE) 토크나이저를 사용
 

 
2) KerasNLP로 RoBERTa 모델 만들기

 
3) RoBERTa 모델 미세 튜닝하기

 
 

2. BERT의 경량화 모델 - DistilBERT

1) DistilBERT
- BERT의 경량화 모델
- 지식정제 (knowledge distillation) : 더 큰 모델인 티처 모델이 학습한 지식을 더 작은 모델인 스튜던트 모델에 전달
- 마스크드 언어 모델링 작업에서 스튜던트의 출력이 티처의 출력에 가까워지도록 스튜던트를 훈련하는 것이 지식 정제의 핵심
- 정제 손실 : 두 모델의 출력 차이로 인한 손실
 
2) 티처 모델 이해하기 - MLM을 위한 BERT

 
3) 정제 손실 이해하기
- 티처와 스튜던트 모델의 출력 값을 소프트맥스 함수에 통과시켜 확률분포로 변환한 뒤에 비교 ➡️ 쿨백-라이블러 발산(KLD) 손실

teacher_pred = softmax(teacher_output)
student_pred = softmax(student_output)
KLD_loss = teacher_pred * log(teacher_pred / student_pred) 

 
4) 스튜던트 모델 DistilBERT 사용하기


5) DistilBERT로 IMDB 영화 데이터 리뷰 텍스트의 감성 분류하기

 

3. KerasNLP로 DistilBERT 모델 만들기

 

💭 느낀 점

후반부라 그런지 지금까지 혼공학습단 스터디하면서 가장 많은 공부 시간을 들인 주차였습니다.. 이렇게 6주 활동이 끝났는데 수고 많으셨습니다!