티스토리 뷰
Introduction to A.I. (2/5)
- 인공지능을 공부할 때 알아두면 좋을 기초적인 내용을 정리한 자료입니다
- 정확히는
딥러닝을 기반으로 하는 인공지능
에 대해서입니다
- 정확히는
- 추후 시간이 된다면 동영상으로도 제작해볼 생각입니다
- 포스팅마다 50개까지의 이미지만 업로드할 수 있어, 이왕 나누는 김에 5부작으로 나누었습니다
(1/5) ... (5/5)
로 구분됩니다
(2/5)
- 2장
Gradient Method
에서는 인공신경망의 가중치값을 조정하는 데에 사용되는 알고리듬에 대해 알아봅니다 - 이번 장의 내용은 대표적인 알고리듬인
Gradient Descent
를 다룹니다 - 이번 장부터 수학 내용이 다수 포함되기 때문에 주의깊게 읽는 것이 좋습니다
Gradient Method
는 선형시스템을 수치계산으로 풀어내는 방법론들을 일컫는 말입니다- 우리는 그 중에서도
Gradient Descent
에 집중할 것입니다
- 우리는 그 중에서도
- (곱하기 연산에 대해) 아래와 같은 상황을 가정해봅시다
- 입력값은 무작위로 초기화되어 있습니다
- 여기에서, 원하는 출력값이 나오도록 해야합니다 ( 에 가까운 값)
- 우리는 오직 입력값만을 조작할 수 있습니다
- 입력값으로 무작위로 뽑힌 값을 넣으면 어떨까요 ?
- 이런 개념의 해결방법을
Random Search
라고 합시다
- 이런 개념의 해결방법을
- 기억하세요, 누구나 항상 운이 나쁠 수 있습니다
- 출력값이 보다 커질 수는 있겠죠
- 하지만 에 가까워지는 건 가능할까요 ?
- 출력값이 너무 작거나 큰 값이 나오는 건 괜찮을까요 ?
- 이건 반쪽짜리 해결방법인 것 같습니다
- 다른 방법을 찾아봐야겠네요
- 잠깐 편미분에 대해 다루고 넘어가고자 합니다
- 이후에 배울
Numerical Gradient
를 이해하는 데에 필요하기 때문입니다
- 이후에 배울
- 편미분은 변수를 여러 개 입력받는 함수에서, 하나의 변수에 대한 미분값을 구하는 방법입니다
- 특정 변수만 변수로 미분하고, 나머지 변수들을 상수로 미분합니다
- 입력받는 변수 개수와 상관없이 편미분 공식은 고정된 형태를 보입니다
- (동일한 식으로) 그저 각 변수에 대해 편미분을 합니다
- 입력값에 대한 편미분값을 생성하고 이를 이용하는 방법입니다
- (이러한 문제에서) 최적값을 보장하는 꽤 좋은 방법입니다
- 하지만 연산비용이 높다는 특징이 있습니다
- 미분을 위해 이라 가정합니다
- 편미분값을 이용해 다음 입력값을 결정하는 과정에서
- 편미분값의 영향을 조절하기 위한
step size
를 로 설정합니다
- 편미분값의 영향을 조절하기 위한
- 이와 같은 과정을 거치면 조금씩 에 근접해감을 알 수 있습니다
- 편미분값은 사실 출력값에 대한 (입력값이 가지는) 영향력을 의미합니다
- 예컨대, 어떤 입력 변수의 편미분값이 일 경우
- 해당 입력 변수의 값이 증가할 때마다 출력값이 만큼 증가합니다
- 반대로 해당 입력 변수의 값이 감소할 때마다 출력값이 만큼 감소합니다
- 우리가 해야할 일은 단지 출력값이 보다 커졌을 때 이것을 멈추는 것입니다
step size
가 작을수록, (이 방법으로 인한 각 시행의 출력값) 차이는 줄어듭니다
- 위에서 알아본
N.G.
은 계산량이 많다는 단점을 가집니다- 하지만 사실은 연산마다 동일한 계산이기 때문에 이를 반복할 필요는 없습니다
- 즉,
N.G.
의 개선된 방법이라 할 수 있습니다
- 계산량 면에 있어 효율적입니다
- 연산마다 편미분값을 구하는 수식을 최적화합니다
- 예컨대, 곱하기와 더하기 연산의 경우 항상 예시와 같은 편미분값을 얻습니다
- 이전에 사용했던 예시에
A.G.
를 적용해봅니다 - 아까와 동일한 결과가 나오는 것을 확인할 수 있습니다
- 이러한 효율성 때문에, AI 프레임워크들은 이러한 방법으로 최적화를 합니다
- 일반적으로 우리는 하나의 연산만 사용하지는 않습니다
- 즉, 서로 연결된 연산의 묶음을 사용하곤 합니다
- 문제는 각 연산들은 자신 이외의 연산에 대한 정보를 가지고 있지않는 것입니다
- 예컨대, 예시의 곱하기 연산은 입력변수 가
add
의 출력값인지 아닌지 모릅니다
- (이를 해결하기 위해서는) 뒤에서부터 앞으로 편미분값들을 구해야합니다
- 그리고 연산 묶음을 하나의 연산으로 취급해야합니다
- 즉, 연산 묶음 중에서 하나의 연산만 떼어놓고 봅니다
- 입력값을 다음과 같이 가정해봅시다
- 위의
A.G.
에서 했던 것처럼 각 입력 변수의 편미분값을 구해줍니다- 최종 출력값 에 대한 와 의 편미분값은 쉽게 구했습니다
- 그럼 이제 더하기 연산에 초점을 맞춰봅시다
- 기호 차이에 주의하세요 와 는 엄연히 다른 함수입니다
- 더하기 연산만 있는 것처럼 편미분값을 구해봅니다
- 이로써 중간 출력값 에 대한 와 의 편미분값을 얻었습니다
- 이것으로 끝일까요 ? 약간 이상하지않나요 ?
- 그렇습니다 우리는 에 대한 와 의 편미분값이 아닌
- 에 대한 와 의 편미분값을 구해야합니다
- 왜냐하면, 와 가 를 조정할 수 있도록 하고 싶은 것이기 때문입니다
- 위에서 보았던 "연산들은 서로를 볼 수 없다"는 사실 때문에
- 기존의 (연산이 하나인 경우의) 방법은 통하지 않습니다
- 이러한 문제를 해결하는 것이
back propagation
이라는 개념입니다- 이 개념은
chain rule
을 사용해 연결된 연산 너머의 출력값에 대한 편미분값을 구하는 것입니다 - 따라서, 이를 이용해 우리는 입력 변수값을 적절하게 조절할 수 있습니다
- 이 개념은
※ chain rule
은 연쇄 법칙
이라고도 합니다
- 그럼 이전 예제에
back propagation
을 적용해봅시다- 우리는 더하기와 곱하기, 총 두 개의 연산을 붙였습니다
- 더하기의 입력 변수에 대한 편미분값을 구하려면, 편미분을 두 번 해야합니다
- 물론, 곱하기의 두 번째 입력 변수는 이에 해당되지 않습니다
- 결과적으로 최종 출력값 가 증가하는 것을 볼 수 있습니다
- 여기까지가 퍼셉트론을 이해하기 위한 배경지식입니다
- 언급하지 않았지만, 최종 출력값을 감소시킬 수도 있습니다
step size
를 곱한offset
을 더하지않고, 뺄 경우입니다
step size
의 크기는 극적인 연출을 위해 크게 설정했었습니다
이후 내용은 (3/5)
에서 이어집니다
감사합니다
'Computer Science > Artificial Intelligence' 카테고리의 다른 글
Introduction to A.I. (4/5) (0) | 2018.10.26 |
---|---|
Introduction to A.I. (3/5) (0) | 2018.10.19 |
Introduction to A.I. (1/5) (0) | 2018.10.07 |
Summary of Reinforcement Learning (0) | 2018.08.25 |
Caffe at Windows #03 (3) | 2018.06.24 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Game
- DirectX
- unity
- lib
- A.I.
- WindowAPI
- C/C++
- pclaf
- csharp
- visualstudio
- CAFFE
- Hashtable
- unreal
- CUDA
- tensorflow
- cuDNN
- JIT
- shader
- Slack
- PopeTV
- Docker
- dll
- git
- Anaconda
- visual-studio
- windows
- ATOM
- vscode
- Python
- NOX
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함