1. 신경망 기반 단어 임베딩: 제안 동기 (Why?)

"왜 굳이 복잡한 신경망까지 사용해야 할까?"에 대한 답입니다.

  • 기존 방식(LSA)의 문제점:
    • 이전까지의 방식(DTM, LSA)은 단어의 '의미'를 단순히 **'출현 빈도'**로만 정의했습니다.
    • 하지만 진짜 '의미'는 빈도수뿐만 아니라, 단어의 순서나 주변에 어떤 단어가 오는지(국소적 문맥)에 따라 결정됩니다. LSA는 이를 반영하지 못했죠.
  • 새로운 가설과 접근법 (★★★★★):
    • 핵심 가설 (분포 가설, Distributional Hypothesis): "비슷한 의미의 단어는 비슷한 주변 단어들과 함께 나타난다." 이 문장은 반드시 외워두세요. "왕(King)"이라는 단어 주변에는 "여왕, 왕자, 성, 왕관" 등이 나타나고, "여왕(Queen)" 주변에도 비슷한 단어들이 나타날 것이라는 아이디어입니다.
    • 새로운 접근: 따라서 이제는 문서 전체를 보는 것이 아니라, 특정 단어 주변의 몇 개 단어(윈도우, window)로 이루어진 **'국소 맥락'**에 집중하여 단어의 의미를 파악하기로 합니다.

2. 참조: 신경망의 학습 원리 (How?)

위의 새로운 아이디어를 구현할 도구로 '신경망'을 선택했습니다. 신경망이 어떻게 학습하는지 기본 원리를 알아봅시다.

신경망이란?

  • 뉴런(Neuron): 신경망을 구성하는 가장 작은 단위로, 입력값(x)을 받아 가중치(w)를 곱하고 편향(b)을 더해 출력값(y)을 내보내는 간단한 계산기입니다.
  • 깊은 신경망(DNN): 이 뉴런들이 여러 층(Layer)으로 수없이 모여 복잡한 구조를 이룬 것입니다. 이를 이용한 기술을 딥러닝이라고 합니다.

신경망의 학습 과정

신경망은 마치 학생과 같습니다. 문제를 풀고, 정답과 비교하며 실력을 키워나갑니다.

  1. 학습 목표(Task) 설정: 신경망에게 풀 문제를 줍니다.
    • 예시: 수많은 강아지 사진(Input X)을 보여주고, "이건 '개'야" 라고 정답(Output Y)을 알려주는 문제를 냅니다.
  2. 예측 및 오차 계산: 신경망은 현재 아는 지식(초기 가중치 w)으로 사진을 보고 예측을 합니다. 당연히 처음에는 틀리겠죠. 그러면 정답과 예측이 얼마나 다른지 '오차(Error)'를 계산합니다. 이 오차를 측정하는 함수를 **손실 함수(Loss Function)**라고 합니다.
  3. 가중치(w) 업데이트 (핵심!)
    • 신경망 학습의 핵심은 **"오차(손실 함수 값)를 최소화하는 방향으로 내부의 가중치(w)를 계속 수정하는 것"**입니다.
    • 이때 **역전파(Backpropagation)**라는 아주 효율적인 방법을 사용합니다. 역전파는 계산된 오차를 바탕으로 "이 오차에 어떤 가중치가 얼마나 영향을 미쳤는지"를 거꾸로 추적하여, 각 가중치를 어느 방향으로 얼마나 수정해야 할지 알려주는 역할을 합니다.

