티스토리 뷰

반응형

0. 신경망은 무엇인가?

딥러닝이란 용어는 신경망을 학습시키는 것을 뜻한다. 신경망은 뉴런의 집합이다. 다시말하면, 입력(x)와 출력(y)를 매칭하여 함수를 찾는 과정이 딥러닝이고, 각각 하나의 입력과 출력을 매칭하는 것이 뉴런이다.

 

좀 더 들어가 보면, 여러개의 각기 다른 정보를 주면, 이러한 입력 특성을 가지고 신경망은 출력을 예측하는 것이다.따라서 충분한 양의 입력과 출력 정보를 주면, 신경망은 입출력을 연결하는 함수를 알아내는데 더욱 뛰어날 것이다.

 

+ 해당 뉴런에 관계없는 입력값이라도 입력으로 넣어주어야 한다. 관계 여부는 신경망이 학습하면서 알아서 조절해 준다.

 

신경망의 구조를 간단히 보면, 입력 데이터가 레이어에 들어가서 레이어에 있는 가중치를 토대로 결과값을 예측을 한다. 그리고 예측값과 타겟값(정답)과 비교 후에 손실 값을 만든다. 그리고 옵티마이저가 손실 값을 사용하여 네트워크 가중치를 업데이트 한다.

 

 

 

1. 신경망(Neural network)의 구조

1,1 딥러닝의 구성 단위: 층(layer)

 층은 하나 이상의 텐서를 입력받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈이다. 그리고 대부분의 층는 가중치를 가지고, 가중치란, 확률적 경사 하강법에 의해 학습되는 하나 이상의 텐서이고 이곳에 네트워크가 학습한 지식이 들어있다. 층마다 적절한 텐서 포맷과 데이터 처리 방식이 다르다.

  • (samples, features) : 2D 텐서 => 밀집 연결층(densely connected layer)인 완전연결층(fully connected layer)와 밀집 층(dense layer)에서 처리되는 경우가 많다. (dense란 클래스라고 생각하자.)
  • (samples, timesteps, features) : 3D 텐서 => 보통 LSTM 같은 순환 층(recurrent layer)에서 처리 된다.
  • 4D 텐서 => 2D 합성곱 층(convolution layer)에서 처리된다.(Conv2D)

 

모든 층은 특정 크기의 입력을 받고, 특정 크기의 출력 텐서를 반환한다.

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(32, input_shape=(784,)))
model.add(layers.Dense(10))

첫 번째 층을 보면 차원이 784인 2D 텐서만 입력으로 받는 층을 만들었다. 이 층은 차원의 크기가 32로 변환된 텐서를 출력한다. 그렇다면 아래의 텐서는 32차원 벡터를 받아야한다. 그렇지만, 케라스에서는 자동으로 상위 층의 크기를 맞추어 주기 때문에 적을 필요가 없다. 위 예에서는 두 번째 층을 보면 input_shape가 없다는 것을 알 수 있다.

 

1.2 손실 함수와 옵티마이저

 손실 함수와 옵티마이져는 학습에서 가장 중요한 열쇠라고 할 수 있다.

  • 손실 함수(loss function) = 목적함수(objective function) : 훈련하는 동안 최소화될 값이자 주어진 문제에 대한 성공 지표이다.
  • 옵티마이저(optimizer) : 손실 함수를 기반으로 네트워크가 어떻게 수정될지를 결정한다. 경사 하강법(SGD)를 구현한다.

여러 개의 출력을 가지는 신경망의 손실 함수는 하나가 아니다. 하지만, 경사 하강법 과정은 하나의 스칼라 손실 값을 기준으로 하기 때문에 손실이 여러 개인 네트워크는 모든 손실의 평균으로 하나의 스칼라 양을 만들어서 사용한다.

 

 

2. 필기체 숫자 인식의 기초

