딥러닝은 크게 3단계로 이루어짐
딥러닝에서 학습을 할 때 문제점은 OVERFITTING이다.
=> 최근에는 CNN-RNN의 하이브리드 모델도 많이 사용되고 있다.

원래 선형회귀분석에서는 직선의 방정식인 H(x)를 y(상수)와의 차이를 제곱하고 평균을 내주면 2차함수가 된다.
최적화가 가능해진다(즉, 그 코스트함수가 제일 작아지는 W 값을 구할 수 있음)
(H(x) - y) => 예측값 - 실제값 이다.
W가 최소가 되는게 좋음
이를 위해 경사하강법이 필요하다.
import torch
x_train = torch.FloatTensor([[1,2], [2,3], [3,4], [4,4], [5,3], [6,2]])
y_train = torch.FloatTensor([[0], [0], [0], [1], [1], [1]])
w = torch.randn([2,1], requires_grad=True)
b = torch.randn([1], requires_grad=True)
optimizer = torch.optim.SGD([w,b], lr=0.01)
# [딥러닝의 1단계]: 모델을 만든다.
def H(x) :
return torch.sigmoid(torch.matmul(x, w) + b) # H(x) = sigmoid(Wx + b)
# [딥러닝의 2단계] 학습을 한다
for stmp in range(2000):
cost = -torch.mean(y_train * torch.log(H(x_train))+(1-y_train) * torch.log(1-H(x_train)))
optimizer.zero_grad()
cost.backward()
optimizer.step()
# [딥러닝의 3단계] 추론/테스트를 한다.
x_test = torch.FloatTensor([[6,4]])
print(H(x_test))
print(H(x_test).detach())
print(H(x_test).detach().item())

최적화에서 가장 일반적으로 사용되는 최적화 알고리즘 중 하나
주어진 cost함수 또는 손실함수의 값을 최소화 하기 위해 사용한다.
경사하강법 과정
초기화: 먼저 경사 하강법을 시작하기 전에 파라미터(가중치와 편향)를 임의의 값으로 초기화한다. (시작점 설정)
예측: 초기화된 파라미터를 사용하여 모델에 입력 데이터를 제공하고 예측값을 계산한다.
비용 계산: 예측값과 실제 타겟 값 사이의 차이를 계산하여 비용(손실)을 측정한다. 이 비용은 모델이 얼마나 잘 예측했는지를 나타냅니다. (MSE, 크로스 엔트로피 사용)
경사 계산: 비용 함수의 기울기(경사)를 계산한다. 이는 현재 파라미터 위치에서 비용 함수의 기울기를 나타내며, 이를 통해 우리는 비용을 줄이는 방향을 결정할 수 있다.
파라미터 업데이트: 경사의 반대 방향으로 일정한 거리(학습률)만큼 이동하여 새로운 파라미터를 업데이트한다. 이는 현재 위치에서 비용 함수를 최소화하는 방향으로 파라미터를 업데이트하는 과정입니다
종료 조건 확인: 미리 정해진 종료 조건을 확인하고, 만족할 때까지 2번부터 5번의 과정을 반복한다. 종료 조건은 주로 특정 반복 횟수에 도달하거나 비용 함수의 변화가 미미할 때 종료하는 등의 방식으로 설정됩니다.
학습 종료: 종료 조건을 만족하면 경사 하강법의 학습이 종료한다. 이 때의 파라미터는 비용 함수를 최소화하는 값으로 수렴함
이진 분류의 예시



import torch
x_train = torch.FloatTensor([[1,2], [2,3], [3,4], [4,4], [5,3], [6,2]])
y_train = torch.FloatTensor([[0], [0], [0], [1], [1], [1]])
w = torch.randn([2,1], requires_grad=True)
b = torch.randn([1], requires_grad=True)
optimizer = torch.optim.SGD([w,b], lr=0.01)
# [딥러닝의 1단계]: 모델을 만든다.
def H(x) :
return torch.sigmoid(torch.matmul(x, w) + b) # H(x) = sigmoid(Wx + b)
# [딥러닝의 2단계] 학습을 한다
for stmp in range(2000):
cost = -torch.mean(y_train * torch.log(H(x_train))+(1-y_train) * torch.log(1-H(x_train)))
optimizer.zero_grad()
cost.backward()
optimizer.step()
# [딥러닝의 3단계] 추론/테스트를 한다.
print(H(x_train))
print('==========================')
#============================================================================
# 비선형 테스트
#============================================================================
x_train = torch.FloatTensor([[1,2], [2,3], [3,4], [4,4], [5,3], [6,2], [6,4]])
y_train = torch.FloatTensor([[0], [0], [0], [1], [1], [1], [0]])
print(H(x_train))
# [[0.1257], 0
# [0.1675], 0
# [0.2197], 0
# [0.6605], 1
# [0.9852], 1
# [0.9996], 1
# [0.9893]] 0

Q1) A인가 아닌가?
A1) 예 (이진분류에서 0.5보다 큰 값이 나옴) 0.99999Q2) B인가 아닌가?
A2) 예 (이진분류에서 0.5보다 큰 값이 나옴) 0.50001Q3) C인가 아닌가?
A3) 아니오=> A가 이 질문에 대한 가장 가까운 정답이다.