▷ 오늘 학습 계획: 딥러닝 강의(7~9)
뉴런의 그래프 표현
보통 신경망은 Graph의 Node(단일 뉴런 연산)와 Edge(뉴런의 연결성)를 이용해 표현한다.
Fully-connected layer(FC, Dense layer)
이전 계층과 모든 뉴런이 서로 연결된 계층
layer: 뉴런이 모인 한 단위(계층)
얇은 신경망
입력, 은닉, 출력의 3가지 계층
은닉 계층과 출력 계층이 fully connected
회귀
잡음이 있는 샘플로부터 규칙을 찾아 연속된 값의 출력을 추정
분류
입력 값을 분석해 특정 범주로 구분하는 작업
binary classification, multi-class classification
다중 분류
softmax 활성 함수 이용
얇은 신경망을 이용한 회귀
출력 계층의 활성 함수에 의해 달라진다. 보통 항등 함수 사용
회귀 문제에서의 출력 y=x로 설정하려면 activation function을 설정하지 않으면 된다.
얇은 신경망을 이용한 이진 분류
출력: 0~1 사이의 실수 값(sigmoid function)
출력을 두개로 해서 softmax를 적용할 수도 있다.
뉴런은 수학적으로 두 벡터의 내적으로 쉽게 표현할 수 있다.
FC: 여러 개의 뉴런을 한 곳에 모아둔 것, matrix 곱셈 연산으로 표현됨
input layer
아무런 연산이 일어나지 않는다.
신경망의 입력을 받아서 다음 계층으로 넘기는 역할
무엇을 입력으로 주어야 하는가?(특징 추출 문제)
계층의 크기 = node개수 = 입력 scaler 수 = 입력 vector의 길이
은닉 계층
입력 계층과 연결된 전결합 계층
복잡한 문제를 해결할 수 있게 하는 핵심적인 계층
출력 계층
은닉 계층 다음에 오는 전결합 계층
신경망의 외부로 출력 신호 전달
신경망의 기능은 출력 계층의 활성 함수에 의해 결정된다.
출력 계층의 크기 = 출력의 scaler 수 = 출력 vector의 길이
선형 회귀: 데이터를 가장 잘 표현하는 선형식을 찾는 동작(MSE 최소로)
다중 선형 회귀
변수가 추가될 때 마다 차원이 추가된다(직선→평면→초평면)
로지스틱 회귀: 범주형 데이터를 대상으로 하는 회귀(cross entropy 최소화)
sigmoid function
모든 실수 입력 값에 대해 출력이 정의됨
입력 값이 0에 가까울 수록 출력이 빠르게 변한다.
모든 점에서 미분 가능
cross entropy
정확히 맞추면 오차 0, 틀리면 오차가 무한히 증가하는 특징
one-hot encoding
한 개의 값만 1이고 나머지 값은 0인 벡터로 표현
희소 행렬(Sparse Vector)
희소 벡터: 대부분의 값이 0이고 크기가 있는 값이 희소하게 나타나는 벡터
벡터 전체를 표기하지 않고 숫자 하나로 표현 가능
softmax
각 입력의 지수함수를 정규화한 것
각 출력은 0~1 사이의 값
모든 출력의 합이 반드시 1
여러 경우의 수 중 한가지에 속할 확률을 표현
LeNET-5
ImageNet
AlexNet
GPU를 병렬로 사용
ZFNet
알렉스넷의 문제점 시각화를 통해 개선
모델 튜닝만으로 좋은 결과를 얻을 수 있다.
VGGNet
깊은 신경망, 3×3 convolutional filter만 사용
작은 필터로 깊은 네트워크 형성
이미지 특징을 추출할 때 많이 사용
일부 계층의 특징으로 스타일 생성
GoogLeNet
네트워크 속에 네트워크
스템: 도입부(일반적인 Conv-Pool-Conv-Pool 구조)
몸체: 인셉션 모듈 9개
최종 분류기: mean pooling을 통해 파라미터 수를 줄임
보조 분류기: 하위 계층에 gradient 전달(훈련때만)
GoogLeNet-인셉션 모듈
1×1, 3×3, 5×5 맥스풀링으로 구성
1×1 -> 채널의 특성 인식
3×3, 5×5 -> 서로 다른 크기의 영역에서 공간의 특징과 채널의 특징 인식
맥스풀링 -> 가장 두드러진 특징 인식
ResNet
최초로 사람의 인지능력보다 좋은 성능
152계층의 엄청난 깊이
redisual connection 구조
ResNet-bottlenet
3×3 Conv(특성 추출) 앞뒤에 1×1 Conv 배치
1×1 Conv로 채널을 줄였다가 다시 확대
import torch
x = torch.tensor(3.5, requires_grad=True) # 기울기 계산
y = (x-1) * (x-2) * (x-3)
y.backward()
x.grad
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
n_epochs = 2000
learning_rate = 1e-3
print_interval = 100
# 모델 수립
model = nn.Linear(x.size(-1), y.size(-1))
# optimizer
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 학습
for i in range(n_epochs):
y_hat = model(x)
loss = F.mse_loss(y_hat, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i+1) % print_interval == 0:
print('Epoch %d: loss=%.4e' % (i+1, loss))
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
data = torch.from_numpy(df[cols].values).float()
n_epochs = 200000
learning_rate = 1e-2
print_interval = 10000
class MyModel(nn.Module):
def __init__(self, input_dim, output_dim):
self.input_dim = input_dim
self.output_dim = output_dim
super().__init__()
self.linear = nn.Linear(input_dim, output_dim)
self.act = nn.Sigmoid()
def forward(self, x):
y = self.act(self.linear(x))
return y
# 모델, loss, optim 선언
model = MyModel(input_dim=x.size(-1),
output_dim=y.size(-1))
crit = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 학습 시작
for i in range(n_epochs):
y_hat = model(x)
loss = crit(y_hat, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i+1) % print_interval == 0:
print('Epoch %d: loss=%.4e' % (i+1, loss))
# acc 계산
correct_cnt = (y == (y_hat > .5)).sum()
total_cnt = float(y.size(0))
print('Accuracy: %.4f' % (correct_cnt / total_cnt))
# 학습 결과 dataframe
pd.DataFrame(torch.cat([y, y_hat], dim=1).detach().numpy(), columns=["y", "y_hat"])
▷ 내일 학습 계획: 딥러닝 강의(10~13)
[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]