필기체 숫자 이미지에서 숫자 인식을 학습할 수 있는 신경망의 구조를 알아보자. 최근 개발되는 신경망은 아래와 같다.

  • Convolutionsal neural network => Good for image recongnition
  • Long short-tern memoty network => Good for speech recongnition

지금은 가장 기본적인 형태의 신경망을 집중해보자. 

Plain vanilla (aka "multilayer perceptron")

사실 이러한 기본 신경망으로도 컴퓨터가 숫자 손글씨를 인식하는데 충분하다. 신경망은 사람의 뇌를 본따서 만든것이다. 그러면 뇌와 신경망은 어떤 점이 유사할까?

신경망에서 하나의 뉴런(여기선 픽셀)은 0.0에서 1.0의 숫자를 가진다. 숫자는 밝기를 의미하고 1.0은 진한 픽셀이 된다. 신경망 안에서 이러한 숫자들은 입력값이라고 불린다. 입력값이 큰 숫자가 주어질 수록 각각의 신경망이 더 크게 활성화된다.  만약 28x28 픽셀로 이루어져 있다면, 총 784개의 뉴런이 신경망의 입력층을 구성하게 된다. 28x28을 한줄로 세우면 그것이 신경망의 시작(입력층=input layer)이라고 할 수 있다. 출력층은 총 10개의 뉴런을 가지고 0부터9까지의 숫자를 표현한다고 생각하면 된다. 그리고 출력층의 각각의 인덱스는 그 인덱스 뉴런이 속하는 숫자의 일치 정도를 퍼센테이지로 나타낸다. 10개의 뉴런 중 가장 확률이 높은 뉴런이 컴퓨터가 최종적으로 인식하는 숫자라고 생각하면 된다. 

 입력층과 출력층 사이에는 숨겨진층(Hidden layers)라고 불리는 몇 개의 층이 있다. 그러나 지금은 구조만 알아보면 되므로 넘어가도록 하자. 그리고 기본적으로 층에의 활성화(activation)가 다음 층의 활성화를 유도하는 방식으로 진행된다. 즉, 정보처리에서 가장 중요한것은 한 층에서의 활성화가 어떻게 다른 층의 활성화를 불러일으키는지에 관한 점이다. 이러한 점은 생물에서 몇 뉴런이 다른 뉴런의 활성화를 수반한다는 점에서 비슷하다.

 정리하면, 위에서 말한 784개의 뉴런이 활성화된 후에 활성화되는 뉴런들이 특정 패턴이 다음 층에 활성화 되게끔 한다. 이런식으로 마지막 output layer까지 전달된다. 출력층에서 가장 높은 값을 가지는 것이 선택된 출력값이다.

 

Q. 위와 같은 형식이 사람의 뇌와 같다고 할 수 있을 까?

 9를 인식을 할 때는 동그라미하나와 직선을 합쳐서 인식한다. 그리고 8을 인식할 때는 위 동그라미와 아래 동그라미를 합쳐서 인식한다. 4를 인식할 떄는 직선 3개를 결합하여 인식한다. 이러한 인식을 하기 위한 부분부분들이 세 번째 층에 들어간다고 보면된다. 그리고 비슷 하다면 활성화가 커진다. 두 번째 층에서는 부분부분을 더욱 쪼개서 나눈  부분이 들어간다고 생각하면 된다.

 정리하면 첫번째 층에서 픽셀이 들어가고, 두 번째 층에서는 주위에 픽셀을 연결한 짧은 선이나 곡선이 들어가고, 세 번째 층에서는 짧은 선이나 곡선을 합친 원이나 직선이 들어가고, 네 번째에서는 숫자나 나타난다고 생각하면 된다. 그리고 이렇게 행동 할 수 있는지는 다음에 알아보자.

 

Q. 그렇다면 신경망을 어떻게 훈련시키나?

