오늘의 시작은 어제 정리한 LSTM모델의 정확도를 늘리는 방법에 대하여 알아보았습니다.

 

정확도를 높이기 위해서 수정한 코드를 작동했는데 시간이 너무 오래걸렸습니다. (대략 5시간 정도).

 

정확도는 크게 개선 되지 않았습니다.

 

지금 현재로는 편향 되어있는 데이터셋을 사용해서 정확도의 개선이 안된 것이라 생각하고있습니다.

 

모델학습을 기다리면서 오늘 새롭게 배부 된 AI활용 강의를 2주차까지 들었습니다.

 

강의를 들으며 코드를 작성하다 패키지들에 오류가 생겨서 또 시간이 많이 들어가게 되었지만

 

새로운 가상환경을 만들어 해결했고 가상환경에 대한 복습이 되는 시간이였습니다.

 

API를 활용하고 오픈소스를 활용하는 부분은 알것같으면서도 모르겟습니다. 

 

정확히 어떻게 써야하고 무엇을 조심해야하는지 누가 옆에서 상상하고있는 것을 말한듯한? 그런느낌입니다.

 

강의를 따라가며 익숙해져야 할 것 같습니다.


☑️ 도전 과제

LSTM 모델 성능 개선

 

우선 LSTM모델의 성능이 아래와 같이 나왔다.

Epoch 1, Validation Accuracy: 0.62
Epoch 2, Validation Accuracy: 0.64
Epoch 3, Validation Accuracy: 0.64
Epoch 4, Validation Accuracy: 0.65
Epoch 5, Validation Accuracy: 0.64
Epoch 6, Validation Accuracy: 0.64
Epoch 7, Validation Accuracy: 0.63
Epoch 8, Validation Accuracy: 0.63
Epoch 9, Validation Accuracy: 0.62
Epoch 10, Validation Accuracy: 0.61

 

해석을 하면

Epoch 1에서 정확도가 0.62에서 Epoch 4까지 0.65까지 증가하였지만 이후 조금씩 떨어지다 마지막엔 Epoch 1보다 더 떨어지는 정확도를 보여주었다.

 

이럴 때는 과적합과 학습 후반부의 이상 검증 성능을 개선하지 못하고있다는 의심을 할 수 있다.

 

과적합이란 모델이 학습 데이터에 너무 적합하게 훈련되어 새로운 데이터(검증 데이터)에 대한 성능이 떨어지는 현상이다.

 

정확도 개선

이때 개선 방법으로는 학습률, 모델구조 변경, 규제기법 적용이 필요하다.

구두점 제거 전처리 과정을 모델코드의 앞부분에 넣고

embed_dim의 수치를 64 -> 100으로 증가

hidden_dim의 수치를 128에서 256으로 증가

학습률을 조정할 스케줄러 추가
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)

LSTM모델 정의부분에 num_layers=2 추가.

self.dropout = nn.Dropout(0.5) 드롭아웃을 설정

옵티마지어 설정 매개변수로 weight_decay=0.0001로 설청 추가했습니다.

 

또한 이렇게 진행했을 때 학습속도가 너무 느려 학습속도를 개선해주는 방법을 알아 보았다.

 

학습속도 개선

자연어 처리(NLP)작업에서 사건 순서에 따라 데이터를 처리하기 때문에 특히 길이가 긴 텍스트나 대용량 데이터셋을 다룰 때 학습 속도가 느려진다.

이를 개선하기 위해 

batch_size를 늘려 한번에 처리되는 데이터양을 늘려주고

hidden_dim을 줄여 모데 파라미터 수를 줄여주어야하고

양방향 LSTM( Bidirectional )을 제거

이미 들어가있던 작업으로는 2가지가 더 있다.

GPU 사용: GPU가 설정되어 있다면 모델과 데이터를 cuda()를 통해 GPU로 이동시켜 처리 속도를 높일 수 있습니다.
속도가 빠른 옵티마이저 사용: Adam이나 AdaGrad 같은 최적화 알고리즘은 SGD보다 수렴 속도가 빠를 수 있습니다.

 

 

 

정확도 개선을 위해 추가한 작업들의 설명을 적어 보겟습니다.

 

  • embed_dim의 수치를 64 -> 100으로 증가

임베딩 차원이 커지면 단어의 표현력이 높아져, 단어 간의 관계를 더 잘 포착할 수 있다.

 

  • hidden_dim의 수치를 128에서 256으로 증가

