👩‍💻LEARN : ML&Data/Book Study

[딥러닝 파이토치 교과서] #4. 딥러닝 시작

쟈니유 2023. 4. 11. 18:11
728x90

 

사실 앞에 머신러닝 기법 파이토치로 구현하느 것도 있는데 정리 안하고 패스함..패스패스...

그렇다고 다 안다는 뜻은 아님... 그냥 코드로 구현하고 지쳤을뿐...

 

기존 텐서로 구현하던 것들을 이제 파이토치로 구현하는 법을 알면 되니까

짱쉬울줄 알았는데, 생각보다...음...?^^?? 하게 되는 부분이 많다. 아무래도 코딩 더 열심히 해야겠지 그렇지... 

 


#4. 딥러닝 시작 

 

1. 딥러닝 용어

가중치(w)

입력값이 연산 결과에 미치는 영향력을 조절하는 요소. wx+b에서 w 

가중합(sum(wx+b))

전달함수라고도 하며, 각 노드에서 들어온 신호에 가중합을 곱한 값을 모두 더한 합계 

가중합이 계산되면 이를 활성화 함수로 넘긴다. 

활성화 함수

가중합을 출력할 때 일정 기준에 따라 출력값을 변화시키는 비선형 함수 

 

  • 시그모이드
    • 1 / (1+np.exp(-x)) 
    • 선형함수의 결과를 0-1 사이에서 비선형 형태로 변형
    • 로지스틱 회귀 등 분류에 사용하나 기울기 소멸 문제로 딥러닝에선 사용 적음 
  • 하이퍼볼릭 탄젠트
    • 선형함수의 결과를 -1 ~1 사이에서 비선형 형태로 변형 
    • 기울기 소멸 문제 있음 
  • 렐루
    • 입력값(x)이 음수일땐 0, 양수일땐 x출력
    • 경사하강법에 영향주지 않고 기울기 소멸 문제 발생하지 않아 은닉층에 주로 사용 
    • 음수값 입력 시 항상 0 이기 때문에 학습 능력 저하 이슈 
  • 리키렐루
    • 입력값이 음수이면 0이 아닌 0.0001 등의 매우 작은 수를 반환하여 렐루 문제 해결 
  • 소프트맥스
    • 입력값을 0-1 사이로 정규화하여 출력값들의 총합이 항상 1이 되게 함
    • 딥러닝의 출력 노드의 활성화 함수로 많이 사용됨 
    • yk = exp(ak) / sum(exp(an) )
      • exp : 지수함수 , n:출력층의 뉴런 개수, k : k번째 
class Net(torch.nn.Module):
	def __init__ (self,n_feature,n_hidden,n_output):
    	super(Net,self).__init__()
        self.hidden = torch.nn.Linear(n_feature,n_hidden) #은닉층
        self.relu = torch.nn.Relu(inplace=True)
        self.out = torch.nn.Linear(n_hidden,n_output)
        self.softmax = torch.nn.Softmax(dim=n_output)
    def forward(self,x):
    	x = self.hidden(x)
        x = self.relu(x)
        x = self.out(x)
        x = self.softmax(x)
        
    return x

손실함수

손실함수 = 오차를 구하는 방법

 

  • 평균제곱오차(MSE)
    • 실제값과 예측값의 차이를 제곱하여 평균 낸 것 
    • 회귀에서 손실함수로 주로 사용됨 
import torch

loss_fn = torch.nn.MSELoss(reduction='sum') #loss 정의 
y_pred = model(x) #앞에 만든 모델에 x값 넣어서 예측값 도출하기
loss = loss_fn(y_pred,y)
  • 크로스 엔트로피 오차
    • 분류 시 데이터 출력을 구분하기 위해 시그모이드를 사용하나, 이 경우 평균제곱오차를 적용할 때 매끄럽지 않은 그래프가 출력됨.
    • 이를 방지하기 위해 크로스 엔트로피 손실 함수를 사용하며 이 손실 함수를 적용하게 되면 경사 하강법 중, 지역 최소점에 멈출 수 있기 때문에 이를 방지하기 위해 자연 상수에 반대되는 자연 로그를 출력값에 취함 
    • 분류문제에서 원핫인코딩이 진행되었을 때만 사용할 수 있는 오차 계산법 
    • - sum(yn * log yn_hat)
      • yn_hat = 신경망이 추정한 값 
      • yn = 정답 레이블 
      • n = 데이터 차원의 개수 
loss = nn.CrossEntropyLoss()

#randn : 평균 0, 표준편차 1인 가우시안 정규분포를 이용한 5*6 텐서 생성 
input = torch.randn(5,6,requires_grad = True)
#empty : dtype에 해당하는 랜덤값으로 채워진 텐서를 반환 
target = torch.empty(3, dtype=torch.long).random(5)

output = loss(input,target)
output.backward()

 

 

2. 딥러닝 학습

순전파

  • 훈련데이터 input
  • 이전 층의 노드에서 수신한 정보에 변환 (가중합, 활성화 함수)을 적용하여 다음 층의 뉴런으로 전송 
  • 모든 층 통과 시 output 도달 

