-
혼공머신 Ch 10 언어 모델을 위한 신경망Study/머신러닝 딥러닝 2025. 10. 2. 14:44

목차
- 들어가며: 혁신적인 언어 모델, 트랜스포머와 LLM
- 트랜스포머의 근간: 어텐션 메커니즘과 아키텍처
2-1. 순환 신경망(RNN)의 한계와 인코더-디코더 구조
2-2. 어텐션 메커니즘의 등장
2-3. 트랜스포머의 핵심: 셀프 어텐션과 아키텍처 구성 요소 - 실전 활용: KoBART를 이용한 텍스트 요약
3-1. 허깅페이스 pipeline으로 KoBART 모델 로드
3-2. 한국어 텍스트 토큰화(Tokenization)의 이해 - LLM 텍스트 생성과 디코딩 전략
4-1. EXAONE-3.5를 활용한 챗봇 답변 생성 예시
4-2. LLM 응답의 다양성을 조절하는 디코딩 전략 (Temperature)
4-3. Top-K 및 Top-P(Nucleus) 샘플링 - 마치며: 언어 모델을 자유자재로 다루기
1. 들어가며: 혁신적인 언어 모델, 트랜스포머와 LLM
이번 포스팅에서는 자연어 처리(NLP) 분야에 혁명을 가져온 트랜스포머(Transformer) 아키텍처의 기본 원리부터 시작하여,
이를 기반으로 하는 대규모 언어 모델(LLM)을 활용해 실제로 텍스트를 요약하고 생성하는 방법까지 심도 있게 다룹니다.
트랜스포머는 현재 ChatGPT와 같은 모든 LLM의 근간을 이루는 기술입니다. 특히 허깅페이스(Hugging Face) 라이브러리를 통해 KoBART와 EXAONE 같은 한국어 특화 모델을 다루는 실습 코드를 통해 이론과 실제 활용 능력을 함께 키워보겠습니다.
2. 트랜스포머의 근간: 어텐션 메커니즘과 아키텍처
2-1. 순환 신경망(RNN)의 한계와 인코더-디코더 구조
번역이나 요약과 같은 작업을 위해 사용되는 인코더-디코더(Encoder-Decoder) 신경망은 과거 순환 신경망(RNN)을 사용했습니다. 이 모델은 입력 시퀀스(문장)의 모든 정보를 인코더의 마지막 은닉 상태에 압축하여 디코더로 전달했습니다. 하지만 이 방식은 텍스트가 길어질 경우 정보 손실이 발생하여 성능에 한계가 있었습니다.
2-2. 어텐션 메커니즘의 등장
어텐션 메커니즘(Attention Mechanism)은 인코더의 모든 타임스텝에 있는 은닉 상태를 디코더가 참조하도록 허용함으로써 이 문제를 해결했습니다. 디코더는 단순히 참조하는 것이 아니라, 각 은닉 상태에 어텐션 가중치를 곱해 적절히 배합하여 맥락에 맞는 정보를 선택적으로 활용했습니다.
2-3. 트랜스포머의 핵심: 셀프 어텐션과 아키텍처 구성 요소




