☑️ 서론 및 목차

오늘부터는 TIL 가독성을 높이기 위해

 

학습을 시작하며 드는 생각

 

공부를하며 모르는 부분들과 실습을 진행하며 만난 오류들을 정리

 

공부를 마무리하며 회고

 

순서로 진행할 것입니다.

 

필기와 코드 설명은 쥬피터 노트북 코드상자에 정리할 것으로 GITHUB링크를 참고해야합니다.

 

TIL/AI/AI_5_1-5.ipynb at main · Onesword-Jang/TIL

 

TIL/AI/AI_5_1-5.ipynb at main · Onesword-Jang/TIL

오늘 배운 것은?! Contribute to Onesword-Jang/TIL development by creating an account on GitHub.

github.com

 

 


☑️ 학습 시작

오늘의 공부는  AI모델활용 강의  5-5까지 듣고 머신러닝의 비지도 학습을 복습할 것입니다.

 

강의만 듣고있으면 12시간 중 절반의 시간을 멍 때리기 때문에 강의양을 조절했습니다.

 

지금 까지 강의를 들으며 느낀 생각은

 

AI모델을 활용하면 정말 다양하고 내가 원하는게 무엇이든지 만들어 낼 수 있을거라는 생각이 들었습니다.

 

그 만큼 조심해야하는 부분이 많고 세세하게 설정해야하는 부분이 많아 보여 어렵게 느껴지지만 

 

나중에 숙달이 되었을 땐 꼭 궁금하거나 만들고 싶다고 생각이 드는 모델을 만들어 보고싶습니다.


☑️ 학습 중 만난 문제

AI모델활용 5 - 1

1. FastAPI 서버 실행 부분에서 ipynb파일을 바로 실행 시킬 수 없음 (FastAPI를 정의한 app을 찾을 수 없다고 Error가 나옴)

FastAPI를 사용할 땐 py파일을 만들어 사용하거나 vscode에서 만들면 쉽다.

쥬피터 노트북에서 사용하는 3가지 방법이있다.

 

1) 매직 명령어 사용

%%writefile AI_5.py
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

2) subprocess 사용

import subprocess
subprocess.run(["uvicorn", "AI_5:app", "--reload"])
  • 이 방법은 Uvicorn 프로세스에 점유되어 다른 셀을 사용할 수 없는 한계가 있다.

3) 별도 터미널에서 실행

  • 일반 터미널이나 Anaconda Prompt에서 FastAPI를 실행하는 것이 가장 간편한 방법
  • Jupyter Notebook은 FastAPI 서버와 독립적으로 사용할 수 있어, 서버 실행에 영향을 받지 않는다.

4) 쥬피터 노프북 셀에서 사용 방법은 3번 째 코드

2.  port의 종류

- 8000 : 테스트 용

 

- Well-Known Ports(0-1023): 이 범위의 포트는 표준화된 프로토콜에 의해 사용

  • 80 : HTTP
  • 443 : HTTPS
  • 25 : SMTP
  • 21 : FTP

- Registered Ports (1024-49151): 이 범위는 특정 애플리케이션에 의해 등록되어 사용

  • 3306 : MySQL
  • 5432 : PostgreSQL

- Dynamic/Private Ports (49152-65535): 이 범위의 포트는 동적으로 할당되는 포트로, 일반적으로 클라이언트 애플리케이션이 서버에 연결할 때 임시로 사용

 

AI모델 활용 5 - 4

1. numpy와 ultralytics의 컴파일러 문제와 빌드도구(meson)의 경로 관련 오류

이 문제는 주로 Visual Studio C++ 빌드도구가 누락되어 발생한다.

해결방법

https://visualstudio.microsoft.com/ko/visual-cpp-build-tools/

  1. Visual Studio C++ 빌드 도구 설치(설치 중 "Windows용 C++ CMake tools" 같이 다운하면 좋음)
  2. 사전 빌드된 numpy설치 (1.24.3)
  3. 설치 재시도(사전 빌드 numpy설치 후)

☑️ 머신 러닝 비지도 학습

🔎 K-means-clustering

1. matplotlib의 패키지 의존성 문제로 설치 불가

  • 딥러닝, AI모델활용 강의에 사용하던 가상환경을 사용해서 모듈들의 버젼 때문으로 인지
  • 머신러닝 거성환경을 사용하고 update를 한 뒤 해결!

2. 클러스터링 모델 적용 후 생성된 군집 번호 열추가 안함

  • 할당 단계를 거치고 결과를 반환해줄 열을 추가 하지않아 오류가 난 것으로 인지
  • Cluster열을 추가하는 코드 추가
    # KMeans 모델 생성 및 군집 추가
    kmeans = KMeans(n_clusters=5, random_state=42)  # 군집 개수(n_clusters)는 조정 가능
    data['Cluster'] = kmeans.fit_predict(data_scaled)  # 클러스터 결과 추가

🔎 계층적 군집화

1. 불러오는 모듈 정의

from sklearn.cluster import AgglomerativeClustering
  • AgglomerativeClustering은 sklearn의 군집화 알고리즘 중 하나로, 상향식 계층적 군집화 방식
    import scipy.cluster.hierarchy as sch
  • scipy.cluster.hierarchy는 SciPy에서 계층적 군집화를 위한 다양한 함수와 도구를 제공하는 모듈
  • 덴드로그램(Dendrogram)을 시각화하는 dendrogram 함수와, 상향식 군집화를 수행하는 linkage 함수를 제공

2. 덴드로그램이란?

  • 데이터 포인트 간의 유사도와 계층적 클러스터링 결과를 시각화하는 트리 형태의 다이어그램
  • 데이터가 군집화되는 과정을 단계별로 표시
  • 특정 위치에서 가지가 나뉘는 위치를 기준으로 최적의 클러스터 수를 직관적으로 파악 가능

3. k개를 찾는 방법

  • 엘보우 방법
  • 실루엣 분석(-1~1): 1에 가까울수록 잘 분리된 군집
  • 지식 및 경험
  • 일반적으론 2~10개 정도 사용해서 최적을 찾음(많을수록 오버피팅이 될 수 있음)

4. plt.scatter 간소화

colors = ['red', 'blue', 'green', 'cyan', 'magenta']
for i, color in enumerate(colors):
    plt.scatter(X_scaled[y_hc == i, 0], X_scaled[y_hc == i, 1], s=100, c=color, label=f'Cluster {i+1}')
  • enumerate는 파이썬 내장 함수로, 리스트와 같은 순회 가능한(iterable) 객체를 반복하면서 각 요소의 인덱스와 값을 동시에 가져올 수 있게 해준다.

 


☑️ 회고

AI모델활용 강의를 들으며

 

아직 저는 API 키를 발급 받지 않은 상태에서 진행했기에

 

직접적으로 결과를 볼 수 없었는데

 

강사님께서 직접 음성 생성 AI을 활용하는 모습을 보여주셔서 굉장히 흥미로웠습니다.

 

머신러닝 비지도 학습을 진행하며

 

이전에 학습할 때 보다 학습하기 수월했으며 재미있었다.

 

하지만 아직도 모르는 부분 까먹은 부분이 많아 보인다.

 

마지막으로

 

강의를 듣다가 주말에 포트폴리오를 만드는 시간을 가지려했었단걸 떠올렸습니다.

 

오늘이 저의 생일이라 약속이 많아 진행하지 못했는데 이번 주에 도전하는 시간을 매일 1~2시간 정도 가져야겟습니다.

 

 


오늘은 AI모델활용 강의를 들으며 시작했습니다.

