인공지능/공부

딥러닝 개론 복습 1

이게될까 2024. 3. 14. 16:12
728x90
728x90

인공지능, 딥러닝, 머신러닝

딥러닝은 깊은 신경망이 있다는게 특징입니다.

머신러닝, 딥러닝

이렇게 봐도 너무 애매한데 이럴때 GPT죠

여우와 토끼 사진을 구분한다고 할 때 머신러닝은 인간이 사진을 보고 사진에서 토끼의 귀 길이, 여우의 귀 길이, 색, 크기 등을 컴퓨터에 입력해줘야 하는거고 딥 러닝은 사진만 던져주면 알아서 하는거야? 

네, 맞습니다! 머신러닝과 딥러닝을 여우와 토끼의 사진을 구분하는 상황으로 비교하면, 다음과 같이 설명할 수 있습니다:

머신러닝에서는 사람이 특징(feature)을 직접 정의하고 추출해야 합니다. 예를 들어, 여우와 토끼를 구분하기 위해 사람이 귀의 길이, 색, 크기 등을 사전에 정의한 특징으로 결정하고, 이 데이터를 기반으로 컴퓨터가 학습하여 여우와 토끼를 구분하게 됩니다. 이 과정에서 중요한 것은 얼마나 유의미하고 구분력 있는 특징을 사람이 정의하느냐에 달려 있습니다.

딥러닝은 사진과 같은 원시 데이터(raw data)를 직접 입력으로 받습니다. 딥러닝 모델, 특히 컨볼루션 신경망(CNN)과 같은 모델들은 데이터로부터 자동으로 특징을 추출하고 학습하는 능력을 가지고 있습니다. 즉, 사람이 사진에서 중요한 특징을 직접 정의할 필요 없이, 모델이 스스로 여우와 토끼를 구분하는 데 중요한 특징을 학습하게 됩니다. 이 과정은 훨씬 더 많은 양의 데이터와 복잡한 모델 구조를 필요로 하지만, 인간이 미처 인식하지 못하는 패턴이나 특징까지도 학습할 수 있는 장점이 있습니다.

딥러닝은 사진만 던져주면 스스로 학습할 수 있는 강력한 능력 덕분에 이미지 분류, 객체 탐지, 이미지 생성 등 다양한 영역에서 뛰어난 성능을 보이고 있습니다.

 

그러니까 머신러닝은 사진을 입력으로 받지 않는거지?

머신러닝은 사진을 직접적인 입력으로 받을 수도 있지만, 전통적인 머신러닝 방식에서는 사진이나 이미지를 원시 데이터(raw data)로 직접 사용하기보다는, 사진에서 특정 특징(features)을 추출하여 그 특징을 기반으로 학습하는 방식을 많이 사용합니다. 이 과정에서 사람이 이미지로부터 중요한 특징을 수동으로 추출하고 선택해야 합니다. 예를 들어, 이미지의 히스토그램, 에지(edge) 정보, 질감(texture), 색상 등의 특징이 이에 해당합니다.

딥러닝, 특히 컨볼루션 신경망(CNN)과 같은 모델들은 이러한 사전 특징 추출 과정 없이 원시 이미지 데이터를 직접 입력으로 받아, 모델 자체가 데이터로부터 중요한 특징을 자동으로 학습하고 추출할 수 있습니다. 이러한 점이 머신러닝과 딥러닝의 주요 차이 중 하나입니다.

따라서 머신러닝이 사진을 입력으로 받지 않는 것이 아니라, 전통적인 머신러닝 방식에서는 이미지를 직접적인 입력으로 사용하기보다는 사진으로부터 추출한 특징을 입력으로 사용하는 경우가 많습니다.

 

그러니까 머신러닝은 사진을 직접 받지 않고, 인간이 만든 알고리즘을 통해 추출된 사진의 특징을 받는다는거지 ?

맞습니다. 전통적인 머신러닝 방식에서는 대체로 사람이 이미지에서 중요하다고 판단하는 특징을 미리 정의하고, 이러한 특징을 추출하는 알고리즘을 통해 데이터를 처리한 후, 그 결과로 얻어진 특징을 모델의 입력으로 사용합니다. 이렇게 사람이 사전에 정의한 특징(feature engineering)에 크게 의존하는 것이 전통적인 머신러닝의 특징 중 하나입니다.

반면, 딥러닝 모델, 특히 컨볼루션 신경망(CNN) 같은 경우에는 이미지를 직접적인 입력으로 받아, 네트워크 스스로가 이미지 내 중요한 특징을 학습하고 추출할 수 있습니다. 이 과정은 사람의 개입 없이 자동으로 이루어지며, 모델이 스스로 최적의 특징을 찾아내는 것이 가능합니다. 이러한 자동 특징 추출(auto feature extraction) 능력이 딥러닝을 강력하게 만드는 주요 요소 중 하나입니다.

 

데이터랑 컴퓨팅 파워만 충분하면 딥러닝을 사용하지 않을 이윤 없어보이네요

 

머신러닝
머신러닝 학습
머신러닝 학습 과정

레이블 == 정답

머신러닝 학습 과정

데이터가 적으면 훈련을 시키는게 중요하므로 훈련용 데이트셋을 늘리고, validation도 사용하지 않을 수 있다.

 

지도학습
지도 vs 비지도