역전파

  • 예측값과 실제 값의 차이를 추정(w/손실함수)
  • 손실함수비용이 0에 가깝게 만들기 위해 모델 훈련 반복하며 가중치 업데이트 (역으로 전파됨)
    • 예측값과 실제값의 차이를 각 노드의 가중치로 미분한 다음 기존 가중치 값에서 빼는 것 
  • 계산된 각 노드의 결과를 또다시 순전파의 가중치 값으로 사용하며 위 내용 반복 

3. 딥러닝의 문제점과 해결방안 

문제점 1. 과적합

훈련데이터를 과하게 학습할 경우 발생 

실제데이터에 대해서는 오차가 증가함 

 

해결방안1. 드롭아웃

학습과정 중 임의로 일부 노드들을 학습에서 제외시키는 것 

def DropoutModel(torch.nn.Module):
	def __init__(self):
    	super(DropoutModel,self).__init__()
        self.layer1 = torch.nn.Linear(~)
        self.dropout1 = torch.nn.Dropout(0.5)
        self.layer2 = torch.nn.Linear(~)
        self.dropout2 = torch.nn.Dropout0.5)
        self.layer3 = torch.nn.Linear(~)
        
    def forward(self,x):
    	x = F.relu(self.layer1(x))
        x = self.dropout1(x)
        x = F.relu(self.layer2(x))
        x = self.dropout2(x)
        
        return self.layer3(x)

문제점2. 기울기 소멸

역전파 시, 출력층에서 은닉층으로 전달되는 오차가 크게 줄어들어 학습이 되지 않는 현상. 

해결방안2. 다른 활성화 함수 사용 

sigmoid, 탄젠트 대신 렐루를 사용하면 해결! 

문제점3. 성능이 나빠짐

경사하강법 수행 시, 기울기가 0에 가까운 , 기울기가 낮은 쪽으로 계속 이동하는 과정에서 성능이 나빠짐

 

해결방안3.  다양한 경사하강법 사용 

배치경사 하강법

  • 전체(whole) 데이터 셋에 대한 오류를 구한 후 기울기를 한번만 계산하여 모델의 파라미터를 업데이트 
  • 즉 전체 훈련 데이터 셋에 대한 가중치를 편미분 하는 방법을 의미 
  • 모든 훈련 데이터 셋을 사용하기 때문에 학습이 오래 걸림 

 

확률적 경사 하강법

  • 임의로 선택한 적은 데이터에 대해서 기울기를 계산
  • 데이터가 적기 때문에 속도는 빠르지만 파라미터 변경 폭이 불안정 

미니 배치 경사 하강법

  • 전체 데이터 셋을 미니 배치 여러개로 나눈 다음, 미니 배치 하나마다 기울기를 구하고 모든 미니 배치의 평균 기울기를 이용하여 모델 업데이트 
#우선 임의의 데이터 셋을 가정 
class CustomDataset(Dataset):
	def __init__(self):
    	self.x.data = [[1,2,3,],[4,5,6],[7,8,9]]
        self.y.data = [[12],[18],[11]]
        def__len__(self):
        	return len(self.x.data)
        def__getitem__(self,idx):
        	x = torch.FloatTensor(self.x.data[idx])
            y = torch.FloatTensor(self.y.data[idx])

dataset = CustomDataset()
#배치 사이즈와 셔플여부(랜덤추출) 
dataloader = DataLoader(dataset, batch_size = 2 , shuffle=True)

 

 

4. 딥러닝 알고리즘

심층신경망(DNN)

  • 입력층 - 출력층 사이 다수의 은닉층을 포함한 인공신경망으로, 비선형 분류가 가능함
  • 장점 : 다양한 비선형적 관계 학습 
  • 단점 : 학습 연산량이 많고 기울기 소멸 문제 발생 가능하여 드롭아웃, 렐루함수, 배치정규화 등을 사용함 

합성곱 신경망(CNN)

  • 합성곱층, 풀링층을 포함하는 이미지 처리 성능이 좋은 인공 신경망 알고리즘으로, 영상 및 사진이 포함된 이미지 데이터에서 객체를 탐색하거나 객체 위치를 찾는 데 유용함 
  • VGG, ResNet, LeNet-5 등등...

순환 신경망(RNN)

  • 시간 흐름에 따라 변화하는 데이터를 학습하기 위한 인공 신경망으로 자기 자신을 참조하여 현재 결과가 이전 결과와 연관 있게 함 
  • 기울기 소멸 이슈가 있어 메모리 개념을 도입한 LSTM을 많이 사용함 
  • 자연어처리에 굿 

제한된 볼츠만 머신

  • 가시층과 은닉층으로 구성된 모델로, 가시층은 은닉층과만 연결됨 (가시층-가시층, 은닉층-은ㅣㄱ층 연결은 없음)
  • 차원 감소, 분류, 선형회귀, 협업필터링, 특성값 학습, 주제 모델링에 사용됨
  • 기울기 소멸 문제 해결하기 위한 사전 학습 용으로도 활용함 
  • 심층 신뢰 신경망의 요소로도 활용됨 

심층 신뢰 신경망(DBN)

  • 사전 훈련된 제한된 볼츠만 머신을 블록처렁 여러 층으로 쌓은 형태로 연결된 신경망
  • 레이블이 없는 데이터에 대한 비지도학습이 가능함 
  • 일반화 (부분이미지에서 전체 연상), 추상화 과정 구현에 유용