공통 · 모델 · 2026-09-28
HC와 mHC: Residual 경로를 넓히고 연결하기
여러 residual stream의 읽기·우회 혼합·쓰기를 같은 입력으로 추적하고, mHC가 반복 혼합에 제약을 두는 이유와 실행 비용을 살펴봅니다.
Residual과 RMSNorm에서 배운 기본 연결은 이전 표현에 이번 계산의 결과를 더합니다. Attention이나 MLP가 새로운 정보를 만들면, 그 결과가 같은 벡터에 누적되어 다음 계산으로 넘어갑니다.
지금까지 모델 심화 연재에서는 주로 토큰 사이에서 정보를 읽고 문맥을 저장하는 방법을 살펴봤습니다. 이제는 같은 토큰의 표현이 모델의 깊이를 따라 어떻게 전달되는가로 시선을 옮기겠습니다. 이번 글의 Hyper-Connections(HC)는 결과를 담는 stream을 여러 개로 늘리고, 이들을 읽고 갱신하는 연결도 학습합니다. 이어서 mHC가 왜 그 연결 중 우회 혼합에 제약을 두는지 살펴보겠습니다.
한 벡터에 쌓이는 층의 결과
여기서 stream은 같은 토큰의 표현을 층에서 층으로 전달하는 경로입니다. 입력 embedding을 e, 첫 번째 계산의 새 출력을 , 두 번째 계산의 새 출력을 라고 하겠습니다. 기본 residual에서는 표현이 e → e + → e + + 로 바뀝니다.
그림 1의 왼쪽은 이 누적을, 오른쪽은 같은 토큰에 대해 여러 표현을 함께 유지하는 경우를 보여 줍니다. 아래로 이동하는 방향은 토큰의 시간 순서가 아니라 모델의 깊이입니다.

하나의 벡터에 더한다고 해서 과거 정보가 모두 사라진다는 뜻은 아닙니다. 학습된 모델은 그 벡터 안에 필요한 특징을 표현할 수 있습니다. 다만 다음 계산이 받는 것은 이미 합쳐진 표현입니다. 각 층의 기여를 따로 꺼내 비중을 정하는 연산이 기본 residual에 들어 있는 것은 아닙니다.
여러 stream을 두면 같은 시점에 여러 d차원 표현을 유지할 수 있습니다. 이 글의 두 stream은 총 2d개의 성분을 담습니다. 첫 stream은 문법, 둘째는 의미처럼 역할을 미리 지정하지는 않습니다. 학습을 통해 서로 다른 내용을 담을 여지를 주는 것입니다. 이 생각을 실제 연결로 만든 것이 HC입니다.
넓어진 경로에서 읽고 쓰기
표현을 두 개 보관한다고 Attention과 MLP도 각각 두 번 실행해야 할까요? HC에서는 여러 stream을 먼저 하나의 d차원 입력으로 모읍니다. 계산 블록 F가 그 입력을 처리한 뒤, 나온 d차원 출력을 다시 각 stream에 배분합니다. F는 Attention 또는 MLP에 해당하며, 그림에서는 정규화 등의 세부 연산을 접었습니다.