오늘의 목표는 4주차까지 듣고 1주차부터 다시 복습을 하여 AI모델 활용에 대한 이해도를 높이는게 목적입니다.

강의를 듣는 도중 gensim과 numpy의 호환성문제가 발생했고 uninstall 등 다양한 방법을 사용해보았고 결국 새로운 가상환경을 만들어 해결했습니다.

오늘 들은 강의는 코드를 작성하며 실습하는 수업이였습니다.

코드를 적으며 기억이 나지 않거나 처음 보는 코드들의 기능을 자세히 알아보며 강의를 들어 이해가 잘 되었습니다.

 

강의를 들으면서 정리한 새롭게 알게된 내용과 까먹은 내용들을 강의 순서에 맞게 정리하겟습니다.

그리고 마크다운을 사용해서 TIL을 작성하는게 익숙해지고있으며 이모지를 가져와서 더욱 가독성이 좋게 꾸며야 할 것 같습니다.

 

마지막으로 해결하지 못한 궁금한 점이있습니다.

 

API를 활용해서 모델을 만드는 실습을 했는데 GPT-4o는 내가 알기론 유료 플랜인데 코드를 실행시키면 요금이 청구 되나요? (코드를 실행 시켜보지는 않았습니다 무서버서ㅎㅎ:)


☑️ AI모델활용 3주차

3-1 허깅페이스와 트랜스포머

Trnasformers 라이브러리

Transformers 라이브러리는 다양한 NLP 모델을 쉽게 사용할 수 있도록 도와주는 Hugging Face의 오픈소스 라이브러리, 이 라이브러리를 통해 최신 NLP 모델들을 불러와 텍스트 생성, 감정 분석, 번역 등 다양한 작업에 활용할 수 있다.

참고! 모델을 가져와서 사용할 땐 vscode가 좋다!!

pipeline

  • pipeline이란?
    1. 텍스트 분류: 감정분석, 주제 분류, 등의 작업을 지원하며, 문장의 감정을 예측하거나 특정 카테고리분류 가능
    2. 질의 응답: 주어진 문서와 질문을 입력받아 문서에서 질문에 대한 답변을 찾는 작업
    3. 텍스트 생성: 주어진 문장을 기반으로 텍스트를 생성하며, 대화생성이나 문장 완성 가능
    4. 번역
    5. 요약: 긴 텍스트를 간단히 요약해 주요 내용 추출 가능
    6. 개체명 인식: 문장 내에서 이름, 위치ㅡ 조직 등을 식별하여 태그를 붙이는 작업
    7. 문장 유사도: 두 문장의 유사도를 계산하는 작업으로 의미적 유사성 측정 가능
  • pipeline의 요소 "text-generation" 그 외
    1. "text-generation": 텍스트 생성 작업 (예: 대화 생성, 글 작성)
    2. "sentiment-analysis": 간단한 감성어 분석
    3. "question-answering": 질의응답 작업
    4. "translation_xx_to_yy": 번역 작업 (예: "translation_en_to_fr"는 영어에서 프랑스어로 번역)
    5. "summarization": 텍스트 요약
    6. "ner": 개체명 인식 (Named Entity Recognition)
    7. "sentence-similarity": 문장 유사도 측정
    8. "fill-mask": 마스크된 텍스트 채우기 (BERT 모델 등에서 사용)
    9. "text-classification": 텍스트 분류 작업 (예: 감정 분석)

임베딩

  • 1. 워드 임베딩
    • 자연어 처리에서 단어를 벡터로 처리 (워드투백, 페스트 텍스트)
  • 2. 센텐스 임베딩
    • 문장 전체를 벡터로 처리
    • 문장간의 유사도 분석, 의미적 관계 분석
    • 딥러닝, 머신러닝의 입력으로 활용 가능
  • 3. 이미지 임베딩
    • 이미지 데이터를 벡터로 표현
    • 이미지의 픽셀 데이터를 저차원 벡터로 분석하고 이미지간의 유사도 분석 가능
    • 딥러닝의 CNN과 비슷하지만 여러가지 방법을 도입하는게 좋다.
  • 4. 그래프 임베딩
    • 그래프 구조를 벡터로 표현
    • 노드간의 관계를 벡터 공간에서 표현
    • 네트워크 분석, 추천 시스템에서 활용

유사도

  • 두 개의 데이터가 얼마나 비슷한지 수치적으로 표현하는 방법
  • 임베딩 벡터에 유사도를 측정하는 방법 (코사인 유사도, 유클리디안 루컬?)
  • 벡터간의 거리나 각도를 계산하는 방법이다.

 


☑️ 3주차 코드 분석

3주차 강의 필기

TIL/AI/AI_3.ipynb at main · onesowrd1/TIL

 

TIL/AI/AI_3.ipynb at main · onesowrd1/TIL

오늘 배운 것은?! Contribute to onesowrd1/TIL development by creating an account on GitHub.

github.com

 

 

트랜스포머를 활용한 모델사용

 

 1. max_length=100는 생성할 문장의 최대 길이를 지정한다.(항상 최대 길이로 문장을 만드는건 아니다.)
 2. num_return_sequences=2는 문장의 개수를 지정한다.

# 트랜스포머를 활용한 모델 사용
from transformers import pipeline

generator = pipeline("text-generation", model = "gpt2")

# 텍스트 생성
result = generator("I have a cat", max_length=100, num_return_sequences=2)
print(result)

 

감정어 분석

문장을 해석해서 어느정도의 감정을 캐치하고 값을 출력한다. ex) Positive


1. model="roberta-base"
버트기반 모델은 핵심적인 논리부분은 대규모 데이터셋을 통해 사전학습 시키고 마지막 레이어(번역, 분류 등) 목적에 따라 바꿀 필요가 있는 레이어는 사용자에게 맡기기도 한다.

 

# 감성어 분석
from transformers import pipeline

sentiment_analysis = pipeline("sentiment-analysis", model="roberta-base")
result = sentiment_analysis("I love you")
print(result)

 

워드 투 백

1. from gensim.models import Word2Vec

- 텍스트 데이터에서 단어 간의 의미적 유사성을 벡터로 표현하는 알고리즘

 

2. from gensim.utils import simple_preprocess

- 텍스트를 소문자로 변환하고 불필요한 기호를 제거하며 토큰화하여 단어 리스트로 반환

 

3. from scipy.spatial.distance import cosine

- 두 벡터 간의 코사인 거리를 계산하며, 유사도를 계산한다.

 

4. sentences

- 임베딩을 생성할 문장 리스트

 

5. processed = [simple_preprocess(sentence) for sentence in sentences]

- simple_preprocess 함수를 사용하여 각 문장을 토큰화하고 소문자로 변환하여 단어 리스트 반환

 

6. Word2Vec(sentences=processed, vector_size=5, window=5, min_count=1, sg=0)

- sentences=processed: 학습에 사용할 문장 리스트

- vector_size=5: 각 단어를 5차원 벡터로 임베딩하고. 이 크기는 사용자가 필요에 따라 조정할 수 있다.

- window=5: 컨텍스트 윈도우 크기로, 현재 단어와의 최대 거리(단어 수)를 나타낸다.

- min_count=1: 최소 등장 빈도로, 1로 설정했으므로 모든 단어가 임베딩에 포함된다.

- sg=0: Skip-gram 방식을 사용할지(1), CBOW 방식을 사용할지(0)를 결정하고. 여기서는 CBOW 방식을 사용.

 

7. dog = model.wv['dog']와 cat = model.wv['cat']

-  dog와 cat이라는 단어의 벡터 표현을 불러온다.

 

8. sim = 1 - cosine(dog, cat)