위와 같이 부분부분을 합쳐나가는 방식이 이미지 처리에서는 좋아 보일 수 있다. 더 복잡한 예는 음성 분석이다. 음성은 특정한 소리들을 합쳐 음절을 만들고, 음절을 합쳐 단어를 만들어, 단어를 합쳐 문장과 추상적인 생각들을 구성한다.

  • Raw audio => r e c o g n i t i o n => re cong ni tion => recongnition

위와 같은 순서라고 보면 된다. 일단 다시 돌아와서 어떻게 작동이 가능하게 설계를 할지에 대해 생각해 보자. 한 층의 활성이 어떻게 다음 층에서의 정확한 활성을 이끌어 낼 수 있을까?? 쉽게 말하면 픽셀을 선으로, 선을 패턴으로, 패턴을 숫자로 결합하는 매커니즘을 만드는 것이다. 이러한 매커니즘을 만들기 위해서 각각의 픽셀은 어떤 변수를 가지고 있어야 할까? 그리고 판별을 위해 무엇을 조정할 수 있어야 할까? 

 예를들어 두번째 층의 layer에서 특정 하나의 뉴런이 특정 모양의 외각선이 있는지 없는지를 판단하는 뉴런이라고 해보자. 우리는 층과 층을 잇는 각각의 신경에 가중치(숫자w)를 부여 할 수 있다. 즉 첫 층의 뉴런에서 모든 활성치를 가져와서 두번째 층의 특정 뉴런과 연결하는 모든 신경의 가중치를 각각 곱한 후에 더한 값을 두번째 측의 특정 뉴런에 넣는다. 

w1a1+w2a2+w3a3+ ... + wnan

으로 이런식으로 식(weighted sum)이 된다. 이때 내가 원하는 픽셀의 가중치는 남겨두고 그 외 픽셀의 가중치(w)를 0에가깝게 만들면, 내가 원하는 부분만의 활성값의 합을 구할 수 있다. 그리고 내가 구한 부분이 외각선, 즉 테두리가 맞는지 확인하고 싶다면 주변 픽셀에 음수 가중치를 주면된다. 그러면 주변 픽셀이 어두워지므로 픽셀이 밝을 때 최대치를 얻을 수 있다.

 여기서 가중치를 구하면, 다양한 숫자가 나올 것이다. 그러나 우리가 신경망에서 원하는건 0과 1사이의 값이다. 따라서 가중치를 준 값이 0과 1 시이의 숫자로 만들어 주는 함수를 추가할 것이다. 이때 로지스틱 방정식으로도 알려진 Sigmoid 함수를 사용할 것이다.

 간단히 설명하면 매우 작음 음수는 0에 매우 가깝고 큰 양수는 1에 가깝다. 그리고 0 주위의 함수는 계속 증가한다. 그래서 뉴런의 활성화는 기본적으로 관련있는 가중치의 합이 얼마나 더욱 큰 양수인지가 중요하다. 그러나 가중치의 합이 0을 넘을 때가 아니라 합이 10보다 클 때 활성화 되기를 원할 수 도 있다(Only activate meaningfully when weighted sum>10). 즉, 활성화 하지 않는 조건을 만드는 것(Bias for inactivity)이다. 만약 10보다 클 때만 활성화 되게 만들기 위해서는 weighted sum 값(가중치 합)에 -10을 넣고 Sigmoid 함수를 곱해주면 된다. 이 때 이렇게 뒤에 더해주는 숫자를 Bias 라고 한다. 즉, 가중치 합은 두번째 레이어가 선택하려는 뉴런의 픽셀 패턴을 알려주고, bias는 뉴런이 활성화 되려면 가중치의 합이 얼마나 더 높아야 하는지를 알려준다. 

 

 지금까지 두번째 층의 하나의 뉴런에 대해 이야기 했다. 두번째 층의 각각의 뉴런은 첫번째 층의 784개의 뉴런과 전부다 연결된다. 그러면 두 번째 층의 각각은 각자의 가중치를 가진다. 만약 총 4개의 layer가 있고 각 레이어의 뉴런의 갯수가 784 - 16 - 16 - 10이라면, 전체의 weights의 수는 784*16 + 16*16 + 16*10 으로 총 13002개의 weight가 있다고 할 수 있다. 그리고 biases의 갯수는 16+16+10 으로 42개이다. 이제 컴퓨터가 실제로 스스로 문제를 해결하고 러닝하기 위해서는 올바른 weights와 biases를 찾아야한다.

 

