ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [cs231n] 3강 손실 함수와 최적화 (4/4, 경사하강 / Gradient Descent)
    AI 2021. 1. 12. 15:40

    일단 우리가 경사를 어떻게 계산하는지 알게 되면, 우리는 수퍼 간단한 알고리즘에 도달하게 됩니다. 3줄 정도죠. 그러나 우리가 어떻게 이 최고로 큰 가장 복잡한 딥러닝 알고리즘을 훈련시키는지에 대한 심장에 해당하죠. 그게 경사 하강 (gradient descent)입니다. 경사 하강은 먼저 우리의 W를 임의 (random)로 초기화하고, 참 (true)일 동안 우리의 손실과 경사를 계산합니다. 그리고 우리의 가중치를 경사방향의 반대로 업데이트하죠. 왜냐면 경사는 함수의 가장 크게 증가하는 방향을 가리키니까요. 그러므로 음의 (minus) 경사는 가장 크게 감소하는 방향을 가리키죠. 그래서 우리가 마이너스 경사의 방향으로 작은 걸음을 취할 겁니다. 그리고 이걸 영원히 반복하면, 결국 여러분의 망은 수렴할 거고, 바라건데 여러분은 행복해 질 겁니다.

    그런데 걸음의 크기 역시 하이퍼파라미터죠. 이게 의미하는건 우리가 경사를 계산할 때마다 ,우리가 그 방향으로 얼마나 멀리 가는 가 입니다. 이 걸음 크기가, 때때로 학습률 (learning rate)라고 하는데, 이런 것을 실제로 학습시킬 때, 아마도 여러분이 설정해야 할 하이퍼파라미터 중 가장 중요한 것입니다. 사실 저는 이 걸음 크기 혹은 학습률을 항상 가장 먼저 확인합니다. 모델 사이즈나 정규화 강도 (regularization strength)같은 것들은 좀 뒤로 미를 수 있죠. 시작할 때 제가 제일 처음 하는 것이 학습률 혹은 걸음 크기를 맞추는 것입니다.

    어떻게 생겼는지 그림으로 그려보면, 여기 2차원으로 된 간단한예가 있는데요. 여기 그릇 같은 것이 우리의 손실 함수를 보여줍니다. 가운데 붉은 영역이 손실이 가장 낮은 곳, 우리가 가고 싶은 곳이죠. 파랑, 초록 지역은 우리가 피하고 싶은 가장자리쪽의 높은 손실 영역이죠. 그래서 우리는 우리의 W를 공간에서 임의의 지점에서 시작하고 우리는 음의 경사 방향을 계산합니다. 바라건데, 그게 우리를 결국 최소값으로 데려다 주겠죠. 이걸 반복하면, 결국 최소값에 도달할 거라고 생각합니다.

    이게 실제로 어떻게 생겼나면, 이걸 계속 반복하면, 우리는 어떤 지점에서 시작을 할 거고, 작은 경사 스텝을 매번 밟을 거구요. 여러분은 이 파라미터가 중심을 향해 원호를 그리는 것을 알수 있죠. 이 최소값 영역으로요. 이게 우리가 진짜 원하는 거죠. 왜냐면 낮은 손실을 원하니까요. 그런데, 티저 (teaser)로 보여 드리자면, 이전 슬라이드에서, 이 매우 간단한 경사의 예를 봤죠. 매 걸음마다, 우리가 경사의 방향으로 걸어가는 걸요. 그러나 실제로, 다음 몇 슬라이드에선, 약간 더 멋진 걸음이 있다는 걸 보게 됩니다. 업데이트 룰이라고 부르는데요. 약간 더 멋진 것들을 취해서, 경사와 여러번의 걸음에 걸쳐 통합시키는 겁니다. 실제에선 이건 것들을 실제로 학습시킬 때, 이 바닐라 (vanilla) 경사보단 그게 좀 더 잘 동작해서 더 자주 사용됩니다. 미리보기로, 우리는 같은 문제를 최적화하는 것에 대해 약간 더 멋진 방법을 볼 수 있는데, 검은 색이 같은 경사 계산입니다. 다른 두 곡선이 우리의 다음 스텝을 만들기 위해서 어떻게 경사 정보를 사용하는지 결정하는 지에 대한 약간 더 멋진 업데이트 룰을 가지고 있습니다. 이것들 중 하나는 모멘텀을 가진 경사 하강이고, 다른 것은 아담 (adam) 최적화기 (optimizer)입니다. 이것들에 대한 세부사항은 다음에 볼 겁니다. 이것의 아이디어는 경사 하강이라고 불리는 이 기본적인 알고리즘으로, 우리는 매 걸음마다 다음 스텝이 어딘지 결정하기 위해서 경사를 사용합니다. 그리고 우리가 어떻게 경사 정보를 사용해야 하는지 알려주는 여러 업데이트 룰 (update rule)이 있습니다. 그러나 기본적으로는 매 걸음마다 아래로 내려가려고 하는 같은 알고리즘이죠.

    우리는 어떤 단 하나의 학습 예제에 대해서 우리의 분류기가 얼마나 잘못하고 있는지 계산하는 손실 함수를 정의했는데요. 그리고 우리는 우리의 데이타셋에 대한 전체 손실은 전체 학습 셋에 걸친 평균일 거라고 얘기했구요. 근데 사실, 이 N이 매우 매우 클 수 있죠. 만약 첫 강의에서 얘기했던 이미지 넷 데이타를 사용한다면, N은 1백3십만이죠. 실제로 이 손실을 계산하는 것은 사실 매우 비쌉니다. 아마도 이 함수를 수백만번 평가를 해야 할 거구요. 매우 느리죠. 그리고 경사가 선형 연산자 (operator)이기 때문에, 실제로 이 표현의 경사를 계산하려고 할 때,  우리 손실 경사는 손실 경사의 각각의 항에 대한 합입니다. 그래서 만약 경사를 다시 계산하려고 하면, 그건 전체 학습데이타 즉, 이 예제의 모든 N개 예제에 대해서반복해야 하는 거죠. 만약 N이 백만이면, 이건 엄청 느리죠. W에 한번 업데이트하기 위해서 우린 엄청 기다려야 합니다. 그래서 실제로는, 우린 확률적 경사 하강 (stochastic gradient descent)을 씁니다. 전체 데이타 셋에 대해서 손실과 경사를 계산하기 보다는 매 반복마다, 미니배치 (mini batch)라고 부르는 학습 예제를 샘플링합니다. 보통 이 크기는 관습적으로, 2의 제곱 숫자로 나가는데. 32, 64, 128같은 숫자가 흔히 사용되죠. 그리고 나서 이 미니배치를 사용해서 전체 합의 추정값과 경사의 맞는 추정값을 계산합니다. 이게 확률적 (stochastic)인 이유는, 어떤 참 값의 기대값의 몬테카를로 (Monte Carlo) 추정이라고 볼 수 도 있는데요. 이게 우리 알고리즘을 약간 더 멋지게 만들죠. 그러나 여전히 4줄입니다. 데이타의 랜덤 미니배치를 샘플링하고, 미니배치에 대한 손실과 경사를 평가하고, 이 손실에 대한 추정과 이 경사의 추정에 근거해서 여러분의 파라미터를 업데이트하죠. 다시, 우리는 약간 더 멋진 업데이트 룰을 볼 건데요. 시간에 걸쳐 정확히 어떻게 여러 경사를 통합할 건지에 대해서요. 이게 실제에서 대부분의 딥러닝 신경망에 대해서 사용할 기본적인 학습 알고리즘입니다.

    vision.stanford.edu/teaching/cs231n-demos/linear-classify/

     

    Multiclass SVM optimization demo

    Parameters \(W,b\) are shown below. The value is in bold and its gradient (computed with backprop) is in red, italic below. Click the triangles to control the parameters. Multiclass SVM loss formulation:

    vision.stanford.edu

    이것들을 확률적 경사 하강으로 학습하는 선형 분류기를 가지고 놀 수 있는 다른 인터랙티브 웹데모가 있는데요.

    이건 선형 분류기와 그것들을 경사 하강으로의 학습시키는 것에 대한 직관을 제공하죠. 왼쪽을 보면, 우리는 3개의 카테고리를 분류하는 문제가 있고, 3개의 클래스들의 빨강, 초록, 파랑색의 점들의 학습 샘플들이 있습니다. 그리고 우리는 이 클래스들에 대해 결정 경계를 그렸습니다. 색이 칠해진 배경 영역이죠. 이 세개의 클래스들에 대해서, 클래스 점수가 증가하는 방향을 알려주는 화살표도 표시되어 있습니다.  온라인으로 이것들을 해보면, 우리는 W를 조정할 수 있고, W의 값을 변경하면, 결정 경계가 회전합니다. 바이어스 (bias)를 변경하면, 이 경계가 회전하진 않고, 한쪽에서 다른쪽으로 이동하죠. 혹은 위아래로요. 이 손실을 업데이트 하는 걸음을 만들수도 있는데, 슬라이더 (slider)로 걸음 크기를 변경할 수도 있죠. 버튼을 눌러서 실행시킬 수 있고, 큰 걸음 크기로 경사 하강을 실행시키면, 결정 경계가 이리저리 움직이며 데이타에 맞추려고 하고 있습니다. 잘 되는 것 같죠. 실시간으로 이 SVM 공식에서 소프트맥스로 손실 함수를 바꿀 수 있죠. 손실 함수의 공식을 바꿔보면, 대체적으로 같은 걸 하고 있죠. 우리의 결정 영역은 대부분 같은 곳에 있습니다. 그러나 정확히 서로에게 얼마나 상대적으로 다르게 끝나는지 그리고 이것들을 분류하는 데 있어서 정확히 트래이드 오프 (trade-off)가 뭔지는 약간 달라집니다. 온라인에 가서 해보고 직관을 얻길 바랍니다.

    여담으로, 다른 아이디어를 얘기할 건데요. 이미지 피쳐 (image feature)라는 겁니다. 여태까지 우리는 선형 분류기를 얘기했죠. 로 (raw) 이미지 픽셀을 받아들여서 로 픽셀을 선형 분류기로 그대로 입력했죠. 지난 시간에 얘기했듯이, 이건 별로 좋은 게 아닙니다. 왜냐면, 멀티 모달리티 (multi-modality) 등등 때문에요. 실제로는 로 픽셀 값을 선형 분류기로 넣는게 잘 동작하지 않습니다. 사실 딥 신경망 이전에는 흔했죠. 그건 2단계의 접근 방법이었습니다. 먼저, 이미지를 받아들인 다음, 이미지의 다양한 피쳐 표현을 계산합니다. 아마도 이미지에 나타난 모양과 관련한 다른 여러 종류의 정량적인 것들을 계산할 텐데요. 그럼 이미지의 피쳐 표현 (feature representation)이 나타납니다. 로 픽셀 자체를 넣는 대신 이 이미지의 피쳐 표현이 선형 분류기로 들어갑니다.

    이것으로의 동기는 이렇습니다. 학습 데이타 셋이 왼쪽에 있다고 해보죠. 이 빨간 점들이 가운데에 있고 파란 점들이 그 주변에 있죠. 이런 종류의 데이타 셋은, 빨간점과 파란점을 나눌 수 있는 선형 결정 경계를 그릴 수 없죠. 우리는 이런 것들의 더 많은 예를 지난 시간에 봤는데요. 그러나 만약 우리가 뭔가 똑똑한 피쳐 트랜스폼 (feature transform)을 하면, 이 경우에는 극 좌표계 (polar coordinate)로의 트랜스폼 후에 이 복잡한 데이타셋은 선형으로 분류할 수 있게 됩니다. 선형 분류기로 맞게 나눠지죠. 여기서의 트릭은 여러분이 관심있는 문제에 대해 뭐가 맞는 정량을 계산하는 피처 트랜스폼인지 알아내는 것이죠. 이미지에 대해서는, 픽셀을 극좌표계로 바꾸는 것은 말이 안되지만 이미지의 피쳐 표현을 작성해 볼 수 있는 있죠. 그건 말이 됩니다. 그건 로 픽셀을 분류기에 넣는 것보단 더 잘 되도록 해줄 겁니다.

    매우 간단한 피처 표현의 예는 색상 히스토그램입니다. 여러분은 휴 칼라 스펙트럼 (hue color spectrum)을 취해서, 버킷에 나눠 담죠. 그리고 모든 픽셀을 이 컬러 버킷들의 하나에 매핑합니다. 그다음 얼마나 많은 픽셀이 이 여러 다른 버킷에 담겼는지 셉니다. 이건 전체적으로 어떤 색깔들이 이미지에 있는지를 얘기해 줍니다. 이 개구리 예를 보면, 이 피처 벡터는 많은 녹색이 있다고 알려 주죠. 그러나 보라나 빨강은 별로 없구요. 이건 여러분이 실제에서 볼 일종의 간단한 피처 벡터이죠. 신경망 등장 이전에 흔히 사용된 또 다른 피처 벡터가 있는데요.

    이 방향이 있는 경사 히스토그램이죠. 첫 강의를 기억해 보면, 휘벨 (Hubel)과 위젤 (Wiesel)이 이 방향이 있는 엣지가 인간의 시각 체계에서 매우 중요하다는 걸 발견했죠. 이 방향이 있는 피처 표현의 경사 히스토그램은 같은 직관을 잡아내려고 합니다. 그리고 이미지의 엣지 (edge)의 각 지점의 방향을 측정하구요. 이게 하는건, 이미지를 취해서 작은 8 x 8 픽셀 영역으로 나누죠. 이 8 x 8 픽셀 영역에서, 뭐가 각 픽셀의 지배적인 엣지 방향인지를 계산합니다. 그 엣지 방향을 양자화 (quantize)해서, 여러 버킷에 담고, 그 영역 각각 내에서, 여러 다른 엣지 방향에 대해서 히스토그램을 계산합니다. 이제 여러분의 전체 피쳐 벡터는 여러 버킷에 담긴 엣지 방향의 히스토그램이 될 거고요. 이미지의 모든 다른 8 x 8 영역에 걸쳐서요. 이건 어떤 면에서 이전에 봤던 색 히스토그램 분류기에 대해서 이원적 (dual)인데, 색 히스토그램은 전체적으로 어떤 색이 이미지에 있냐는 걸 말하죠. 이건 어떤 종류의 엣지 정보가 이미지에 있냐는 거죠. 이미지의 여러 부분에 로컬라이즈 (localize) 되긴했지만, 이 여러 영역에 어떤 종류의 엣지가 있는 지를 말해 줍니다. 이 왼쪽 개구리는, 잎에 앉아 있는데, 이 잎들은 대각선 엣지를 많이 가지고 있죠. 만약 방향이 있는 경사 피처의 히스토그램을 시각화하면, 이 영역에서 방향성 경사 피쳐 표현의 히스토그램이 잡아 내고 있는 대각선 엣지가 많이 있다는 걸 알게 될 겁니다. 이건 진짜 흔한 피쳐 표현이고 사실 얼마 전까지도 물체 인식에 많이 사용되었습니다.

    다른 피쳐 표현은 단어 가방 아이디어인데요. 이게 자연어 처리로부터 영감을 받은 건데, 만약 여러분이 단락이 있으면, 피처 벡터로 단락을 표현하는 방법은 그 단락의 여러 단어 빈도를 세는거죠. 그래서 우리는 그 직관을 취해서, 이미지에 어떤 식으로든 적용하려고 합니다. 그러나 문제는 이미지에 대한 단어의 직관적인 비유를 위한 진짜 간단한 방법이 없다는 거죠. 그래서 우리는 우리 자신의 시각적 단어의 어휘장을 정의해야 합니다. 우리는 이 2단계 접근 방법을 사용하는데, 먼저 우린 대량의 이미지를 받아서, 이 이미지들에 대해서 작은 랜덤 자르기로 많은 부분을 샘플링합니다.그걸 K-means 같은 것으로 클러스터링 해서, 여러 종류의 이미지내의 시각적 단어를 표현하는 여러 클러스터 중심을 만들어 내는거죠. 오른쪽 이미지를 보면, 이건 사실 다양한 이미지로부터 클러스터링한 실제 예인데, 이 클러스터링 단계가 지나면, 우리의 시각적 단어들은 빨강, 파랑, 노랑 같은 여러 색깔들을 잡아내고, 뿐만 아니라, 여러 방향이 있는 엣지들을 잡아냅니다. 이게 재밌는 건 우리는 데이타 추진 방식으로 데이타 부터 나오는 방향이 있는 엣지를 보게 됐고, 일단 이런 코드북이라고 부르는 시각적 단어 집합을 얻게 되면, 우리의 이미지를 인코딩해서 이 각각의 시각적 단어에 대해서 이 시각적 단어가 얼마나 많이 이 이미지에 등장하는 지를 알 수 있습니다. 이건 우리에게 이 이미지의 시각적 모양이 어떤지에 대해 약간 다른 정보를 주는데 이건 일종의 피처 표현이죠. 페이페이 (Fei-Fei) 교수님이 대학원생 때 연구한 것이고, 얼마 전까지 실제에서 보던 것들입니다.

    이 모든 것들을 엮으면, 이 이미지 분류 파이프라인이 어떻게 보일까요? 약 5~10년전엔 이미지를 취해서, 단어 가방이나 방향성 경사 히스토그램 같은 것으로 이미지의 여러 피처 표현을 계산한 다음 이 전체 피쳐를 함께 붙인다음 피처 추출기를 선형 분류기로 넣습니다. 약간 간단히 얘기한 거지만, 파이프라인은 그것보단 약간 더 복잡하죠. 이게 일반적인 직관입니다. 여기서 말하고 싶은 아이디어는 이 피쳐들을 추출해 내는데, 이 피쳐 추출기는 훈련하는 동안 업데이트 되지 않는 고정된 블럭 같은 겁니다. 훈련 중에는 단지 선형 분류기만 업데이트합니다. 합성곱 신경망 같은 딥 신경망으로 이동해 보면, 그렇게 달라 보이지 않습니다. 유일한 차이는 미리 피쳐를 적기 보다는, 우리는 데이타로부터 바로 피쳐를 학습할 겁니다. 우리는 로 픽셀을 취해서, 이 합성곱 신경망으로 넣을거고, 결국 여러 레이어를 통해서 데이타에 의해 추진된 몇몇 종류의 피처 표현을 계산할 겁니다. 그리고 우리는 단지 선형 분류기의 가중치를 훈련하기 보다는 이 전체 망에 대한 전체 가중치를 훈련시키죠. 단지 위의 선형 분류기의 가중치만이 아니라요.

    다음시간에 세부적인 사항들에 대해 볼거고 신경망을 소개할 겁니다. 역전파도 얘기할겁니다.

    댓글

Designed by Tistory.