- cosine 함수를 사용하여 dog와 cat 벡터의 코사인 유사도를 계산

 

import numpy as np
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess
from scipy.spatial.distance import cosine


sentences = [
    "The quick brown fox jumps over the lazy dog",
    "I love playing with my pet dog",
    "The dog barks at the stranger",
    "The cat sleeps on the sofa",
]

processed = [simple_preprocess(sentence) for sentence in sentences]
print(processed)

model = Word2Vec(sentences=processed, vector_size=5, window=5, min_count=1, sg=0)
dog = model.wv['dog']
cat = model.wv['cat']

sim = 1 - cosine(dog, cat)
print(sim)

☑️ AI모델 활용 4주차

4주차 강의 필기

TIL/AI/AI_4.ipynb at main · onesowrd1/TIL

 

TIL/AI/AI_4.ipynb at main · onesowrd1/TIL

오늘 배운 것은?! Contribute to onesowrd1/TIL development by creating an account on GitHub.

github.com

 

 

4-1 생성형 AI모델 직접 만들기 때 주의!!

생성형AI란?

  • 주어진 입력에 따라 새로운 콘텐츠를 생성하는 인공지능 기술
  • 몇 개의 단어를 입력받아 그에 맞는 문장 생성, 스케치를 바탕으로 이미지 생성

종류

  1. 텍스트 생성(GPT-3, ChatGPT 등)
  2. 이미지 생성(DALL-E, Stable Diffusion 등)
  3. 음악 생성(Magenta 등)

어려움

  1. 대규모 데이터 필요
  2. 컴퓨터 자원의 한계
  3. 모델 구조의 복잡성
  4. 훈련 과정의 불안정성

파인튜닝의 필요성!

  • 파인 튜닝은 사전 학습된 모델을 특정 작업에 맞게 추가로 학습시키는 과정으로, 생성형 AI 모델을 보다 쉽게 적용할 수 있는 방법
  • 사전 학습된 모델(시간 절감, 높은 성능, 도메인 특화, 작업 맞춤)

만들 때 고려할 부분

  1. 사전학습된 모델 활용
  2. 클라우드 서비스 활용
  3. 작은 프로젝트부터 시작하기

4-2 생성형 AI모델 기본 원리

랜덤성 Randomness

역할

  • 출력 데이터를 생성할 때 일정한 확률에 따라 다양한 선택지를 고려하게 한다.

확률 분포

  • 학습 데이터를 통해 얻은 확률 분포를 기반으로 새로운 데이터를 생성
  • 데이터의 분포를 학습해서 새로운 데이터를 생성할 수 있게 되는거다.

조건성 Conditionality

조건 입력

  • 입력된 조건에 따라 결과를 다르게 생성
  • 텍스트, 이미지, 오디오 등 다양한 형식의 조건이 있다.

중요성

  • 조건성 덕분에 생성형 모델은 매우 다양한 상황에 적응할 수 있다.(사용자가 원하는 특정 스타일, 주제, 분위기 등)

결론

  • 생성형 AI는 랜덤성과 조건성을 결합하여 다양한 결과를 생성한다.
  • 조건은 출력의 전반적인 틀과 스타일을 결정
  • 랜덤성은 결과의 세부적인 변화를 만든다.
  • 두 요소의 상호작용 덕분에 생성형 AI는 창의적이고 예측 불가능한 결과를 생성가능하게 만들어 준다.

※작동원리

텍스트 기반 생성형 모델의 원리

  1. 입력 토큰화
  2. 확률 예측
  3. 랜덤 선택: temperature 파라미터를 조정하여 랜덤성을 조절가능
  4. 반복 생성

이미지 기반 생성형 모델의 원리

  1. 텍스트 인코딩
  2. 이미지 생성
  3. 세부 사항 추가

오디오 기반 생성형 모델의 원리

  1. 텍스트 또는 멜로디 인코딩
  2. 오디오 생성
  3. 랜덤성 적용

4-3 Hugging Face와 Stable Diffusion

텍스트 생성

  1. 사전학습된 모델 사용
  2. 서비스를 활용해서 AIP의 형태로 언어를 형성

GPT-4o 모델로 텍스트 생성하기

API_KEY는 설정 파일이나 환경변수를 통해 관리해야한다. (코드상에 KEY작성 금지!!)

Stable Diffusion을 활용한 이미지 생성

Stable Diffusion 모델의 세부 조정

  • guidance_scale: 텍스트 조건을 얼마나 강하게 반영할지 결정하는 파라미터. 값이 높을수록 텍스트 설명에 충실한 이미지를 생성한다.
  • num_inference_steps: 이미지 생성 과정에서의 추론 단계 수를 지정한다. 단계 수가 많을수록 이미지의 품질이 향상되지만, 생성 시간이 길어진다.
image = pipe(prompt, guidance_scale=7.5, num_inference_steps=50).images[0]

☑️  4주차 코드 분석

1. 서비스를 활용해서 AIP의 형태로 언어를 형성

from openai import OpenAI

  • OpenAI API와 상호작용하는 데 필요한 기능을 제공

client = OpenAI()

  • OpenAI 클래스의 인스턴스를 생성하여 client 변수에 할당
  • client 객체를 통해 OpenAI API의 기능을 사용할 수 있ek.

client.chat.completions.create

  • completions.create 메서드를 호출하여 대화형 응답을 생성

role, content

  • 역할, 내용
# 2. 서비스를 활용해서 AIP의 형태로 언어를 형성

# JavaScript에 openai환경변수 설정
import os

os.environ["OPENAI_API_KEY"] = "<your OpenAI API key>"

# python
from openai import OpenAI

client = OpenAI()

completion = client.chat.completions.create(
    # 필요되는 정보들
  model="gpt-4o",
  messages=[
    {"role": "system", "content": "너는 환영 인사를 하는 인공지능이야, 농담을 넣어 재미있게해줘"},
    {"role": "user", "content": "안녕?"}  
  ]
)

print("답변: " + completion.choices[0].message.content)

 

2. Stable Diffusion 모델 예제 코드

 

from diffusers import StableDiffusionPipeline

  • 텍스트 설명을 기반으로 이미지를 생성하는 파이프라인을 제공

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4"

  • "CompVis/stable-diffusion-v1-4"는 모델의 이름이며, Hugging Face 허브에서 가져올 모델 경로
  • torch_dtype=torch.float16은 16비트 부동 소수점 데이터를 사용하도록 설정

pipe = pipe.to("cuda")

  • pipe 객체를 GPU로 옮긴다. "cuda"는 GPU 장치를 의미하며, 이를 통해 모델의 연산이 GPU에서 수행되어 속도를 높일 수 있다.

prompt = "A futuristic cityscape with flying cars at sunset"

  • 생성할 이미지의 텍스트 설명을 정의

image = pipe(prompt).images[0]

  • 텍스트 설명을 기반으로 이미지 생성 요청을 처리
  • images[0]은 생성된 첫 번째 이미지를 선택한다.

image.save("generated_image.png")

  • "generated_image.png"라는 파일명으로 저장
# stable diffusion 모델 예제 코드
from diffusers import StableDiffusionPipeline
import torch

# Stable Diffusion 파이프라인 로드
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16)
pipe = pipe.to("cuda")  # GPU 사용

# 텍스트 설명을 기반으로 이미지 생성
prompt = "A futuristic cityscape with flying cars at sunset"
image = pipe(prompt).images[0]

# 생성된 이미지 저장 및 출력
image.save("generated_image.png")
image.show()

오늘의 시작은 어제 정리한 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"로 출력 되듯이 요소를 이어줄 때 요소사이에 값(" ")을 넣어주는 역할

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

 