히든 차원이 커지면 더 많은 정보를 저장할 수 있어 긴 문맥을 덩 잘 학습할 수 있다.

 

  • 학습률을 조정할 스케줄러 추가
    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)

이 코드를 추가하면 학습률이 step_size마다 gamma 비율로 감소해 학습 중에 ㅊ히적화가 가능하다.

 

  • LSTM모델 정의부분에 num_layers=2 추가.

LSTM을 2개 이상으로 쌓아 더 깊은 모델을 구성해 볼 수 있다.

 

  • bidirectional=True를 설정하면, 양방향 LSTM을 적용

텍스트를 앞에서 읽을 뿐만 아니라 뒤에서 읽을 수도 있게 하여 문맥 이해에 도움

 

  • self.dropout = nn.Dropout(0.5) 드롭아웃을 설정

드롭아웃을 활용하여 오버피팅을 방지할 수 있다.

 

  • 옵티마지어 설정 매개변수로 weight_decay=0.0001로 설청 추가

옵티마이저에 weight_decay를 설정해 가중치 감소 기법을 적용해 과적합을 방지할 수 있다.

 


☑️ AI모델 활용 1주차

 1-1  API란?

  • 프로그램끼리 통신하는 인터페이스이다.
  • 예시: 구글(비젼API), 챗GPT, 일레븐 랩스

사전학습 모델: 많은 데이터로 미리 학습된 AI모델

  • 학습과정을 생략하고 바로 예측이나 분류가 가능
  • 모델 단위로 제공 되어서 모델결합에 좋다.
  • 안정성이 좋다.

 

AI에 대한 개념을 알아야 한다!

  • AI가 어떤 방식으로 작동하는지 알면 문제해결에 필요한 도구나 모델을 선택하는데 좋다.
  • AI의 한계를 인지하고 인식해야지 현실적인 기대를 설정하고 행동할 수 있다.
  • AI가 제공하는 결과를 이해하고 의미를 파악할 수 있어야 잘 활용할 수 있다.

1-2 패키지 관리
패키지란?
패키지는 여러 모듈들을 묶어놓은 하나의 디렉토리입니다. 파이썬에서는 다양한 기능을 제공하는 패키지들이 있어서, 개발자가 직접 모든 기능을 구현하지 않아도 됩니다.
ex) pandas, numpym, pytorch 등

주의! 같은 패키지라도 버젼에 따라 기능이 다르다!!

pip이란? 파이썬 패키지 관리자

  • pip list로 본인의 환경에 설치된 패키지들을 보여준다
  • 가상환경이란? 프로젝트마다 독립된 환경을 구성해주는 도구이며, 다른 프로젝트와 패키지 간 충돌을 방지를 한다.
  • which python으로 내 파이썬이 어디에서 시작하는지 볼 수 있다.

 1-3 허깅페이스
허깅페이스란
자연어 처리 중심으로 다양한 API모델들을 제공하는 플랫폼

 

특징
1. transformers 라이브러리
이 라이브러리는 BERT, GPT-3 같은 최신 NLP 모델을 쉽게 사용할 수 있다.
2. 모델허브
수천 개의 미리 학습된 모델들이 모여있는 곳이며,클릭 몇 번으로 모델을 가져다 쓸 수 있다.
3. 커뮤니티 중심

 

장점
1. 쉬운 접근성
2. 광범위한 모델 선택
3. 오픈소스
4. 커뮤니케이션 지원

 

단점
1. 리소스 요구량이 큰 모델들이있다.
2. 복잡한 초기 설정
3. 특화된 모델

#경고창 무시
import warnings
warnings.filterwarnigs('ignore')


☑️ AI모델 활용 2주차


 2-2 API로 인공지능 활용하기
API는 Application Programming Interface의 줄임말로, 프로그램 간에 데이터를 주고받을 수 있게 해주는 인터페이스

  • 텍스트 생성 API: ChatGPT
  • 음성 합성 API: ElevenLabs
  • 컴퓨터 비젼 API: Google Vision AI
  • 음성인식 API: Google Cloud Speech-to-Text
  • 번역 API: DeepL

장점
1. 손쉬운 사용
2. 신속한 개발
3. 확장성

단점
1. 비용: 사용에 따른 비용 발생
2. 제한된 언어: 커스터마이징의 제한
3. 의존성: 해당 서비스가 중단되거나 변경될 때

