| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 혼공분석
- CC2023
- 후기
- 제이펍
- 애프터이펙트
- 혼공JS
- 바이브코딩
- 혼공자
- 혼공C
- CS2023
- 챌린지
- 3주차후기
- 혼공
- 혼공바
- 회고
- 맛있는디자인
- 스터디
- 혼만딥
- 프리미어프로
- 혼공단
- Doit파이썬스터디
- 맛있는디자인스터디12기
- 전면개정2판
- 혼공학습단
- 맛있는디자인스터디13기
- 6주차후기
- 진짜쓰는일러스트레이터
- 혼공파
- Doit점프투파이썬
- 혼공머신
- Today
- Total
애독자's 공부방
[혼만딥] 6주차 _ 혼자 만들면서 공부하는 딥러닝 본문
혼공단 - 혼만딥, 혼자 만들면서 공부하는 딥러닝
■ 시작에 앞서..
기존에 못 다녀온 국립중앙박물관을 지난주에 다녀왔습니다. 원하던 '까치호랑이 배지'는 못 얻었지만, 귀여운 '반가사유상'과 ‘작호도’ 마그넷을 득템 했습니다. 아이들이 군데군데 세워진 반가사유상 인형을 보고, 너무 귀엽다고 해서 '사유의 방'도 가봤고, 원래 들리려 했던 어린이박물관도 좋아해 줘서 다행입니다. 하지만 다시 방문하려고 해도 예약이 마감되어서 이제는 못 갈 것 같고, 이후에는 국중박의 나머지 전시장을 둘러보려고 합니다!

■ 공부한 내용
| # | 진도 | 기본 숙제(필수) | 추가 숙제(선택) |
| 6주차 (8/11 ~ 8/17) |
Chapter 04 | Ch.04(04-2) KerasNLP 또는 허깅페이스 BERT 모델로 영화 리뷰 감성 분석 후 결과 캡처하기 | Ch.04(04-2) 감성 분석에 사용된 토큰화 과정 살펴보고 입력과 출력 비교해 보기 |

