일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 퀵정렬
- 알고리즘
- BFS
- GRU
- pytorch
- 재귀함수
- 최단 경로
- 이진 탐색
- 계수정렬
- 인공지능
- 그리디
- 큐
- 선형대수
- 캐치카페신촌점 #캐치카페 #카페대관 #대학생 #진학사 #취준생
- DFS
- 삽입정렬
- 다이나믹 프로그래밍
- AI
- 스택
- RESNET
- LSTM
- 머신러닝
- 딥러닝
- 정렬
- rnn
- 선택정렬
- Machine Learning
- Today
- Total
hyeonzzz's Tech Blog
[Andrew Ng] 딥러닝 2단계 : 4. 최적화 알고리즘 본문
1. 미니 배치 경사하강법
벡터화는 m개의 샘플에 대한 계산을 효율적으로 만들어준다. 따라서 훈련 샘플을 받아서 큰 행렬에 저장한다.
X = [x^(1) x^(2) x^(3) ... x^(m)] 차원은 (n_x, m)
Y = [y^(1) y^(2) y^(3) ... y^(m)] 차원은 (1, m)
벡터화는 m개의 샘플을 상대적으로 빠르게 훈련시킬 수 있지만 m이 매우 크다면 여전히 느릴 수 있다.
m >= 5,000,000 이라면
경사 하강법의 작은 한 단계를 밟기 전에 모든 훈련 세트를 처리해야 한다. 또 경사 하강법의 다음 단계를 밟기 전에 다시 오백만 개의 전체 훈련 샘플을 처리해야 한다. 따라서 오백만 개의 거대한 훈련 샘플을 모두 처리하기 전에 경사 하강법이 진행되도록 하면 더 빠른 알고리즘을 얻을 수 있다.
<미니 배치>
훈련 세트를 더 작은 훈련 세트들로 나누었다고 해보자. 이러한 작은 훈련 세트는 미니배치라고 부른다. 각각의 미니배치가 1,000개의 샘플을 갖는다고 하면 X^{1} = x^(1)부터 x^(1000)까지이고 첫번째 작은 훈련 세트, 즉 미니배치라고 부른다. 그다음 X^{2} = x^(1001)부터 x^(2000)까지 얻는다. 5,000,000 * 1000 = 5000개의 미니배치가 있고 따라서 X^{5000}으로 끝나게 된다. Y도 똑같이 Y^{5000}까지 나눈다. 훈련 샘플은 X^{t}와 Y^{t}로 구성된다.
<표기법>
x^(i) : i 번째 훈련 샘플
z^[l] : l 번째 신경망의 z 값
{t} : 서로 다른 미니배치
X는 (n_x, m) 차원이다. 따라서 X^{1}이 1000개의 훈련 샘플이라면 차원은 (n_x, 1000)이 돼야 한다. X^{2}를 포함해 모든 미니배치의 차원은 (n_x, 1000)이 돼야 한다. Y^{1}의 차원은 (1, 1000)이 돼야 한다.
배치 경사 하강법 : 모든 훈련 세트의 경사 하강법을 동시에 진행시키는 방법
미니배치 경사 하강법 : 하나의 미니배치 X^{t}, Y^{t}의 경사 하강법을 동시에 진행시키는 방법
<코드 작성 방법>
첫 번째로 입력 X^{t}에 대해 정방향 전파를 구현하게 된다. 이를 위해 z^[1] = W^[1]X를 구현한다. 전에는 X를 곱해주었지만 전체 훈련 세트를 진행하는 것이 아닌 첫 번째 미니배치를 진행하기 때문에 X^{t}를 곱해주게 된다. 그리고 A^[1] = g^[1](Z^[1])이다. 벡터화된 구현이기 때문에 Z를 대문자로 써줬다. 이런 식으로 A^[L] = g^[L](Z^[L])까지 진행합니다. 이것이 우리의 예측이다. 이 벡터화된 구현이 동시에 오백만개의 샘플 대신에 1,000개의 샘플을 진행한다.
다음은 비용함수 J를 계산한다. 작은 훈련 샘플의 크기가 1,000이므로 1/1000으로 쓴다. i가 1부터 l까지 y^(i)의 예측값과 y^(i)를 매개변수로 하는 손실함수의 합을 곱해준다. 명확성을 위해 이 표기법은 미니배치 X^{t}, Y^{t}에서 온 샘플을 말한다. 여기에 정규화 항을 사용할 수도 있다. 분모에 2를 곱하고 l에 대한 프로베니우스 노름의 제곱의 합을 곱해준다. 하나의 미니배치에 대한 비용이기 때문에 J에 위 첨자 {t}를 색인하도록 하겠다. 모든 것은 전에 했던 경사 하강법을 구현하는 것과 정확히 같지만 X, Y 대신에 X^{t}, Y^{t}에 한다는 점만 다르다.
다음은 역전파를 구현하겠다. J^{t}에 대응하는 경사를 계산하기 위한 것이다. 여전히 X^{t}와 Y^{t}를 사용한다. 그리고 가중치를 업데이트한다. 모든 W^[l]은 W^[l]-αdW^[l]로 업데이트되고 b도 비슷하게 업데이트 된다. 따라서 이것은 미니배치 경사 하강법을 사용한 훈련 세트를 지나는 한 번 반복이다. 여기에 작성한 코드는 훈련의 한 에포크를 거친다고도 말할 수 있다. 에포크는 훈련 세트를 거치는 한 반복을 의미한다.
따라서 배치 경사 하강법에서 훈련 세트를 거치는 한 반복은 오직 하나의 경사 하강 단계만을 할 수 있게 한다. 미니배치 경사 하강법의 경우 훈련 세트를 거치는 한 반복은 5,000개의 경사 하강 단계를 거치도록 한다. 또 다른 반복문을 사용해서 훈련 세트를 여러번 거치면 원하는 만큼 계속 거의 수렴할 때까지 훈련 세트를 계속 반복시키게 된다. 훈련 세트가 많다면 배치 경사 하강법보다 미니배치 경사 하강법이 훨씬 더 빠르게 실행된다.
2. 미니 배치 경사하강법 이해하기
배치 경사 하강법에서는 모든 반복에서 전체 훈련 세트를 진행하고 각각의 반복마다 비용이 감소하기를 기대합니다. 비용함수 J를 서로 다른 반복에 대한 함수로 그렸을 때 모든 반복마다 감소해야 합니다 하나라도 올라간다면 무언가 잘못된 것입니다. 학습률이 너무 크다든지 말입니다.
미니배치 경사 하강법에서 비용 함수에 대한 진행을 그려본다면 모든 반복마다 감소하지는 않습니다. 특히 모든 반복에서 어떤 X^{t}와 Y^{t}를 진행시키는데 비용함수 J^{t}를 그려본다면 X^{t}와 Y^{t}만을 이용해 계산된 값입니다. 그럼 모든 반복에서 다른 훈련 세트, 즉 다른 미니배치에서 훈련하는 것입니다. 따라서 비용함수 J를 그리면 전체적인 흐름은 감소하나 약간의 노이즈가 발생됩니다. 따라서 미니배치 경사 하강법을 훈련하기 위한 J^{t}를 그리면 모든 반복에서 아래로 내려가지는 않습니다. 그러나 큰 흐름은 아래로 내려갑니다. 약간의 노이즈가 발생하는 이유는 아마 X^{1}과 Y^{1}이 상대적으로 쉬운 미니배치라서 비용이 약간 낮은데 우연적으로 X^{2}와 Y^{2}가 더 어려운 미니배치라서 아마 잘못 표시된 샘플이 있다든지의 이유로 비용이 약간 더 높아질 수 있습니다. 미니배치 경사 하강법을 실행시킬 때 이러한 진동이 일어나는 이유입니다.
여러분이 선택해야 하는 매개변수 중 하나는 미니배치의 크기입니다. m이 훈련 세트의 크기일 때 극단적인 경우는 미니배치 크기가 m과 같은 경우입니다. 그럼 이것은 배치 경사 하강법이 됩니다. 따라서 이런 극단적인 경우에는 하나의 미니배치만을 갖게 됩니다. X^{1}과 Y^{1}입니다. 그리고 이 미니배치의 크기는 전체 훈련 세트와 같습니다. 따라서 미니배치 크기를 m으로 설정하는 것은 일반적인 경사 하강법과 같습니다.
다른 극단적인 경우는 미니배치 크기가 1과 같은 경우입니다. 이것은 확률적 경사 하강법이라고 불리는 알고리즘을 제공합니다. 그리고 여기서 각각의 샘플은 하나의 미니배치입니다. 이런 경우에 첫 번째 미니배치인 X^{1}과 Y^{1}을 살펴보면 미니배치 크기가 1일 때 이것은 첫 번째 훈련 샘플과 같습니다. 첫 번째 훈련 샘플로 경사 하강법을 하는 것입니다. 그 다음에 두 번째 미니배치를 살펴보면 이것은 두 번째 훈련 샘플과 같고 이것에 대한 경사 하강 단계를 취합니다. 이런 식으로 한 번에 하나의 훈련 샘플만을 살펴보며 계속 진행합니다
이제 이 두 가지 극단적인 경우가 비용함수를 최적화할 때 무엇을 하는지 살펴봅시다.
만약 이것이 여러분이 최소화하려는 비용함수의 등고선이라면 최솟값은 가운에 위치합니다. 그럼 배치 경사 하강법은 어딘가에서 시작해 상대적으로 노이즈가 적고 상대적으로 큰 단계를 취합니다. 그러면서 계속 최솟값으로 나아갑니다.
그와 반대로 확률적 경사 하강법에서 어딘가에서 시작하면 모든 반복에서 하나의 훈련 샘플로 경사 하강법을 실행하게 됩니다. 대부분의 경우 전역 최솟값으로 가게 되지만 어떤 경우는 잘못된 방향을 가르켜 잘못된 곳으로 가기도 합니다. 따라서 확률적 경사 하강법은 극단적으로 노이즈가 많을 수 있지만 평균적으로는 좋은 방향으로 가게 됩니다. 잘못된 방향일수도 있지만요. 따라서 확률적 경사 하강법은 절대 수렴하지 않을 것입니다. 진동하면서 최솟값의 주변을 돌아다니게 되지만 최솟값으로 곧장 가서 머물지는 않을 것입니다.
실제로 여러분이 사용하는 미니배치 크기는 1과 m 사이일 것입니다. 1은 상대적으로 너무 작고 m은 상대적으로 너무 큰 값입니다. 여기 그 이유가 있습니다. 배치 경사 하강법을 사용한다면 미니 배치의 크기는 m과 같습니다. 그럼 매우 큰 훈련 세트를 모든 반복에서 진행하게 됩니다. 이것의 주된 단점은 한 반복에서 너무 오랜 시간이 걸린다는 것입니다. 작은 훈련 세트에서는 괜찮지만 큰 훈련 세트에서는 오랜 시간이 필요합니다
그와 반대로 확률적 경사 하강법을 사용한다면. 하나의 샘플만 처리한 뒤에 계속 진행할 수 있습니다. 하나의 샘플만 처리한 뒤에 계속 진행할 수 있어 매우 간단합니다. 노이즈도 작은 학습률을 사용해 줄일 수 있습니다. 그러나 확률적 경사 하강법의 큰 단점은 벡터화에서. 얻을 수 있는 속도 향상을 잃게된다는 것입니다. 한 번에 하나의 훈련 세트를 진행하기 때문에 각 샘플을 진행하는 방식이 매우 비효율적입니다. 따라서 가장 잘 작동하는 것은 이 사이에 있는 값입니다. 미니배치 크기가 너무 크거나 작지 않을 때입니다. 그리고 실제로 이것은 가장 빠른 학습을 제공합니다
이를 통한 두 가지 장점이 있습니다 하나는 많은 벡터화를 얻는다는 것입니다. 따라서 이전 비디오에서 사용했던 예시처럼 미니배치 크기가 1,000개의 샘플이라면 1,000개의 샘플에 벡터화를 하게 될 것입니다. 그럼 한 번에 샘플을 진행하는 속도가 더 빨라지게 됩니다
두 번째로 전체 훈련 세트가 진행되기를 기다리지 않고 진행을 할 수 있습니다. 이전 비디오의 예를 들면 각각의 훈련 세트의 에포크는 5,000번의 경사 하강 단계를 허용합니다. 따라서 실제로 사이에 있는 미니배치 크기가 가장 잘 작동합니다. 항상 최솟값으로 수렴한다고 보장할 수는 없지만 더 일관되게 전역의 최솟값으로 향하는 경향이 있습니다. 그리고 매우 작은 영역에서 항상 정확하게 수렴하거나 진동하게 됩니다.
그렇다면 미니배치 크기가 m이나 1이 아닌 그 사이의 값이어야 한다면 이 값을 어떻게 선택할까요?
여기 가이드라인이 있습니다. 첫 번째로 작은 훈련 세트라면 그냥 배치 경사 하강법을 사용하세요. 훈련 세트가 작다면 미니배치 경사 하강법을 사용할 필요 없이 전체 훈련 세트를 빠르게 진행할 수 있습니다. 여기서 작은 훈련 세트는 샘플이 2000개보다 적은 경우를 말합니다.
이와 달리 더 큰 훈련 세트라면 전형적인 미니배치 크기는 64에서 512 사이가 가장 일반적입니다. 왜냐하면 컴퓨터 메모리의 접근 방식을 생각해보면 미니배치 크기가 2의 제곱인 것이 코드를 빠르게 실행시켜줍니다. 따라서 64는 2^6, 128은 2^7, 256은 2^8, 512는 2^9입니다. 저는 미니배치의 크기를 2의 제곱수로 구현할 것입니다. 이전 비디오에서는 미니배치 크기를 1,000으로 설정했는데 그 값 대신 2^10인 1024를 사용하는 것을 추천합니다. 미니배치 크기로 1,024는 조금 드문 경우입니다. 이 범위의 미니배치 크기가 더 일반적입니다.
마지막 팁은 미니배치에서 모든 X^{t}와 Y^{t}가 CPU와 GPU 메모리에 맞는지 확인하세요. 이것은 여러분의 애플리케이션과 하나의 훈련 샘플의 크기에 달려 있습니다. 그러나 CPU나 GPU 메모리에 맞지 않는 미니배치를 진행시키면 성능이 갑자기 떨어지고 훨씬 나빠지게 됩니다.
실제로 미니배치 크기는 빠른 탐색을 통해 찾아내야 하는 또 다른 하이퍼파라미터입니다. 가장 효율적이면서 비용함수 J 를 줄이는 값을 찾아내야 합니다. 제가 하는 방법은 몇 가지 다른 2의 제곱수를 시도해보고 경사 하강법 최적화 알고리즘을 가능한 가장 효율적이게 만드는 값을 선택하는 것입니다. 말씀드린 방법이 값을 찾는 것을 시작하는데 도움이 되었으면 좋겠습니다
미니배치 경사 하강법의 구현과 알고리즘의 수행 속도를 높이는 방법을 배웠습니다. 특히 큰 훈련 세트에서 훈련할 때 말이죠
3. 지수 가중 이동 평균
지수가중평균 : 시계열 데이터에서 이전 데이터와 최신 데이터에 가중치를 부여하여 평균을 계산하는 방법
경사 하강법보다 빠른 몇 가지 최적화 알고리즘을 보여드리고 싶습니다. 그 알고리즘들을 이해하기 위해서는 지수가중평균을 사용할 수 있어야 합니다. 통계학에서 지수가중이동평균이라고도 불립니다. 먼저 이것에 대해 이야기하고 가장 정교한 최적화 알고리즘을 구현하는데 사용할 것입니다.
지금은 미국에 살고 있지만 저는 런던에서 태어났습니다. 이 예시를 위해 작년 런던의 일별 기온을 가져왔습니다. 1월 1일의 기온은 화씨 40도였습니다. 이것은 섭씨 4도와 같습니다. 1월 2일은 섭씨 9도네요 이런 식으로 1년의 절반인 181까지 나와 있습니다. 180일에는 화씨 60도입니다 섭씨 15도와 같습니다. 여름에는 따뜻해지고 겨울에는 더 춥습니다.
데이터를 그려보면 다음과 같습니다. 여기서 지역 평균이나 이동 평균의 흐름을 계산하고 싶다면 이런 방법이 있습니다. V_0를 0으로 초기화합시다. 매일 이전 값에 0.9를 곱하고 여기에 0.1 곱하기 해당 날의 기온을 더해줄 것입니다. 따라서 이 값을 계산해 그림으로 나타내면 이런 그림을 얻게 됩니다. 일별 기온의 지수가중평균을 얻게 됩니다.
이전 슬라이드의 공식을 다시 살펴봅시다. 이전에 쓰던 0.9를 β라고 표현하면 V_t = βV_t-1 + (1-β)θt 가 됩니다. 이전의 슬라이드에서 β는 0.9였습니다. 이유는 나중에 배울 것입니다만 V_t를 계산한 값은 대략적으로 1/(1-β) * 일별 기온의 평균과 같습니다. 예를 들어 β가 0.9와 같은 경우 이는 10일 동안 기온의 평균과 같습니다. 그것이 이 붉은색 선입니다.
좀 다른 것을 시도해봅시다 β가 0.98이면 1/(1-0.98)은 50과 비슷하므로 이 값은 50일의 기온의 평균과 거의 같습니다. 이것을 그리면 초록색 선과 같습니다. 여기서 알 수 있는 것은 β 값이 클수록 선이 더 부드러워집니다. 더 많은 날짜의 기온의 평균을 이용하기 때문에 곡선이 더 부드러워집니다. 그러나 곡선이 올바른 값에서 더 멀어집니다. 더 큰 범위에서 기온을 평균하기 때문이죠. 그래서 기온이 바뀔 경우에 지수가중평균 공식은 더 느리게 적응합니다. 따라서 지연되는 시간이 더 큽니다. β가 0.98이면 이전 값에 많은 가중치를 주고 현재의 기온에는 작은 가중치를 주게 됩니다. 따라서 기온이 올라가거나 내려가면 이 지수가중평균은 β가 커서 더 느리게 적응하게 됩니다.
다른 값을 시도해봅시다 또 다른 극단적인 예시로 β가 0.5라면 이 공식에 의해서 2일의 기온만 평균하는 것과 같습니다. 그럼 다음과 같은 노란색 그래프를 얻게 됩니다. 오직 2일의 기온만을 평균했기 때문에 더 노이즈가 많고 이상치에 더 민감합니다. 그러나 기온 변화에 더 빠르게 적응합니다.
따라서 이 공식은 지수가중평균을 구현하기 위한 공식입니다. 통계학 논문에서는 지수가중이동평균이라고 부릅니다. 이 매개변수 혹은 학습 알고리즘의 하이퍼파라미터의 값을 바꿈으로써 약간씩 다른 효과를 얻게 되고 이를 통해 가장 잘 작동하는 값을 찾게 됩니다. 빨간색 곡선을 주는 값을 말합니다. 초록색이나 노란색 곡선보다는 더 나은 평균을 제공합니다. 이제 지수가중평균을 계산하는 방법의 기본을 배웠습니다.
4. 지수 가중 이동 평균 이해하기
β가 0.9와 같은 경우 빨간색 곡선을 얻게 됩니다. 1에 가까운 0.98의 경우 초록색 곡선을 얻게 됩니다. 0.5로 작은 값의 경우 노란색 곡선을 얻게 됩니다. 일일 기온의 평균을 계산하는 방법에 대해 수학적으로 더 알아봅시다.
여기 공식이 다시 나옵니다 β를 0.9로 설정합시다. 이를 이용해 몇 가지 식을 더 작성하겠습니다. 이것을 구현할 때 t는 0부터 1, 2, 3으로 증가하는데 분석을 위해 t가 감소하는 방향으로 식을 작성하겠습니다. 여기 이 첫 번째 식을 살펴봅시다. V_100이 무엇인지 알아봅시다. 이 두 항의 위치를 바꾸겠습니다. 0.1 곱하기 θ_100 더하기 0.9 곱하기 V_99가 V_100의 값이 됩니다. 그럼 V_99의 값은 무엇일까요? 이 식에서 가져오도록 하겠습니다. 이것은 두 항을 바꾼 0.1*θ_99 + 0.9*V_98이 됩니다. V_98 역시 이 위의 식을 대입해 0.1*θ_98 + 0.9*V_97입니다 이런 식으로 계속됩니다.
이 모든 항을 다 곱하면 V_100는 0.1*θ_100 더하기 θ_99의 계수를 보면 0.1 곱하기 0.9 곱하기 θ_99입니다. 이제 θ_98의 계수를 살펴보면 0.1 * 0.9 * 0.9입니다. 따라서 식을 확장하면 0.1*(0.9)^2*θ_98이 됩니다. 식을 계속 확장하면 그 다음은 0.1*(0.9)^3*θ_97 더하기 0.1*(0.9)^4*θ_96 + ... 입니다. 따라서 이것이 가중치의 합, 즉 θ_100의 가중치의 평균입니다. 이것은 현재 온도이고 한 해의 100일째인 V_100을 찾고 있습니다. 이것은 θ_100, θ_99, θ_98, θ_97, ... 의 합으로 되어 있습니다.
이것을 그림으로 나타내는 한 가지 방법은 몇 일간의 온도가 있다고 했을 때 여기가 θ축이고 이 쪽은 t축입니다. θ_100는 어떤 값을 갖고 θ_99도 어떤 값을 갖게 될 것입니다. t가 100일 때, 99일 때, 98일 때의 θ를 표시한 것입니다. 따라서 몇 일간의 온도를 표시한 것입니다. 우리가 볼 수 있는 것은 지수적으로 감소하는 함수입니다. 0.1에서 시작해 0.9*0.1 (0.9)^2*0.1 따라서 지수적으로 감소하는 함수입니다. V_100을 구하는 과정은 이 두 함수 간에 요소별 곱셈을 해서 더하는 것입니다. 이 값을 취해서 θ_100 * 0.1 θ_99*0.1*0.9 이런 식으로 일일 온도에 지수적으로 감소하는 함수를 곱해주고 모두 더합니다. 그럼 그 값이 V_100이 됩니다.
앞에 곱해지는 계수들을 모두 더하면 1 또는 1에 가까운 값이 됩니다. 다음 비디오에서 얘기할 편향 보정이라고 불리는 값입니다. 이들에 의해 지수가중평균이 됩니다.
얼마나 많은 날들이 평균적인 온도가 되는지 궁금하실 겁니다. 0.9^10이 0.35와 대략적으로 같고 이 값은 1/e, 즉 많은 자연로그의 밑과 대략적으로 같습니다. 더 일반적으로 (1-ε)이 있다면 이 예시에서 ε은 0.1이 되고 (1-ε)은 0.9가 됩니다. (1-ε)^(1/ε)은 대략적으로 1/e와 같습니다. 0.3 또는 0.35입니다. 다른 말로 온도가 감소하기까지 즉 1/3이 되기까지 약 10일이 걸립니다. 따라서 이런 이유때문에 β가 0.9와 같을 때 만약 지난 10일간의 온도에만 초점을 맞춰 가중평균을 계산한다면 10일 뒤에는 가중치가 현재 날짜의 가중치의 1/3로 줄어듭니다.
그와 반대로 β가 0.98이라면 이 값이 매우 작아지려면 0.98의 몇 제곱이 필요할까요? 0.98^50가 대략적으로 1/e와 같습니다. 처음 50일 동안의 1/e보다 가중치는 더 커질 것입니다. 감소는 가파르게 일어날 것입니다. 따라서 직관적으로 50일의 온도의 평균은 더 급격히 빠릅니다. 왜냐하면 이 예시에서 ε은 0.02이기기 때문입니다. 따라서 1/ε은 50과 같습니다. 이것은 1/(1-β)와도 대략적으로 같습니다. 여기서 ε은 1-β입니다. 평균적인 온도가 몇 일 정도가 될지에 관한 상수를 알려줍니다. 그러나 이것은 관습적으로 쓰이는 것이지 수학 공식은 아닙니다.
이제 실제로 어떻게 구현할지를 알아봅시다.
v_0를 0으로 초기화합니다. 첫째 날에는 v_1, 둘째 날에는 v_2, 이런 식으로 계속됩니다. v_0, v_1, v_2, ...를 별개의 변수로 취급합니다. 실제로 구현할 때는 v를 0으로 초기화합니다. 그리고 첫째 날에는 v를 β*v + (1--β)θ_1으로 설정합니다. 다음 날에는 v를 β*v + (1--β)θ_2로 설정합니다. 가끔 v에 아래 첨자 θ를 한 표기법을 사용하기도 합니다. v가 θ를 매개변수로 하는 지수가중평균을 계산한다는 것을 나타내기 위해서요.
이것은 반복문으로 나타내면 v_θ를 0으로 설정하고 각각의 날짜마다 다음 θ_t를 얻고 그리고 v_θ는 β*v_θ + (1-β)θ_t로 업데이트됩니다.
이렇게 지수평균을 얻는 식의 장점은 아주 적은 메모리를 사용한다는 것입니다. 이 실수 하나만을 컴퓨터 메모리에 저장하고 가장 최근에 얻은 값을 이 식에 기초해 덮어쓰기만 하면 되니까요. 한 줄의 코드만 작성하면 되서 효율적입니다. 그리고 지수가중평균을 계산하기 위해 하나의 실수를 저장하는 메모리만 필요합니다. 평균을 계산하는 가장 정확하고 최선의 방법은 아닙니다. 명시적으로 지난 10일 또는 50일 간의 온도를 더하고 10이나 50으로 나누는 것이 더 나은 추정치를 제공합니다. 그러나 그렇게 하는 방법은 더 많은 메모리를 필요로 합니다. 그리고 더 복잡한 구현이라 컴퓨터적으로 많은 비용이 필요합니다. 따라서 다음 비디오에서 몇 가지 예제에 나오는 많은 변수의 평균을 계산하는 경우에는 이것이 컴퓨터 계산 비용과 메모리 효율 측면에서 더 효율적입니다. 머신러닝에서 이 방법을 많이 사용하는 이유입니다. 이제 지수가중평균을 구하는 방법을 배웠습니다.
5. 지수 가중 이동 평균의 편향보정
지수가중평균을 어떻게 구현하는지 배웠습니다. 편향 보정이라고 불리는 기술적인 세부 사항으로 평균을 더 정확하게 계산할 수 있습니다. 어떻게 작동되는지 살펴봅시다.
지난 비디오에서 β가 0.9일 때의 그래프와 β가 0.98일 때의 그래프를 살펴보았습니다. 그러나 여기 작성된대로 공식을 구현하면 β가 0.98일 때 초록색 곡선을 얻지 못할 것입니다. 여기 있는 보라색 곡선을 얻게 될 것입니다. 보라색 곡선이 매우 낮은 곳에서 시작한다는 것이 보이실 겁니다. 이를 고쳐보도록 하겠습니다.
이동평균을 구할 때 v_0는 0으로 초기화하고 v_1 = 0.98*v_0 + 0.02*θ_1입니다. 그러나 v_0 = 0이기 때문에 v_1은 그냥 0.02*θ_1이 됩니다. 따라서 첫 번째 날의 온도가 화씨 40도면 v_1의 값은 0.02*40인 8이 될 것입니다. 값이 훨씬 더 낮아져서 첫 번째 날의 온도를 잘 추정할 수 없습니다. v_2는 0.98v_1 + 0.02θ_2가 될 것입니다. v_1 값을 여기에 대입하면 v_2의 값은 0.980.02θ_1 + 0.02θ_2가 됩니다. 이것은 0.0196θ_1 + 0.02θ_2입니다. θ_1과 θ_2가 양수라고 가정하면 v_2를 계산한 값은 θ_1이나 θ_2보다 훨씬 더 작아질 것입니다. 한 해의 첫 두 날짜를 추정한 값이 좋지 않은 추정이 됩니다.
따라서 이 추정값이 더 나은 값이 될 수 있도록 수정하는 방법이 있습니다. 특히 추정의 초기 단계에서 더 정확하게 보정할 수 있습니다. v_t를 취하는 대신에 v_t / 1-β^t를 취합니다. t는 현재의 온도입니다. 예시를 들어 살펴보면 t가 2일 때 1-β^t는 1-(0.98)^2와 같습니다. 이 값을 계산하면 0.0396과 같습니다. 따라서 둘째 날의 온도를 추정한 값은 v_2를 0.0396으로 나눈 값과 같습니다. 이 값은 0.0196*θ_1 + 0.02*θ_2를 0.0396으로 나눈 값과 같습니다. 따라서 이것은 θ_1과 θ_2의 가중평균에 편향을 없앤 값이 됩니다. 따라서 t가 더 커질수록 β^t는 0에 가까워집니다. 따라서 t가 충분히 커지면 편향 보정은 그 효과가 거의 없어집니다. t가 커질 때 보라색 곡선과 초록색 곡선이 거의 겹치는 이유입니다. 그러나 초기 단계의 학습에서 편향 보정은 더 나은 온도의 추정값을 얻는데 도움이 될 것입니다. 보라색 선에서 초록색 선으로 갈 수 있게 합니다. 머신러닝에서 지수가중평균을 구현하는 대부분의 경우 사람들은 편향 보정을 거의 구현하지 않습니다. 왜냐하면 초기 단계를 그냥 기다리고 편향된 추정이 지나간 후부터 시작합니다. 그러나 초기 단계의 편향이 신경쓰인다면 편향 보정은 초기에 더 나은 추정값을 얻는데 도움이 될 것입니다. 이제 지수가중이동평균을 구현하는 방법을 배웠습니다. 이제 더 나은 최적화 알고리즘을 구현하는데 이것을 사용해봅시다.
6. Momentum 최적화 알고리즘
모멘텀을 이용한 경사 하강법 : 현재의 그래디언트(기울기)뿐만 아니라 이전 스텝에서의 모멘텀을 고려하여 파라미터를 업데이트한다
모멘텀 알고리즘 혹은 모멘텀이 있는 경사 하강법은 일반적인 경사 하강법보다 거의 항상 더 빠르게 동작합니다. 기본적인 아이디어는 경사에 대한 지수가중평균을 계산하는 것입니다. 그 값으로 가중치를 업데이트합니다. 이 비디오에서는 한 문장의 설명을 풀어서 어떻게 구현할 수 있을지 알아봅시다.
대부분의 예제에서 비용함수를 최적화한다고 가정해봅시다. 등고선은 다음과 같습니다 빨간 점은 최솟값의 위치를 나타냅니다. 경사 하강법을 여기서 시작해서 경사 하강법 혹은 미니배치 경사 하강법의 한 반복을 취하면 이 쪽으로 향합니다. 파란색선을 참고합니다. 타원의 반대쪽에서 경사 하강법의 한 단계를 취하면 이런 식으로 오게 됩니다. 계속 한 단계씩 갈 때마다 이런 식으로 나아갑니다. 많은 단계를 취하면 최솟값으로 나아가면서 천천히 진동합니다. 위 아래로 일어나는 이런 진동은 경사 하강법의 속도를 느리게 하고 더 큰 학습률을 사용하는 것을 막습니다. 왜냐하면 오버슈팅하게 되어 보라색처럼 발산할 수도 있기 때문입니다. 따라서 학습률이 너무 크지 않아야 진동이 커지는 것을 막을 수 있습니다.
이 문제를 보는 또 다른 관점은 수직축에서는 진동을 막기 위해 학습이 더 느리게 일어나기를 바라지만 수평축에서는 더 빠른 학습을 원합니다. 최솟값을 향해 왼쪽에서 오른쪽으로 이동하는 것을 처리하고 싶기 때문입니다. 따라서 모멘텀을 이용한 경사 하강법에서는 구현할 때에는 다음과 같이 합니다. 각각의 반복에서 더 정확히 말해서 반복 t에서 보편적인 도함수인 dw와 db를 계산하게 될 것입니다. 위 첨자로 괄호를 표시하는 것은 생략하겠습니다. 그러나 현재의 미니배치에 대한 dw와 db를 계산하게 됩니다. 배치 경사 하강법을 사용하는 경우 현재의 미니배치는 전체 배치와 같습니다. 그 다음에 V_dw = βV_dw + (1-β)dw를 계산합니다. 이동평균을 w에 대한 도함수로 계산합니다. v_db = βv_db + (1-β)db 계산합니다. 그럼 w를 사용해 가중치를 업데이트합니다. w = w - α*v_dw 으로 업데이트됩니다. b = b - α*v_db 로 업데이트 됩니다. 이것은 경사 하강법의 단계를 부드럽게 만들어줍니다.
지난번에 계산한 몇 가지 도함수가 이런 식이라고 한다면 이 경사의 평균을 구하면 수직 방향의 진동이 0에 가까운 값으로 평균이 만들어집니다. 진행을 늦추고 싶은 수직 방향에서는 양수와 음수를 평균하기 때문에 평균이 0이 됩니다. 반면에 수평 방향에서 모든 도함수는 오른쪽을 가리키고 있기 때문에 수평 방향의 평균은 꽤 큰 값을 가집니다. 따라서 몇 번의 반복이 있는 이 알고리즘에서 경사 하강법은 결국에 수직 방향에서는 훨씬 더 작은 진동이 있고 수평 방향에서는 더 빠르게 움직인다는 것을 찾을 수 있을 겁니다. 따라서 이 알고리즘은 더 직선의 길을 가거나 진동을 줄일 수 있게 합니다.
이 모멘텀에서 얻을 수 있는 직관은 밥그릇 모양의 함수를 최소화하려고 하면 그럼 이 도함수의 항들은 아래로 내려갈 때 가속을 제공한다고 볼 수 있습니다. 따라서 작은 공이 이 그릇의 경사를 내려갈 때 도함수는 여기에 가속을 부여하고 더 빠르게 내려가게 만듭니다. 가속을 주기 때문입니다. 그리고 β의 값은 1보다 조금 작기 때문에 마찰을 제공해서 공이 제한 없이 빨라지는 것을 막습니다. 따라서 경사 하강법이 모든 이전 단계를 독립접으로 취하는 대신에 그릇을 내려가는 공에 가속을 주고 모멘텀을 제공할 수 있습니다.
이제 어떻게 구현할지에 대한 세부 사항을 살펴봅시다.
여기 학습률 α와 지수가중평균을 제어하는 β라는 두 가지 하이퍼파라미터가 있습니다. β의 가장 일반적인 값은 0.9입니다. 지난 10일 간의 온도를 평균하는 것이죠. 실제로 β가 0.9인 경우 매우 잘 작동합니다. 다양한 값을 시도하면서 하이퍼파라미터를 탐색해보세요. 그러나 0.9가 꽤 견고한 값을 제공합니다.
편향 보정은 어떨까요? v_dw를 (1-β^t)로 나눠줍니다. 많은 사람들이 잘 사용하지 않습니다. 그 이유는 10번의 반복 뒤에 이동평균이 충분히 진행 돼서 편향 추정이 더 이상 일어나지 않기 때문입니다. 따라서 경사 하강법이나 모멘텀을 구현할 때 편향 보정을 하는 사람들은 거의 없습니다. v_dw를 0으로 초기화하는 과정은 dw와 같은 차원의 0으로 이루어진 행렬입니다. w와도 같은 차원입니다. v_db도 0에 대한 벡터로 초기화됩니다. db와 b와 같은 차원입니다.
모멘텀이 있는 경사 하강법에 대한 논문을 읽어보면 (1-β^t)에 관한 항이 자주 삭제되어 있는 것을 발견할 것입니다. 따라서 v_dw = β*v_dw + dw입니다. 보라색으로 표시한 버전의 효과는 v_dw가 1/(1-β)에 대한 계수로 스케일링 되는 것입니다. 따라서 경사 하강법의 업데이트를 실행할 때는 α가 1/(1-β)에 대응되는 값으로 바뀔 필요가 있습니다. 실제로는 두 가지 모두 잘 작동할 것입니다. 학습률 α에 대한 가장 최적의 값에만 영향을 미치게 됩니다. 그러나 저는 이 식이 덜 직관적이라고 생각합니다. 이것의 한 가지 효과는 하이퍼파라미터 β의 값을 보정함으로써 v_dw와 v_db의 스케일링에 영향을 주게 되고 학습률도 다시 보정해야 합니다.
따라서 제가 왼쪽에 쓴 수식을 개인적으로 더 선호합니다. 1-β에 관한 항이 살아있는 수식말입니다. 그러나 β를 0.9로 하는 것은 두 설정 모두 하이퍼파라미터의 일반적인 선택입니다. 학습률 α가 다르게 보정된다는 것이 이 두 버전의 차이입니다. 따라서 모멘텀이 없는 경사 하강법보다 거의 항상 더 잘 작동합니다.
7. RMSProp 최적화 알고리즘
모멘텀을 사용하는 것이 경사 하강법을 빠르게 할 수 있다는 것을 배웠습니다. root mean square prop, 줄여서 RMSprop이라는 알고리즘이 있습니다. 이 알고리즘 역시 경사 하강법을 빠르게 하는데 작동 방식을 살펴봅시다.
지난 번에 했던 예제를 살펴보면 경사 하강법에서 수평 방향으로 진행을 시도해도 수직 방향으로 큰 진동이 있다는 것을 알 수 있습니다. 이 예제에 대한 직관을 제공하기 위해 수직축은 매개변수 b, 수평축은 매개변수 w라고 가정합시다. w1과 w2라고 해도 되지만 직관을 위해 w와 b라고 이름을 지었습니다. b 방향 또는 수직 방향의 학습 속도를 낮추기 위한 것이고, 그리고 수평 방향의 속도를 빠르게 하기 위한 것입니다.
RMSprop 알고리즘이 하는 일은 다음과 같습니다. 반복 t에서 현재의 미니배치에 대한 보통의 도함수 dw와 db를 계산할 것입니다. 지수가중평균을 유지하기 위해서 새로운 표기법인 s_dw를 사용하겠습니다. 이 값은 β*s_dw + (1-β)dw입니다. 여기서 제곱 표시는 요소별 제곱을 나타냅니다. 이것은 도함수의 제곱을 지수가중평균하는 것입니다. s_db도 βs_db + (1-β)*db^2과 같습니다. 다음으로 RMSprop은 매개변수를 다음과 같이 업데이트합니다. w = w - α * dw/s_dw의 제곱근 입니다. 그리고 b = b - α * db/s_db의 제곱근입니다.
이것이 어떻게 작동하는지에 대한 직관을 얻어봅시다. 수평 방향, 이 예제에서의 w 방향에서는 학습률이 꽤 빠르게 가기를 원합니다. 반면에 수직 방향, 즉 b 방향에서는 느리게 혹은 수직 방향의 진동을 줄이고 싶습니다. 따라서 이 두 항, s_dw와 s_db에서 우리가 원하는 것은 s_dw가 상대적으로 작고, 반면에 s_db는 상대적으로 큰 것입니다. 수직 방향에서의 업데이트를 줄이기 위해서요. 실제로 수직 방향에서의 도함수가 수평 방향의 것보다 훨씬 큽니다. b 방향에서의 경사가 매우 큽니다. 도함수 db는 매우 크고 dw는 상대적으로 작습니다. 따라서 db^2은 상대적으로 크고, dw가 작기 때문에 dw^2은 상대적으로 더 작습니다. 다음에 오는 효과는 더 큰 숫자로 나눠서 수직 방향에서 업데이트하기 때문에 진동을 줄이는데 도움을 줍니다. 반면에 수평 방향에서는 작은 숫자로 나눠서 업데이트하기 때문에 RMSprop을 사용한 업데이트는 수직 방향에서의 업데이트는 감소하지만 수평 방향은 계속 나아가게 합니다.
이것의 효과는 큰 학습률을 사용해 빠르게 학습하고 수직 방향으로 발산하지 않습니다. 더 명확히 말하면 제가 수직과 수평 방향을 b와 w로 나타냈는데 실제로는 매우 매개변수의 고차원 공간에 있기 때문에 진동을 줄이려는 수직 차원은 w1, w2, .. w17의 매개변수 집합이고 수평 방향의 차원은 w3, w4, ... 처럼 나타날 것입니다. 따라서 w와 b의 분리는 표현을 위한 것이고, 실제로 dw와 db는 매우 고차원의 매개변수 벡터입니다. 그러나 직관적으로 이런 진동을 얻는 차원에서 더 큰 합 또는 가중평균 도함수의 제곱을 계산하기 때문에 결국에는 이런 진동이 있는 방향을 감쇠시키게 됩니다. 따라서 제곱 평균 제곱근, 줄여서 RMSprop이었습니다.
마지막으로 넘어가기 전에 몇 가지 세부 사항을 말씀드리겠습니다. 다음 비디오에서는 RMSprop을 모멘텀과 결합할 것입니다. 따라서 모멘텀을 위해 사용했던 하이퍼파라미터 β를 쓰는 대신에 여기 있는 하이퍼파라미터를 β_2라고 부르겠습니다. 충돌하지 않기 위해서요. 모멘텀과 RMSprop에서 같은 하이퍼파라미터가 있으니까요.
또한 알고리즘이 0으로 나눠지지 않도록 주의하세요. 만약 s_dw의 제곱근이 0에 매우 가깝다면 이 값은 폭발할 수 있습니다. 실제로 구현할 때 이러한 수학적 안정성이 보장되야 합니다. ε이 10^(-8)이면 합리적인 기본값이지만 이보다 약간 큰 값도 수학적 안정성을 보장합니다. 너무 작은 숫자로 나누지 않도록 주의하세요. RMSprop은 진동을 줄이는 효과가 있다는 점에서 모멘텀과 비슷합니다. 더 큰 학습률을 사용할 수 있게 해서 속도를 올려줍니다. 알고리즘의 학습 속도를 말합니다. 이제 RMSprop을 구현하는 방법을 배웠고 학습 알고리즘의 속도를 올리는 방법입니다. RMSprop의 재밌는 사실은 학계의 논문에서 나온 것이 아니라 몇 년 전 제프리 힌튼이 가르친 코세라 강의에서 나왔습니다. 코세라는 학술 연구의 보급을 위한 플랫폼이 되기를 의도한 것은 아니었지만, 실제로는 그렇게 되었습니다. RMSprop이 널리 알려진 것은 코세라 강의 덕분이었습니다. RMSprop과 모멘텀을 함께 사용하면 더 나은 최적화 알고리즘을 얻을 수 있습니다.
8. Adam 최적화 알고리즘
RMSprop과 Adam 최적화 알고리즘은 넓은 범위의 딥러닝 아키텍처에서 잘 작동하는 알고리즘으로 우뚝 섰습니다. 따라서 시도를 망설이지 않아도 되는 알고리즘입니다. 왜냐하면 많은 사람들이 시도했고 많은 문제에 잘 작동한다는 것을 보았기 때문입니다. Adam 최적화 알고리즘은 RMSprop과 모멘텀을 합친 알고리즘입니다. 어떻게 작동하는지 살펴봅시다.
Adam을 구현하기 위해서 v_dw와 s_dw를 0으로 초기화합니다. v_db와 s_db도 0으로 초기화합니다. 그리고 반복 t에서 도함수 dw와 db를 현재의 미니배치를 써서 계산합니다. 주로 미니배치 경사 하강법을 사용합니다. 그리고 모멘텀 지수가중평균을 계산합니다. 따라서 v_dw는 RMSprop의 하이퍼파라미터와 구분하기 위해 β_1이라고 부르겠습니다. 따라서 이것은 모멘텀을 구현할 때 사용하는 식입니다. β 대신에 하이퍼파라미터로 β_1을 사용한 점만 다릅니다. 비슷하게 v_db = β_1*v_db + (1-β_1)*db 입니다.
RMSprop의 업데이트는 다음과 같습니다. 이번에는 하이퍼파라미터 β_2를 사용하고 여기 제곱은 dw의 요소별 제곱입니다. s_db = β_2s_db + (1-β_2)db^2입니다. 따라서 이것은 하이퍼파라미터 β_1을 사용한 모멘텀 업데이트고 이것은 하이퍼파라미터 β_2를 사용한 RMSprop 업데이트입니다.
전형적인 Adam의 구현에서는 편향 보정을 합니다. v_dw^corrected = v_dw/(1-β_1^t)와 같습니다. 비슷하게 v_db^corrected = v_db/(1--β_1^t) 이고 비슷하게 s_dw에 대한 편향 보정 역시 s_dw/(1--β_2^t)와 같습니다. s_db^corrected는 s_db/(1--β_2^t)와 같습니다.
최종적으로 업데이트를 실행합니다. W는 W-α*모멘텀을 구현하고 있기 때문에 v_dw^corrected이고 RMSprop을 부분적으로 추가하기 때문에 s_dw^corrected의 제곱근+ε로 나눠줍니다. b도 비슷한 방식으로 b - α 곱하기 v_db^corrected를 s_db^corrected의 제곱근 + ε입니다. 따라서 이 알고리즘은 모멘텀이 있는 경사 하강법의 효과와 RMSprop이 있는 경사 하강법의 효과를 합친 결과가 나옵니다. 이것은 매우 넓은 범위의 아키텍처를 가진 서로 다른 신경망에 잘 작동한다는 것이 증명된 일반적으로 많이 쓰이는 학습 알고리즘입니다.
따라서 이 알고리즘은 많은 하이퍼파라미터가 있습니다.
1. 학습률 하이퍼파라미터 α
: 매우 중요하고 보정될 필요가 있으므로 다양한 값을 시도해서 잘 맞는 것을 찾아야 합니다.
2. β_1, β_2
β_1의 기본적인 값으로 0.9를 보통 선택합니다. 이것은 dw의 이동평균, 가중평균입니다 모멘텀에 관한 항입니다. β_2에 대한 하이퍼파라미터는 Adam 논문에서 저자가 추천하는 값이 0.999입니다. 이것은 dw^2와 db^2의 이동가중평균을 계산한 것입니다.
3. ε
이 값은 크게 상관 없습니다만 Adam 논문의 저자에 따르면 10^(-8)을 추천합니다. 그러나 이 값을 설정하지 않아도 전체 성능에는 영향이 없습니다.
그러나 Adam을 구현할 때 보통 사람들은 β_1과 β_2, 그리고 ε도 기본값을 사용합니다. ε의 값을 보정하는 사람은 본 적이 없습니다. 보통 α에 여러 값을 시도해 가장 잘 작동되는 값을 찾습니다. β_1과 β_2도 보정할 수 있지만 자주 하지는 않습니다.
Adam이라는 용어는 어디서 온 것일까요?
Adam은 Adaptive moment estimation 에서 온 용어입니다. β_1이 도함수의 평균을 계산하므로 이것이 첫 번째 모멘트이고 β_2가 지수가중평균의 제곱을 계산하므로 두 번째 모멘트입니다. 모두 그냥 Adam 최적화 알고리즘이라고 부릅니다. 따라서 Adam 최적화 알고리즘이었습니다. 신경망을 더 빠르게 훈련시킬 수 있을 것입니다. 하이퍼파라미터 보정과 최적화 문제에 대한 직관을 더 다루어보겠습니다.
9. 학습률 감쇠
학습 알고리즘의 속도를 높이는 한 가지 방법은 시간에 따라 학습률을 천천히 줄이는 것입니다. 이것을 학습률 감쇠라고 부르는데 어떻게 구현할 수 있을지 살펴봅시다.
왜 학습률 감쇠가 필요한지 예시를 하나 들어보겠습니다. 상당히 작은 미니배치에 대해 미니배치 경사 하강법을 구현한다고 가정해봅시다. 64나 128 같은 경우 말입니다. 단계를 거치면서 약간의 노이즈가 있지만 최솟값으로 향하는 경향을 보일 것입니다. 그러나 정확하게 수렴하지는 않고 주변을 돌아다니게 될 것입니다. 왜냐하면 어떤 고정된 값인 α를 사용했고 서로 다른 미니배치에 노이즈가 있기 때문입니다.
그러나 천천히 학습률 α를 줄이면 α가 여전히 큰 초기 단계에서는 여전히 상대적으로 빠른 학습이 가능합니다. 그러나 α가 작아지면 단계마다 진행 정도가 작아지고 최솟값 주변의 밀집된 영역에서 진동하게 될 것입니다. 따라서 α를 천천히 줄이는 것의 의미는 학습의 초기 단계에서는 훨씬 큰 스텝으로 진행하고 학습이 수렴할수록 학습률이 느려져 작은 스텝으로 진행합니다.
따라서 여기 학습률 감쇠를 구현하는 방법입니다.
하나의 에포크는 데이터를 지나는 하나의 패스입니다. 따라서 훈련 세트가 다음과 같으면 서로 다른 미니배치로 나눠서 훈련 세트를 지나는 첫 번째 패스를 첫 번째 에포크라고 부릅니다. 두 번째 지나는 것을 두 번째 에포크라고 부릅니다. 따라서 여러분이 할 수 있는 것은 학습률 α = 1/1+ decay_rate*epoch_num을 여기에 초기 학습률인 α_0를 곱해줍니다. 여기 있는 decay_rate = 감쇠율은 조정이 필요한 또 다른 하이퍼파라미터입니다.
여기 구체적인 예시가 있습니다. 여러 번의 에포크를 거치면 α_0가 0.2 이고, 감쇠율이 1일 때 첫 번째 에포크를 하는 동안 α는 1/1+1 * α_0입니다. 따라서 감쇠율이 1이고 에포크가 1일 때 학습률은 0.1이 됩니다. 두 번째 에포크에서 학습률은 0.67로 떨어지고 세 번째 에포크에서는 0.5이고 네 번째는 0.4입니다. 에포크 수에 대한 함수에서 학습률은 점차적으로 감소합니다. 학습률 감쇠를 사용하고 싶다면 하이퍼파라미터 α_0와 감쇠율에 대해서 다양한 값을 시도하고 잘 작동하는 값을 찾으면 됩니다.
학습률 감쇠에 대한 다른 방법들
1. 지수적 감쇠라고 불리는 것은 α가 1보다 작은 값을 가집니다. 예를 들면 0.95^epoch_num * α_0입니다. 따라서 이것은 기하급수적으로 빠르게 학습률을 감소시킵니다.
2. 상수 k / epoch_num의 제곱근 * α_0입니다. 또는 상수 k / 미니배치의 개수 t의 제곱근 * α_0 을 사용합니다.
3. 이산적 단계로 감소하는 학습률을 사용하기도 합니다. 어떤 단계에서는 어떤 학습률 값을 가지고 그 뒤에는 학습률이 반으로 줄어들고 일정 시간이 지날 때마다 계속 반씩 줄어드는 모습입니다. 이런 것을 이산 계단이라고 부릅니다.
4. 직접 조작하는 감쇠입니다. 따라서 한 번에 하나의 모델을 훈련하는데 몇 시간 혹은 며칠이 걸린다면 어떤 사람들은 훈련을 거치면서 모델을 정리해 나갈 것입니다. 학습률이 느려지고 있는 것처럼 느껴서 데이터의 크기를 줄이는 것입니다. 이런 식으로 α의 값을 시간이나 날마다 직접 보정하는 것은 훈련이 작은 수의 모델로만 이루어진 경우에 가능합니다.
저의 경우에 학습률 감쇠는 제가 시도하는 것들에서 낮은 우선순위를 갖습니다. α의 값만을 바꿔서 큰 영향을 얻을 수 있다는 점에서 학습률 감쇠는 도움이 되고 훈련 속도를 빠르게 해줄 수 있습니다. 그러나 제가 시도하는 목록에서는 낮은 우선순위를 갖습니다. 다음 주에 다룰 시스템적인 하이퍼파라미터 보정 방법을 통해 효율적으로 하이퍼파라미터를 찾는 방법을 배울 수 있을 겁니다 학습률 감쇠는 여기까지입니다.
10. 지역 최적값 문제
딥러닝 학문의 초기에는 나쁜 지역 최적값에 갇히는 최적화 알고리즘을 많이 사용하곤 했습니다. 하지만 딥러닝 이론이 계속 발전하면서 지역 최적값에 대한 이해도 바뀌었습니다. 이제 지역 최적값에 대해 이제는 어떻게 생각하고 딥러닝 문제 안의 최적화 문제를 소개하겠습니다.
사람들이 지역 최적값에 대해 고민할 때 이 그림을 생각합니다. 여러분이 w_1과 w_2라는 매개변수를 최적화한다고 할 때 이 면적의 높이가 비용 함수가 되겠네요. 이 그림에서는 지역 최적값이 많아 보입니다. 이런 곳들에서 경사하강법 등의 알고리즘이 전역 최적값에 도달하기 전 지역 최적값에 갇혀버리기 십상이죠. 이렇게 2차원에서 그림을 그린다면 서로 다른 지역 최적값이 많은 그림을 쉽게 접할 수 있습니다. 이렇게 낮은 차원의 그림을 통해서 직관을 얻곤 하죠.
하지만 직관이 항상 옳지만은 않습니다. 경사가 0인 점은 대부분 지역 최적값이 아니라 비용 함수의 경사가 0인 경우 대개 안장점입니다. 역시 경사가 0인 점 중에 하나죠. 마찬가지로 w_1과 w_2일텐데 높이는 비용 함수 J입니다. 사실 고차원의 함수에서 경사가 0이면 각 방향에서 볼록 함수나 오목 함수가 되기 마련이죠. 예를 들어 20,000 차원의 공간에서 지역 최적값이 되기 위해서는 20,000개의 방향이 모두 이렇게 생겨야 합니다. 그런 일이 일어날 확률은 매우 낮죠. 아마 2^(-20,000)쯤 되겠죠? 대신 어떤 방향에서는 위로 굽어져있고 어떤 방향에서는 아래로 굽어져있는 형태가 주로 발생할 겁니다. 모두 위로 굽어있는 것보다는요.
따라서 고차원 공간에서는 오른쪽 그림처럼 지역 최적값보다 안장점이 되기 쉽습니다. 여기서 왜 안장점이라고 불리냐하면 이 모양이 말에 얹는 안장과 비슷하기 때문이죠. 이게 말이라면 여기에 머리와 눈이 있겠죠? 여러분이 말의 기수라고 하면 이 안장에 앉겠죠? 따라서 경사가 0인 점을 안장점이라고 부릅니다. 여러분이 앉아 있는 이 점이 경사가 0이라는 것을 알아두기 바랍니다.
딥러닝의 역사에서 배울 수 있는 것은 왼쪽 그림처럼 낮은 차원의 공간에서 얻었던 직관이 학습 알고리즘이 높은 차원에서 돌아갈 때 적용되지 않을 수 있단 거죠. 왜냐하면 20,000 개의 매개변수가 있을 때 J는 20,000 차원의 벡터에 대한 함수일 테고 지역 최적값보다 안장점을 훨씬 많이 볼 수 있을 겁니다.
그럼 지역 최적값이 문제는 아니고 뭐가 진짜 문제일까요? 안정지대가 학습을 아주 지연시킬 수 있습니다. 안정 지대는 미분값이 아주 오랫동안 0에 가깝게 유지되는 지역을 말합니다. 만약 여기에 있다고 치면 경사하강법에 따라 면을 따라서 아래로 움직이겠죠? 여기서 경사가 0이거나 0에 가까울 테니 면이 거의 평평할 겁니다. 아마 아주 오랜 시간이 걸릴 거에요. 안정지대에서 여기까지 찾아가는 데 말이죠.
그리고 왼쪽이나 오른쪽에 무작위로 작은 변화가 주어지면 명확하게 나타내기 위해 다른 색을 써볼까요? 그러면 알고리즘이 안정지대를 이렇게 벗어날 수 있을 겁니다. 하지만 이 점에 도달하기 전에 아주 긴 시간동안 경사를 탄 후에야 안정지대를 벗어날 수 있습니다.
이 영상에서 알아두셔야할 것은 충분히 큰 신경망을 학습시킨다면 지역 최적값에 갇힐 일이 잘 없다는 사실입니다. 여러 매개변수와 비용 함수 J가 상대적으로 고차원에서 정의된다면 말이죠. 하지만 둘째로 안정지대는 문제입니다. 학습 속도가 매우 느려지니까요. 여기에서는 모멘텀이나 RMSprop, Adam 등 이런 알고리즘의 도움을 받을 수 있습니다. 이런 경우에는 Adam과 같은 최적화 알고리즘이 안정지대 내에서 움직이거나 벗어나는 속도를 올릴 수 있습니다. 신경망이 일반적으로 고차원에서 최적화 문제를 해결할 때 사실 어떤 사람도 이 공간이 어떻게 생겼는지 잘 모를 것입니다. 이 공간에 대한 이해도 계속 발전하고 있고요. 이 영상을 통해 최적화 알고리즘이 맞닥뜨릴 법한 문제에 대해 직관을 얻었길 바랍니다.
'Deep Learning > Basics' 카테고리의 다른 글
[Andrew Ng] 딥러닝 2단계 : 6. 배치 정규화 (0) | 2024.02.01 |
---|---|
[Andrew Ng] 딥러닝 2단계 : 5. 하이퍼파라미터 튜닝 (1) | 2024.01.29 |
[Andrew Ng] 딥러닝 2단계 : 3. 최적화 문제 설정 (1) | 2024.01.25 |
[Andrew Ng] 딥러닝 2단계 : 2. 신경망 네트워크의 정규화 (2) | 2024.01.25 |
[Andrew Ng] 딥러닝 1단계 : 5. 심층 신경망 네트워크 (1) | 2024.01.24 |