일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- LLM
- 유튜브자막 추출
- Zoom 자막 추출
- 유튜브자막다운로드
- deepseek
- 도봉1기llm
- Zoom 영상 자막 다운
- 영상 자막 추출
- 도봉1기
- JAVA EE Integration
- 새싹LLM강의
- RandomSearchCV
- 유튜브자막 추출하는법
- SeSAC
- ChatGPT
- GridSerarchCV
- 테스트데이터
- 나타나지 않을 때
- 안지워지는이유
- (도봉 SW 1기) LLM 활용 인공지능 서비스 개발자 양성과정
- Zoom자막
- randomstate
- hyperparameter-optimization
- 딥시크
- One-Hot encoding
- 노션 countif
- 개발자도구로 영상자막 다운받는법
- Raytune
- 하이퍼파라미터최적화
- Optuna
- Today
- Total
잇연
[sesac LLM] day40-240228 DL binary classification 이진분류 본문
복습
single nueron model인 퍼셉트론은 선형 모델로 구성된다. input값과 그 입력의 weight가 곱해져 모델이 만들어진다. 가중치(weight)와 편향(bias)은 모델의 매개변수로, 모델의 출력을 결정한다. 각각의 입력에 대해 강도를 곱해야 하므로, 입력(input)값과 강도(weight)의 크기는 일치해야 한다. 예를 들어, (1,3)이 입력되면 (3,1)의 가중치(weight)를 갖게 되며, 이를 기반으로 하나의 출력값이 생성된다. 이 출력값과 정답값 사이의 오차를 계산하여, 경사 하강법을 사용해 가중치를 조금씩 업데이트한다.
wieght, bias는 연구자가 지정하지 못하고 모델이 조금씩 변화하면서 바꿀 수 있는 값들이다. 경사하강법을 통해서 weight와 bias의 최적의 값을 만들어나가는 것이다.
모델의 예측값과 정답값 사이에 오차를 최소화하는 과정이라고 생각하면 된다.
x가 input값, w가 가중치, y가 예측값이라고 할 때 MSE(Mean Square Error)로 구하면,
(wx-y)^2이렇게 나타낼 수 있다.
이 식을 그림으로 나타내면 아래와 같다.
이 식을 일반화하면 aw^2 -bw +c이렇게 나타낼 수있다. 최적의 w를 구해야하는 것이 결국 모델이 하는 일.
이 w의 변화량, 이 미분값을 가지고 현재 위치에서 어느방향을 갈지 업데이트를 하는 과정을 거치는데, 미분을 통해서 방햐을정하고, 그것을 w에 업데이트 해주는 방식인 것이다.
처음 설정한 w값이 최소 값의 오른쪽이었다면 기존 값에서 빼줘야하고
처음 설정한 w값이 최소값의왼쪽이라면 기존값에서 더해줘야한다.\\
기울기 구해보면 가운데 기준 왼쪽지점에서 웨이트가 출발했으면 기울기가 마이너스임 그래서 기울기에 마이너스 붙이는것.
웨이트의 보폭은 러닝레이트를 지정하여 결정한다. 최소지점으로 가는 속도라고 할 수 도잇음. 슷자를 크게 지정하면 지나쳐가버릴 수 도 있다.그래서 작게 설정하는 것이 좋다.
이진분류 실습
tensor_logistic_regression 실습
1. import, 데이터선언
import torch # PyTorch 라이브러리를 임포트합니다.
import torch.nn as nn # PyTorch의 신경망 모듈을 임포트합니다.
import torch.optim as optim # PyTorch의 최적화 알고리즘 모듈을 임포트합니다.
# 데이터 선언
x_data = torch.tensor([[5.], [30.], [95.], [100.], [265.], [270.], [290.], [300.], [365.]], dtype=torch.float32) # 입력 데이터를 선언합니다.
y_data = torch.tensor([[0.], [0.], [0.], [0.], [1.], [1.], [1.], [1.], [1.]], dtype=torch.float32) # 출력(목표) 데이터를 선언합니다.
x_data는 입력데이터이자 학습데이터고
y_data는 출력데이터이자 학습데이터의 정답값이다.
기존과 다르게, y_data가 0,1로 이루어져있어 이진 분류 문제로 볼 수 있다.
2. 모델 정의,생성
# 퍼셉트론 모델 구현
class PerceptronModel(nn.Module): # 퍼셉트론 모델 클래스를 정의합니다.
def __init__(self): # 모델의 구조를 정의하는 생성자를 정의합니다.
super(PerceptronModel, self).__init__() # nn.Module의 생성자를 호출합니다.
self.layer = nn.Linear(1, 1) # 선형 변환(Linear transformation)을 수행하는 층을 생성합니다.
def forward(self, x): # 모델의 순전파를 정의합니다.
x = torch.sigmoid(self.layer(x)) # 선형 변환 후, 시그모이드 활성화 함수를 적용합니다.
return x # 변환된 값을 반환합니다.
# 모델 인스턴스 생성
model = PerceptronModel() # 정의한 퍼셉트론 모델의 인스턴스를 생성합니다.
super(PercpetronModel, self).__init__()생성자를 호출해주고 super().__init__() 이렇게 생략해줄 수 있다.
class 퍼셉트론모델(nn.Module을 상속함):
def 초기화 함수(퍼셉트론모델 자신에 대해):
상속받은 nn.Module의 초기화 함수를 호출함
선형 변환을 수행하는 층을 생성하며, 이 층은 입력 차원과 출력 차원이 모두 1인 상태로 설정됨
3.손실함수 및 옵티마이저 정의
# 손실 함수 및 옵티마이저 정의
optimizer = optim.SGD(model.parameters(), lr=0.01) # 확률적 경사 하강법(Stochastic Gradient Descent)을 최적화 알고리즘으로 사용합니다.
criterion = nn.BCELoss() # 이진 교차 엔트로피(Binary Cross Entropy) 손실 함수를 사용합니다.
4. 모델 학습
# 모델 학습
epochs = 2000 # 총 에포크 수를 선언합니다.
for epoch in range(epochs): # 각 에포크에 대해서
# Forward pass
outputs = model(x_data) # 모델에 입력 데이터를 전달하여 출력을 얻습니다.
loss = criterion(outputs, y_data) # 출력과 목표 데이터의 차이를 손실 함수를 통해 계산합니다.
# Backward and optimize
optimizer.zero_grad() # 이전에 계산된 경사를 0으로 초기화합니다.
loss.backward() # 손실에 대한 경사를 계산합니다.
optimizer.step() # 경사를 사용하여 모델의 파라미터를 업데이트합니다.
# Accuracy
predicted = (outputs > 0.5).float() # 출력이 0.5보다 크면 1, 아니면 0으로 예측합니다.
acc = (predicted == y_data).float().mean() # 예측이 목표 데이터와 일치하는 비율을 계산하여 정확도를 얻습니다.
if (epoch+1) % 200 == 0: # 200 에포크마다
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}, Acc: {acc.item():.4f}') # 현재 에포크, 손실 및 정확도를 출력합니다.
# 테스트 데이터 준비
test_data = torch.tensor([[7.], [80.], [110.], [180.], [320.]], dtype=torch.float32) # 테스트 데이터를 선언합니다.
# 모델을 통해 테스트 데이터 예측
with torch.no_grad(): # 경사 계산을 수행하지 않음을 지정합니다.
predictions = model(test_data) # 테스트 데이터를 모델에 전달하여 예측을 얻습니다.
print("Test Data 예측 값:") # 예측 값을 출력합니다.
for i, test_val in enumerate(test_data, start=1): # 각 테스트 데이터에 대하여
print(f"Test {i}: input: {test_val.item()}, output: {predictions[i-1].item()}") # 입력 값과 예측 값을 출력합니다.
이진분류에서 mse를 쓰면 학습이 잘안된다.
왜 그럴까에 대해서 배워보자.
이론
선현모델처럼 직선으로 구분하려면 분류가 어려운 경우가 있다. 하지만 curve로 fitting하면 분류가 가능하다. 0,1을 잘 구분할 수 있게 된다.
이것을 가능하게 하는 것이 activation function이다. 선형모델을 비선형으로 만들어주는 activation function , 활성화 함수이다.
activation function으로 선형을 비선형으로 만들어준다. XW가 선형모델이고 g(XW)를 거치고 나면 커브가 생긴다. 이 커브 피팅을 통해서 일정한 threshold를 잡고 threshold보다 낮으면 0, 높으면 1으로 디시전 바운더리를 결정할 수 있는 경계선을 확실히 구분할 수 있게 되었다.
대표적인 activation function은 시그모이드이다.
MSE로 비용함수를 지금까지 구해왔는데, 분류는 잘 되지 않음.
굴곡이 계속 생김. 차이가 계속 벌어지거나 학습이 잘안된다.
그래서 classification을 위해서는 loss function을 cross Entropy로 써야한다.
이진분류이기 때문에 nn.BCELoss()로 써야하고 마지막 출력층에 activation funciton을 시그모이드로 넣어서 이진분류한다.
요약
선형회귀모델 ->self.layer = nn.Linear(x),로스계산에 MSE 사용,
로지스틱회귀모델(이진분류) -> x = torch.sigmoid(self.layer(x)), 로스계산에 BCELoss()사용
로지스틱 회귀 모델에서 시그모이드(Sigmoid) 함수를 사용하는 이유는 모델의 출력을 0과 1 사이의 값으로 변환하여 확률로 해석할 수 있게 하기 위해서이다.
'SESAC LLM 개발자 강의' 카테고리의 다른 글
[sesac LLM] day41-240229 DL 히든레이어,ReLu, Softmax (0) | 2024.02.29 |
---|---|
[sesac LLM] day38-240226 DL 딥러닝 첫수업, 퍼셉트론이란 (0) | 2024.02.27 |
[sesac LLM] day33-240219 ML 트리모델, 앙상블★ (0) | 2024.02.20 |
day29 240213 - [외부특강] 취업 특강 (0) | 2024.02.13 |
day27 - 세번째 강사님 첫 날 OT (앞으로의 커리큘럼에 대해서 설명) (0) | 2024.02.07 |