BERT 개념이해 #5 Linear #
#2026-03-04
#1 Linear가 풀려는 문제: “좋은 표현”을 더 좋은 표현으로 가공해야 한다
Self-Attention까지 지나오면 각 토큰은 이미 문맥이 섞인 768차원 벡터를 갖는다. 그런데 여기서 중요한 질문이 생긴다. “문맥을 섞었다”는 건 관계를 모았다는 뜻이지, 그 관계를 사람이 원하는 형태의 특징으로 정리했다는 뜻은 아니다. 예를 들어 분류 문제라면, 모델은 결국 “이 기사에서 business를 강하게 시사하는 패턴” 같은 걸 잡아야 한다. Self-Attention이 단어들 사이의 연결을 만들어줬다면, 그 다음 단계에서는 그 연결 결과를 다시 재조합해서 “유용한 특징”으로 변환해야 한다. Linear 레이어는 바로 이 변환을 담당한다. 한마디로 Linear는 벡터를 “다른 관점의 좌표계”로 옮기는 장치다. 같은 정보를 더 잘 쓰기 위해, 정보를 섞고 재배치하는 가장 기본적인 도구가 Linear다.
1차원에서 선형 변환은 너무 단순해서 감이 바로 온다. x에 w를 곱하고 b를 더해서 y를 만든다. “크기를 조절하고 위치를 이동한다”는 게 전부다. 그런데 신경망은 1차원이 아니라 768차원 같은 고차원 벡터를 다룬다. 여기서 선형 변환의 진짜 의미가 드러난다. 출력 벡터의 각 성분 yᵢ는 입력의 모든 성분 x₁~x₇₆₈을 가중합해서 만든다. 다시 말하면, 출력의 한 차원은 입력의 768개 정보를 다 섞어서 만든 “새로운 특징 하나”다.
입력: x = 3.0
가중치: w = 2.0
편향: b = 1.0
출력: y = w·x + b = 2.0 × 3.0 + 1.0 = 7.0
이것이 선형 변환의 핵심:
곱하고(scale) 더한다(shift)
이 관점이 정말 중요하다. Linear 레이어는 “특징을 고르는 게 아니라, 특징을 새로 만든다.” 입력 벡터의 각 차원은 이미 어떤 의미를 가진 축들이지만, 그 축들이 지금 당장 문제에 가장 유용한 축이라고 보장할 수 없다. Linear는 그 축들을 섞어서, 모델이 필요로 하는 새 축을 만들어준다. 그래서 Linear는 단순한 차원 변환기가 아니라, “특징 생성기”다.
#
#2 행렬로 보면 더 명확하다: 한 번에 256개의 새 특징을 만든다
입력이 768차원이고 출력이 256차원이라면, 가중치 행렬 W는 (256×768) 크기다. 이 말은 무엇이냐면, 출력 차원 하나를 만들기 위해 768개의 가중치가 필요하고, 그런 출력을 256개 만들기 위해 256줄이 필요하다는 뜻이다. 즉 W의 각 행은 “출력의 한 차원을 만드는 레시피”다. 그리고 편향 b는 출력 차원마다 하나씩 있어서, 그 새 특징의 기준점을 이동시킨다.
입력: x = [x₁, x₂, x₃] (3차원)
가중치 행렬: W ∈ ℝ^{4×3} (4행 3열)
편향 벡터: b ∈ ℝ^4
출력: y = xW^T + b (4차원)
계산:
y₁ = w₁₁x₁ + w₁₂x₂ + w₁₃x₃ + b₁
y₂ = w₂₁x₁ + w₂₂x₂ + w₂₃x₃ + b₂
y₃ = w₃₁x₁ + w₃₂x₂ + w₃₃x₃ + b₃
y₄ = w₄₁x₁ + w₄₂x₂ + w₄₃x₃ + b₄
각 출력 yᵢ = 입력 모든 원소의 가중합 + 편향
= 입력 전체를 고려한 새로운 특징
그래서 Linear는 결국 이렇게 행동한다. “입력 벡터를 보고, 내가 학습해둔 레시피 256개를 동시에 적용해서, 256개의 새 특징을 뽑아낼게.” 이 한 문장으로 Linear의 기능이 끝까지 설명된다.
#
#3 BERT에서 Linear가 많이 등장하는 이유: 트랜스포머는 ‘선형 혼합’이 기본 재료다
BERT를 뜯어보면 Linear가 거의 모든 곳에 깔려 있다. 이유는 트랜스포머의 핵심이 “관계를 계산하고, 그 결과를 다시 섞어 표현을 만드는 것”인데, 그 섞기 작업의 기본 도구가 Linear이기 때문이다.
Self-Attention 내부에서 Q, K, V를 만드는 것도 Linear다. 여기서 Linear의 역할은 “입력 벡터를 다른 공간으로 투영(projection)해서, 비교에 적합한 형태로 바꾸는 것”이다. 같은 입력이라도 W_Q를 통과하면 “무엇을 찾을지”라는 관점의 벡터가 되고, W_K를 통과하면 “내가 어떤 단서인지”라는 관점의 벡터가 되고, W_V를 통과하면 “내가 전달할 내용”이 된다. 이건 단순히 숫자를 바꾸는 게 아니라, 같은 정보를 서로 다른 역할로 분해하는 과정이다. 그리고 여러 헤드에서 나온 결과를 다시 통합할 때도 W_O라는 Linear를 한 번 더 써서 “12개 관점에서 나온 정보를 다시 한 덩어리로 정리”한다.
즉 Attention의 핵심이 Q·Kᵀ와 Softmax처럼 보이지만, 실제로 그 Attention이 유용해지게 만드는 건 그 앞뒤의 Linear 투영들이다. Linear가 없으면 Attention은 “원래 임베딩 공간에서의 단순 유사도”에 갇히기 쉽고, 관계 학습의 자유도가 크게 줄어든다.
이 모델에서 Linear가 등장하는 곳:
[Self-Attention 내부]
Q 프로젝션: 768 → 768 (W_Q)
K 프로젝션: 768 → 768 (W_K)
V 프로젝션: 768 → 768 (W_V)
Output 프로젝션: 768 → 768 (W_O)
[MLP Sublayer (FFN)]
확장: 768 → 3,072 ← 4배 확장
압축: 3,072 → 768 ← 원래대로
[EnhancedClassifier]
중간층: 768 → 256
출력층: 256 → 4 ← 4개 클래스
#
#4 FFN에서 768→3072→768을 하는 이유: 넓게 펼쳐서 조합한 뒤 다시 압축한다
트랜스포머 블록에서 Self-Attention 다음에 항상 나오는 것이 FFN(Feed-Forward Network)이다. 구조가 768→3072→768인 이유는 겉으로 보면 이상하다. “왜 굳이 4배로 늘렸다가 다시 줄이지?” 여기서 가장 중요한 직관은 이거다. Self-Attention이 하는 일은 “어떤 토큰이 어떤 토큰을 볼지 정해서 정보를 섞는 것”이다. 즉 관계 기반의 가중합이다. 하지만 그걸로 끝내면 표현이 ‘선형적인 혼합’에 머물 수 있다. 문장 이해에는 “단순 혼합”이 아니라 “조건부 조합”이 필요할 때가 많다. 예를 들어 “A가 있고 B가 있고 동시에 C가 있을 때만” 강한 신호가 되는 패턴은 단순한 가중합만으로는 충분히 표현하기 어렵다. 그래서 FFN은 중간에 GELU 같은 비선형 함수를 넣어서, 특징들 사이의 비선형 조합을 만들 수 있게 한다.
768 → 3,072 → 768
비유: 도서관에서 책 재분류
768개 칸에 꽂힌 책들
↓ 먼저 3,072개 칸으로 펼침
모든 책을 꺼내 더 세밀하게 분류
↓ 다시 768개 칸으로 압축
새로운 분류 체계로 정리된 768개 칸
이점:
넓은 중간 공간(3,072)에서 복잡한 특징 조합 가능
"Self-Attention이 놓친 비선형 관계" 포착
4배 확장은 BERT 설계에서 경험적으로 좋은 비율
그런데 왜 차원을 3072까지 넓히냐면, 비유로 말하면 작업대가 넓을수록 더 복잡한 조립을 할 수 있기 때문이다. 768차원 공간에서는 768개의 축 위에서만 조합을 해야 하지만, 3072차원으로 확장하면 훨씬 많은 “중간 특징 슬롯”이 생긴다. 그 슬롯들에 “조합 결과”를 임시로 만들어 올려놓고, 마지막에 다시 768로 압축하면서 필요한 것만 추려서 정리한다. 그래서 768→3072는 “표현을 펼쳐서 조합할 공간을 만들기”이고, 3072→768은 “조합된 결과를 다시 모델의 기본 차원으로 정돈하기”다. 이 구조가 트랜스포머에서 경험적으로 매우 잘 작동해서 표준이 됐다.
계산:
Linear₁: (batch, L, 768) × (768, 3072) → (batch, L, 3072)
→ GELU 활성화 →
Linear₂: (batch, L, 3072) × (3072, 768) → (batch, L, 768)
파라미터:
768→3072: 768 × 3072 + 3072(bias) = 2,362,368
3072→768: 3072 × 768 + 768(bias) = 2,360,064
합계: ≈ 4.72M params (BERT Layer 1개당)
× 12 = 56.6M params
#
#5 Classifier에서 768→256→4를 하는 이유: 바로 압축하면 중요한 패턴이 뭉개진다
뉴스 분류처럼 최종 출력이 4개 클래스인 경우, 가장 단순한 방법은 768을 바로 4로 보내는 것이다. 하지만 768차원은 굉장히 풍부한 표현이고, 그 안에는 다양한 정보가 얽혀 있다. 그걸 한 번의 선형 변환으로 바로 4개로 압축하면, “분류에 필요한 특징을 추출하는 중간 단계”가 거의 없다. 그래서 EnhancedClassifier처럼 768→256→4로 한 번 완충층을 두면, 256차원 공간에서 “분류에 필요한 정보만 골라 정리”할 시간이 생긴다. 그리고 중간에 GELU를 끼우면 단순 선형 분리보다 더 복잡한 결정 경계를 만들 수 있다. 결과적으로 분류기는 BERT가 만든 표현을 더 잘 활용한다.
Naive (기본 BERT):
Linear: 768 → 4 (파라미터: 3,072)
→ 직접 4개 클래스로
EnhancedClassifier:
Linear: 768 → 256 (파라미터: 196,608 + 256 = 196,864)
→ GELU →
Linear: 256 → 4 (파라미터: 1,024 + 4 = 1,028)
합계: 197,892 params
이유:
768차원의 풍부한 BERT 표현을 바로 4개로 압축하면
→ 중간의 복잡한 패턴을 포착할 기회가 없음
256차원 중간층이 있으면:
→ BERT의 768차원에서 분류에 필요한 특징 추출
→ 추출된 256차원에서 최종 4개 클래스 판별
→ Optuna가 classifier_hidden={128, 256, 512} 중 256 선택
#
#6 계산량 관점에서의 함정: Attention보다 FFN이 더 무거울 때가 많다
사람들은 보통 트랜스포머에서 가장 비싼 게 Self-Attention이라고 생각한다. 왜냐하면 O(L²)라는 말이 너무 강렬하기 때문이다. 그런데 실제로는 길이 L이 192 정도로 제한된 설정에서는 FFN이 더 많은 연산을 할 수 있다. FFN은 토큰마다 768→3072 같은 큰 행렬곱을 수행하고, 이걸 시퀀스 길이 L만큼 반복한다. 그래서 총량이 L×d×4d 형태로 커진다. 결국 “길이가 아주 길어질 때는 Attention이 병목이 되지만, 길이가 적당할 때는 FFN이 연산과 파라미터의 대부분을 차지한다”는 현상이 생긴다. 그래서 BERT 파라미터를 뜯어보면 FFN 쪽이 굉장히 큰 비중을 가져간다. 트랜스포머를 최적화할 때 사람들이 FFN 최적화도 매우 중요하게 보는 이유가 여기에 있다.
Linear의 시간 복잡도: O(in × out)
Self-Attention vs Linear:
Self-Attention: O(L² × d) — L에 따라 제곱 증가
Linear (FFN): O(L × d²) — L에 선형 증가
L=192, d=768 기준:
Self-Attention: 192² × 768 = 28,311,552
FFN: 192 × 768 × 3072 = 453,149,696
사실 FFN이 Self-Attention보다 더 많은 계산을 함!
→ BERT에서 파라미터와 FLOP의 대부분을 FFN이 차지
#
#7 초기화와 학습률이 다른 이유: 어디는 이미 배워놓았고, 어디는 새로 배운다. HuggingFace에서 불러오는 BERT의 W_Q, W_K, W_V, W_O, 그리고 FFN의 Linear들은 사전학습으로 이미 꽤 괜찮은 값으로 세팅되어 있다. 그래서 fine-tuning 때는 이 가중치를 크게 흔들지 않도록 학습률을 낮게 잡는다. 반면 EnhancedClassifier의 Linear는 새로 붙인 층이라 랜덤 초기화에서 시작한다. 이 부분은 “처음부터 배워야 하는 영역”이기 때문에 상대적으로 더 높은 학습률을 허용할 수 있다. 즉 Linear는 같은 Linear라도, 어떤 것은 이미 언어 지도를 학습한 상태의 선형 변환이고, 어떤 것은 새 과제에 맞게 처음부터 학습해야 하는 선형 변환이다.
nn.Linear의 기본 초기화: Kaiming Uniform
→ 입력 차원의 크기에 맞게 랜덤 초기화
BERT 사전학습 가중치 (Huggingface):
W_Q, W_K, W_V, W_O: 이미 의미있는 값으로 초기화
FFN Linear: 이미 의미있는 값으로 초기화
→ Fine-tuning 시 lr을 낮게 유지 (1e-5 수준)
EnhancedClassifier Linear:
랜덤 초기화 (사전학습 없음)
→ Fine-tuning 시 더 높은 lr 허용 (3.6e-5)
#
#8 정리: Linear는 “정보를 섞어 새 특징을 만드는 기본 기계”다
Linear 레이어는 입력 벡터의 모든 원소를 가중합해 출력 벡터의 각 차원을 만든다. 그래서 단순히 차원을 늘리고 줄이는 도구가 아니라, 입력 특징들을 섞어서 새로운 특징 축을 만들어내는 장치다. BERT에서 Linear는 Q/K/V/O 투영으로 Attention이 관계를 학습할 수 있게 만들고, FFN의 768→3072→768 구조로 비선형 조합을 위한 넓은 작업 공간을 제공하며, 분류기에서는 768→256→4처럼 단계적으로 압축하면서 분류에 필요한 특징을 추출한다. 트랜스포머에서 Linear는 “모든 중요한 연산이 일어나기 전에, 그리고 일어난 후에” 항상 등장하는 이유가 있다. 관계를 계산하든, 조합을 만들든, 최종 결정을 내리든, 결국 정보는 한 번 더 섞여야 더 쓸만한 형태가 되기 때문이다.
- Linear = 모든 입력 원소의 학습된 가중합 + 편향
y = xW^T + b: 입력(in)에서 출력(out) 차원으로 선형 변환- BERT에서 등장하는 곳:
- Self-Attention Q/K/V/*: 768→768 (문맥 추출을 위한 공간 변환)
- FFN**: 768→3072→768 (4배 확장 후 압축, 비선형 특징 포착)
- Classifier: 768→256→4 (분류를 위한 점진적 차원 축소)
- 활성화 함수(GELU)와 함께 써야 비선형 특징 학습 가능
- 파라미터: FFN이 BERT 전체의 가장 큰 비중 차지 (56.6M/110M)