오늘은 과제 제출 전 팀원들과 도전과제를 어떻게 제출할지 논의해보았고 도전과제는 진행한 부분까지만 제출하기로 정하였습니다.

 

그 뒤 과제 제출 후 간단하게 발표 시연까지 했습니다.

 

이후 도전과제를 개인적으로 진행하는 시간을 가졌는데 딥러닝 강의 자료에서는 LSTM모델을 정의하는 코드들이 포함 되어있지 않아 인터넷을 뒤져보고 작성하다가 진도가 너무 느렸기에 GPT에 코드를 작성해달라고 한 뒤 분석하는 시간을 가졌습니다.

 

전처리는 데이터의 특성별로 필요한 과정이 달라 데이터를 분석하는 시선이 더욱 필요해 보였으며 

 

사용하는 모듈들의 기능을 숙지하지 못한 상태로 판단했습니다.

 

또한 사용할 데이터를 구분하고 모델을 정의하고 평가하는 코드들에 대한 이해도가 매우 낮아 하나씩 찾아보고 왜 이런 과정을 거치는지 사용된 함수들의 정의 등을 정리하며 학습을 진행했습니다.

 

딥러닝 넷플릭스 리뷰 감정 분석 모델에 대한 코드들을 전체적으로 알아보는 시간이였습니다.

 

완전히 이해가 된것은 아니지만 아떤 함수를 왜 사용하고 어떤 기능을하는지 알아보는 시간이였구요 오늘 정리한 것을 토대로 내일은 새로운 딥러닝 문제를 해결해보거나 오늘 TIL을 반복 학습해보아야 겟습니다.


 

모듈들에 대한 설명은  23일차 TIL에서 자세히 정리 하였으니 찾아 보시면 좋을 것같습니다.

 

tokenizer에 대한 부분은 2가지 방법이 있어 구분하기 위해 정리하였습니다.

 

get_tokenizer

라이브러리: torchtext

파이프라인에서 사용하기 위해 여러 가지 사전 정의된 토큰화 방식 제공

주로 NLP모델링에서 빠르게 파이프라인 구축에 사용

"basic_english", "spacy" 등 다양한 토큰화 옵션 제공

 

Tokenizer

라이브러리: keras.preprocessing.text(Keras/TensorFlow)

텍스트 데이터셋의 단어들을 토큰화하고 숫자 시퀀스로 변환하는 기능 제공

주로 딥러닝에서 LSTM, CNN모델 등과 함께 텍스트 데이터를 시퀀스 형태로 입력할 때 사용

 

  • values 메서드

content와 score의 딕셔너리의 키(Keys)와 값(Values) 중 값(Values)를 texts와 labels에 저장 한다.

texts = df['content'].values  
labels = df['score'].values

 

  • Train_Test_Split

학습 데이터와 훈련 데이터셋으로 나누는 방법뿐만 아닌

LSTM에서는 train_test_split을 사용할 때 훈련 데이터와 검증 데이터로 분리한다.

train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=0.2, random_state=42)

 

  • get_tokenizer

1. basic_english로 영어 텍스트의 공백과 구두점 기준으로 단어를 구분해 토큰화시켜 문장의 단어목록을 반환하며, 후속 텍스트 데이터 처리 준비 단계이다.

2. yield_tokens는 단어 사전을 만들기 위한 반복자 함수, 각 문장을 토큰화하여 단어 목록을 생성하고 문장에서 나온 모든 단어를 하나씩 반환해 사전에 추가한다.

3. vocab = build_vocab_from_iterator(yield_tokens(train_texts), specials=["<unk>"]):

- yield_token 함수를 사용해 단어를 순차적으로 받으며 이를 통해 단어 사전을 생성

- specials = ["<nuk">]로 정의된 특별 토큰은 사전에 없는 단어를 처리해 사전에 없는 단어는 <unk>로 치환한다.

4. vocab.set_default_index(vocab["<unk>"])

set_default_index 메서드를 통해 사전에 없는 단어가 나올 경우 기본적으로 <unt>토큰의 인덱스로 설정 되게한다.

#text를 토큰화시켜 단어사전에 저장
tokenizer = get_tokenizer("basic_english")

def yield_tokens(texts):
    for text in texts:
        yield tokenizer(text)

vocab = build_vocab_from_iterator(yield_tokens(train_texts), specials=["<unk>"])
vocab.set_default_index(vocab["<unk>"])

 

  • 커스텀 데이터셋을 정의하는 이유

- pytorch에서는 Dataset클래스를 커스터마이징하여 데이터로더에서 사용한다.

- 각 리뷰 텍스트와 레이블을 직접 불러와 전처리하고 모델이 학습 가능한 형태(토큰 인덱스)로 변환하기 위해서이다.

 

  • class ReviewDataset(Dataset)

- pytorch의 Dataset 클래스를 상속하여 __len__과 __getitem__ 메서드를 구현한다.

- 구현된 커스텀 데이터셋은 데이터 로더를 통해 배치로 나누어 학습에 사용한다.

 

  • def __init__(self, texts, labels, vocab, tokenizer)

- 클래스 인스턴스를 초기화할 때 텍스트 데이터와 레이블 데이터, 단어사전(vocab), 토큰과 함수(tokenizer)를 인자로 받는다.

- self.texts = texts는 리뷰 텍스트 데이터, self.labels = labels는 해당 리뷰의 점수를 저장한다.

- self.vocab = vocab는 텍스트를 숫자 인덱스로 변환하는 데 필요한 단어 사전을 저장한다.

- self.tokenizer = tokenizer는 텍스트를 토큰화하는 데 사용할 토큰화 함수를 저장한다.

 

  • def __len__(self): return len(self.labels)

- 데이터셋의 길이를 반환하여 데이터셋의 샘플 개수를 알려준다.

- 데이터셋의 전체 데이터 크기를 확인할 때 유용하다.

 

  • def __getitem__(self, idx)

- 주어진 인덱스(idx)에 해당하는 텍스트와 레이블 데이터를 반환한다.

- tokens = self.tokenizer(self.texts[idx])는 인덱스에 해당하는 텍스트를 토큰화하여 단어 목록으로 변환한다.

- text_indices = [self.vocab[token] for token in tokens]는 각 토큰을 단어 사전(vocab)을 이용해 숫자 인덱스 형태로 변환한 리스트

- label = self.labels[idx]는 해당 텍스트의 점수를 불러온다

  • return torch.tensor(text_indices, dtype=torch.long), torch.tensor(label, dtype=torch.long)

- 텍스트 인덱스( text_indices )와 레이블(label)을 PyTorch 텐서 형태로 변환하여 반환한다.

- text_indices는 사전(vocab)을 통해 숫자 인덱스로 변환된 리스트

- label은 해당 리뷰 텍스트에 매핑된 정답 레이블로 예측 대상이 되는 점수(정수형태로 변환 된다.)

- dtype=torch.long는 데이터 타입을 **64비트 정수형(int64)**으로 지정하는 옵션

#커스텀 데이터셋 정의
class ReviewDataset(Dataset):
    def __init__(self, texts, labels, vocab, tokenizer):
        self.texts = texts  # 텍스트 데이터
        self.labels = labels  # 레이블 데이터
        self.vocab = vocab  # 단어 사전
        self.tokenizer = tokenizer  # 토큰화 함수

    def __len__(self):
        return len(self.labels)

    def __getitem__(self, idx):
        # 토큰화 후 단어 인덱스로 변환
        tokens = self.tokenizer(self.texts[idx])
        text_indices = [self.vocab[token] for token in tokens]
        label = self.labels[idx]
        return torch.tensor(text_indices, dtype=torch.long), torch.tensor(label, dtype=torch.long)

 

  • batch_size = 32