2017년에 발표된 트랜스포머는 RNN을 완전히 제거하고 어텐션 구조만 사용하여 현재 LLM 기술의 근간을 이루고 있습니다.
- 동시 처리: 트랜스포머의 인코더는 입력 텍스트를 한꺼번에 동시에 전달받아 처리하여 속도가 빠릅니다.
- 셀프 어텐션 (Self-Attention): 입력 데이터 자체에서 어떤 토큰이 현재 가장 중요하게 살펴봐야 하는지를 스스로 결정하는 메커니즘입니다.
- 멀티헤드 어텐션 (Multi-Head Attention): 어텐션 계산 블록을 여러 개 사용하여 다양한 패턴과 관계를 동시에 추출합니다.
- 잔차 연결 (Residual Connection): 층을 건너뛰어 입력값을 출력에 더해주는 방식으로, 모델을 깊게 쌓을 때(많은 층을 쌓을 때) 안정적인 훈련을 가능하게 합니다.
3. 실전 활용: KoBART를 이용한 텍스트 요약
3-1. 허깅페이스 pipeline으로 KoBART 모델 로드
허깅페이스(Hugging Face)의 transformers 라이브러리는 pipeline을 통해 복잡한 과정을 추상화하고 모델을 쉽게 로드하여 사용할 수 있게 합니다. 한국어 텍스트 요약에 특화된 KoBART 모델을 로드하는 코드입니다.
from transformers import pipeline # KoBART 요약 모델 로드 (KoBART는 한국어에 특화된 BART 모델입니다.) kobart = pipeline(task='summarization', model='EbanLee/kobart-summary-v3', device=0) ko_text = "하나, ‘입문자 맞춤형 7단계 구성’을 따라가며 체계적으로 반복하는 탄탄한 학습 설계! 이 책은 데이터 분석의 핵심 내용을 7단계에 걸쳐 반복 학습하면서 자연스럽게 머릿속에 기억되도록 구성했습니다..." # 요약 실행 kobart(ko_text) # 결과: [{'summary_text': '이 책은 데이터 분석의 핵심 내용을 7단계에 걸쳐 반복 학습하면서 머릿속에 기억되도록 구성했습니다. ...'}]3-2. 한국어 텍스트 토큰화(Tokenization)의 이해
언어 모델은 텍스트를 처리하기 위해 이를 작은 단위인 토큰으로 분리하고 정수 ID로 변환합니다.
# 토큰 분리 예시 tokens = kobart.tokenizer.tokenize('혼자 만들면서 배우는 딥러닝') print(tokens) # [' 혼자', ' 만들', '면서', ' 배우는', ' ', '딥', '러', '닝'] # 토큰을 ID로 변환 token_ids = kobart.tokenizer.convert_tokens_to_ids(tokens) print(token_ids) # [16814, 14397, 14125, 25429, 1700, 10021, 10277, 9747] # 문장 전체를 인코딩하면 시작/끝 토큰이 자동으로 추가됨 token_ids_encoded = kobart.tokenizer.encode('혼자 만들면서 배우는 딥러닝') print(token_ids_encoded) # [0, 16814, 14397, 14125, 25429, 1700, 10021, 10277, 9747, 1] # ID를 다시 텍스트로 복원 text_decoded = kobart.tokenizer.decode(token_ids_encoded) print(text_decoded) # '<s> 혼자 만들면서 배우는 딥러닝</s>'
4. LLM 텍스트 생성과 디코딩 전략
4-1. EXAONE-3.5를 활용한 챗봇 답변 생성 예시
대규모 언어 모델(LLM)인 LG AI연구원의 EXAONE-3.5 모델을 사용하여 쇼핑몰 Q&A 챗봇 역할을 수행하도록 지시하고 답변을 생성하는 코드입니다.
from transformers import pipeline, AutoTokenizer # 모델과 토크나이저 로드 (GPU 사용) exaone_tokenizer = AutoTokenizer.from_pretrained("LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct") pipe = pipeline(task="text-generation", model="LGAI-EXAONE/EXAONE-3.5-2.4B-Instruct", tokenizer=exaone_tokenizer, device=0, trust_remote_code=True) # 시스템 메시지를 통해 챗봇의 역할 정의 messages = [ {"role": "system", "content": "너는 쇼핑몰 홈페이지에 올라온 질문에 대답하는 Q&A 챗봇이야. 확정적인 답변을 하지 말고 제품 담당자가 정확한 답변을 하기 위해 시간이 필요하다는 간단하고 친절한 답변을 생성해줘."}, {"role": "user", "content": "이 다이어리에 내년도 공휴일이 표시되어 있나요?"} ] pipe(messages, max_new_tokens=200, return_full_text=False) # 출력 (예시): [{'generated_text': '안녕하세요! 다이어리에 대한 질문 감사합니다. 정확한 정보를 드리기 위해서는 제품 담당자님께서 확인이 필요합니다...'}]4-2. LLM 응답의 다양성을 조절하는 디코딩 전략 (Temperature)
temperature 매개변수는 다음 토큰을 선택하는 확률 분포의 모양을 조절하여 LLM의 생성 결과를 제어하는 핵심 요소입니다.
- 높은 Temperature (예: 10.0): 확률 분포를 평탄하게 만들어 낮은 확률의 토큰도 선택될 가능성이 커지며, 결과적으로 다양하고 창의적이지만 일관성이 떨어지거나 의미 없는 문장이 생성될 수 있습니다.
- 낮은 Temperature (예: 0.001): 가장 높은 확률의 토큰을 선택할 가능성이 커져 결정적이고 안정적이지만, 결과가 반복적이거나 단조로울 수 있습니다.
# 낮은 Temperature (0.001)로 안정적인 답변 생성 output = pipe(messages, max_new_tokens=200, return_full_text=False, do_sample=True, temperature=0.001) # 출력은 매우 안정적이고 일관된 답변이 나옵니다.4-3. Top-K 및 Top-P(Nucleus) 샘플링
do_sample=True일 때, temperature와 함께 사용하여 텍스트 생성의 품질과 다양성을 높이는 기법입니다.
- Top-K Sampling: 각 스텝에서 확률이 가장 높은 상위 개의 토큰 중에서만 샘플링하여, 극히 희귀한 토큰이 선택되는 것을 방지합니다.
- Top-P Sampling (Nucleus Sampling): 확률이 높은 토큰부터 누적 확률이 값이 될 때까지의 토큰 집합(Nucleus) 내에서만 샘플링합니다. 이 방법은 다음 토큰이 가질 수 있는 경우의 수를 동적으로 조절하여 보다 자연스럽고 유창한 텍스트를 생성하는 데 효과적입니다.
# Top-P Sampling (누적 확률 0.9)을 적용하여 자연스러운 답변 생성 output = pipe(messages, max_new_tokens=200, return_full_text=False, do_sample=True, top_p=0.9) # 출력: '안녕하세요! 다이어리에 내년도 공휴일 정보가 포함되어 있는지 확인하는 건 좋은 질문이에요. 현재 바로 답변 드리기는 어렵지만...'
5. 마치며: 언어 모델을 자유자재로 다루기
지금까지 트랜스포머의 근간부터 KoBART 요약, 그리고 EXAONE 및 GPT-4o를 활용한 텍스트 생성과 디코딩 전략까지 알아보았습니다. LLM의 생성 결과를 단순히 받아들이는 것이 아니라, temperature, top_k, top_p와 같은 디코딩 전략을 통해 원하는 방향으로 제어하는 능력은 실무에서 매우 중요합니다. 오늘 학습한 내용을 바탕으로 직접 다양한 언어 모델을 다루어보며 AI 시대를 이끌어갈 실력을 다지시길 바랍니다.
코드 출처:
https://github.com/rickiepark/hg-mldl2/blob/main/10-2.ipynb
hg-mldl2/10-2.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
https://github.com/rickiepark/hg-mldl2/blob/main/10-3.ipynb
hg-mldl2/10-3.ipynb at main · rickiepark/hg-mldl2
<혼자 공부하는 머신러닝+딥러닝(개정판)>(한빛미디어, 2025)의 코드 저장소입니다. Contribute to rickiepark/hg-mldl2 development by creating an account on GitHub.
github.com
내용 및 이미지 출처:
https://www.youtube.com/watch?v=0iYxsB6KCRk&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=27
https://www.youtube.com/watch?v=WJQAXLLvVpU&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=28
https://www.youtube.com/watch?v=tTacED-uDN0&list=PLVsNizTWUw7E2RxZ4aspcR9vNamXccmFE&index=29
'Study > 머신러닝 딥러닝' 카테고리의 다른 글
혼공머신 CH 09 텍스트를 위한 인공 신경망 (0) 2025.09.29 혼공머신 CH 08 합성곱 신경망 (CNN) (0) 2025.09.28 혼공머신 CH 07 딥러닝의 시작: 인공신경망 (0) 2025.09.27 혼공머신 CH 06 비지도 학습 (0) 2025.09.26 혼공머신 CH 05 트리 알고리즘 (0) 2025.09.25