그림 2의 핵심은 보관하는 표현의 폭과 F가 받는 입력의 폭을 구분하는 것입니다. 두 stream을 가진 residual 경로의 폭은 2d지만 F의 입력과 출력은 여전히 d입니다. 별도로 기존 두 stream을 섞는 우회 경로가 있으며, 그 결과에 F에서 나온 기여를 더합니다.
HC를 정리한 mHC 논문 §3은 이 연결을 읽기 , 우회 혼합 , 쓰기 로 구분합니다. 계수를 만드는 가중치는 학습되며, 동적인 연결에서는 현재 표현에 따라서도 계수가 달라집니다. 아래 숫자는 그중 한 계산 시점의 계수를 직접 정한 예시입니다.
같은 입력의 두 경로
두 stream을 = [2, 0], = [0, 2]로 두겠습니다. 이를 행으로 쌓은 X는 2×2 행렬입니다. 행은 stream이고 열은 벡터의 성분입니다. 예시에서는 두 수가 우연히 같지만 stream 수와 특징 차원 d는 서로 다른 축입니다.
그림 3의 왼쪽은 X에서 F의 입력과 쓰기 기여를 만드는 경로입니다. 오른쪽은 같은 X에서 출발하는 우회 경로입니다. 오른쪽 혼합이 왼쪽의 읽기 결과를 입력으로 받는 것이 아닙니다.
![첫 패널에서 H_pre .75,.25가 X [[2,0],[0,2]]를 [1.5,.5]로 읽고 F 출력 .4,−.2를 가정한다. 둘째 패널은 H_res [[.8,.2],[.2,.8]]로 같은 X를 섞어 B [[1.6,.4],[.4,1.6]]를 만든다. 첫 패널의 쓰기 계수 [1,.5] 세로벡터와 u의 곱 W [[.4,−.2],[.2,−.1]]를 B에 더해 [[2,.2],[.6,1.5]]를 얻는다.](/images/model-advanced-hc-mhc/02-read-mix-write.png?v=bdb34ff94e1a)
읽기 계수를 0.75와 0.25로 정하면 F에 들어가는 값은 다음과 같습니다.
F의 내부 계산은 생략하고 출력 u = [0.4, −0.2]를 가정하겠습니다. 첫 stream에는 u의 1배, 둘째에는 0.5배를 씁니다. 따라서 더할 기여는 각각 [0.4, −0.2]와 [0.2, −0.1]입니다. 쓰기 계수는 한 stream에 전달할 벡터 전체에 곱하는 scalar입니다.
우회 경로에서는 첫 stream에 기존 의 0.8배와 의 0.2배를 모아 [1.6, 0.4]를 만듭니다. 둘째에는 그 비율을 바꿔 [0.4, 1.6]을 만듭니다. 마지막에 두 경로를 합칩니다.
| Stream | 우회 혼합 결과 B | 새로 쓸 기여 W | 다음 표현 B + W |
|---|---|---|---|
| 첫 번째 | [1.6, 0.4] | [0.4, −0.2] | [2, 0.2] |
| 두 번째 | [0.4, 1.6] | [0.2, −0.1] | [0.6, 1.5] |
읽기는 F에 무엇을 보여 줄지, 우회 혼합은 기존 표현을 어떻게 전달할지, 쓰기는 새 결과를 어디에 얼마나 반영할지를 정합니다. 셋을 모두 “가중합”이라고 부를 수는 있지만 입력과 출력, 맡은 역할이 다릅니다.
일반적으로 n개의 stream을 유지한다면 X의 크기는 n×d, 읽기 행렬은 1×n, 우회 혼합은 n×n입니다. 이 글에서는 쓰기를 n×1 열벡터로 두므로, F의 1×d 출력과 곱하면 n×d 쓰기 기여가 됩니다. 그림의 는 원 논문의 행벡터 표기를 전치한 것입니다. 예시 읽기 계수의 합이 1이라는 사실도 모든 HC 읽기·쓰기 계수가 반드시 합 1이어야 한다는 규칙은 아닙니다.
혼합이 깊이를 따라 반복되면
기본 residual의 우회 경로는 입력을 그대로 전달합니다. F의 출력을 0으로 두면 다음 표현은 이전 표현과 같습니다. HC는 우회 경로에도 혼합 행렬이 있으므로, F가 새 값을 만들지 않아도 기존 표현이 바뀔 수 있습니다.
그림 4에서는 이 효과만 분리하기 위해 F의 출력을 모두 0으로 두었습니다. 이번 [2, 0]은 두 stream에서 같은 성분 하나를 뽑은 값입니다. 앞 절처럼 한 stream의 두 성분을 나열한 벡터와 축이 다릅니다.
![기본 I는 [2,0] 유지. 왼쪽 2I는 [2,0],[4,0],[8,0],[16,0]. 오른쪽 H=[[.8,.2],[.2,.8]]는 [2,0],[1.6,.4],[1.36,.64],[1.216,.784]로 바뀌며 합 2 유지.](/images/model-advanced-hc-mhc/03-repeated-residual-mixing.png?v=e09ea239be1a)
혼합 행렬이 항등행렬 I이면 [2, 0]은 계속 [2, 0]입니다. 반면 2I를 반복 적용하면 [4, 0], [8, 0], [16, 0]이 됩니다. 새 정보가 추가되지 않아도 우회 경로만으로 값이 커지는 것입니다. 이는 HC가 반드시 이렇게 학습된다는 예측이 아니라, 연결에 제약이 없을 때 허용되는 경우를 보여 주는 예시입니다.
오른쪽의 0.8·0.2 혼합은 [2, 0]을 [1.6, 0.4], [1.36, 0.64], [1.216, 0.784]로 바꿉니다. 값은 서로 섞이지만 각 단계의 두 값 합은 2로 유지됩니다. mHC는 이런 보존 성질을 갖도록 우회 혼합을 제한합니다.
mHC가 보존하는 것
mHC의 우회 혼합은 원소가 음수가 아니고 각 행과 열의 합이 1인 행렬을 목표로 합니다. 이를 이중 확률 행렬이라고 합니다. 그림 5에서는 행 합과 열 합이 각각 어떤 의미를 갖는지 같은 [2, 0] 예시로 확인할 수 있습니다.
![[2,0]을 섞으면 [1.6,.4]가 되어 두 값 모두0~2 안에 있고 합2가 유지된다. H_res [[.8,.2],[.2,.8]]의 행·열 합은1이며 원점수에서 양수화와 반복 정규화로 만든다.](/images/model-advanced-hc-mhc/04-constrained-residual-mixing.png?v=c04d1359f492)
행 합이 1이면 출력 하나는 입력들을 비율에 맞춰 섞은 값입니다. 0.8×2 + 0.2×0 = 1.6처럼, 음수가 아닌 비중으로 평균을 내므로 입력의 최솟값 0과 최댓값 2 사이에 놓입니다. 열 합이 1이면 입력 하나가 여러 출력으로 나뉘는 배율의 총합이 1입니다. 그래서 모든 출력의 합도 모든 입력의 합과 같습니다.
이 행렬들을 반복해서 곱한 결과도 같은 성질을 가집니다. 앞 그림에서 혼합을 반복해도 [2, 0]의 범위 밖으로 값이 커지지 않았던 이유입니다. 다만 값의 합을 보존한다고 각 stream의 내용을 그대로 보존하는 것은 아닙니다. 반복 혼합으로 두 값이 가까워지는 모습도 함께 볼 수 있습니다.
mHC 논문 §4는 양수로 변환한 점수 행렬에 행·열 정규화를 반복하는 Sinkhorn-Knopp 절차를 사용합니다. 실제 유한 번 반복에서는 제약을 근사하며, 읽기와 쓰기 계수에는 별도의 변환을 적용합니다. 모든 연결 행렬을 이중 확률 행렬로 만드는 것은 아닙니다.
또한 이 보존 성질은 새 F 출력을 더하기 전 우회 혼합에 대한 것입니다. F의 쓰기 기여까지 더한 전체 표현의 크기가 고정된다거나, 학습의 모든 불안정성이 사라진다고 해석하면 안 됩니다.
표현의 여유와 실행 비용
HC는 residual 경로에 여러 표현을 유지할 여지를 주고, mHC는 그 경로를 반복해서 연결할 때의 혼합을 제약합니다. 이를 통해 더 풍부한 연결을 쓰면서도 우회 신호가 과도하게 증폭되는 위험을 줄이려는 것입니다.
F의 폭이 d로 유지되어도 전체 비용이 그대로인 것은 아닙니다. n개의 표현을 보관하고 읽고 써야 하므로 활성값 저장과 메모리 접근이 늘어납니다. 연결 계수를 만들고 stream들을 섞는 연산도 추가됩니다. 같은 토큰 수와 d에서 residual 표현 자체의 성분 수는 n배지만, 모델 전체 메모리나 실행 시간이 그대로 n배가 되는 것은 아닙니다. Attention의 KV cache, MLP 중간값, 커널 구성 등 다른 항목이 함께 비용을 결정합니다.
따라서 확인할 것은 정확도뿐 아니라 학습 안정성, 활성값 메모리, 실제 실행 시간입니다. 이 글의 작은 수치 예시는 연결의 역할을 설명하며 성능 개선을 측정한 결과가 아닙니다.
다음 글의 Gated Residual도 여러 stream을 유지합니다. 다만 우회 경로는 원본을 그대로 두고, 읽기에서 벡터 성분마다 gate를 적용합니다. 무엇을 보관할지에 이어, 보관된 표현을 어떻게 사용할지에 초점을 옮기겠습니다.