□ Chapter 04. 트랜스포머 인코더 모델로 텍스트 감성 분류하기
▷ 04-1. 트랜스포머 인코더 모델 이해하기
1. 어텐션 메커니즘(attention mechanism): 인코더-디코더 모델 구조에서 디코더가 텍스트를 생성할 때 어떤 입력에 주의를 기울일지를 결정하기 위해 고안된 알고리즘
- 순환 신경망으로 구성된 인코더-디코더 모델에 어텐션 메커니즘을 사용하면 번역 작업의 성능이 향상
- 인코더(encoder): 데이터를 이해하는 단계
- 디코더(decoder): 인코더가 이해한 내용을 바탕으로 결과를 생성하는 단계
2. 트랜스포머(transformer): 어텐션 메커니즘의 아이디어를 확장하여 인코더와 디코더에서 순환 신경망을 빼고 어텐션과 피드 포워드 신경망으로 구성한 모델
- 어텐션을 인코더의 문맥 백터에 대해 계산하는 것이 아니라 입력 토큰 사이의 어텐션을 계산하기 때문에, 특별히 셀프 어텐션이라고 지칭
- 트랜스포머 구조는 텍스트 처리 분야에서 높은 성능을 내기 때문에 순환 신경망을 완전히 대체
3. 멀티 헤드 어텐션(multi-head attention): 여러 개의 셀프 어텐션(헤드)을 병렬로 처리. 셀프 어텐션이 문맥에서 중요한 토큰을 감지한다면 멀티 헤드 어텐션층은 다양한 헤드를 통해 더 폭넓게 문맥을 이해하는 데 도움
- 트랜스포머 기반 대규모 언어 모델이 발전하면서 다양한 종류의 멀티 헤드 어텐션이 개발중
- 케라스는 이를 위한 MultiHeadAttention 클래스를 제공
4. 위치 인코딩: 트랜스포머 모델이 입력 데이터의 순서를 고려하지 못한다는 단점을 보완하기 위한 장치
- 입력 토큰의 임베딩에 위치 인코딩을 더함으로써 같은 토큰이더라도 시퀀스에 등장하는 위치에 따라 임베딩이 달라짐.
- 원본 트랜스포머는 삼각 함수를 사용해 위치 인코딩을 만들었지만, 최근에는 토큰의 임베딩을 만드는 것처럼 위치 정수를 임베딩층에 통과시켜 위치 임베딩을 만드는 방법을 많이 사용
▷ 04-2. 전이 학습으로 영화 리뷰 텍스트의 감성 분류하기
1. BERT(Bidirectional Encoder Representations from Transformers): 대표적인 트랜스포머 인코더 모델로, 영문 위키피디아와 북코퍼스 데이터셋에서 훈련됨. 여러 개의 트랜스포머 인코더 블록을 쌓고, 분류 작업이나 마스크드 언어 모델링 작업을 위한 헤드를 그 위에 놓는 것이 기본 구조
- BERT는 워드피스 토크나이저를 사용하여 입력 텍스트를 토큰으로 변환
- 워드피스(WordPiece) 토크나이저: 단어를 더 작은 단위(부분단위)의 단어로 분리하는 부분단어 토큰화(subword tokenization) 방법 중 하나로, 기존에 있던 바이트 페어 인코딩(BPE)의 변
2. 토크나이저(tokenizer): 모델에 입력되는 텍스트를 토큰으로 분할하는 일종의 전처리 알고리즘으로, 훈련되는 가중치가 없음. 일반적으로 한 단어는 하나 이상의 토큰으로 분할되며, 토크나이저에 따라 토큰을 구성하는 방식이 다름. 사전 훈련된 모델을 사용할 떄는 그 모델이 훈련에 사용한 토큰화와 동일한 방식으로 입력 텍스트를 분할해야 함
- 토큰화(tokenization): 언어 모델이 텍스트 문자열을 모델이 처리할 수 있는 작은 부분인 토큰(token)으로 분리하는 과정
3. KerasNLP: 케라스 기반의 자연어 처리 라이브러리로 사전 훈련된 모델은 물론, 밑바닥부터 모델을 구성하기 위해 필요한 구성 요소를 제공
- KerasNLP는 케라스 버전3을 사용하며, 대규모 언어 모델의 성장 속도에 발맞춰 빠르게 발전중
4. transformers: 허깅페이스에서 제공하는 딥러닝 기반의 자연어 처리 라이브러리.
- 저수준 딥러닝 라이브러리인 파이토치와 텐서플로를 모두 지원하며, 허깅페이스에서 공유되는 수많은 사전 훈련된 트랜스포머 모델을 쉽게 사용할 수 있는 인터페이스를 제공
- 트랜스포머 모델을 활용하려면 꼭 익혀야하는 라이브러리
▷ 04-3. BERT 후속 모델로 영화 리뷰 텍스트의 감성 분류하기
1. RoBERTa(A Robustly Optimized BERT Pretraining Approach): BERT를 기반으로 훈련 데이터와 어휘사전을 증가시키고, BPE 토크나이저를 사용한 트랜스포머 인코더 모델
- RoBERTa는 훈련을 위해 BERT의 다음 문장 예측 작업을 사용하지 않고, 마스크드 언어 모델링만 사용
2. DistilBERT(A Distilled Version of BERT): 티처와 스튜던트 모델로 구성된 지식 정제 기법을 사용하여 훈련한 모델
- 티처 모델로는 BERT를 사용하고, 스튜던트 모델은 인코더 블록의 개수를 줄인 트랜스포머 기반 모델로, 티처 모델의 출력과 같아지도록 훈련된 스튜던트 모델이 DistilBERT에 해당
■ 기본 숙제
▷ Ch.04(04-2) KerasNLP 또는 허깅페이스 BERT 모델로 영화 리뷰 감성 분석 후 결과 캡처하기
- 책에 있는 내용을 따라서 진행하다가 다음과 같은 오류가 발생했습니다. 아마도 원격 스크립트를 직접 실행(trust_remote_code=True)할 수 있었던 허깅페이스의 정책이 보안 강화를 위해 바뀌었기 때문인 것 같습니다.
from datasets import load_dataset
nsmc = load_dataset("nsmc", trust_remote_code=True)
| `trust_remote_code` is not supported anymore. Please check that the Hugging Face dataset 'nsmc' isn't based on a loading script and remove `trust_remote_code`. If the dataset is based on a loading script, please ask the dataset author to remove it and convert it to a standard format like Parquet. ERROR:datasets.load:`trust_remote_code` is not supported anymore. Please check that the Hugging Face dataset 'nsmc' isn't based on a loading script and remove `trust_remote_code`. If the dataset is based on a loading script, please ask the dataset author to remove it and convert it to a standard format like Parquet. /usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: The secret `HF_TOKEN` does not exist in your Colab secrets. To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session. You will be able to reuse this secret in all of your notebooks. Please note that authentication is recommended but still optional to access public models or datasets. ... RuntimeError: Dataset scripts are no longer supported, but found nsmc.py |
- 그래서 혼만딥 코드 저장소(Github)를 확인해 보니, 해당 코드가 1주일 전에 변경된 것을 확인했습니다. 살펴보니 원격 스크립트를 실행하던 nsmc 대신에, Parquet이라는 표준 파일 형식을 사용하는 Blpeng/nsmc와 같은 다른 저장소를 사용하게 된 것 같고, 기존 스크립트에 포함되어 있었을 것으로 생각되는 전처리 과정(불필요한 열 및 결측치 삭제)도 별도로 추가되어 있었습니다.
- 요약하자면, 신규 코드에서는 허깅페이스 라이브러리의 최신 정책에 맞춰 데이터셋을 불러오는 방식이 원격 스크립트 실행에서 표준 파일 형식 로딩으로 바뀌었고, 전처리까지 추가되었습니다.
영화 리뷰 감성 분석과 토큰화 과정이 통합된 코드는 본문 맨 아래에 추가하였습니다.
1) KerasNLP 모델을 사용한 분석
- 모델 구축: keras_nlp.models.BertClassifier.from_preset("bert_tiny_en_uncased", num_classes=2)를 사용하여 사전 학습된 BERT 모델인 bert_tiny_en_uncased를 기반으로 한 분류기 모델을 생성합니다. 이 모델은 2개의 클래스(긍정/부정)를 예측하도록 설정되었습니다.
- 모델 학습: classifier.fit(train_ds, validation_data=val_ds, epochs=5) 코드를 통해 IMDB 영화 리뷰 데이터셋으로 모델을 5 에포크 동안 학습시킵니다.
- 결과 표시: classifier.predict([feature]) 코드를 통해 특정 샘플에 대한 모델의 예측 결과를 확인합니다.
- 모델 평가: classifier.evaluate(test_ds)를 통해 테스트 데이터셋으로 모델의 성능(손실, 정확도)을 평가합니다.

