1. 신경망 기반 단어 임베딩: 제안 동기 (Why?)
"왜 굳이 복잡한 신경망까지 사용해야 할까?"에 대한 답입니다.
- 기존 방식(LSA)의 문제점:
- 이전까지의 방식(DTM, LSA)은 단어의 '의미'를 단순히 **'출현 빈도'**로만 정의했습니다.
- 하지만 진짜 '의미'는 빈도수뿐만 아니라, 단어의 순서나 주변에 어떤 단어가 오는지(국소적 문맥)에 따라 결정됩니다. LSA는 이를 반영하지 못했죠.
- 새로운 가설과 접근법 (★★★★★):
- 핵심 가설 (분포 가설, Distributional Hypothesis): "비슷한 의미의 단어는 비슷한 주변 단어들과 함께 나타난다." 이 문장은 반드시 외워두세요. "왕(King)"이라는 단어 주변에는 "여왕, 왕자, 성, 왕관" 등이 나타나고, "여왕(Queen)" 주변에도 비슷한 단어들이 나타날 것이라는 아이디어입니다.
- 새로운 접근: 따라서 이제는 문서 전체를 보는 것이 아니라, 특정 단어 주변의 몇 개 단어(윈도우, window)로 이루어진 **'국소 맥락'**에 집중하여 단어의 의미를 파악하기로 합니다.
2. 참조: 신경망의 학습 원리 (How?)
위의 새로운 아이디어를 구현할 도구로 '신경망'을 선택했습니다. 신경망이 어떻게 학습하는지 기본 원리를 알아봅시다.
신경망이란?
- 뉴런(Neuron): 신경망을 구성하는 가장 작은 단위로, 입력값(x)을 받아 가중치(w)를 곱하고 편향(b)을 더해 출력값(y)을 내보내는 간단한 계산기입니다.
- 깊은 신경망(DNN): 이 뉴런들이 여러 층(Layer)으로 수없이 모여 복잡한 구조를 이룬 것입니다. 이를 이용한 기술을 딥러닝이라고 합니다.
신경망의 학습 과정
신경망은 마치 학생과 같습니다. 문제를 풀고, 정답과 비교하며 실력을 키워나갑니다.
- 학습 목표(Task) 설정: 신경망에게 풀 문제를 줍니다.
- 예시: 수많은 강아지 사진(Input X)을 보여주고, "이건 '개'야" 라고 정답(Output Y)을 알려주는 문제를 냅니다.
- 예측 및 오차 계산: 신경망은 현재 아는 지식(초기 가중치 w)으로 사진을 보고 예측을 합니다. 당연히 처음에는 틀리겠죠. 그러면 정답과 예측이 얼마나 다른지 '오차(Error)'를 계산합니다. 이 오차를 측정하는 함수를 **손실 함수(Loss Function)**라고 합니다.
- 가중치(w) 업데이트 (핵심!)
- 신경망 학습의 핵심은 **"오차(손실 함수 값)를 최소화하는 방향으로 내부의 가중치(w)를 계속 수정하는 것"**입니다.
- 이때 **역전파(Backpropagation)**라는 아주 효율적인 방법을 사용합니다. 역전파는 계산된 오차를 바탕으로 "이 오차에 어떤 가중치가 얼마나 영향을 미쳤는지"를 거꾸로 추적하여, 각 가중치를 어느 방향으로 얼마나 수정해야 할지 알려주는 역할을 합니다.
시험 대비 최종 요약
- 신경망 기반 임베딩의 동기: LSA가 놓친 단어 순서와 국소 문맥을 반영하기 위함.
- 핵심 가설: 분포 가설 ("비슷한 의미의 단어는 비슷한 주변 문맥에서 등장한다.")
- 접근 방식: 문서 전체가 아닌, 윈도우(window) 기반의 지역적 문맥에 집중.
- 학습 원리:
- **학습 목표(Task)**를 설정한다.
- 예측값과 정답의 차이인 **손실(Loss)**을 계산한다.
- **역전파(Backpropagation)**를 이용해 손실을 줄이는 방향으로 **가중치(w)**를 업데이트한다.
- 궁극적인 목표: 이 학습 과정이 끝나고 나면, 신경망 내부에 남는 최적화된 가중치(w)가 바로 우리가 원하던 '단어의 의미가 응축된 벡터(Word Embedding)'가 됩니다!
1. 경사하강법 (Gradient Descent): 신경망의 나침반
신경망이 학습한다는 것은 **'손실(오차)을 최소화하는 최적의 가중치(W)를 찾아가는 과정'**입니다. 경사하강법은 바로 이 최적의 값을 찾아가는 가장 기본적이고 강력한 방법입니다.
- 핵심 아이디어: 마치 안개 속에서 산을 내려가는 등산가와 같습니다. 가장 낮은 계곡으로 가고 싶지만 안개 때문에 어디가 낮은지 보이지 않습니다. 이때 등산가가 할 수 있는 최선의 방법은, 지금 서 있는 위치에서 발을 딛고 가장 가파르게 경사진 내리막길 방향으로 한 걸음씩 나아가는 것입니다.
- 용어 매칭 (★★★★★):
- 산의 지형: 손실 함수 (Loss Function)
- 등산가의 위치: 현재 가중치(W) 파라미터 값
- 가장 낮은 계곡: 손실이 최소가 되는 지점 (최적의 가중치 값)
- 발밑의 경사 (기울기): 그래디언트 (Gradient)
- 한 걸음의 보폭: 학습률 (Learning Rate)
시험 대비 요약: **경사하강법(Gradient Descent)**이란, 손실 함수의 최솟값을 찾기 위해 현재 지점의 그래디언트(기울기)가 가리키는 가장 가파른 하강 방향으로 가중치를 조금씩 이동시켜, 점차 손실을 줄여나가는 최적화 알고리즘입니다.
2. Neural Network Language Model (NNLM): 신경망, 언어를 배우다
NNLM은 2003년 요슈아 벤지오(Yoshua Bengio)가 제안한, 경사하강법과 신경망을 언어 모델링에 적용한 최초의 시도로, 단어 임베딩 역사에 한 획을 그은 매우 중요한 모델입니다.
- 핵심 아이디어: NNLM 이전의 통계적 언어 모델들은 여러 한계(e.g., 희소성 문제)가 있었습니다. NNLM은 이 문제를 신경망으로 해결하고자 했습니다.
- 학습 목표 (Task) 정의 (★★★★★): NNLM의 학습 목표는 아주 명확합니다. 바로 **"이전 단어들을 보고 다음 단어를 예측하는 것"**입니다.
- 공식: 주어진 (n-1)개의 단어로 n번째에 올 단어를 맞추는 문제입니다.
- 예시: "고양이가 소파 위에" 라는 단어들이 주어졌을 때, "앉았다" 라는 다음 단어를 예측하도록 신경망을 학습시킵니다.
- NNLM의 두 가지 위대한 유산:
- 단어 임베딩의 탄생: NNLM은 "다음 단어 예측"이라는 원래의 목표를 수행하는 과정에서, 부산물(by-product)로 아주 중요한 것을 만들어냈습니다. 바로 각 단어의 의미가 압축된 밀집(dense) 벡터, 즉 **단어 임베딩(Word Embedding)**입니다. 신경망의 내부 가중치가 단어의 의미 벡터가 된 것입니다.
- 가능성 입증: 신경망을 통해 언어를 학습하고, 단어의 의미를 벡터로 표현할 수 있다는 가능성을 최초로 보여주어 이후 Word2Vec, GloVe, BERT 같은 후속 모델들의 탄생에 지대한 영향을 주었습니다.
시험 대비 요약: **NNLM(신경망 언어 모델)**이란, **'(n-1)개의 이전 단어로 n번째 단어를 예측'**하는 과제를 신경망으로 학습하는 모델입니다. 이 과정에서 부산물로 단어의 의미가 담긴 **밀집 벡터(단어 임베딩)**를 얻을 수 있다는 것을 보여준 최초의 모델입니다.
NNLM 아키텍처 완전 정복
NNLM의 목표는 **"이전 (n-1)개의 단어들이 주어졌을 때, n번째 단어가 무엇일지 예측하는 것"**입니다. 이 목표를 달성하기 위해 아래와 같은 구조를 사용합니다.
1단계: 입력 계층 (Input Layer)
- 역할: 예측에 사용할 이전 단어들, 즉 **문맥(Context)**을 입력받는 부분입니다.
- 예시: "고양이가 소파 위에" 라는 문맥이 주어지면, '고양이', '소파', '위에' 라는 3개의 단어가 입력됩니다. 실제로는 단어 자체가 아니라 단어 사전에 정의된 각 단어의 **고유 번호(index)**가 입력됩니다.
2단계: 투사 계층 (Projection Layer) ★★★★★
- 역할: NNLM의 가장 핵심적인 부분입니다. 바로 이 계층에서 단어 임베딩이 만들어집니다.
- 구성: 이 계층은 'Matrix C' 라고 불리는 거대한 행렬(Lookup Table) 하나로 이루어져 있습니다. 이 행렬의 각 행(row)은 우리 단어 사전에 있는 모든 단어 각각에 대한 임베딩 벡터를 의미합니다.
- 작동 방식:
- 입력 계층에서 단어의 고유 번호(index)를 받습니다.
- 그 번호에 해당하는 행(row)을 Matrix C에서 그대로 꺼내옵니다(Look-up).
- 꺼내온 행이 바로 그 단어의 밀집(dense) 벡터, 즉 임베딩 벡터입니다.
- 핵심 포인트: 처음에는 이 Matrix C가 무작위 숫자로 채워져 있지만, 모델이 학습을 진행하면서 "다음 단어를 더 잘 예측하는 방향으로" 이 행렬의 값들이 계속 업데이트됩니다. 학습이 끝나면, 이 Matrix C 자체가 우리가 원하던 '단어 임베딩 모델'이 됩니다!
3단계: 은닉 계층 (Hidden Layer)
- 역할: 문맥을 이루는 각 단어의 임베딩 벡터들을 하나로 합쳐서, 단어들 사이의 의미적, 문법적 관계를 학습하는 부분입니다.
- 작동 방식:
- 투사 계층에서 나온 여러 개의 단어 임베딩 벡터들을 하나의 긴 벡터로 연결(concatenate)합니다.
- 이 긴 벡터를 입력받아 비선형 변환(tanh 함수)을 거쳐 다음 계층으로 전달합니다. 이 과정을 통해 단어들의 조합이 갖는 복합적인 패턴을 파악합니다.
은닉 계층(Hidden Layer)은 개별 단어들의 의미를 조합하여 문맥 전체의 복합적인 의미를 파악하기 위해 반드시 필요합니다. 단순히 단어 벡터들을 합치기만 해서는 알 수 없는 더 깊은 관계를 학습하는 '중간 관리자' 역할을 합니다.
은닉 계층의 역할: 단순한 조합을 넘어 상호작용 학습하기
간단한 비유를 들어보겠습니다. [New, York, is] 라는 단어들이 주어졌을 때 다음 단어를 예측한다고 생각해 보세요.
- 은닉 계층이 없다면? 모델은 그저 'New'의 의미 벡터, 'York'의 의미 벡터, 'is'의 의미 벡터를 단순히 합치거나 평균 낼 뿐입니다. 이 경우, 모델은 New + York이 New_York이라는 특별한 도시를 의미한다는 상호작용을 제대로 학습하기 어렵습니다. 그냥 '새롭다'와 '요크'라는 의미가 섞인 애매한 벡터가 될 뿐이죠.
- 은닉 계층이 있다면?
- 의미의 조합: "New"라는 단어와 "York"라는 단어가 특정 순서로 함께 나오면, 이것은 '새롭다'는 의미가 아니라 '미국의 도시'라는 완전히 새로운 의미의 개념으로 해석해야 한다는 패턴을 학습합니다.
- 문법적 구조 파악: "is"라는 be동사 뒤에는 명사나 형용사가 올 확률이 높다는 등의 문법적 구조를 파악합니다.
- 비선형 관계 학습: 언어는 단순한 덧셈(A+B=C)으로 표현되지 않는 복잡한 관계가 많습니다. 예를 들어 "not good"은 "good"의 의미를 완전히 뒤집습니다. 은닉 계층의 **비선형 변환(tanh 함수 등)**은 이러한 복잡하고 비선형적인 관계를 잡아내는 데 결정적인 역할을 합니다.
- 은닉 계층은 투사 계층에서 합쳐진 긴 벡터([New_York_is])를 입력받아 다음과 같은 복합적인 패턴을 학습합니다.
결론적으로, 은닉 계층은 각 단어라는 개별 재료들을 받아서, 이 재료들이 어떻게 어우러져 '문맥'이라는 하나의 요리를 만드는지 그 레시피를 학습하는 핵심적인 두뇌와 같습니다. 이 과정이 없다면 모델은 단어들의 단순한 나열 이상의 의미를 파악할 수 없습니다.
tanh(탄젠트에이치)를 이용한다는 것은, 신경망의 은닉층에서 들어온 신호를 다음 층으로 그냥 전달하지 않고, tanh라는 '활성화 함수(Activation Function)'를 한번 통과시켜 신호의 형태를 바꿔주는 것을 의미합니다.
핵심적인 이유는 '비선형성(Non-linearity)'을 추가하기 위해서입니다.
왜 비선형 변환이 필요한가?
신경망의 기본 계산은 입력값에 가중치를 곱하고 더하는, 아주 단순한 선형(Linear) 계산의 반복입니다. 만약 활성화 함수 없이 이런 선형 계산만 여러 겹 쌓는다면, 그 결과는 결국 하나의 거대한 선형 계산과 다를 바 없습니다. 이는 마치 직선 자만 여러 개 가지고 복잡한 곡선을 그리려는 것과 같아서, 단순한 패턴밖에 학습할 수 없습니다.
tanh와 같은 비선형 활성화 함수는 이 직선적인 신호를 구부리고 휘게 만드는 역할을 합니다. 이 과정을 통해 신경망은 훨씬 더 복잡하고 유연한 패턴을 학습할 수 있는 능력을 갖추게 됩니다.
tanh의 작동 방식
tanh 함수는 들어온 값을 -1과 +1 사이의 S자 형태로 바꿔주는 역할을 합니다.
- 입력: 뉴런에 들어온 신호의 총합 (양수든 음수든, 값이 얼마든 상관없음)
- 출력: -1에서 +1 사이의 값
- 입력값이 크면 출력은 +1에 가까워집니다 (신호를 강하게 '활성화' 또는 '긍정').
- 입력값이 작으면 출력은 -1에 가까워집니다 (신호를 강하게 '억제' 또는 '부정').
- 입력값이 0에 가까우면 출력도 0에 가까워집니다 (신호가 '중립적'임).
결론적으로, 은닉층에서 tanh를 이용한다는 것은, 각 뉴런이 단순한 덧셈기가 아니라, 들어온 신호의 중요도를 판단하여 '강한 긍정', '강한 부정', '중립'과 같이 의미 있는 결정을 내리는 똑똑한 부품이 되도록 만드는 과정이라고 이해하시면 됩니다.
벡터를 길게 연결하는 것은 **'재료를 한곳에 모으는 것'**이고, 비선형 변환을 하는 것은 **'그 재료들을 레시피에 따라 요리하여 완전히 새로운 맛을 만드는 것'**과 같습니다.
## 왜 이 과정이 복합적인 패턴을 만들까요?
두 단계로 나누어 자세히 설명해 드릴게요.
1단계: 연결 (Concatenation) - "재료를 순서대로 나열하기"
"The cute cat"이라는 구절이 있다고 해봅시다. 각 단어의 임베딩 벡터가 3차원이라고 가정하면 다음과 같습니다.
- The 벡터: [0.1, 0.2, 0.1]
- cute 벡터: [0.5, 0.1, 0.1]
- cat 벡터: [0.2, 0.8, 0.3]
이 벡터들을 그냥 더하거나 평균을 내면 각 단어의 고유한 순서와 정보가 일부 손실됩니다. 하지만 '연결(concatenate)'하면 모든 정보가 순서대로 보존된 하나의 긴 벡터가 만들어집니다.
- 연결된 벡터: [0.1, 0.2, 0.1, 0.5, 0.1, 0.1, 0.2, 0.8, 0.3]
하지만 여기까지는 그저 재료를 순서대로 늘어놓은 것뿐입니다. 이 상태만으로는 "cute라는 형용사가 cat이라는 명사를 꾸며준다"는 **단어들의 조합이 갖는 특별한 관계(패턴)**를 알 수 없습니다.
2단계: 비선형 변환 (tanh) - "레시피로 요리하기"
이제 은닉층(Hidden Layer)이 이 길게 연결된 벡터를 입력받습니다. 은닉층의 뉴런들은 이 긴 벡터의 특정 부분들에 가중치를 곱하고 더하는 연산을 하는데, 이것이 바로 **'레시피'**입니다.
- 비선형 변환이 없다면 (선형 변환만 있다면): 단순히 재료의 양을 조절해서 섞는 것과 같습니다. 아무리 섞어도 밀가루, 계란, 설탕은 그냥 '밀가루+계란+설탕'일 뿐, '빵'이 되지 않습니다. 즉, "형용사 뒤에 명사가 오는 패턴" 같은 복잡한 관계를 학습할 수 없습니다.
- 비선형 변환(tanh)이 있다면 (★★★★★): tanh와 같은 비선형 함수는 **'재료들을 가열하고 굽는 과정'**과 같습니다. 이 과정을 통해 재료들은 서로 화학 반응을 일으켜 완전히 새로운 물질인 '빵'이 됩니다. 신경망에서도 마찬가지입니다.
- 어떤 뉴런은 연결된 벡터의 4~6번째 자리(cute 벡터 부분)와 7~9번째 자리(cat 벡터 부분)에 높은 가중치를 부여하도록 학습될 수 있습니다.
- 그리고 tanh 함수를 통해, 이 두 부분이 동시에 특정 조건을 만족할 때만 강한 신호(예: +1에 가까운 값)를 발생시키도록 학습합니다. 이것이 바로 "형용사가 명사를 꾸며준다"는 복합적인 패턴을 인식하는 순간입니다.
- 다른 뉴런은 "not good"처럼 'not'이 'good' 앞에 올 때 의미가 완전히 반전되는 패턴을 학습할 수도 있습니다.
4-단계: 출력 계층 (Output Layer)
- 역할: 은닉 계층에서 파악한 문맥 정보를 바탕으로, 단어 사전에 있는 **모든 단어들 각각에 대해 "다음 단어로 나올 확률"**을 계산합니다.
- 작동 방식:
- 소프트맥스(Softmax) 함수를 사용합니다. 소프트맥스는 여러 개의 숫자 값을 '확률' 개념으로 바꾸어주는 역할을 합니다. (모든 출력값은 0~1 사이이고, 총합은 1이 됩니다.)
- 이 확률값들 중에서 가장 높은 확률을 가진 단어가 모델의 최종 예측이 됩니다. (e.g., '앉았다'가 80% 확률로 예측)
시험 대비 최종 요약
- NNLM 목표: 이전 단어들로 다음 단어 예측.
- 핵심 구성 요소: 투사 계층(Projection Layer)의 Matrix C. 이 행렬 자체가 학습의 결과물이자 단어 임베딩이다.
- 전체 흐름:
- 입력: 단어의 고유 번호(Index)
- 투사: Matrix C에서 해당 번호의 행(임베딩 벡터)을 꺼냄.
- 은닉: 여러 단어 벡터를 조합해 문맥 패턴 학습.
- 출력: 모든 단어에 대한 다음 단어 등장 확률 계산 (Softmax 사용).
- 의의와 한계: 단어 임베딩의 개념을 최초로 제시했지만, 은닉층과 출력층의 계산이 너무 복잡하고 느리다는 단점이 있었습니다. 이 단점을 개선한 모델이 바로 Word2Vec입니다.
NNLM의 한계점 (Limitations)
NNLM의 한계는 주로 **'느린 속도'**와 **'부수적인 학습 목표'**라는 두 가지 큰 문제로 요약할 수 있습니다.
1. 계산량이 너무 크다 (느린 학습 속도)
이것이 NNLM의 가장 치명적인 단점입니다.
- 원인: NNLM은 다음 단어를 예측할 때, 출력층(Output Layer)에서 단어 사전에 있는 모든 단어에 대해 각각 확률을 계산해야 합니다. (Softmax 함수 때문)
- 문제점: 만약 단어 사전에 10만 개의 단어가 있다면, 매 학습 단계마다 10만 개의 단어에 대한 확률 계산을 반복해야 합니다. 이는 엄청난 계산 비용을 유발하여 학습 속도를 매우 느리게 만듭니다. 🐢
2. 고정된 크기의 문맥 (긴 문맥 반영 불가)
NNLM은 정해진 개수의 단어만 보고 다음 단어를 예측합니다.
- 원인: 모델의 입력 크기가 (n-1)개의 단어로 고정되어 있습니다. 예를 들어 n=5라면, 항상 바로 앞 4개의 단어만 봅니다.
- 문제점: "저 멀리 파란 지붕을 가진 집에 사는 사람들은..." 이라는 문장에서, 뒤에 나올 동사를 예측하려면 아주 멀리 있는 '사람들은'이라는 단어를 봐야 합니다. 하지만 NNLM은 정해진 창(window) 크기 때문에 이렇게 멀리 떨어진 단어의 정보를 반영할 수 없습니다. 즉, 국소 맥락(Local Context)에만 의존하는 한계가 있습니다.
3. 새로운 단어 추가의 어려움
이것은 LSA와 NNLM이 공유하는 문제입니다.
- 원인: 모델이 한번 학습되고 나면, 입력과 출력 계층의 크기는 단어 사전의 크기에 맞춰 완전히 고정됩니다.
- 문제점: 학습 데이터에 없던 새로운 단어(신조어 등)가 등장하면 모델은 이를 처리할 수 없습니다. 이 단어를 추가하려면 모델 전체를 처음부터 다시 학습시켜야만 합니다.
4. 임베딩 학습의 비효율성 (★★★★★)
이것은 NNLM의 근본적인 한계를 지적하는 매우 중요한 포인트입니다.
- 원인: NNLM의 진짜 학습 목표는 '단어 임베딩을 잘 만드는 것'이 아니라, **'다음 단어를 잘 예측하는 언어 모델을 만드는 것'**입니다. 단어 임베딩(Matrix C)은 이 과정을 통해 얻어지는 **부산물(by-product)**일 뿐입니다.
- 문제점: 우리는 좋은 '단어 임베딩'을 얻고 싶은데, NNLM은 상대적으로 별로 중요하지 않은 '다음 단어 예측'이라는 무겁고 어려운 작업을 억지로 수행하고 있는 셈입니다. 이 때문에 학습이 비효율적이고, 결과물로 나온 임베딩이 정말 최적인지 확신하기 어렵습니다.
시험 대비 최종 요약
| 한계점 종류 | 문제점 | 핵심 원인 |
| 속도 / 효율성 | 학습이 매우 느리고 계산량이 많음 | 어휘집 전체에 대한 Softmax 계산 |
| 문맥 파악 | 긴 문맥을 반영하지 못하고 짧은 문맥에만 의존 | 고정된 입력 윈도우 (n-1) |
| 확장성 | 새로운 단어가 추가되면 전체 재학습 필요 | 고정된 모델 구조 |
| 학습 목표 | 단어 임베딩 자체가 아닌 언어 모델 성능에 최적화됨 | 임베딩은 학습의 부산물(By-product) |
이러한 NNLM의 한계, 특히 **'느린 속도'**와 **'비효율적인 학습 방식'**을 개선하기 위해 등장한 모델이 바로 Word2Vec입니다. 이 흐름을 이해하는 것이 매우 중요합니다!
'코딩공부 > 자연어처리' 카테고리의 다른 글
| 시험공부를 하려고 만든 자연어처리 정리-GloVe (1) | 2025.10.09 |
|---|---|
| 시험공부를 하려고 만든 자연어처리 정리-단어임베딩 (word2vec) (1) | 2025.10.08 |
| 시험공부를 하려고 만든 자연어처리 정리-단어임베딩 (LSA,SVD) (0) | 2025.10.08 |
| 시험공부를 하려고 만든 자연어처리 정리-전처리 3탄(벡터화)-BM25 (0) | 2025.10.08 |
| 시험공부를 하려고 만든 자연어처리 정리-전처리 3탄(벡터화)-TF한계와 TF-IDF (0) | 2025.10.08 |