시험 대비 최종 요약

  • 신경망 기반 임베딩의 동기: LSA가 놓친 단어 순서와 국소 문맥을 반영하기 위함.
  • 핵심 가설: 분포 가설 ("비슷한 의미의 단어는 비슷한 주변 문맥에서 등장한다.")
  • 접근 방식: 문서 전체가 아닌, 윈도우(window) 기반의 지역적 문맥에 집중.
  • 학습 원리:
    1. **학습 목표(Task)**를 설정한다.
    2. 예측값과 정답의 차이인 **손실(Loss)**을 계산한다.
    3. **역전파(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의 두 가지 위대한 유산:
    1. 단어 임베딩의 탄생: NNLM은 "다음 단어 예측"이라는 원래의 목표를 수행하는 과정에서, 부산물(by-product)로 아주 중요한 것을 만들어냈습니다. 바로 각 단어의 의미가 압축된 밀집(dense) 벡터, 즉 **단어 임베딩(Word Embedding)**입니다. 신경망의 내부 가중치가 단어의 의미 벡터가 된 것입니다.
    2. 가능성 입증: 신경망을 통해 언어를 학습하고, 단어의 의미를 벡터로 표현할 수 있다는 가능성을 최초로 보여주어 이후 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)은 우리 단어 사전에 있는 모든 단어 각각에 대한 임베딩 벡터를 의미합니다.
  • 작동 방식:
    1. 입력 계층에서 단어의 고유 번호(index)를 받습니다.
    2. 그 번호에 해당하는 행(row)을 Matrix C에서 그대로 꺼내옵니다(Look-up).
    3. 꺼내온 행이 바로 그 단어의 밀집(dense) 벡터, 즉 임베딩 벡터입니다.
  • 핵심 포인트: 처음에는 이 Matrix C가 무작위 숫자로 채워져 있지만, 모델이 학습을 진행하면서 "다음 단어를 더 잘 예측하는 방향으로" 이 행렬의 값들이 계속 업데이트됩니다. 학습이 끝나면, 이 Matrix C 자체가 우리가 원하던 '단어 임베딩 모델'이 됩니다!

3단계: 은닉 계층 (Hidden Layer)

  • 역할: 문맥을 이루는 각 단어의 임베딩 벡터들을 하나로 합쳐서, 단어들 사이의 의미적, 문법적 관계를 학습하는 부분입니다.
  • 작동 방식:
    1. 투사 계층에서 나온 여러 개의 단어 임베딩 벡터들을 하나의 긴 벡터로 연결(concatenate)합니다.
    2. 이 긴 벡터를 입력받아 비선형 변환(tanh 함수)을 거쳐 다음 계층으로 전달합니다. 이 과정을 통해 단어들의 조합이 갖는 복합적인 패턴을 파악합니다.

은닉 계층(Hidden Layer)은 개별 단어들의 의미를 조합하여 문맥 전체의 복합적인 의미를 파악하기 위해 반드시 필요합니다. 단순히 단어 벡터들을 합치기만 해서는 알 수 없는 더 깊은 관계를 학습하는 '중간 관리자' 역할을 합니다.


은닉 계층의 역할: 단순한 조합을 넘어 상호작용 학습하기

간단한 비유를 들어보겠습니다. [New, York, is] 라는 단어들이 주어졌을 때 다음 단어를 예측한다고 생각해 보세요.

  • 은닉 계층이 없다면? 모델은 그저 'New'의 의미 벡터, 'York'의 의미 벡터, 'is'의 의미 벡터를 단순히 합치거나 평균 낼 뿐입니다. 이 경우, 모델은 New + York이 New_York이라는 특별한 도시를 의미한다는 상호작용을 제대로 학습하기 어렵습니다. 그냥 '새롭다'와 '요크'라는 의미가 섞인 애매한 벡터가 될 뿐이죠.
  • 은닉 계층이 있다면?
    1. 의미의 조합: "New"라는 단어와 "York"라는 단어가 특정 순서로 함께 나오면, 이것은 '새롭다'는 의미가 아니라 '미국의 도시'라는 완전히 새로운 의미의 개념으로 해석해야 한다는 패턴을 학습합니다.
    2. 문법적 구조 파악: "is"라는 be동사 뒤에는 명사나 형용사가 올 확률이 높다는 등의 문법적 구조를 파악합니다.
    3. 비선형 관계 학습: 언어는 단순한 덧셈(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. 이 행렬 자체가 학습의 결과물이자 단어 임베딩이다.
  • 전체 흐름:
    1. 입력: 단어의 고유 번호(Index)
    2. 투사: Matrix C에서 해당 번호의 행(임베딩 벡터)을 꺼냄.
    3. 은닉: 여러 단어 벡터를 조합해 문맥 패턴 학습.
    4. 출력: 모든 단어에 대한 다음 단어 등장 확률 계산 (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)
Sheets로 내보내기

이러한 NNLM의 한계, 특히 **'느린 속도'**와 **'비효율적인 학습 방식'**을 개선하기 위해 등장한 모델이 바로 Word2Vec입니다. 이 흐름을 이해하는 것이 매우 중요합니다!

+ Recent posts