2) Hugging Face pipeline을 사용한 분석
- 모델 구축 및 로딩: transformers 라이브러리의 pipeline 함수를 사용하여 WhitePeak/bert-base-cased-Korean-sentiment 모델을 불러옵니다. 이 모델은 한국어 감성 분석에 맞게 미세 튜닝된 모델입니다.
- 결과 표시: pipe('아 더빙.. 진짜 짜증나네요 목소리') 코드를 통해 직접 작성한 한국어 리뷰 문장을 모델에 입력하여 감성 분석 결과를 출력합니다.

■ 추가 숙제(선택)
▷ Ch.04(04-2) 감성 분석에 사용된 토큰화 과정 살펴보고 입력과 출력 비교해 보기
- 통합된 코드 중간을 보면 토큰화 과정이 포함되어 있습니다. 사람은 문장 전체를 읽고 의미를 이해하지만, 컴퓨터는 문장을 단어 단위로 쪼개고 이를 숫자로 변환해야만 이해할 수 있기에 이 작업이 필요합니다.
- 토크나이저(Tokenizer): 문장을 단어, 부분 단어(subword), 또는 글자 단위의 작은 조각인 토큰(token)으로 분리하는 역할을 하는 도구입니다.
- 예를 들어, "Pandemonium is a horror movie"라는 문장이 있으면, 토크나이저는 이 문장을 ['pandemonium', 'is', 'a', 'horror', 'movie']와 같은 토큰들로 쪼갭니다.
- BERT와 같은 최신 모델들은 흔히 사용되는 토큰화 방식 외에도, [CLS]와 같은 특수 토큰을 추가하고, 모든 토큰을 고유한 정수 ID로 변환하는 작업을 수행합니다.
- 토큰화(Tokenization)토크나이저를 사용해 텍스트를 토큰으로 분리하고, 이를 모델이 이해할 수 있는 정수 ID로 변환하는 과정 전체를 의미합니다.
-
- 이 과정을 거쳐야만 모델이 텍스트 데이터를 행렬 연산에 사용할 수 있는 숫자 형태로 받아들일 수 있게 됩니다.
1) KerasNLP 모델의 토큰화
- 토큰화 과정: prep_data = classifier.preprocessor(feature) 코드를 통해 feature (영화 리뷰 텍스트)가 모델의 전처리기(preprocessor)를 거쳐 token_ids와 같은 딕셔너리 형태로 변환됩니다.
- 입력과 출력 비교: print(len(prep_data['token_ids']), prep_data['token_ids'][:10]) 코드는 토큰화의 결과물인 '정수 ID 리스트(token_ids)'의 길이와 앞부분 10개를 출력합니다. bert_tokenizer.detokenize(prep_data['token_ids'][:10]) 코드는 토큰 ID를 다시 텍스트로 변환하여 토큰화 전후를 비교할 수 있게 합니다.