weights(가중치들)과 biases에 대해 이해하는 과정이 있어야 만약 결과 값이 틀리더라도 수정을 할 수있다. 그리고 개선하기 위해 여러가지를 실험을 해 볼 수도 있다. 간단히 식으로 보면

2번째 layer의 첫번째 뉴런을 구하는 식이라고 보면된다.  그리고 전체를 행렬로 바꾸는 것도 가능하다. 첫 번쨰 layer의 활성화 정도를 열벡터로 나타내고, 각각의 가중치를 모아  행으로 모은다. 

 

 

위의 식의 결과가 두번째 layer의 값들로 나오게 된다. 위의 식을 간단히 표현하면 W*a + b 로 나타낼 수 있습니다. 많은 라이브러리들이 행렬 곱을 최적화하므로 아래의 예처럼 관련 코드를 훨씬 수비고 빠르게 만들 수 있다. 

class Network(object):
	def __init__(self, *args, **kargs):
    	# initialize weights and biases
        
    def feedforward(self, a):
    	# Return the output of the network for an input vector a
        for b, w in zip(self.biases, self.weights):
        	a = sigmoid(np.dot(w, a) + b)
        return a

정리하면 뉴런은 이전 층의 뉴런의 출력을 모두 받아서 0과 1 사이의 수를 만들어 내는 함수이다. 그런데 이 네트워크는 어떻게 데이터를 보는 것 만으로 적절한 weight와 bias를 러닝 하는걸까? 이것은 다음 페이지에서 알아보자.

 

+ 최근은 Sigmoid 함수를 잘 안쓰고 ReLU함수가 더 훈련시키기 좋아서 많이 쓴다.

Rectified Linear Unit (ReLU function)

ReLU function

ReLU(a) = max(0, a)

임계값을 넘기지 못하면 0을 출력하고 넘어가면 항등함수(  f(a) = a  )를 출력한다. Deep nurual networks에서 Signoid함수는 잘 작동하지 않았는데, 누군가 ReLU 함수를 사용해 보니 잘 작동했다. 그래서 많이 사용한다.

 

 

 

 

 

신경망을 이 용한 지도학습(Supervised Learning)

ex

Input(x) Output(y) 신경망 종류
집 특성 가격 표준 신경망
광고, 유저정보 광고 클릭을 하는지 안하는지 표준 신경망
Audio Text transcript CNN
Image Object(1,...., 1000) RNN
영어 중국어 RNN
Image, Tadar infor 차 위치파악 합성곱 신경망, 하이브리드 신경망

 

아래의 그림은 표준신경망, 합성곱신경망(이미지 데이터), 순환신경망(1차원 시퀀스 데이터(시간 포함)) 순서다.

SNN, CNN, RNN

구현 방법은 차차 알아나가보자.

 

 

Structured Data vs Unstructured Data

구조적 데이터 비구조적 데이터
데이터베이스로 표현된 데이터 이미지, 오디오와 같이 특징적인 값을 추출하기 어려운 형태의 데이터. 딥러닝 덕분에 컴퓨터가 비구조적 데이터를 인식 할 수 있게 됐다.

 

 

CNN에 대한 이해를 위해서는 아래의 url을 눌러보자

han-py.tistory.com/230

 

Convolutional Neural Network(CNN) _기초개념

0. CNN 특징 image classification에서 가장 많이 사용하고 있다. 일반적으로 convolution layer, pooling layer, fully-connected layer로 구성되어 있다. feature extraction 역할(특징을 뽑아낸다) - Convolut..

han-py.tistory.com

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함