- 모델 학습 및 평가 과정에서 한 번에 처리할 데이터 샘플 수를 설정한다.

- 배치 크기를 조절하면 학습 속도와 메모리 사용량에 영향을 미친다.

 

  • train_dataset = ReviewDataset(train_texts, train_labels, vocab, tokenizer)
  • val_dataset = ReviewDataset(val_texts, val_labels, vocab, tokenizer)

- ReviewDataset(train_texts, train_labels, vocab, tokenizer)는 학습 및 검증 데이터셋을 각각 생성하여 DataLoader에서 사용하기 위한 객체

 

  • train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, collate_fn=lambda x: collate_fn(x, vocab))
  • val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, collate_fn=lambda x: collate_fn(x, vocab))

- train_loader와 val_loader는 학습과 검증에 사용될 데이터셋을 로딩하는 객체

- shuffle=True는 학습 데이터의 순서를 매 배치마다 무작위로 섞어준다.

- collate_fn=lambda x: collate_fn(x, vocab)는 배치 내 텍스트와 레이블 텐서들을 일정한 크기로 패딩 처리 및 시퀀스 길이를 정렬하여 LSTM에서 효율적인 학습이 가능

#데이터로더 정의
batch_size = 32

train_dataset = ReviewDataset(train_texts, train_labels, vocab, tokenizer)
val_dataset = ReviewDataset(val_texts, val_labels, vocab, tokenizer)

train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, collate_fn=lambda x: collate_fn(x, vocab))
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, collate_fn=lambda x: collate_fn(x, vocab))

 

  • LSTMClassifier

- 임베딩, LSTM, 완전 연결층으로 이루어진 신경망 구조를 정의한다

 

  •  __init__메서드

- vocab_size, embed_dim, hidden_dim, output_dim 등의 매개변수를 통해 모델의 구조와 각 층의 크기를 설정

- super(LSTMClassifier, self).__init__()은 부모 클래스인 nn.Module의 __init__ 메서드를 호출하여 모델이 올바르게 초기화한다.

  •  self.embedding = nn.Embedding(vocab_size, embed_dim)

- 입력 텍스트를 임베딩 벡터로 변환하고 입력 데이터 길이를 고정한다.

- vocab_size는 단어 사전의 크기

- embed_dim은 각 단어를 백터화할 차원 수를 의미한다.

  • self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)

- nn.LSTM(embed_dim, hidden_dim, batch_first=True)는 시퀀스 데이터를 처리하는 LSTM 계층을 정의한다.

- hidden_dim은 LSTM 계층의 은닉 상태 크기를 의미

- batch_first=True를 설정하여 배치 크기와 시퀀스 길이의 순서를 (batch, seq_len, feature_dim) 형태로 설정

  • self.fc = nn.Linear(hidden_dim, output_dim)

- 최종적으로 은닉 상태에서 피처를 추출한 후, 각 클래스를 예측하기 위한 완전 연결층

- output_dim은 분류할 클래스의 수로 설정

 

  • def  forward(self, text)

- 입력 텍스트 텐서를 받아 예측 결과를 생성하는 과정

  • embedded = self.embedding(text)

- 텍스트 인덱스를 임베딩 벡터로 변환하여 단어의 의미를 반영한 벡터로 변환한다.

  • _, (hidden, _) = self.lstm(embedded)

- LSTM 계층을 통해 피처를 추출하며, 이때 hidden은 마지막 시퀀스의 은닉 상태를 나타낸다.( 이 은닉 상태는 텍스트의 전체적인 의미를 요약한 값으로 사용된다.

  • return self.fc(hidden[-1])

hidden[-1]은 마지막 은닉 상태로 텍스트의 최종 피처를 푠현한다. 이를 완전 연결층에 전달하여 각 클래스로 분류하는 최종 출력이 생성된다.

# 모델 정의
class LSTMClassifier(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim):
        super(LSTMClassifier, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)  # 임베딩 층
        self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)  # LSTM 층
        self.fc = nn.Linear(hidden_dim, output_dim)  # 출력층

# 순전파 메서드
    def forward(self, text):
        embedded = self.embedding(text)  # 텍스트를 임베딩
        _, (hidden, _) = self.lstm(embedded)  # LSTM으로 피처 추출
        return self.fc(hidden[-1])  # 마지막 hidden state를 사용해 출력

 

  • vocab_size = len(vocab)

- 사전 내의 단어 개수를 나타내며, nn.Embedding 층에서 임베딩 벡터를 생성할 때 필요한 값이다.

- 임베딩 층은 단어의 고유 인덱스를 사용해 각 단어를 고정된 벡터 차원으로 표현하므로 단어의 총 개수를 알아야한다.

  • embed_dim = 64

- 임베딩 벡터의 차원을 설정한다.

- 임베딩 차원이 높을수록 단어의 표현력이 증가할 수 있지만 지나치게 크면 연산량이 커지므로 적절한 값을 설정해야한다.

  • hiddden_dim = 128

- LSTM의 은닉층 차원을 설정한다.

- 은닉층 차원이 클수록 LSTM이 더 많은 패턴을 학습할 수 있지만, 연산 비용이 높아질 수 있어 데이터에 맞춰 설정해야한다.

  • output_dim = len(label_encoder.classes_)

- 모델의 최종 출력 차원, 즉 분류할 클래스의 개수를 의미한다

- label_encoder.classes_는 각 레이블을 고유 클래스 인덱스로 변환하여 사용하고 이 값을 통해 분류할 클래스 수를 자동으로 설정합니다.

 

  • model = LSTMClassifier(vocab_size, embed_dim, hidden_dim, output_dim)

- 위에서 설정한 하이퍼파라미터 값을 바탕으로 LSTMClassifier 모델을 인스턴스화시킨다.

- 각 하이포파라미터가 모델의 구성에 반영되어 모델 초기화 시점에 필요한 모든 설정이 완료된다.

- 모델 초기화는 이후 훈련 시 파라미터가 업데이트될 기준값을 절정하는 역할도 한다.

  • criterion = nn.CrossEntropyLoss()

- 다중 클래스 분류 문제에서 주로 사용되는 손실 함수로, 예측값과 실제값 간의 차이를 로그 확률 기반으로 계산한다.

- 이 함수는 각 클래스의 확률값을 고려하여 손실을 계산하므로, 분류 문제에서 최적화가 잘 이루어진다.

- 예측이 정답에 가까울수록 손실이 작아지고, 예측이 틀릴수록 손실이 커진다.

optimizer = optim.Adam(model.parameters(), lr=0.001)

- Adam 옵티마이저는 경사하강법의 변형으로 학습률을 자동 조정하는 기능이 있어, 일반적으로 빠르고 안정적인 학습을 가능하게 한다.

- model.parameters()는 모델의 모든 학습 가능한 파라미터를 가져와 옵티마이저가 이들을 업데이트할 수 있게한다.

- lr=0.001는 학습률로, Adam 옵티마이저의 초기 학습 속도를 결정한다.

-일반적으로 0.001이나 0.0001로 설정한다.(수렴이 불안정해지는걸 방지)

# 하이퍼파라미터 정의
vocab_size = len(vocab)
embed_dim = 64
hidden_dim = 128
output_dim = len(label_encoder.classes_)  # 분류 클래스 개수

# 모델 초기화
model = LSTMClassifier(vocab_size, embed_dim, hidden_dim, output_dim)

# 7. 손실 함수와 옵티마이저 정의
criterion = nn.CrossEntropyLoss()  # 분류 문제이므로 CrossEntropyLoss 사용
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam 옵티마이저

 

  • epochs = 10

