르장드르 변환: 기울기로 다시 쓴 함수
앞의 패턴은 x²이라는 곡선 하나에서 본 것이다. 그렇다면 어떤 모양의 곡선이어야 같은 일이 늘 일어날까? 자를 곡선 아래에서 밀어 올렸을 때 자가 곡선에 걸리려면, 곡선이 어디서나 아래로 둥글게 휘어 있어서 움푹 들어간 곳이 없어야 할 것이다. 이 모양을 말로 정확히 적으면, 그래프 위의 어떤 두 점을 잇는 선분도 그래프보다 아래로 내려가지 않는다는 것이다. 이런 함수를 볼록 함수(아래로 볼록한 함수, convex function)라 한다. 비용 곡선 x², 지수함수 e^x, 교차 엔트로피 손실을 로짓의 함수로 본 것이 모두 볼록 함수다. 미분을 두 번 할 수 있는 함수라면 2차 도함수가 어디서나 0 이상인 것과 같은 말이고, 이때 기울기 f′(x)는 x가 커질수록 줄지 않는다.
그렇다면 공장이 아닌 다른 볼록 함수, 이를테면 지수함수 e^x에도 비용 곡선에서 이윤표를 만든 조작을 그대로 할 수 있을까? 그리고 그때도 이윤표처럼 모든 기울기에서 유한한 값이 나올까?
정의
조작 자체는 어느 함수에나 쓸 수 있다. 함수 f가 주어지면 기울기 s마다 sx − f(x)를 가장 크게 만든 값을 대응시켜 새 함수 f*를 만들면 된다. 이 조작을 르장드르 변환 (기울기로 다시 쓰기, Legendre transform)이라 하고, 그렇게 만든 f*를 f의 켤레라 부른다. 최적화 책에서는 같은 함수를 볼록 켤레(convex conjugate)라는 정식 이름으로 부른다.
max 대신 sup을 쓴 이유는 최댓값이 없는 경우가 있기 때문이다. 이를테면 f(x) = e^x에서 s = −1이면 −x − e^x는 x를 음의 방향으로 보낼수록 끝없이 커지므로 f*(−1) = +∞이다. 켤레가 +∞인 기울기는 「그 기울기의 자로는 곡선에 닿을 수 없다」는 뜻이다. e^x의 기울기는 항상 양수이므로 기울기가 음수인 접선은 없다.

미분할 수 있을 때의 계산법
f가 매끄럽고 2차 도함수가 양수이면 sup은 미분이 0인 곳, 곧 f′(x) = s인 x에서 얻어진다. 기울기가 x에 따라 계속 커지므로 그런 x는 하나뿐이다. 그래서 물리 교재가 쓰는 르장드르 변환은 다음 두 단계로 이루어진다.
첫 식은 「기울기를 새 변수로 삼는다」는 선언이고, 둘째 식은 「새 변수 곱하기 원래 변수, 빼기 원래 함수」를 새 함수로 삼는다는 선언이다. 이때 둘째 식의 x는 첫 식을 풀어 s의 함수로 바꿔 넣어야 한다는 점이 중요하다. 값은 같더라도 s만으로 적혀 있지 않으면 아직 변환이 끝난 것이 아니다. 이렇게 얻은 f*를 s로 미분하면 x가 나오는데, 공장 문제에서 이윤 곡선의 기울기가 생산량이었던 것과 같은 이야기다.
자주 만나는 쌍을 표로 정리해 두자. 마지막 두 줄은 뒤에서 발산을 다룰 때 다시 만난다.
| f(x) | f가 정의된 곳 | f*(s) | f*가 유한한 곳 |
|---|---|---|---|
| ½x² | 모든 x | ½s² | 모든 s |
| ½ax² (a > 0) | 모든 x | s²/(2a) | 모든 s |
| e^x | 모든 x | s ln s − s (s = 0이면 0) | s ≥ 0 |
| x ln x | x > 0 | e^(s − 1) | 모든 s |
문제 2. 기울기가 1보다 큰 자
f(x) = √(1 + x²)의 켤레 f*(s)를 구하고, s = 2일 때의 값을 말하라.

계산법대로 하면 s = f′(x) = x/√(1 + x²)이니까 거꾸로 풀면 x = s/√(1 − s²)이고, 넣어서 정리하면 f*(s) = −√(1 − s²). s = 2를 numpy에 넣었더니… nan이랑 경고가 떠요. numpy가 화났어요.

음수의 제곱근이니까 당연하지. 그러니까 s > 1에서는 f*가 정의되지 않는 거야.

계산법 말고 정의로 돌아가 봐요. s = 2이면 2x − √(1 + x²)의 sup이에요. x를 양의 방향으로 보내면 어떻게 되죠?

격자로 해 볼게요. x를 −5부터 5까지 두면 최댓값이 4.90, −50부터 50까지 두면 49.99예요. 격자를 넓힐수록 같이 커져요.

x가 크면 √(1 + x²)는 거의 x니까 2x − √(1 + x²)는 거의 x만큼 커지네요. sup은 +∞예요. 정의되지 않는 게 아니라 무한대였어요.

그림으로 말하면, √(1 + x²)의 기울기 x/√(1 + x²)는 늘 −1과 1 사이라서 기울기가 2인 접선은 없어요. 그 자는 아무리 낮춰도 오른쪽에서 곡선 위로 올라와요. 계산법은 「기울기가 s인 점이 있다」는 걸 전제로 하니까, 그런 점이 없으면 정의로 돌아가야 해요. 그럼 경계인 s = 1은요?

x − √(1 + x²)의 sup이니까 0이에요. x를 키울수록 0에 다가가기만 하고 닿지는 않지만요. −√(1 − s²)도 s = 1에서 0이니까 이어지네요. 해석학에서 max와 sup을 구별하라는 게 이럴 때 쓰이는군요.

정리하면 −1 ≤ s ≤ 1이면 −√(1 − s²), 그 밖이면 +∞. nan은 틀린 답이었네요.

계산법에는 전제가 하나 더 있었어요. f가 매끄럽다는 것이요. 이번엔 f(x) = |x|로 해 볼까요? x = 0에서 뾰족하게 꺾여서 미분할 수 없는 함수예요.

s = f′(x)를 풀려고 했는데… 기울기는 왼쪽에서 −1, 오른쪽에서 1뿐이라 기울기가 0.5인 점이 없어요. 그럼 이번에도 f*(0.5) = +∞인가요?

격자로 보면 0.5x − |x|는 x = 0에서 가장 커서 최댓값이 0이야. 무한대가 아니야.

자로 말해 봐요. 기울기가 0.5인 자를 |x| 아래에서 밀어 올리면 어디에 닿죠?

꺾인 점 (0, 0)에 걸려요. 기울기가 −1과 1 사이인 자는 모두 그 한 점에 걸리고요. 그러니까 −1 ≤ s ≤ 1이면 f*(s) = 0이에요. 한 점에서 기울기가 하나로 정해지지 않아도 sup으로 쓴 정의는 아무 문제가 없네요.

뾰족한 점 하나가 여러 기울기의 자를 한꺼번에 떠맡는 거네요. 앞의 √(1 + x²)도 멀리서 보면 |x|랑 닮았는데, 둘 다 기울기가 1을 넘는 자는 닿지 않고요.