Code › codeit-ai-sprint
편미분과 경사 벡터
머신러닝 기본기 강의, 편미분과 경사의 의미
오늘 머신러닝 기본기 강의의 마지막 연습문제까지 풀었다. 2차원에서 가장 가파른 방향을 보고, 극소점과 극대점을 지나, 고차원에서의 미분과 머신러닝에 미분이 필요한 이유까지 이어지는 흐름이었는데, 편미분과 경사 벡터 쪽에서 잠깐 멈췄다. 개념 자체가 엄청 복잡하다기보다는, 한 변수에서 보던 기울기가 여러 변수로 넘어가는 순간 머릿속 그림이 잘 안 그려졌기 때문이다.
한 변수 함수에서는 기울기를 비교적 쉽게 떠올릴 수 있다. 가 조금 움직일 때 가 얼마나 변하는지 보면 되는데, 순간변화율이 양수라면 가 증가할 때 함수값도 같이 올라가고, 음수라면 가 증가할수록 함수값이 내려간다고 보면 된다.
기울기가 0인 지점은 조금 더 조심해서 봐야 했다. 그 순간만 보면 평평하다는 뜻이지 무조건 최소나 최대라는 뜻은 아니기 때문에, 아래로 내려가다가 바닥을 찍고 다시 올라가면 극소점(local minimum), 위로 올라가다가 꼭대기를 찍고 내려오면 극대점(local maximum)이라고 구분한다. 그중 전체 범위에서 가장 작은 곳은 최소점(global minimum), 가장 큰 곳은 최대점(global maximum)이라고 부른다.
안장점(saddle point)은 기울기가 0처럼 보이지만, 그 지점이 바닥도 꼭대기도 아닌 경우였다. 어떤 방향에서는 내려가는 것처럼 보이고 다른 방향에서는 올라가는 것처럼 보이는데, 말 그대로 말 안장처럼 한쪽으로는 휘어 내려가고 다른 쪽으로는 휘어 올라가는 모양이어서 saddle point라고 부르는 듯하다.
여기서 입력 변수가 두 개로 늘어난다.
이제 함수값은 하나만으로 정해지지 않고, 와 가 같이 들어가서 두 값이 함께 함수의 높이를 만든다. 지도로 비유하면 한 축은 동서 방향, 다른 축은 남북 방향이고, 함수값은 그 위치의 고도에 가깝다.
편미분(partial derivative)은 변수 하나만 움직여 보는 방식이었다. 에 대해 편미분할 때는 를 잠깐 고정해 두고, 반대로 에 대해 편미분할 때는 를 고정하는데, 둘 다 한꺼번에 움직이면 어느 변수가 함수값을 얼마나 바꿨는지 분리해서 보기 어렵다.
그래서 를 에 대해 편미분하면 가 된다. 이때 는 만 포함한 값이라서 입장에서는 그냥 상수처럼 취급되고, 상수의 변화율은 0이라 사라지는 식이다.
반대로 에 대해 편미분할 때는 를 상수처럼 보고, 만 미분하면 된다.
여기서 처음보는 기호가 나왔다(아마 예전에 봤을수도? ㅎㅎ) 그냥 가 아니라 둥글게 말린 같은 기호를 쓰는데, 이 기호는 편미분을 나타내는 표기라고 한다. 한 변수 함수에서 는 에 대해 를 미분한다는 뜻이고, 분모에 있는 는 를 기준으로 변화율을 본다는 표시다. 편미분에서도 비슷하지만, 입력 변수가 여러 개라서 “지금은 이 변수 하나만 기준으로 본다”는 표기가 필요하다.
그래서 는 다른 변수는 그대로 둔 채 만 아주 조금 바꿨을 때 함수 가 얼마나 변하는지 보는 것이고, 는 는 고정한 채 만 바꿨을 때의 변화율을 보는 것이다. 한 변수 함수에서는 보통 “에 대해 미분한다”라고 하고, 입력 변수가 여러 개인 함수에서는 “에 대해 편미분한다”, “에 대해 편미분한다”처럼 표현한다.
각 변수에 대한 편미분 값을 모으면 경사 벡터(gradient vector)가 된다고 한다.
앞에 붙은 거꾸로 된 삼각형 모양의 기호도 찾아보니 나블라(nabla)라고 한다. 여기서는 “이 함수의 각 방향별 변화율을 모아 놓은 것” 정도로 이해하면 될 것 같고, 방향으로는 얼마나 가파른지, 방향으로는 얼마나 가파른지를 한 벡터에 담은 셈이다.
예를 들어 을 넣으면 이렇게 된다.
처음에는 이 2와 4가 각각 무엇을 말하는지 잘 안 와닿았다. 풀어보면 2는 로 고정한 상태에서 를 아주 조금 움직였을 때 함수값이 얼마나 변하는지를 말하고, 4는 로 고정한 상태에서 를 아주 조금 움직였을 때 함수값이 얼마나 변하는지를 말하는 값이었다.
지도를 비유로 들어서 한번 설명해 보면, 현재 위치가 이고 동쪽으로 한 발 움직일 때 고도가 대략 2만큼 올라간다. 북쪽으로 한 발 움직이면 고도가 대략 4만큼 올라가니까, 둘 중 어느 쪽이 더 가파른지는 바로 보이는 느낌? ㅋㅋ 이 지점에서는 방향 변화가 방향 변화보다 더 큰 셈이다.
그런데 경사 벡터는 단순히 “동쪽은 2, 북쪽은 4”라고 따로 말하는 데서 끝나지 않고, 이 둘을 합쳐서 현재 위치에서 가장 가파르게 올라가는 방향을 가리킨다. 라는 벡터는 방향으로도 가고 방향으로도 가되, 쪽으로 더 강하게 가는 방향이라서 경사 벡터가 함수가 가장 빠르게 증가하는 방향이라고 말하는 듯하다.
반대로 가장 빠르게 내려가고 싶다면 부호를 반대로 붙이면 된다.
이 말은 지금 위치에서 함수값을 줄이려면 경사 벡터가 가리키는 방향의 반대로 움직이면 된다는 뜻이다. 마지막 퀴즈에서 “경사는 증가하는 방향을 가리킬 수도 있고, 감소하는 방향을 가리킬 수도 있다”는 문장이 나왔는데, 경사 자체는 증가 방향을 알려주고 그 반대 방향을 잡으면 감소 방향이 된다고 이해했다.
머신러닝에서 이게 왜 필요한지도 연결해서 이해했다. 모델의 성능을 평가하려면 어떤 값이 좋아지고 나빠지는지를 숫자로 봐야 하고, 그 숫자가 어느 방향으로 움직일 때 줄어드는지도 알아야 한다는 흐름으로 받아들였다.