- 전체 학습을 반복할 횟수로, 모델이 데이터를 몇 번 볼지 설정한다.

- 에포크 수가 높으면 과적합이 발생할 수 있다.

  • for epoch in range(epochs)

- 지정한 에포크 수 만큼 학습을 반복하여 모델의 성능을 점진적으로 개선한다.

- 각 에포크는 모델이 모든 학습 데이터를 한번 순회하는 과정을 의미한다.

  • model.train()

- 모델을 학습모드로 전환하여 필요 동작을 적용한다.

- 모델이 평가 모드(model.eval())일 때와 다르게, 학습 시에는 드롭아웃과 같은 규제 항목이 적용되도록 설정한다.

  • for batch_text, batch_label in train_loader

- train_loader로부터 배치 단위로 데이터를 불러와 모델이 학습할 수 있도록한다.

- batch_text는 텍스트 데이터, batch_label은 해당 텍스트의 레이블이다.

- 배치 처리를 통해 메모리를 효율적으로 사용하고 학습 속도를 향상시킬 수 있다.

  • optimizer.zero_grad()

- 이전 배치에서 계산된 기울기를 초기화한다.

- 매 배치마다 새로운 기울기를 계산해야하므로 이전 기울기가 누적되는 것을 방지하기위해 초기화한다.

  • output = model(batch_text)

- 현재 배치의 텍스트 데이터를 모델에 입력하여 예측값을 생성한다.

- LSTM을 통해 각 텍스트 시퀀스에서 피처를 추출하고 출력층을 통해 분류 예측이 이루어진다.

  • loss = criterion(output, batch_label)

- 예측값(output)과 실제 레이블(batch_label) 간의 손실을 계산한다.

- 손실 함수 criterion으로는 CrossEntropyLoss가 사용되어, 예측값이 실제값과 얼마나 차이가 나는지를 확률적 로그 손실 형태로 계산한다.

  • loss.backward()

-손실 값에 대한 기울기를 계산하여 각 모델 파라미터에 대해 **기울기(gradient)**를 구한다.

- 역전파를 통해 기울기가 계산되면, 이 기울기를 사용하여 파라미터가 업데이트된다.

  • optimizer.step()

- 계산된 기울기를 바탕으로 파라미터를 업데이트하여 모델을 개선한다.

- optimizer는 Adam 옵티마이저로 설정되어 있어, 파라미터가 기울기를 따라 학습률에 맞춰 갱신한다.

- 최적화 과정이 반복될수록 모델이 더 나은 예측을 하도록 학습한다.

# 모델 학습
epochs = 10
for epoch in range(epochs):
    model.train()
    for batch_text, batch_label in train_loader:
        optimizer.zero_grad()  # 기울기 초기화
        output = model(batch_text)  # 모델 예측
        loss = criterion(output, batch_label)  # 손실 계산
        loss.backward()  # 역전파
        optimizer.step()  # 가중치 갱신

 

model.eval()

- 모델을 평가 모드로 전환

with torch.no_grad()

- 기울기 계산을 비활성화하는 컨텍스트

- 모델의 파라미터를 업데이트하지 않기 때문에 기울기를 계산할 필요가 없다.

- 메모리 사용량과 연산 비용이 줄어들어 검증 속도가 향상된다.

for batch_text, batch_label in val_loader

- 검증 데이터를 배치 단위로 불러와 반복 처리한다.

- val_loader는 검증 데이터셋을 로드하며, batch_text는 텍스트 데이터, batch_label은 해당 텍스트의 실제 레이블

output = model(batch_text)

- 현재 배치의 텍스트 데이터를 입력받아 모델 예측값을 생성한다.

- output은 예측 결과로, 각 클래스에 대한 확률 점수가 포함된 텐서

pred = output.argmax(1)

- 가장 높은 확률을 가진 클래스 인덱스를 선택한다.

- argmax(1)는 각 행에서 최대값을 가진 인덱스를 반환하므로, 이 값을 예측된 클래스 레이블로 사용한다.

- 모델이 해당 텍스트 데이터에 대해 가장 확률이 높은 클래스를 예측하도록 한다.

correct += (pred == batch_label).sum().item()

- (pred == batch_label).sum().item()는 예측값과 실제 레이블이 일치하는 경우의 개수를 계산한다.

- pred == batch_label는 예측과 실제 레이블을 비교하여 일치 여부를 반환하고, .sum()은 일치하는 예측의 총 개수를 계산한다.

- .item()은 결과를 텐서에서 정수로 변환하여 누적된 correct에 추가한다.

accuracy = correct / len(val_dataset)

- 검증 데이터 전체에 대한 정확도를 계산한다.

- correct는 정확하게 예측된 데이터 수이고, len(val_dataset)는 전체 검증 데이터 수

- 에포크 별 검증 정확도를 출력하여 모델의 성능 변화를 확인한다.

    # 검증 단계
    model.eval()
    correct = 0
    with torch.no_grad():
        for batch_text, batch_label in val_loader:
            output = model(batch_text)
            pred = output.argmax(1)  # 예측 클래스
            correct += (pred == batch_label).sum().item()

    accuracy = correct / len(val_dataset)
    print(f"Epoch {epoch+1}, Validation Accuracy: {accuracy:.2f}")

1. get_tokenizer는 전처리 과정이라고 볼수있나요?

- 전처리 과정으로 볼 수 있다.

 

2. text_indices = [self.vocab[token] for token in tokens]는 각 토큰을 단어 사전(vocab)을 이용해 숫자 인덱스 형태로 변환한 리스트라는데 vocab은 texts의 토큰들을 넣은 단어사전이라고 이해했는데 여기서 언제 숫자 인덱스 형태로 변환한 건지 모르겟습니다.? 혹시 tensor로 변환을 하는 건가요?

- vocab은 텍스트에 사용된 모든 단어(토큰)를 고유한 숫자 인덱스로 매핑한 사전입니다. 이 과정은 문자를 숫자로 매핑하는 작업

 

3. super(LSTMClassifier, self).__init__()은 부모 클래스인 nn.Module의 __init__ 메서드를 호출하여 모델이 올바르게 초기화한다.에서 부모클래스를 말하는게 커스텀 데이터셋을 말하는 건가요?

- 아니다. 부모 클래스는 nn.Module입니다. LSTMClassifier는 nn.Module을 상속받아 만들어진 자식 클래스이다.

- 부모 클래스의 __init__ 메서드를 호출하여 LSTMClassifier가 nn.Module의 모든 기능을 올바르게 상속받고 초기화하게 해준다.

 

4. model.train()에서 드롭아웃이라는 것이 무엇인가요?

model.train()과 model.eval()은 학습 및 평가 과정에서 모델의 안정적 성능을 유지하도록 돕는 중요한 설정

 

  • 학습 모드 (model.train())
    • model.train()은 모델이 학습 중임을 명시합니다.
    • 학습 모드에서는 모델이 데이터를 학습하며, 일반화 성능을 높이기 위해 규제 기법(regularization)을 적용합니다.
    • 대표적인 규제 기법에는 드롭아웃과 배치 정규화(Batch Normalization)가 있습니다.
  • 평가 모드 (model.eval())
    • model.eval()은 모델이 평가나 추론 중임을 명시합니다.
    • 이 모드에서는 모델의 파라미터 업데이트 없이 예측 성능만 측정하게 되므로 규제 기법이 적용되지 않습니다.
    • 드롭아웃과 배치 정규화는 평가 시점에서는 불필요하며, 오히려 정확도를 떨어뜨릴 수 있어 이들 기능이 비활성화됩니다.
  • 드롭아웃 (Dropout)
    • 드롭아웃은 학습 중에 임의로 뉴런을 비활성화하여, 네트워크가 특정 뉴런에 과도하게 의존하지 않도록 방지하는 기법
  • 배치 정규화 (Batch Normalization)
    • 배치 정규화는 각 배치마다 평균과 분산을 기준으로 데이터를 정규화하여, 학습 안정성과 속도를 높이는 기법

