현대 AI를 가능하게 만든 세 가지 아이디어: 그 중 어느 것도 마법은 아니다
요약
현대 AI 아키텍처의 핵심인 신경망 깊이 문제를 해결한 세 가지 엔지니어링 아이디어를 설명합니다. 특히 ResNet의 핵심인 스킵 연결(Skip connection)이 어떻게 그래디언트 소실 문제를 해결하고 네트워크의 깊이를 확보했는지 다룹니다.
핵심 포인트
- 심층 신경망의 훈련 오차 및 최적화 문제 분석
- 그래디언트 소실 및 폭발 문제의 원인 설명
- 스킵 연결을 통한 항등 함수 학습의 용이성 확보
- 엔지니어링적 해결책으로서의 아키텍처 설계 원리
현대 AI는 겉으로 보기에는 마법처럼 보입니다. 문장을 입력하면 기계가 일관성 있는 답변을 작성하거나, 함수를 완성하거나, 문단을 일본어로 번역해 줍니다. 그 안에서 무언가 이국적인 일이 일어나고 있다고 가정하고 싶은 유혹이 생깁니다.
하지만 그렇지 않습니다. 여러분이 들어본 거의 모든 모델 뒤에 있는 아키텍처 (Architecture)는 몇 가지 평범한 엔지니어링 해결책에 기반하고 있으며, 각 해결책은 특정한 짜증 나는 문제를 해결하기 위해 발명되었습니다. 단 하나의 천재적인 순간도, 비밀 소스 (Secret sauce)도 없습니다. 그저 자신의 네트워크가 고장 났음을 인지하고 이를 패치 (Patch)한 사람들이 있을 뿐입니다.
이것은 그러한 패치 중 세 가지에 대한 이야기입니다. 스택 트레이스 (Stack trace)를 읽을 수 있다면, 이 세 가지를 모두 이해할 수 있습니다.
모두가 마주했던 벽
2014년경, 더 똑똑한 신경망 (Neural network)을 만드는 레시피는 명확해 보였습니다. 바로 더 깊게 (Deeper) 만드는 것이었습니다. 더 많은 레이어 (Layer)는 더 많은 용량을 의미했고, 이는 더 나은 결과로 이어져야 했습니다. 하지만 특정 지점을 지나면 작동을 멈췄습니다. 더 깊은 네트워크는 오히려 성능이 저하되었으며, 여러분이 예상하는 방식과는 달랐습니다.
징후는 훈련 오차 (Training error)였습니다. 56개 레이어의 네트워크는 20개 레이어의 네트워크보다 자신이 훈련되고 있는 바로 그 데이터에서 더 나쁜 성능을 보였습니다. 이는 일반적인 용의자인 과적합 (Overfitting)을 배제합니다. 왜냐하면 깊은 네트워크는 눈앞에 있는 정답조차 암기하지 못했기 때문입니다. 문제는 용량이 아니었습니다. 네트워크를 훈련시킬 수 없었던 것입니다.
두 가지 문제가 잘못되고 있었습니다. 각 레이어를 가르치는 오차 신호 (Error signal, 즉 그래디언트 (Gradient))는 초기 레이어에 도달하기 위해 모든 레이어를 거쳐 역방향으로 전달되어야 합니다. 수십 개의 레이어를 통해 숫자를 밀어 넣으면 그 숫자는 아무것도 아닌 상태로 줄어들거나 폭발적으로 커지는 경향이 있어, 초기 레이어는 거의 쓸 만한 피드백을 받지 못했습니다. 그리고 신호를 형태에 맞게 다듬더라도, 깊어질수록 최적화 (Optimization) 자체가 더 어려워졌습니다.
따라서 네트워크를 강력하게 만들어 줄 것으로 기대되었던 깊이 (Depth)가 오히려 네트워크를 망가뜨리는 요소가 되었습니다. 여기 세 가지 아이디어가 어떻게 그 벽을 허물었는지 소개합니다.
아이디어 1: 신호에 지름길을 제공하라
첫 번째 해결책은 모욕적일 정도로 단순합니다. 모든 레이어가 입력을 변환하도록 강제하는 대신, 입력이 앞질러 건너뛰어 나중에 다시 더해지도록 허용하는 것입니다.
어떤 입력 x를 받는 레이어 블록을 상상해 보세요. 보통은 그 블록이 처음부터 완전히 새로운 출력을 만들어내도록 요구합니다. 스킵 연결 (Skip connection, 2015년 ResNet의 핵심 기법)은 이 질문을 바꿉니다. 블록은 작은 조정값 (adjustment)을 계산하고, 그러면 원래의 x를 그 위에 다시 더합니다:
output = (레이어가 계산한 값) + x
그 작은 + x는 두 가지 큰 역할을 합니다.
첫째, "아무것도 하지 않기"를 쉽게 만듭니다. 만약 블록이 취할 수 있는 최선의 선택이 입력을 그대로 두는 것이라면, 일반적인 레이어 스택은 항등 함수 (identity function)를 학습해야 하는데, 이는 일련의 비선형 수학 (nonlinear math)을 통해 수행하기에 놀라울 정도로 어렵습니다. 스킵 연결이 있으면, 블록은 단순히 조정값을 0에 가깝게 살짝 밀어내기만 하면 되고 입력은 손상되지 않은 채 그대로 흘러갑니다. 이제 레이어를 더 추가하는 것이 더 이상 해가 되지 않습니다. 추가된 어떤 레이어든 아무것도 하지 않는 상태로 돌아갈 수 있기 때문입니다. 깊이 (Depth)는 더 이상 도박이 아니게 되었습니다.
둘째, 그래디언트 (gradient)에게 집으로 돌아가는 명확한 길을 제공합니다. 더해진 x는 출력에서 입력으로, 그 사이의 모든 레이어를 우회하여 곧장 되돌아가는 직접적인 경로를 만듭니다. 학습 신호 (teaching signal)가 더 이상 모든 고난의 과정을 견뎌낼 필요가 없습니다. 급행 차선을 얻게 된 것입니다. 거의 하룻밤 사이에 사람들은 100층 이상의 깊은 네트워크를 학습시키기 시작했고, 네트워크는 실제로 깊어질수록 더 좋아졌습니다.
이를 정체된 마을을 우회하는 우회 도로라고 생각하세요. 마을 중심부를 거쳐야 하는 교통량은 여전히 마을로 들어가지만, 그 외의 모든 것은 곧장 지나쳐 흐릅니다.
두 번째 아이디어: 신호의 표류를 막는 것
지름길(Shortcut)이 있든 없든, 두 번째 문제가 있습니다. 데이터가 네트워크를 통과하면서 숫자들의 스케일 (scale)이 표류 (drift)합니다. 어떤 레이어는 0.01 정도의 값을 내보내고, 다음 레이어는 5000 정도의 값을 내보냅니다. 활성화 값 (activations)이 극단적인 값으로 방황하게 되면 학습이 정체됩니다. 가중치 (weights)를 업데이트하는 수학적 연산이 그 극단적인 영역에서는 무뎌지기 때문입니다.
정규화 (Normalization)는 여러 오디오 트랙을 믹싱하기 전에 준비하는 방식과 같이 이 문제를 해결합니다. 즉, 볼륨의 레벨을 맞추는 것입니다. 각 단계마다 레이어 (layer)로 들어가는 숫자들을 0을 중심으로 다시 중앙 정렬하고, 일관된 분포로 다시 스케일링 (rescale) 합니다. 그런 다음 네트워크에 두 개의 조절 가능한 노브 (knobs)를 제공하여, 결과값이 필요하다고 판단될 경우 이를 다시 늘리거나 이동할 수 있게 합니다. (2015년 버전인 배치 정규화 (batch normalization)는 예시들의 배치 (batch) 전체에 걸쳐 레벨을 맞춥니다. 이후 등장한 사촌 격인 레이어 정규화 (layer normalization)는 단일 예시의 특징 (features)들에 대해 레벨을 맞추며, 이는 텍스트에 훨씬 더 적합합니다.)
그 대가는 지루할 정도로 실용적입니다. 신호 (signal)가 학습이 작동하는 범위 내에 머물게 됩니다. 학습률 (learning rate)을 훨씬 높여서 더 빠르게 학습할 수 있습니다. 초기 가중치 (starting weights)를 세심하게 관리할 필요가 없어집니다. 이는 세 가지 아이디어 중 가장 화려하지 않은 아이디어이지만, 아마도 디버깅 시간을 가장 많이 아껴주는 아이디어일 것입니다.
지름길 (shortcuts)과 레벨링 (leveling)이 마련되면서, 네트워크는 마침내 깊어질 수 있었고 학습 가능한 상태를 유지할 수 있었습니다. 하지만 언어의 경우, 깊이만으로는 여전히 충분하지 않았습니다.
세 번째 아이디어: 모든 단어가 다른 모든 단어를 바라보게 하기
여기 언어에 특화된 문제가 있습니다. 수년 동안 모델들은 빨대를 통해 읽는 방식처럼 텍스트를 읽었습니다. 즉, 한 번에 한 단어씩 읽으며 실행 중인 요약본을 메모리에 유지하는 방식이었습니다. 이것들이 순환 신경망 (recurrent networks)이었으며, 두 가지 결함이 이들을 몰락시켰습니다.
첫째, 느렸습니다. 각 단계가 다음 단계로 입력되기 때문에, 49번째 단어가 끝나기 전에는 50번째 단어를 처리할 수 없었습니다. 수천 가지 일을 동시에 수행하도록 설계된 칩인 GPU에 작업을 분산할 방법이 없었습니다.
둘째, 잘 잊어버렸습니다. 문단의 첫 단어를 마지막 단어와 연결하려면, 정보가 그 사이의 모든 단어를 거쳐 앞으로 전달되는 과정을 견뎌내야 했습니다. 끝에 도달하면 시작 부분은 흐릿해져 버렸습니다.
어텐션 (Attention)은 빨대를 던져버립니다. 기억력이 희미해지는 방식으로 왼쪽에서 오른쪽으로 읽는 대신, 모든 단어가 문장 내의 다른 모든 단어를 직접 바라보고 어떤 단어가 자신에게 중요한지 무게를 달 수 있게 합니다. 단어 "it"은 그것이 가리키는 명사가 아무리 멀리 떨어져 있더라도 단 한 번의 도약으로 직접 뒤로 가서 닿을 수 있습니다. 거리는 더 이상 중요하지 않게 됩니다.
그리고 더 이상 순차적인 읽기에 의존할 필요가 없기 때문에, 전체 과정을 한 번에 병렬(parallel)로 계산할 수 있습니다. 느린 부분이 증발해 버리는 것입니다.
이것이 바로
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기