비지도에선 동그라미, 세모 모양도 없고 그냥 2차원 좌표만 있겠네여

강화 학습

 

 

딥러닝
딥러닝 기본 구조

저런 뉴런들이 엄청나게 많다고 생각하면 됩니다. 제가 단순하게 짠 코드들도 수천개가 들어있네요

딥러닝 학습 과정

오차를 구하는 법은 저 3개 말고도 여러가지가 있다는 점 !

배치가 작을 수록 학습은 작은 양의 데이터만 사용하기 때문에 빠를 수 있지만 이상치에 대한 영향이 커진다.

에폭은 너무 적다면 학습이 안될 수도, 너무 크다면 너무 많이 학습해서 오버피팅이 일어날 수 있다.

 

딥러닝의 성능
딥러닝 학습
딥러닝 역전파
딥러닝 이미지 분야
딥러닝 순환 신경마 RNN
딥러닝 비지도 학습

 

순방향 신경망

퍼셉트론 원리
XOR Gate

인공신경망 하나로는 XOR 게이트를 표현할 수 없는 문제가 생겼다.

 

비선형 문제는 어떻게 풀까?

sigmoid의 등장!
딥러닝 구조
딥러닝 용어
weight
bias

이 이름으로는 처음 들어보네요 ㅎㅎ,,...

 

activation function

 

이제 기울기 소실을 막기 위해 엄청 단순해 집니다.

ReLU

 

Leaky ReLU

 

soft max

소프트 멕스에서 exp를 사용한다는 것을 꼭 반영해줘야 합니다......

 

 

loss function
평균 제곱 오차 MSE
사용법

 

이진 분류 loss 구하기

 

다중 분류 loss 구하기
cost function

이 것 말고도 다양한 cost function들이 있으니 찾아서 사용해보면 된다.

이런 코드를 쓴다는데 저는 ....

import torch
import torch.nn as nn
import torch.nn.functional as f
import torch.optim as optim
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from google.colab import drive
drive.mount('/content/drive')
data = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/health.csv")
h = torch.FloatTensor(np.array(data[["H"]]))
w = torch.FloatTensor(np.array(data[["W"]]))
lr = 0.00001
epochs = 500000
bathsize = 10
dropout = 0.1
model=nn.Sequential( nn.Linear(1,2,bias =True),
                     nn.BatchNorm1d(2), #레이어가 이어지는 숫자만큼
                     nn.Sigmoid(),
                     nn.Dropout(dropout),
                     nn.Linear(2,2,bias =True),
                     nn.ReLU(),
                     nn.Dropout(dropout),
                     nn.Linear(2,1,bias =True),
                     )
optimizer = optim.Adam(model.parameters(),lr=lr,betas=(0.9,0.999))
dataset=TensorDataset(h,w)
dataloader = DataLoader(dataset, batch_size= bathsize,shuffle=True)
# model.weight.data = torch.nn.Parameter(torch.Tensor([[0.1]]))
# model.bias.data = torch.nn.Parameter(torch.Tensor([[-0.5]]))

#model_final=nn.Sequential(model)
loss_graph=[]
for k in range (epochs +1):
    optimizer.zero_grad()
    cost = f.mse_loss(model(h),w)
    cost.backward()
    optimizer.step()
    if k % (epochs / 10) == 0:
      print(k, cost.item())
      loss_graph.append(cost.item())

이렇게나

Conv1 = nn.Conv2d(in_channels=1,out_channels=3,kernel_size = 3,stride=2, padding=1,dilation=1,groups=1,bias=True)
Conv2 = nn.Conv2d(in_channels=3,out_channels=3,kernel_size = 3,stride=2, padding=1,dilation=1)
relu = nn.ReLU()
maxpool=nn.MaxPool2d(2)
model=nn.Sequential(nn.Conv2d(in_channels=1,out_channels=6,kernel_size = 5,stride=1, padding=2,dilation=1,groups=1,bias=True),
                    relu,
                     nn.MaxPool2d(kernel_size = 2,stride = 2,padding = 0, dilation = 1, ceil_mode= False),
                    nn.Conv2d(in_channels=6,out_channels=16,kernel_size = 5,stride=1, padding=0,dilation=1,groups=1,bias=True),
                     relu,
                    nn.MaxPool2d(kernel_size = 2,stride = 2,padding = 0, dilation = 1, ceil_mode= False),
                    nn.Flatten(),
                    nn.Linear(400,120,bias =True),
                    relu,
                    nn.Linear(120,84,bias =True),
                    relu,
                    nn.Linear(84,10,bias =True),
                    nn.Softmax(dim = 1)
                     ).to(device)

이렇게 많이 만들었네요 ㅎㅎ,,

 

신경망 학습

 

딥러닝 학습 과정
forward
backpropagation

 

이진분류 문제
다중분류문제

 

이전부터 계속 나왔던 진행 과정

forward Propagation

 

다중 분류로 갑시다.

 

optimization

오차를 미분한 값의 반대방향으로 진행한다.

경사하강법 진행 내용

 

 

Learning rate

 

역전파 시작?

역전파 과정이다. 결국 마지막엔 (z3 - y)만 남은것을 볼 수 있다.

이제 체인룰에 의해 앞부분도 진행된다.

 

오버피팅

 

 

drop out
over fitting 해결법
예시코드
gradient descent

 

 

 

BGD

 

SGD

 

 

728x90