티스토리 뷰
Introduction to A.I. (3/5)
- 인공지능을 공부할 때 알아두면 좋을 기초적인 내용을 정리한 자료입니다
- 정확히는
딥러닝을 기반으로 하는 인공지능
에 대해서입니다
- 정확히는
- 추후 시간이 된다면 동영상으로도 제작해볼 생각입니다
- 포스팅마다 50개까지의 이미지만 업로드할 수 있어, 이왕 나누는 김에 5부작으로 나누었습니다
(1/5) ... (5/5)
로 구분됩니다
(3/5)
- 3장
Perceptron
에서는 인공신경망을 구성하는 퍼셉트론에 대해 알아봅니다 - 이번 장의 내용은 2장 내용을 이해한 것을 전제하고 있습니다
- 따라서 2장 내용이 이해되지않는 경우 가볍게 보고 넘어가세요
- 퍼셉트론은 가중치 변수와 일련의 연산들로 구성되는 노드입니다
- 인공신경망을 그래프로 표현했을 때, 노드 하나하나를 지칭하는 용어이기도 합니다
- 출력값을 제어하기 위한 활성화함수를 가집니다
- 자신에게 연결된 다른 퍼셉트론에게 어떤 값을 전달해줄지 결정합니다
- 단일 퍼셉트론은 최대 2가지 종류의 데이터를 분류할 수 있습니다
- 다시 말하면, 2개 초과의 데이터는 다중 퍼셉트론으로 분류할 수 있습니다
- 분류에도 여러 종류가 있는데
- 1가지 종류의 데이터를 분류하는 것을
Linear Regression
이라 하고 - 2가지 종류의 데이터를 분류하는 것을
Binary Classification
이라 합니다
- 1가지 종류의 데이터를 분류하는 것을
※ Binary Classification = Linear Classification
L.R.
은 비용을 최소화하는 선을 그리는 알고리듬입니다- 비용이라 함은 종종 선과 데이터간 거리로 정의됩니다
- (선형회귀로) 학습한 뒤에는 예측값을 구하는 모델을 얻게 됩니다
- 여기서의 모델이라 함은 인공신경망을 부르는 다른 말입니다
L.C.
을 살펴보기 이전에 이곳에서Gradient Descent
를 적용해볼 것입니다
- 매우 간단한 데이터를 가지고
L.R.
을 구현해보겠습니다- 를 입력으로 하고 를 출력으로 하는 퍼셉트론을 설계합니다
- 즉, 꼴의 함수에 가까워진다면 성공하는 것입니다
- 데이터셋의 크기는 이고 각 데이터의 크기는 입니다
- 따라서 퍼셉트론이 가져야할 가중치는 개입니다
- 하지만 바이어스가 존재하는 것이 더 효과적이라는 게 학계의 정설입니다
- 그러므로 우리도 바이어스를 위한 가중치도 준비해줍시다
- 결과적으로는 가중치 변수가 총 2개 필요합니다
- 그리고 활성화함수는 사용하지않겠습니다
- 즉, 활성화함수 이전까지의 연산결과를 그대로 흘려보냅니다
- 퍼셉트론의 설계를 끝냈으니, 이제 이를 어떻게 학습시킬지 결정합니다
- 당연히
G.D.
알고리듬을 적용할 것입니다 - 이 알고리듬은 입력값을 조정해 출력값을 바꾸는 특징을 가집니다
- 그리고 퍼셉트론의 입력값은 데이터와 가중치 두 종류입니다
- 여기에서, 데이터 자체가 변경되면 안 되므로 우리는 가중치만 조정하게 될 것입니다
- 당연히
- 가중치 변수들의 초기값을 모두 로 설정합니다
- 원하는 결과값과의 차이가 얼마나 나는지 알기 위한 연산도 필요합니다
- 학습을 위해 (가중치 변수의 조정을 위해) 필요하기 때문입니다
- 삽화는 각 연산들을 간소화하고, 퍼셉트론을 블럭으로 다시 표현한 것입니다
- 위의 과정만으로는
G.D.
알고리듬을 제대로 적용할 수 없습니다G.D.
알고리듬은 최종 출력값을 늘리거나 줄일 수 있습니다- 그러므로 원하는 값과의 차이를 줄이는 데에 사용해야할 것입니다
- 우리는 원하는 값과의 차이를 에 가깝게 만들고 싶습니다
- 퍼셉트론의 출력값을 으로 만드는 것이 아니죠
- 만약 퍼셉트론의 출력값에 곧바로
G.D.
를 적용한다면 - 어떤 데이터가 들어와도 출력이 이 되는 가중치값들로 학습이 될 것입니다
- 따라서 우리는 퍼셉트론의 출력값을 기반으로 원하는 값과의 차이를 계산하는 별도의 함수가 필요합니다
- 이 함수는 일반적으로
Error Function
이라 불립니다 - 학습시키는 동안에만 우리의 모델에 붙어있게 됩니다 (학습 이후 제거)
- 이 함수는 일반적으로
- 제일 간단한 오류함수는 좌상단 빨간 사각형의 내용과 같습니다
- 모든 데이터를 고려하기 위해
sum
을 사용합니다 - 미분시 나오는 를 상쇄하기 위해 이 아닌 으로 나눕니다
- 원하는 값과 출력값이 차이가 클수록, 더 많이 조정하기 위해 제곱을 사용합니다
- 모든 데이터를 고려하기 위해
확률과 통계
를 공부했다면 눈치챘겠지만, 위의 식은분산 공식
과 유사합니다- 그리고 수식의 의미도 그와 동일합니다
- 따라서, 분산 자체를 공부하는 것도 위의 수식을 이해하는 데에 도움이 될 것입니다
- 오류함수가 이와 같은 구조이기 때문에
- 데이터셋의 모든 데이터를 순회할 때가 되어서야 학습이 수행됩니다
- 오류함수가 이런 방식으로 구현되어, 가중치 조정의 방향이 일정합니다
- 단순히 빼기만 하면 됩니다 (이후에 설명)
- 오류함수의 원형은 좌상단 빨간 사각형과 같지만
G.D.
알고리듬을 적용하려면 이에 대한 편미분을 구해야합니다- 저는 이를 라는 이름으로 부르겠습니다
- 에는 가중치 변수의 이름이 들어갑니다
- 앞서 말했던 것처럼,
G.D.
알고리듬을 사용해 오류함수값을 에 가깝게 줄일 수 있을 것입니다 - 오류함수는 제곱꼴이기 때문에 항상 양수값이 나올 것이고요
- 즉, 음수값이 나올 일이 없으므로 항상 빼주기만 하면 됩니다
- 또한 제곱꼴이기 때문에 삽화와 같은 성질또한 갖게 됩니다
- 공식을 사용하려면, 오류함수 이전까지의 편미분을 구해야합니다
chain rule
을 사용해 편미분값을 구할 수 있습니다
- 자 그럼 제가 언급했던 공식에 두 가중치 변수를 적용합니다
- 각 가중치 변수에 대한 값을 구했다면, 오프셋도 구할 수 있습니다
- 여기서의 오프셋은 기존의 가중치 변수에서 얼마나 변화시킬지를 결정하는 값입니다
- 오프셋을 결정할 때
stepSize
도 고려하도록 합시다 ( 로 합니다)
- 이제 (수작업으로...) 학습을 시켜봅시다
- 첫번째 학습결과는 각 가중치 변수를 만큼 변화시킵니다
※ 계산과정 (한 번만 보여드립니다)
- 위에서 보았던 계산과정을 반복합니다
- 우리 모델의 출력값이 우리가 원하는 값에 근접해가는 모습이 보이나요 ?
- 앞서 보았던 계산결과를 표로 정리하면 다음과 같습니다
- 이러한 작업은 좌하단의 그래프를 의미합니다
- 가중치 변수를 조정하여 차이를 줄이는 것이죠
- 오류함수가 제곱꼴이기 때문에 그래프 또한 2차함수 모양이고요
G.D.
와 같은 알고리듬을 적절하게 사용하는 것도 중요하지만- 이런 인공신경망의 가중치 초기값과
stepSize
를 설정하는 것도 중요합니다 - 그 값들이 적절하게 설정된다면 필요한 학습횟수가 줄어들 수 있고
- 매우 부적절할 경우에는 원하는 모델을 만들지 못할 수도 있습니다
- 이런 인공신경망의 가중치 초기값과
- 우하단의 삽화는
stepSize
가 인 경우의 그래프입니다- 가중치 변수의 값과 차이값이 범위를 넘어섭니다
- 앞서 말한 것을 그림으로 표현한 것입니다
over-shooting
은 오류함수값이 계속 발산하는 현상이며local-minima
는 국지적인 최소값을 의미합니다local-minima
를 만났을 때stepSize
가 너무 작다면- 빠져나가지 못하고 그래프상에서 계속 진동하게 될 것입니다
- 이번에는 퍼셉트론으로
L.C.
문제를 해결해봅시다- AND 논리게이트와 동일한 작동을 하는 퍼셉트론으로 학습시켜보겠습니다
- 이번에는 데이터로부터 들어오는 입력값이 개입니다
- 그러므로 가중치 변수도 개를 준비합니다
- 추가적으로 바이어스를 위한 가중치 변수까지 고려한다면 총 개가 필요합니다
- 활성화함수로 를 사용합니다
- 이 함수는 어떤 값이 들어와도 구간으로 수렴시키는 특징을 가집니다
- 출력값이 또는 이므로, 이보다 더 크거나 작은 값은 필요없기 때문에 제한하기 위해 사용합니다
- 초기값은 이전과 동일하게 모두 로 설정합니다
L.R.
에서처럼 각 연산들을 간소화시킵니다
L.R.
에서처럼 퍼셉트론들을 블럭으로 표현합니다- 그리고 각 가중치 변수들의 편미분 공식을 구해줍니다
- 이 편미분은 모델의 출력값에 대한 것이지, 오류함수에 대한 것이 아닙니다
- 이전과 동일한 방법으로 가중치 변수들을 조정합니다
- 경향성을 살펴보면 과 의 값은 증가하고 의 값은 감소합니다
- 좌상단 사진은 위의 방식으로 번 학습시킨 결과입니다
weight
이후의 값은 각각 입니다
- 이를 각각 2D 3D 그래프로 그려보았을 때 오른쪽과 같습니다
- 의 값이 모두 일 경우에 축상으로 양수값을 얻고
- 그렇지않은 경우 축상으로 음수값을 얻음을 알 수 있습니다
- 단순히 데이터만 변경하고 이전 과정을 거치면 OR 논리게이트를 구현할 수 있습니다
- 이제 XOR 논리게이트 구현에 도전해봅시다
- AND 논리게이트 때와 동일한 구조로 진행합니다
- 이 부분도 우려먹겠습니다
- 학습을 시켜보니 뭔가 좀 이상합니다
- 오프셋이 모두 동일하게 나오네요
- 단순한 우연이 아니었던 것 같습니다
- 오프셋이 모두 동일한 것은 값이 모두 동일하기 때문인데, 이러한 일이 왜 발생하는 걸까요
- 왼쪽의 사진은 위의 학습을 번 수행한 뒤의 결과입니다
- 오류함수값이 전혀 줄어들지않는 모습입니다
- 또한 가중치값들은 증가만 하고 있습니다
- 이러한 문제가 발생하는 이유는 XOR을 선형으로 구분할 수 없기 때문입니다
- 즉, 비선형으로 구분할 수 있는 다중 퍼셉트론 구조를 사용해야합니다
- 이번에는 퍼셉트론을 개로 늘려보겠습니다
- 각 퍼셉트론의 구조에는 변함이 없습니다
- 초기값은 모두 무작위값으로 설정했습니다
- 변수 개수가 많아지기 시작할 때, 무작위값을 대입하는 것도 나쁜 선택은 아닙니다
- 오히려 모두 동일한 값으로 대입하는 것이 더 나쁜 결과를 가져올 수 있습니다
- 실제로 모두 로 설정한다면, 학습을 아무리 반복해도 원하는 결과를 절대 얻지 못하게 됩니다
- 이전 방식과 동일하게 간소화 작업을 거칩니다
- 가중치 변수가 개나 되다 보니 각 편미분 공식을 구하는 것도 일입니다
- 퍼셉트론이 여러 개 붙어있는 경우, 편미분 계산이 복잡해지기 쉽습니다
- 지금까지의 계산과정을 잘 관찰했다면, 최종연산에서 입력연산까지 연결하는 방식을 눈치챘을 것입니다
- 최종연산에서 입력연산 방향으로 사다리를 타는 것처럼 이동하면서
- 지나치는 연산들의 미분값들을
chain rule
에 적용하면 됩니다
- 잊을 만하니 다시 복습해보죠
- 오류함수에서 특정 가중치 변수에 대해 편미분을 한 것이 입니다
- 가중치 변수의 이름이 라면 인 것이고요
- 초기 가중치값은 오른쪽과 같습니다
- 바이어스만 모두 로 설정해줬습니다
- 일반적으로 바이어스의 경우 이 아닌 값을 잘 쓰지않기 때문입니다
- 학습시켜봅시다
- 모델의 규모가 커지면서 슬라이드에 모두 담기가 어렵습니다
- 이에 따라 표로 정리하여 표기합니다
- 값들도 생략하겠습니다
- 학습 회차까지의 표입니다
- 우리가 원하는 결과값은 이며, 이에 근접해가는지 확인해봅시다
- 실제로 인 경우에 대해, 양수에서 음수로 변한 것을 볼 수 있습니다
- 인 경우에 대해, 음수에서 양수로 변한 것을 볼 수 있습니다
- 표는 학습 회와 회에 대한 결과입니다
- 우리가 원하는 값과 매우 근접함을 알 수 있습니다
- 하단은 회 실시 후의 가중치값들입니다
- 결과적으로 얻게 된 모델을 그래프로 시각화해봅니다
- 선형이 아닌 비선형의 곡면이 나왔네요
- 과 의 경우에 축상으로 음수값을 얻으며
- 그 외 범위에서 축상으로 양수값을 얻는 것을 볼 수 있습니다
- AND 논리게이트 문제와는 다르게, 비선형 구분이 필요한 문제입니다
- 즉, 분류해야할 데이터가 가지 종류였다는 것입니다 ( 개의 구역)
- 종류 개수가 많은 경우의 분류문제는 이처럼 연산량이 많이 필요하고 복잡도도 높습니다
- 여기까지가 퍼셉트론의 내용입니다
이후 내용은 (4/5)
에서 이어집니다
감사합니다
'Computer Science > Artificial Intelligence' 카테고리의 다른 글
Introduction to A.I. (5/5) (0) | 2018.11.01 |
---|---|
Introduction to A.I. (4/5) (0) | 2018.10.26 |
Introduction to A.I. (2/5) (0) | 2018.10.13 |
Introduction to A.I. (1/5) (0) | 2018.10.07 |
Summary of Reinforcement Learning (0) | 2018.08.25 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- CAFFE
- PopeTV
- NOX
- dll
- windows
- unity
- Python
- pclaf
- WindowAPI
- visualstudio
- visual-studio
- shader
- unreal
- Game
- Anaconda
- cuDNN
- DirectX
- CUDA
- Docker
- csharp
- vscode
- Slack
- lib
- A.I.
- Hashtable
- ATOM
- tensorflow
- C/C++
- JIT
- git
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함