2) Hugging Face 모델의 토큰화:
- 토크나이저 로드: bert_kor_tokenizer = AutoTokenizer.from_pretrained('bongsoo/bert-small-kor-v1') 코드로 bert-small-kor-v1 모델에 맞는 토크나이저를 불러옵니다.
- 토큰화 과정: prep_data = bert_kor_tokenizer(nsmc['train'][0]['document']) 코드를 통해 한국어 리뷰 텍스트를 토크나이저에 입력하면, input_ids와 같은 정수 ID 형태의 딕셔너리로 변환됩니다.
- 입력과 출력 비교: bert_kor_tokenizer.convert_ids_to_tokens(prep_data['input_ids']) 코드는 input_ids를 다시 토큰 문자열로 변환하여 출력합니다. bert_kor_tokenizer.convert_tokens_to_string(tokens) 코드는 토큰 리스트를 다시 하나의 문장으로 변환하여 토큰화 전후를 비교할 수 있습니다.

■ 통합 코드
'머신러닝+딥러닝 > 혼공학습단 14기' 카테고리의 다른 글
| 혼공학습단 14기 활동 회고: 6주간의 성장과 미래 혼공단 양성 (6) | 2025.08.14 |
|---|---|
| [혼만딥] 5주차 _ 혼자 만들면서 공부하는 딥러닝 (6) | 2025.08.04 |
| [혼만딥] 4주차 _ 혼자 만들면서 공부하는 딥러닝 (1) | 2025.07.22 |
| [혼만딥] 3주차 _ 혼자 만들면서 공부하는 딥러닝 (0) | 2025.07.19 |
| [혼만딥] 2주차 _ 혼자 만들면서 공부하는 딥러닝 (1) | 2025.07.07 |