"경사하강법"의 두 판 사이의 차이
(→개요) |
|||
(같은 사용자의 중간 판 하나는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
== 개요 == | == 개요 == | ||
− | 경사법이라고도 한다. 딥러닝에서 어떻게 최적의 매개변수를 찾아낼 것인가. 그 고민의 해답이 경사법이었다. | + | 경사법이라고도 한다. 딥러닝에서 어떻게 최적의 매개변수를 찾아낼 것인가. 그 고민의 해답이 경사법이었다. 훈련의 가장 기본적인 아이디어로, 다른 훈련법들은 모두 이 아이디어를 토대로 출발한다. |
+ | |||
+ | 풀어야 할 문제에 따라 적절한 훈련법이 다르다. | ||
=== 목표 === | === 목표 === | ||
47번째 줄: | 49번째 줄: | ||
=== 한계 === | === 한계 === | ||
비등방성 함수에선 탐색이 비효율적이다. 단순히 기울기 방향으로 따라가기 때문에 복잡한 함수에선 효율적이지 않다. 때문에 모멘텀 등을 사용한다. | 비등방성 함수에선 탐색이 비효율적이다. 단순히 기울기 방향으로 따라가기 때문에 복잡한 함수에선 효율적이지 않다. 때문에 모멘텀 등을 사용한다. | ||
− | [[분류:딥러닝 | + | [[분류:딥러닝 훈련기법]] |
2021년 9월 13일 (월) 17:46 기준 최신판
1 개요편집
경사법이라고도 한다. 딥러닝에서 어떻게 최적의 매개변수를 찾아낼 것인가. 그 고민의 해답이 경사법이었다. 훈련의 가장 기본적인 아이디어로, 다른 훈련법들은 모두 이 아이디어를 토대로 출발한다.
풀어야 할 문제에 따라 적절한 훈련법이 다르다.
1.1 목표편집
목표는 최종적으로 얻어지는 오차값을 통해 이 오차값을 만들어낸 이전 뉴런들로부터의 가중치를 조절하는 것이다. 즉, 해당 오차값에 많은 영향을 미친 뉴런의 가중치값을 크게 조절하고, 오차에 그닥 영향을 미치지 않은 가중치값은 거의 조절하지 않는 것. 해당 오차를 만들어낸 가중치를 조절해나간다면 점차 바른 가중치로 좋은 결과를 얻을 수 있을 것이다.
1.2 아이디어편집
한 층에서 다음층으로 넘어갈 때 다음층의 한 뉴런에 전달되는 값 는 이전 층의 뉴런의 배열 들로부터 온 것이다. 그리고 오차함수 또한 이전 층의 뉴런의 배열로부터 온 것이다. 오차함수에 크게 영향을 미쳤다는 의미는 크게 잘못된 가중치를 가졌다는 의미인데, 가중치를 변화시켜가면서 오차함수의 변화를 보고 오차함수가 작아지는 방향으로 가중치를 변화시키는 것이 필요하다. 그리고 사람의 개입 없이 자동으로.
그렇다면, 가중치 을 변화시킬 때 오차함수가 얼마나 변하는지 보고 이를 작게 하는 방향으로 을 변화시켜야 할텐데, 이는 해당 가중치가 변함에 따라 오차함수에 어떻게 영향을 미칠지 살펴봄으로써 정할 수 있을 것이다. 가중치가 미치는 영향은 다음과 같이 나타낼 수 있을 것이다. 형태로 해당 가중치가 조금 변할 때 얼마나 영향을 미칠지 알 수 있다.(이는 를 만큼 늘리면 오차함수가 만큼 늘어난다는 의미이다.
목표는 의 값을 줄이는 것이니, 가 +라 가정할 때 을 감소시키는 방향으로 움직여야 전체 의 값이 감소할 것이다.
따라서, 인공지능의 작동 후 를 얻었을 때 를 로 변형해 주면( 는 학습률을 의미한다.) 학습에 따라 적절한 에 도달하게 될 것이다.(가중치의 영향이 클수록 더 크게 변하게끔.)
1.3 기울기 구현편집
def numerical_gradient(f, x): # 함수 f의 x에 대한 기울기를 구한다.
# 일반적으로 f에 오차함수, x에 가중치 배열을 넣는다.
d = 1e-4 # 미소변위 대신 쓰이는 값. 실제 미분은 구할 수 없는 경우가 많으니 수치미분으로 경사를 구한다. 이 정도가 좋다고 알려져있다.
grad = np.zeros_like(x) # 기울기를 담기 위해 받은 배열의 크기와 같은 크기의 배열을 준비한다.
for i in range(x.size): # 전체 갯수에 대해 순회한다.
init = x[i] # 처음 x값을 받아,
po = init + d
fx_p = f(po) # 양수 미소변위의 함수값을 구하고,
ne = init - d
fx_n = f(ne) # 음수 미소변위의 함수값을 구한다.
grad[i] = (fx_p - fx_n) / (2 * d) # 수치미분을 실행.
return grad
1.4 학습률편집
와 같은 것들은 사람이 정해주어야 하는, 하이퍼파라미터라 하는데, 여러 후보값을 통해 구해보는 수밖에 없다.
- 가 너무 작으면 의 최저점이 아닌, 언덕에서 머무르며 빠져나오지 않게 될 수 있고,(이렇게 되면 최선의 답이 아님에도 학습이 진행되지 않는다.)
- 가 너무 크면 안정지점에 들어가지 못하고 이리저리 튀는 모습을 보여주게 된다.
1.5 수치미분의 한계편집
연산량이 많아 속도가 느리다.
때문에 이어지는 게 오차역전파법
다만, 오차역전파법은 미분을 계산해야 하고, 층마다 새로이 구성해야 하기 때문에 실수할 수 있어 수치미분을 검증용으로 사용한다. 오차역전파법이 잘 구현되었는지 검증용으로. 역전파와 수치미분을 비교해 차이의 절대값을 구하고 이를 평균해 오차를 구해보면 오차역전파법이 제대로 구현되었는지 확인할 수 있다.
1.6 한계편집
비등방성 함수에선 탐색이 비효율적이다. 단순히 기울기 방향으로 따라가기 때문에 복잡한 함수에선 효율적이지 않다. 때문에 모멘텀 등을 사용한다.