5. 패딩이란?

- 머신러닝이나 딥러닝에서 입력 데이터의 길이를 동일하게 맞추기 위해 사용하는 방법이다.

- LSTM이나 CNN과 같은 모델은 입력으로 고정된 길이의 텍스트가 필요합니다. 따라서 짧은 텍스트에 추가적인 "패딩 토큰"을 붙여서 길이를 맞추게 됩니다.

- 패딩을 추가해 모든 텍스트 길이를 동일하게 맞추면, 배치를 만들어 처리하기 쉬워지고, 모델이 고정된 입력 크기에서 학습할 수 있게된다.

 

 

☑️ 취업 특강 및 자기관찰

🔎 필요스킬

데이터 수집, 처리, 분석 스킬, 문제해결능력, 데이터 기반 의사결정 능력

python, pytorch, 머신러닝, 딥러닝 알고리즘, 데이터 시각화 능력

 

🔎 직업군

- 데이터 사이언티스트: 데이터 분석, 모델링, 예측 등을 통해 시스템 개발 및 개선

- 데이터 엔지니어: 데이터 수집 파이프라인 설계, 구현, 배포, 데이터 수집

- AI연구원: 새로운 AI기술을 연구하고 개발하여 AI분야에 기여

- AI프로덕트 매니저: AI 기반 제품의 개발 및 출시 전략을 수집하고 시장 트렌드를 분석

- 머신러닝 엔지니어: 머신러닝 알고리즘을 설계, 구현, 배포하고 AI모델 성능을 최적화

- 데이터 엔지니어

- 머신러닝 엔지니어

- 백엔드 개발자

 

🔎 코딩 테스트 준비: 프로그래머스, 백준, LeetCode

 

🔎 내가 준비해야할 것들

- 마크다운 사용법

- 노션 사용법

- 이력서 포트폴리오 작성 노하우 늘리기

- python, pytorch, 딥러닝, 머신러닝, 데이터 분석 공부

 

 

🔎 내가 걱정하는 것들

- 지방에서는 취업하기 많이 어려운지

- 문서 작성 능력이 너무 낮다

- 직업군에 대한 정보들이 감이 잡히지 않음

- 소통, 공감 능력은 좋다고 생각하지만 문제 해결 능력이 좀 떨어짐(감정적인 편)

 

 

🔎 나의 장점

- 책임감이 강함

- 상대입장에서 생각하고 행동하는 편  

- 의견이 많고 자주 질문하는 편

- 의견 공유하는 것을 좋아함(쌍방향)

- 무언가를 많드는 과정을 좋아함(내가 만든것을 공유하고 반응 보는 것이 제일 좋음)

 

🔎 나의 단점

- 참을성이 부족함(한번만 해도 될 일을 먼저 진행해보고 두번하게 되는 경우가있음)

- 잘휘둘리는편

- 걱정이 많아 생각이 많음

- 깊게 생각하는 힘이 부족함(얕은 생각에서 관련도가 적은 것들을 신경쓰고 그 부분에만 집중해서 중요한 부분을 놓치는 경우가 많음)

혼자서 오해를하고 트러블이 발생하게 만드는 경우가 가끔있음 (그럴수록 더욱 이야기하고 오해를 풀려고 노력 함)


☑️ 1차 커리어 코칭

 

커리어코치: 임하늘 코치님

 

코칭 시간 14:25 ~ 14:50

 

내용

1. 내가 어떻게 어떤 생각으로 내일배움캠프에 신청하여 오게 되었는지 설명

 

2. 오늘 오전에는 어떤 학습을 하였는지

 

3. 채용 사이트 추천

 

4.인텔리픽 커리어 코칭 시스템 소개

 

5.포트폴리오, 이력서 등 작성 및 예시 사이트 추천

 

6. 현재 가지고있는 고민 상담

 


 

오늘은 1차 커리어 코칭을 진행했습니다.

 

커리어 코칭을 진행하기 전 오전에는 일전에 진행했던 취업특강(김대영 튜터님)의 강의를 복습했다.

 

강조되고 내가 미리 준비해야하는 부분을 파악해 포트폴리오와 이력서 작성에 대한 구상하는 시간을 가졌습니다.

 

노션을 사용해서 나의 포트폴리오 페이지를 만들기 위해 유튜브의 노션으로 포트폴리오 강의를 시청하였고

다른 사람들의 노션으로 작성한 포트폴리오를 볼 수 있는 방법으로 살펴 보던 중 데이터 분석가님의 포트폴리오를 보게 되었다.

 

비전공으로 데이터 분석가가 되기까지의 내용이있었고 흥미를 가지고 알아 보았습니다.

 

데이터 분석가 답게? 취업 싸이트에서 필수조건, 우대사항의 데이터를 가져와서 분석하여 내가 가진 기술, 필요한 기술 등 시각화하여 우선 순위를 정하는 방법에대한 소개를 봤습니다.

 

그리고 커리어 코칭을 받으며 느낀점을 위 진행 순서대로 말하겟습니다.

 

1. 지금까지 내가 걸어온 길이 너무 여기저기를 건들이면서 취업까지했지만 시도하기 전에 포기를 한 경험으로 자존감이 매우 떨어진 상태였고 이 자존감을 다시 올리기 어렵다고 생각했다. 하지만 임하늘 코치님께서는 다른 시선으로 다양한 일을 시도해보았고 본인 역량을 잘 판단하고있다고 말씀해주셨습니다.

 

아직 내가 나에 대한 실망감은 남아있지만 코치님의 평가를 듣고  다른 시선으로 나를 보는 방법을 배운것 같으며 조금이지만 자존감이 회복 된것 같습니다.

 

2. 오전에 진행한 학습을 말씀드리니 여러가지 참고 싸이트를 보여주셨습니다. 아직 다 살펴 보진 않았지만 잘 활용해보겟습니다.

 

3, 4. 코칭 시스템이 어떻게 진행 되는지 확인하였고 인턴신청, 본인이 원하는 방향으로 코칭 등을 알아보았고 잘 활용해 보아야겟습니다.

 

5. 노션으로 작성을 하려고 했는데 git으로 작성해서 배포하는게 좋다고 말씀하셔서 git으로 진행해보아야겟습니다.

 

6. 지금 학습상태로는 당연히 현업에 도움이 되지는 못하지만 꾸준히 열심히하면 현업에서 할 수 있을 것이다.


☑️ 딥 러닝 도전과제 

 

torchtext에서 OSErorr를 만나 해결해보려고 pytorch를 uninstall 해보고 다시 다운 받아보고 가상공간에서 다시 시도해보고 많은 시도를 했고 pytorch를 다운 받을 때 많은 시간이 소요되었다.

 

결국 튜터님을 찾아가서 물어보았고 답은 정말 간단했다. torch에서 최신버젼부터 window에는 text를 지원하지 않아서 그렇다고 한다.

 

그래서 pytorch를 다운그레이드 시켜주어서 해결하였다.

더보기

pip install torch==2.2.2 torchtext==0.17.2

 

이제 OS문제를 해결했으니 도전과제를 시작하였다.

 

도전과제를 진행한게 벌써 5일이 지났다.

 