팁!
1. 문서읽기: 사용방법이 문서에 포함되어있어 필수!
2. API 키 관리
3. 무료 할당량 체크

강의 8분 쯤 부터 API소개를 다시 듣고 필기하자.

2-3 일단 만들어보자 PyTorch, Transformer

시작하기 전 pip한 모듈들
1. pip install transformers
2. pip install sentencepiece sacremoses
3. pip install importlib_metadata

모델 불러오기

d_model 단어의 임베딩 차원수를 나타낸다

nhead는 멀티헤드레코드에 헤드수

멀티헤드레코드란?
 데이터베이스 구조에서 하나의 테이블에 여러 종류의 레코드를 저장할 수 있게 성계된 구조를 의미하며, 8개의 주의 헤드가 생기고 각 헤드가 독립적으로 주의계산을 수행한 다음 모든 헤드의 결과가 결합된다.

layers는 어느정도의 레이어로 형성할 것인지

 

모델 학습 준비

  • 파라미터가 많고 깊고 복잡한 모델일 경우 lr(러닝레이트)를 작게 설정하는 경우가 많음

모델 학습 시키기

  • epoch는 모델을 학습하는 하나의 주기를 의미
  • num_epochs는 총 학습 주기 수를 의미
  • optimizer.zero_grad()는 매 에포크의 학습 시작 전에 이전 에포크에서 누적된 기울기 초기화
  •  output = model(src, tgt)
     * src는 소스 입력 데이터를 나타내며, 트랜스포머 모델의 입력으로 들어가는 원본 텍스트나 시퀀스
     * tgt는 대상 데이터(target data)로, 일반적으로 모델이 예측해야 하는 정답 시퀀스
  • criterion은 손실 함수로, 예측된 출력(output)과 실제 레이블(tgt_labels) 사이의 오차를 계산 
  • loss.backward()는 손실 값에 대한 가중치의 기울기를 계산하는 과정으로, 역전파(backpropagation)라고도 한다.
  • optimizer.step()은 계산된 기울기를 바탕으로 모델의 가중치를 업데이트하는 단계
import torch
import torch.nn as nn
from torch.nn import Transformer

# transformer 모델 불러오기
model = Transformer(d_model=512, nhead=8, num_encoder_layers=6, num_decoder_layers=6)

# 모델학습 준비
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
criterion = nn.CrossEntropyLoss()

# 모델학습 시키기
for epoch in range(num_epochs):
    optimizer.zero_grad()
    output = model(src, tgt)
    loss = criterion(output, tgt_labels)
    loss.backward()
    optimizer.step()
    
    # 사전 학습된 모델 활용 예시
model = torch.hub.load('huggingface/pytorch-transformers', 'modelForCausalLM', 'gpt2')
tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'gpt2')

# 예제
input_text = "Once upon a time"

# 인풋 토큰화
input_ids = tokenizer.encode(input_text, return_tensors='pt')

# 토큰화된 인풋을 통해 아웃풋 생성
output = model.generate(input_ids, max_length=20, num_return_sequences=1)

# 아웃풋 토큰화
tokenizer.decode(output[0], skip_special_tokens=True)

☑️ 회고

 

split메서드: 공백을 기준으로 단어별로 분할하여 리스트에 저장할 수 있게 해준다.

 

pop(index) :

- 리스트의 특정 인덱스 위치에 있는 요소 제거하고 그 값을 반환

- 인덱스를 지정하지 않으면 마지막 요소가 제거 된다.

- 주로 특정 요소를 제거하거나 리스트를 조작할 때 유용

 

random.randit(a, b)

- a와 b 사이의 정수 중 무작위 하나를 반환한다.

- a와 b의 양쪽 경계가 포함된다. ex) randit(1, 5)는 1,2,3,4,5 중 하나의 정수를 무작위로 선택

- 주로 샘플링, 데이터 증강, 난수 생성 등의 작업에 유용

 

join(inerable)

- join함수는 문자열 메서드로 리스트나 튜플과 같은 반복 가능한 객체(iterable)에 있는 문자열을 하나로 합친다.

- join을 호출하는 문자열은 각 요소 사이에 삽입될 구분자 역할을한다.

- " ".join(['I', 'love'])는 "I love"로 출력 되듯이 요소를 이어줄 때 요소사이에 값(" ")을 넣어주는 역할

- 리스트나 튜플의 각 요소를 연결하여 문자열로 합칠 때 사용

 

+ Recent posts