댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
사이트 로그인
이번 세미나 시간에는 다층신경망 그리고 텐서보드에 대해 알아보겠습니다.
먼저, 저번 시간에 배운 단층신경망에 대해 복습을 하고, 다층신경망의 등장, 활성화 함수, 손실 함수를 학습하고, 이후 텐서보드를 사용하는 법에 대해 알아보겠습니다.
퍼셉트론이란, 간단히 말하면, 여러 입력값들에 대해 0 또는 1을 출력하는 함수입니다. 이 퍼셉트론을 잘 만든다면, 여러 이진 분류를 구현해낼 수 있습니다.
그 중, 예시로 Input이 2개인 단층 퍼셉트론은 위의 그림과 같이 표현됩니다.
앞에서 본 퍼셉트론은 파라미터인 w1, w2, theta 값에 따라, 여러 기능을 할 수가 있는데, 그 중 하나로 or게이트로의 표현입니다. w1 = 0.5, w2 = 0.5, theta = 0.3의 값을 가지도록 하면, x, y값에 대해 or게이트와 똑같이 작동을 함을 표를 통해 알 수 있습니다.
다른 예시로 and게이트 입니다. 비슷하게, w1 = 0.5, w2 = 0.5, theta = 0.7의 값을 가지도록 하면, x, y값에 대해 and게이트와 똑같이 작동을 함을 표를 통해 알 수 있습니다.
Nand게이트 역시. w1 = 0.5, w2 = 0.5, theta = 0.7의 값을 가지면서, 부등호 방향을 반대로 하면, x, y값에 대해 nand게이트와 똑같이 작동을 함을 표를 통해 알 수 있습니다.
다음으로 델타규칙이라는 것을 배웠었는데, 퍼셉트론을 통해 출력되는 값과 실제 값을 비교하여 차이가 생길 경우, 그 차이를 퍼셉트론에 반영하여, 다음 번엔 좀 더 나은 출력값을 가질 수 있도록 학습을 시킨다는 것이 델타규칙입니다.
단층 퍼셉트론으로 모든 것이 표현 가능할 것처럼 보였지만, xor게이트 앞에서는 무기력했습니다. Xor게이트는 그래프를 통해 보면, 어떤 식으로 선을 그려도, 분할이 불가능하다는 것을 알 수가 있습니다. 따라서, 이를 해결하기 위해 단층 퍼셉트론을 여러 층으로 쌓아 다층신경망을 만들게 되었습니다.
단층신경망과 다층신경망의 차이는 은닉층의 여부로 가려지게 됩니다. 단층신경망은 입력값을 받는 input layer와 출력값을 내보내는 output layer만 존재하는 반면, 다층신경망은 그 사이에 입력과 출력을 직접적으로 하지는 않지만, 중간 계산과정을 참여하게 되는 은닉층(hidden layer)가 존재하게 됩니다.
위의 다층신경망 개념을 이용해 단층 퍼셉트론의 한계였던 xor게이트를 구현해보도록 하겠습니다.
Or게이트의 경우 주황색으로 색칠된 영역을 1로 분류를 합니다.
nand게이트의 경우 파랑색으로 색칠된 영역을 1로 분류를 합니다.
이
두 게이트가 모두 1로 분류하는 영역만 1로 분류하는 게이트를 만들 경우, 이는 xor게이트와 정확히 똑같이 작동하게 됩니다
따라서, or게이트와 nand게이트의 결과를 and게이트에 입력한 결과를 출력하는 다층 신경망을 만들면, xor게이트가 될 것입니다.
도식화 및 표로 표시하면 다음과 같이 됩니다.
위처럼 층을 쌓아서 신경망을 구축하게 되면, 깊게 쌓을수록, 선형의 한계를 벗어나 비선형, 특이한 모형들에 대해 분류를 잘 할 수 있게 된다.
퍼셉트론을 쌓고 쌓다보면, 위와 같이 복잡한 구조를 가지게 되는데, 현재 이런 방법으로 신경망을 구성하여, 이미지 분류, 텍스트 마이닝 등등 많은 일들을 해낼 수 있게 되었다.
다시 한번 or게이트를 보도록 하자
Or게이트는 크게 두 부분으로 나눌 수 있다. 먼저, 가중치 값을 입력값에 곱한 뒤, 더하는 가중치 연산 과정
그리고, theta값과 비교하여, 1과 0, 두 가지로 분류하는 활성화 함수 과정이다.
활성화 함수는 스칼라값을 입력하면 스칼라값을 출력하는 함수로, 레이어 간에 입출력 형태를 맞춰주거나, 선형 함수로만 이루어진 신경망에서 비선형 함수인 활성화 함수를 사용하여, 비선형의 특성을 신경망에 지니게하는 역할을 가지고 있다.
가중치 연산을 하는 일반 노드와 활성화 함수를 비교해 보았을 때, 일반 노드는 입력값이 N개지만, 활성화 함수는 1개이고, 일반 노드는 학습을 하는 파라미터가 존재하지만, 활성화 함수는 학습이 없이 계속해서 같은 역할을 수행한다.
최초의 활성화 함수는 계단 함수이다. 앞의 or게이트에서사용되었던 것과 같이, 어떤 값(theta) 이상일 경우 gamma1을, 반대의 경우 gamma2를 출력하게 하여, 이진 분류에 사용되거나, 신경망에 계단 함수의 성질을 넣어주고 싶을 경우 사용하게 된다.
다음으로는 오랫동안 사용되어 왔지만, 현재에는 사용되지 않는 시그모이드 함수이다. 시그모이드 함수는 평균이 0.5이고, 0~1까지의 값을 출력하는 함수이다. 시그모이드 함수는 넓은 입력값을 0~1 사이의 값으로 반환해주고, 이진 분류 문제에서 각각이 선택될 확률로도 사용되는 등 많이 사용되었으나, 현재는 많은 문제점들이 발견되어 사용되지 않고 있다.
대표적인 문제점으로 학습이 잘 되지 않는다는 것이 있는데, 시그모이드 함수의 그래프를 살펴보면, 그래프의 양 극단에서는 x값이 변하더라도, y값의 변화가 그리 크지 않음을 알 수 있다. 이는 학습에 사용되는 x값의 변화량 대비 y값의 변화량(gradient)이 매우 작음을 알 수 있는데, 이 때문에, 학습이 매우 더디게 진행된다. 또, 깊이가 깊어질수록 데이터의 양극화가 심해지고, 결과값이 항상 양수이기 때문에, 이후 배울 내용인 오차역전파 과정을 통하여 학습할 시, gradient값이 부호 편향적이게 된다. 또, 1보다 항상 작기 때문에, 신경망이 깊어질수록 오차역전파 과정동안 끊임없이 작아지게 되는 문제가 있다. 마지막으로, exp함수를 사용하기 때문에, 컴퓨터가 이를 계산하는 과정이 다른 선형 함수들에 비해 매우 느리기 때문에, 컴퓨터를 통한 계산 과정이 오래걸린다는 문제점도 가진다.
앞의 시그모이드 함수의 문제를 해결하기 위해 나온 한 가지 함수로 하이퍼볼릭 탄젠트 함수가 있다. 형태는 매우 유사하나, 먼저 평균이 0이기 때문에, 결과값이 양수로 편향되어 있던 문제는 해결되었으나, 여전히 나머지 문제들(극단적인 데이터, 매우 작은 gradient값)이 해결이 되지 않았다.
이후, ReLu라는, 정말 간단한 모양의 함수이지만 놀라운 결과를 보이는 활성화 함수가 등장하게 되었다. 먼저 시그모이드 함수의 가장 큰 문제점이였던, 매우 작은 gradient값은 선형 함수이기 때문에, 1보다 큰 영역에서는 gradient가 다음 레이어로 그대로 전달이 되기 때문에, gradient에 대해서는 악영향을 주지 않게 되었고, 연산 속도 역시 exp에 비해 매우 빨라졌다. 비록 선형 함수의 꼴을 하고 있지만, 깊은 신경망에 여러 개의 ReLu 함수가 들어가게 되면, 비선형 함수와 비슷한 모습을 가지게 된다. 모든 것을 해결해줄 것 같은 ReLu이지만, 한 가지 단점이 있었는데, 0보다 작은 값을 출력하게 될 경우, 이 때, gradient가 0에 계속해서 머물 가능성이 생기게 되는데, gradient가 0을 가지게 되면, 해당 가중치는 학습이 완료되는 순간까지 0으로 남기 때문에, 학습이 이루어지지 않는다.
그래서 그 ReLu함수의 단점을 보완하기 위해, 0보다 작은 영역에서 0이 아닌 매우 작은 x에 비례하는 값을 가지는 Leaky ReLu가 출현하게 되었다. ReLu의 장점을 가지면서도, 0이하의 값에서 가중치들이 죽어버리는 현상을 해결할 수 있었다.
여기에서 더 일반화한, maxout이라는 활성화 함수가 있는데, 이 함수는 두 개의 선형 함수에 max함수를 덮어씌운 형태인데, maxout내의 w1, w2, b1, b2는 학습을 하는 파라미터로, 학습을 진행하면서, 최적의 형태를 찾는다. 최근(17년 5월 기준)의 연구결과들에 따르면 maxout이 가장 좋은 성능을 낸다고 한다. 하지만, 그렇다고 무작정 좋은 것은 아닌 것이, 다른 활성화 함수에 비해 파라미터를 쓰기 때문에, 학습을 하는 파라미터의 수가 증가하게 된다는 단점 역시 있고, 상황마다 적절한 활성화 함수는 다를 수 있기 때문에, 무조건 maxout을 사용하는 것이 답이 될 순 없다.
다음으로 배울 것은 손실함수이다. 신경망은 데이터를 통해 학습을 한다는 것이 핵심인데, 그 데이터를 가지고 어떻게 학습을 하냐에 대한 해답이 바로 손실함수이다. 우리가 만든 신경망이 원하는 기능을 할 때와 현재의 차이를 함수로 정의하여, 그 차이값을 구하고, 그 값을 이용해서 신경망을 개선(gradient descent 등)시킨다.
그 종류로 여러 가지가 있는데, 대표적으로 MSE(mean square error)부터, 분류 오차, 교차 엔트로피 등이 있다.
이 세 함수 모두 주로 쓰이는 영역이 다르다. MSE의 경우, 제곱이 아닌 절대값을 사용하는 경우도 있고, 필요한 경우 그 이상의 차수로도 사용은 가능하다. 어떤 신경망을 만들든 그에 맞는 손실함수를 정의하여 사용하는 것이 중요한다.
다음은 텐서보드에 대해 알아보자.
텐서보드는 텐서플로우 라이브러리를 이용하여 모델을 만들고, 학습을 하고, 결과를 예측할 때, 그에 대한 기록(로그)를 읽어서 시각화를 해주는 장치이다. 위의 그림에서는 정확도가 학습 과정에 따라 어떤식으로 변했는지, 손실 함수는 어떻게 변했는지를 표시해 준 것이다. 이처럼 학습 과정을 시각화하여, 모델이 잘 만들어지고, 원하는대로 작업을 수행하는지 확인을 할 수 있다.
그렇다고 그냥 원래 있던 코드를 돌리기만 해선 텐서보드에 나타나지진 않는다. 텐서보드가 읽을 수 있는 로그를 만드는 메소드들을 이용하여, 로그를 남겨야 하는데, 이는 위의 함수와 같이 여러 메소드들이 있다.
텐서보드가 읽을 수 있는 로그를 남기는 코드를 조금 더 자세히 살펴보면, 위의 코드는 텐서플로우 라이브러리를 이용하여 선형 회귀를 구현한 것이다. X, y를
데이터를 넣을 placeholder로
만들고, 학습할 파라미터인
W, b를 임의의
값으로 초기화 후 생성하고, 가설을
X * W + b로
정의하였고, 손실함수로
오차 제곱 합을 사용하였다. 그리고
train을 loss를
최소화하는 방향으로(learning_rate = 0.01)
학습을 진행하도록 한다.
이제, 텐서보드가 읽을 수 있는 로그를 남겨볼텐데, 먼저 tf.summary.histogram은 학습하는 벡터를 기록해주는 객체이다. 비슷하게, tf.summary.scalar는 학습하는 스칼라값을 기록해주는 객체이다. Histrogram은 일반적으로 파라미터들을 기록할 때 사용되고, scalar는 손실 함수, 정확도 등을 기록하는데에 사용된다.
여기서 로그를 남길 주소를 정해주어야 하는데, 만약 “”으로 둔다면, 현재 코드가 실행되고 있는 위치에 저장이 된다. 위의 코드에서는 현재위치/logs/5 폴더에 저장이 될 것이다.
이와 같이 코드를 삽입하면, 학습이 진행되면서 로그가 기록될 것이다.
학습이 완료되면, 텐서보드가 읽을 수 있는 코드가 지정해준 경로에 남게 된다. 이 때 경로 및 파일 명에 한글이 들어가지 않아야 한다. 이 파일들만 있다면, 어디서든 텐서보드를 통해 학습 과정을 열람할 수 있다.
이제 텐서보드를 구동시켜볼 차례인데, 텐서보드는 텐서플로우 라이브러리가 사용이 가능한 환경이라면 추가적인 설치없이 곧바로 사용이 가능하다. 먼저 cmd창을 켜보도록 하자(혹시 tensorflow를 사용하는데에 추가적은 것이 필요하면, 그 모든 것을 다 마친 상태에서 이어서 진행하여야 한다.)
명령어를 tensorboard –logdir (로그가 저장된 경로)와 같이 입력하면, 되는데, 이때, 주소를 절대 경로 혹은 상대 경로를 선택하여 입력하여 주면 된다.
실행이 되면, 위의 그림과 같이 port 6006과 함께 주소가 출력되는데, 이를 chrome 주소창에 입력을 하면 텐서보드가 실행이 된다. 그리고 주소와 상관없이 localhost:6006만 입력하여도 실행이 된다. 위의 그림처럼 WARNING이 여러 번 뜰 수가 있는데, 이는 로그 파일이 1개가 아니라 여러 개일 경우, 생기는 WARNING으로 사용하는데에는 지장이 없으니, 일단 무시를 하고 사용하도록 하자.
텐서보드에는 7개의 탭이 있는데, 그 목록은 다음과 같다. SCALARS, IMAGES, AUDIO, GRAPHS, DISTRIBUTIONS, HISTOGRAMS, EMBEDDINGS
Scalar 탭에서는 tf.summary.scalar를 이용하여 저장된 scalar값을 그래프로 보여주는데, 그 값이 여러 개일 경우, 여러 개의 그래프로 보여준다. 학습횟수에 따라, 변하는 스칼라값(손실 함수, 정확도)등을 볼 수 있다.
IMAGES 탭에서는 모델 내에서 사용된 이미지를 볼 수 있다.
GRAPH 탭에서는 학습 과정 그래프를 시각화해준다. 변수 간의 관계, 연산 과정 등이 상세하게 기재되어 있다. 각 영역을 클릭을 통해 조금 더 자세히 볼 수도 있다.
DISTRIBUTIONS 탭에서는 tf.summary.histogram를 통해 기록이 된 파라미터에 대한 변화를 볼 수 있다. 왼쪽의 그래프 형태는 파라미터가 단 한 개의 값을 가질 때, 학습이 진행되면서의 변화를 나타낸 것이고, 오른쪽은 파라미터가 여러 개일 때, 그 분포를 색의 진하기를 통해서 진한 영역에는 많은 파라미터가, 연한 영역에는 적은 파라미터가 분포되어 있음을 나타낸다.
HISTOGRAMS 탭에서는 distribution탭과 마찬가지로 tf.summary.histogram를 통해 기록이 된 파라미터에 대한 변화를 볼 수 있다.
EMBEDDINGS 탭에서는 데이터를 2, 3차원으로 차원축소하여 시각화한 모습을 볼 수 있다. 차원축소 방식에 따라 선택할 수도 있고, 학습이 진행되는 과정을 볼 수도 있다.
텐서보드
활용방안으로, 모델을 튜닝할
때, 어떤 hyper parameter를
가질 때, 좋은
성능을 내는지, 학습의
속도는 어떤지 등을 비교할 수 있다.
위는 MNIST데이터를 CNN을
이용하여 예측을 하는 모델에서 여러 종류의 hyper parameter에
따라 학습 횟수에 따른 정확도를 시각하한 것인데, 원하는
x값을
마우스 오버하면, 이미지의
검은 박스에서 상세한 값을 보여준다. 이를
통해 원하는 방식으로 작동하는 모델로 개선할 수 있다.
텐서보드 내에 여러 가지 옵션들을 조정하여 조금 더 원하는 방식대로 로그를 살펴볼 수 잇는데, x축에 들어갈 값을 학습 횟수 뿐만 아니라, 학습에 걸리는 시간, 실제 시간 등으로 넣어서 비교 역시 가능하다.
로그들이 많이 쌓이게 되면, 원하는 모델을 보기가 힘들어지는데, 자신이 원하는 모델만도 볼 수가 있다. 체크박스를 이용하여 원하는 모델들을 선택하면, 선택된 모델들만 그래프가 표시가 된다. 이는 distributions, histograms 탭에서도 동일하게 작동하고, graphs, embbedings 탭에서는 해당 모델에 대한 그래프, embbeding 결과를 볼 수 있다.
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
7 |
Tensorflow-gpu 설치전 필요한 프로그램들을 정리했습니다.
1 ![]() |
토스트먹어 | 2017.09.12 | 18632 |
6 |
GAN 스터디 공유자료
![]() |
DataMarket | 2017.08.29 | 19478 |
5 |
5주차 딥러닝 - CNN
![]() |
구혜인 | 2017.06.21 | 19188 |
4 |
4주차 딥러닝 - 오차역전파, 매개변수 갱신(모멘텀, Adagrad, Adam), 배치정규화
![]() |
수빈 | 2017.05.21 | 23141 |
» |
2주차 딥러닝 - 다층신경망, 활성화 함수, 손실 함수 그리고 텐서보드
![]() |
록 | 2017.05.16 | 31859 |
2 |
3주차 딥러닝 - 소프트맥스, 손실함수(MSE, 교차엔트로피), SGD, 오버피팅 방지
![]() |
토토실 | 2017.05.15 | 36816 |
1 |
1주차 딥러닝 - 퍼셉트론&텐서플로선형회귀
1 ![]() |
히둥 | 2017.04.26 | 26716 |
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5