본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 21. 00:30

현대 AI를 가능하게 만든 세 가지 아이디어: 그 중 어느 것도 마법은 아니다

요약

현대 AI 아키텍처의 핵심인 신경망 심화 학습의 한계를 극복한 세 가지 엔지니어링 해결책을 설명합니다. 특히 ResNet의 핵심인 스킵 연결(Skip Connection)이 그래디언트 소실 문제를 어떻게 해결하고 네트워크의 깊이를 확보했는지 다룹니다.

핵심 포인트

  • 깊은 신경망이 오히려 성능이 저하되던 그래디언트 소실 및 최적화 문제 설명
  • 스킵 연결(Skip Connection)을 통해 레이어가 항등 함수를 학습하기 쉽게 개선
  • 입력값을 보존하며 조정값만 계산함으로써 네트워크 깊이의 안정성 확보
  • 그래디언트가 초기 레이어까지 원활하게 전달될 수 있는 경로 제공

현대 AI는 겉으로 보기에는 마법처럼 보입니다. 문장을 입력하면 기계가 일관성 있는 답변을 작성하거나, 함수를 완성하거나, 문단을 일본어로 번역해 줍니다. 그 안에서 뭔가 이국적인 일이 일어나고 있다고 가정하기 쉽습니다.

하지만 그렇지 않습니다. 여러분이 들어본 거의 모든 모델의 이면에 있는 아키텍처 (Architecture)는 몇 가지 평범한 엔지니어링 해결책에 기반하고 있으며, 각 해결책은 특정한 짜증 나는 문제를 해결하기 위해 발명되었습니다. 단 하나의 천재적인 순간도, 비밀스러운 비법도 없습니다. 그저 자신의 네트워크가 망가졌다는 것을 알아차리고 이를 패치 (Patch)한 사람들뿐입니다.

이것은 그 패치들 중 세 가지에 대한 이야기입니다. 스택 트레이스 (Stack trace)를 읽을 줄 안다면, 이 세 가지를 모두 따라올 수 있습니다.

모두가 마주했던 벽

2014년경, 더 똑똑한 신경망 (Neural network)을 만드는 레시피는 명확해 보였습니다. 더 깊게 만드는 것이었습니다. 더 많은 레이어 (Layer)는 더 많은 용량을 의미했고, 이는 더 나은 결과로 이어져야 했습니다. 하지만 특정 지점을 지나면 작동을 멈췄습니다. 더 깊은 네트워크는 오히려 성능이 저하되었으며, 여러분이 예상하는 방식과는 달랐습니다.

징후는 훈련 오차 (Training error)였습니다. 56개 레이어의 네트워크는 20개 레이어의 네트워크보다 자신이 훈련되고 있는 바로 그 데이터에서 더 나쁜 성능을 보였습니다. 이는 흔한 원인인 과적합 (Overfitting)을 배제합니다. 왜냐하면 깊은 네트워크는 눈앞에 있는 정답조차 암기하지 못했기 때문입니다. 문제는 용량이 아니었습니다. 네트워크를 훈련시킬 수 없었던 것입니다.

두 가지 문제가 잘못되고 있었습니다. 각 레이어를 가르치는 오차 신호(경사, Gradient)는 초기 레이어에 도달하기 위해 모든 레이어를 역방향으로 통과해야 합니다. 수십 개의 레이어를 통해 숫자를 밀어 넣으면 그것은 아무것도 아닌 상태로 줄어들거나 폭발해 버리는 경향이 있어, 초기 레이어는 거의 사용 가능한 피드백을 받지 못했습니다. 그리고 신호를 형태에 맞게 다듬더라도, 깊어질수록 최적화 (Optimization) 자체가 더 어려워졌습니다.

따라서 네트워크를 강력하게 만들어 줄 것으로 기대되었던 깊이가 오히려 네트워크를 망가뜨리는 요소가 되었습니다. 다음은 세 가지 아이디어가 어떻게 그 벽을 허물었는지에 대한 내용입니다.

아이디어 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을 중심으로 다시 중심을 잡고 (recenter), 일관된 퍼짐 정도 (spread)로 다시 크기를 조정 (rescale)합니다. 그런 다음 네트워크에 두 개의 조절 가능한 노브 (knobs)를 제공하여, 만약 필요하다면 그 결과값을 다시 늘리거나 이동시킬 수 있게 합니다. (2015년 버전인 배치 정규화 (batch normalization)는 예시들의 배치 (batch) 전체에 걸쳐 레벨을 맞춥니다. 이후에 등장한 친척 격인 레이어 정규화 (layer normalization)는 단일 예시의 특징 (features)들에 대해 레벨을 맞추며, 이는 텍스트에 훨씬 더 적합합니다.)

그 보상은 지루할 정도로 실용적입니다. 신호 (signal)가 학습이 작동하는 범위 내에 머물게 됩니다. 학습률 (learning rate)을 훨씬 높여서 더 빠르게 학습할 수 있습니다. 초기 가중치 (starting weights)를 조심스럽게 다루지 않아도 됩니다. 이는 세 가지 아이디어 중 가장 화려하지 않은 아이디어이지만, 아마도 디버깅 시간을 가장 많이 아껴주는 아이디어일 것입니다.

지름길 (shortcuts)과 레벨링 (leveling)이 마련되면서, 네트워크는 마침내 깊어질 수 있었고 학습 가능한 상태를 유지할 수 있었습니다. 하지만 언어의 경우, 깊이만으로는 여전히 충분하지 않았습니다.

세 번째 아이디어: 모든 단어가 다른 모든 단어를 바라보게 하기

여기 언어에 특화된 문제가 있습니다. 수년 동안 모델들은 마치 빨대를 통해 읽는 것처럼 텍스트를 읽었습니다. 즉, 한 번에 한 단어씩 읽으며 실행 중인 요약본을 메모리에 유지하는 방식이었습니다. 이것들이 순환 신경망 (recurrent networks)이었으며, 두 가지 결함이 이를 침몰시켰습니다.

첫째, 느렸습니다. 각 단계가 다음 단계로 정보를 전달하기 때문에, 49번째 단어가 끝나기 전에는 50번째 단어를 처리할 수 없었습니다. 수천 가지 일을 동시에 수행하도록 설계된 칩인 GPU에 작업을 분산할 방법이 없었습니다.

둘째, 잘 잊어버렸습니다. 문단의 첫 단어를 마지막 단어와 연결하려면, 정보가 그 사이의 모든 단어를 거쳐 앞으로 전달되는 과정을 견뎌내야 했습니다. 끝에 도달하면 시작 부분은 흐릿해져 버렸습니다.

어텐션 (Attention)은 빨대를 버립니다. 기억력이 희미해지는 방식으로 왼쪽에서 오른쪽으로 읽는 대신, 모든 단어가 문장 내의 다른 모든 단어를 직접 바라보고 어떤 단어가 자신에게 중요한지 무게를 달 수 있게 합니다. "it"이라는 단어는 그것이 가리키는 명사가 아무리 멀리 떨어져 있더라도, 단 한 번의 도약으로 곧장 뒤로 가서 닿을 수 있습니다. 거리는 더 이상 중요하지 않게 됩니다.

그리고 더 이상 순차적인 읽기에 의존할 필요가 없기 때문에, 전체 과정을 한 번에 병렬적으로 (in parallel) 계산할 수 있습니다. 느린 부분이 증발해 버리는 것입니다.

이것이 바로

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0