Deep Learning_3

YJ·2023년 6월 27일
0

▷ 오늘 학습 계획: 딥러닝 강의(7~9)

📖 04_Review of Deep Learning

AI, ML, DL

  • 인공지능: 기계가 사람의 행동을 모방하게 하는 기술
  • 기계학습: 기계가 일일이 코드로 명시하지 않은 동작을 데이터로부터 학습하여 실행할 수 있도록 하는 알고리즘을 개발하는 연구 분야
  • 딥러닝: 기계 학습의 한 분야인 인공 신경망에 기반하여 많은 양의 데이터를 학습해 뛰어난 성능을 이끌어내는 연구 분야

뉴런과 회귀, 분류

  • 뉴런의 그래프 표현
    보통 신경망은 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
    여러 경우의 수 중 한가지에 속할 확률을 표현

CNN 계열의 네트워크

  • 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로 채널을 줄였다가 다시 확대

📖 05_Basic of Pytorch

import torch
x = torch.tensor(3.5, requires_grad=True) # 기울기 계산
y = (x-1) * (x-2) * (x-3)
y.backward()
x.grad

torch.nn.Linear(in_features, out_features, bias=True)

Boston 집값 예측

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))

Breast cancer

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)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글