딥러닝 모델인 LSTM모델을 구현하다가 시간이 너무 오래걸려서 포기하고 머신러닝에 대한 이해도 부터 높여야겟다는 생각으로 머신러닝 모델 학습을 진행해 왔었는데 너무 다 잊어 버리기 전에 다시 한번 복습한다는 생각으로 오늘 다시 딥러닝 모델 구현을 시도해 보았다.

 

우선 전처리, feature 분석, 데이터 시각화(막대그래프) 부분은 얼추 기억하고있어넘어가고 LSTM모델 학습 코드 공부를 진행했다.

 

  • torch.nn
더보기

import torch.nn as nn

- torch.nn 모듈은 신경망을 구축하기 위한 다양한 함수들을 포함한다.

- 주로 nn.Module, nn.Linear, nn.Conv2d, nn.ReLU 등 신경망의 계층을 구성하거나 손실 함수를 정의할 때 사용한다.

 

그럼 여기서  nn.Module, nn.Linear, nn.Conv2d, nn.ReLU 등을 정의하는 이유를 알아보자

 

nn.Module

목적: 모든 신경망 레이어와 모델의 기본 클래스이다.

역할: 사용자 정의 신경망을 만들 때 nn.Module을 상속받아 신경망 계층들을 구성하고, forward()메서드를 정의해 데이터를 순차적으로 전달하는 방식을 설계한다.

장점: 자동 미분, 학습, 평가 모드를 쉽게 전환 가능, 신경망의 구조를 객체 지향적으로 구성하여 코드의 재사용성과 관리성 높여준다.

 

nn.Linear

목적: 인공신경망에서 완전 연결(filly connected, FC) 계층을 나타내는 클래스

역할: 입력 데이터를 가중치와 곱하고, 편향(bias)를 더하는 "선형 변환"을 수행한다. 주로 신경망의 출력층이나 중간층에 사용

장점: 입력과 출력 차원을 지정하여 데이터를 학습 가능한 파라미터(가중치와 편향)를 통해 변환함으로써 모델이 데이터의 특성을 학습하도록 도와준다.

 

nn.Conv2d

목적: 2차원 합성곱(convolution) 연산을 수행하는 계층(이미지 처리)

역할: 입력 데이터(예: 이미지)에서 특징(feature)을 추출하는 데 중요한 역할이며, 필터(커널)를 사용하여 입력 데이터를 슬라이딩하며 연산을 수행하고, 이미지의 특정 패턴이나 특징을 학습

 

nn.ReLU

목적: Rectified Linear Unit 활성화 함수로, 입력 값을 양수는 그대로 유지하고 음수는 0으로 만드는 비선형 함수다.

역할: 신경망에 비선형성을 추가하여 더 복잡한 패턴을 학습할 수 있게 합니다. 이는 선형 연산만으로 이루어진 모델이 해결하지 못하는 문제를 해결하도록 도와준다.

장점: 기울기 소실 문제를 방지, 대부분 신경망에서 기본 활성화 함수로 자주 사용한다.

 

  • optim
더보기

import torch.optim as optim

- 매개변수를 학습하기 위한 최적화 알고리즘을 제공하는 모듈이다.

- 다양한 최적화 알고리즘(SGD, Adam, RMSprop)이 포함, 이를 통해 모델의 손실을 줄이는 방향으로 학습이 진행 된다.

 

  • get_tokenizer
더보기

from torchtext.data.utils import get_tokenizer

- torchtext 라이브러리에서 제공하는 유틸리티 함수로, 텍스트 데이터를 단어 또는 문장 단위로 나누기 위해 토크나이저를 생성할 때 사용한다.

- basic_english, spacy와 같은 다양한 옵션을 지정할 수 있어, 영어 텍스트와 같은 자연어 처리 작업에서 자주 활용한다.

- basic_english: 소문자 변환, 구두점 제거, 공백 기준 분리

- spacy: 언어 모델 기반 처리(사전 훈련된 언어 모델을 사용해 문장을 토큰으로 분할한다.), 품사 태깅(각 단어에 대한 푸사정보를 제공한다.), 형태소 분석(단어의 기본형과 어근을 추출하는데 도움을 준다.), 구두점 처리 및 특수문자 구분

 

  • build_vocab_from_iterator
더보기

from torchtext.vocab import build_vocab_from_iterator

- 텍스트 데이터로부터 어휘 집합(vocabulary)를 생성한다.

- 모든 단어를 순회하며 고유한 단어를 모아 어휘집합을 만들고 단어를 정수로 매핑할 수 있는 사전을 생성한다.

- 자연어를 수치화하여 모델이 학습할 수 있는 형태로 만드는데 필수적이다.

 

  • torch.utils.data.Dataset
  • torch.utils.data.DataLoader
더보기

from torch.utils.data import DataLoader, Dataset

torch.utils.data.Dataset:

PyTorch의 데이터셋 클래스이며. 데이터를 불러오기 위해 이 클래스를 상속하여 사용자 정의 데이터셋을 구성할 수 있다.

 

torch.utils.data.DataLoader:

- Dataset에서 정의한 데이터셋을 배치 단위로 로드하고, 모델 학습을 위한 미니 배치를 생성하는 역할을 한다.

- DataLoader는 데이터를 배치로 분리하고 섞는(shuffle) 기능을 제공하여 학습 과정에서 데이터의 순서가 고정되지 않도록한다.

 

배치(Batch):

- 모델학습시 한 번에 처리할 데이터 샘플의 전체 집합을 의미한다. (100개의 데이터 샘플이있다면 하나의 배치에는 100개의 샘플이 들어 간다.)

 

미니 배치(Mini - batch):
전체 배치를 더 작은 그룹으로 나누어 처리하는 방식이다. 모델 학습 시 전체 데이터셋을 몇 개의 작은 그룹(미니배치)로 나누고, 각각의 미니 배치를 순차적으로 사용해 학습을 진행한다(100개의 샘플일 경우 배치크기(batch size를 10으로 설정하면 10개의 미니배치로 나위게 된다.)

 

.item메서드

- 스칼라 값을 가진 텐서에서 단일 값을 추출할 때 사용

- 손실(loss) 값이 단일 숫자 값으로 나오는 경우, 이 값을 item()을 통해 Python의 기본 자료형으로 변환

- 하나의 값만을 담고 있는 텐서에 대해서만 사용 가능

- tensor.tolist()를 사용하여 전체를 리스트로 변환하는 방법을 사용가능


☑️ GitHub

오늘 OSError를 해결하며 시간이 너무 비어서 github에서 포트폴리오를 만들기 위한 본인의 홈페이지를 만드는 시간을 가졌다.

 

우선 새로운 repositories를 만들어야한다.

 

만들 때 설정으로는

 

이름을

Repository name: 원하는 이름.github.io

 

Public 클릭

 

Add a README file 클릭

 

create repository 클릭

 

이제 새로운 레포지토리에서

 

+ 버튼 클릭

 

Create new file 클릭

 

name에 Create index.html 작성

 

Code에

<html>
  <body>
    <h1>한검 포트폴리오 만들기!</h1>
  </body>
</html>

를 작성해준다.

 

setting에 들어가 page 클릭

 

Branch에서 None을 Main으로 바꾸고 save클릭을 하게 되면 페이지 위쪽에 홈페이지 주소가 만들어진다.

 

여기까지 진행하였고 시간이 빌때나 주말에 홈페이지에 테마 추가를 진행해보려고 한다.

 

오늘은 모든 내용에 나의 생각이 들어가있으며 학습을 많이 진행하지목해 회고는 따로 작성하지 않았습니다.

+ Recent posts