자연어 처리란?
자연어 처리(NLP)는 인간의 언어를 해석, 조작 및 이해하는 능력을 컴퓨터에 부여하는 기계 학습 기술입니다. 텍스트 데이터는 인류가 생겨난 이후로 가장 많이 쌓여있는 데이터라고 볼 수 있습니다. 자연어 처리에는 많은 분야(추천시스템, 기계 번역 등)가 있는데, 제가 소개해드릴 분야는 토픽모델링과 관련된 사회과학 분야의 예시입니다.
https://github.com/d0gyunkim/first_project 해당 링크는 제가 직접 시도한 토픽 모델링 프로젝트입니다. 국민 청원 데이터를 사용하였고, 자연어 처리 , 그중에서도 토픽 모델링을 사용한 청원 잠재 주제를 선정하였습니다. 이후에 해당 주제들을 네이버에 검색한뒤, 이에 대한 기사수, 댓글수, 감정 표현수를 수집하여 이를 온라인에서의 영향력으로 판단하고, 청원내에서의 영향력과 비교하여 청원 주제들을 분류해보았습니다.
(해당 예시: 청원 데이터들에 대해 전처리를 한 이후로 토픽 모델링을 하여 나온 단어들)
(최종 결과) -> 온라인 영향력과 청원 내 영향력 두가지 지표로 군집화)
(위의 결과에 대한 해석)
텍스트 데이터는 사람들의 감정, 관계등을 담고 있다. 이전까지는 기계학습을 통해 텍스트 데이터 속에 있는 행간의 의미를 파악하기가 어려웠다. 그러나 트랜스포머와 같은 최신의 자연어 처리 기술은 방대한 텍스트 데이터에서 단어간의 의미를 파악하고 나아가 사람들의 잠재적인 욕망까지도 표현한다.
기존의 자연어 처리 기법
텍스트를 기계학습 데이터로 사용하기 위해서는 텍스트를 숫자로 처리해야 하는데, 이를 위한 방법론으로 ‘Bag-of-Words’가 있다.
1. Bag-of-Words (BoW)
Bag-of-Words (BoW)는 텍스트를 벡터화하는 가장 기본적인 방법 중 하나이다. 이 방식은 문서나 문장의 단어 빈도를 기반으로 각 문서를 수치화하여 분석할 수 있도록 한다. 하지만 단어의 순서나 문맥은 무시하고 단순히 단어의 출현 빈도만 반영하는 방법이다.
Bag-of-Words의 벡터화 과정
- 고유 단어 리스트 생성: 모든 문서에서 등장하는 고유한 단어 목록을 만든다. 예를 들어, 여러 문장에서 고유 단어들이 ["나는", "커피", "좋아해", "차"]라면, 이 단어들이 전체 BoW 모델에서 특정 위치를 차지하게 된다.
- 빈도수 계산: 각 문서에서 해당 단어들이 몇 번 등장했는지 빈도수를 세어 벡터화한다. 예를 들어, "나는 커피를 좋아해"라는 문장은 [1, 1, 1, 0]로, "나는 차를 좋아해"는 [1, 0, 1, 1]로 벡터화됩니다.
이렇게 만들어진 벡터를 사용해 머신러닝 모델에 입력으로 넣어 사용할 수 있다.
2. Naive Bayes 분류기
Naive Bayes 분류기는 확률을 이용해 주어진 데이터가 특정 범주에 속할 확률을 계산하는 분류 모델이다. Naive Bayes는 단어가 독립적이라는 가정을 기반으로 하고, 특히 텍스트 분류에 널리 사용된다. 이 모델은 단어 간 상호작용을 고려하지 않으므로, 단순하면서도 빠르게 계산할 수 있다.
3. Bag-of-Words를 이용한 Naive Bayes 분류기 구축 예시
예를 들어, 우리가 긍정과 부정 리뷰를 분류하는 모델(sentiment analysis)을 만들고자 할 때의 과정은 다음과 같다.
- Bag-of-Words 벡터화: 리뷰 텍스트를 BoW 모델을 이용해 벡터로 변환한다. 예를 들어, "이 영화 정말 재미있었어요"와 "영화가 너무 지루했어요" 같은 문장을 각각 벡터화한다.
- Naive Bayes 분류기 학습: BoW 벡터와 해당 리뷰의 레이블(긍정 또는 부정)을 이용하여 Naive Bayes 분류기를 학습시킨다.
- 확률 계산: 모델은 새 리뷰가 주어졌을 때 해당 리뷰가 긍정인지 부정인지의 확률을 계산한다. 예를 들어, "정말 지루하고 실망스러웠다"라는 리뷰가 들어오면, 이 문서가 부정 클래스에 속할 확률이 높게 나오게 된다.
- 결과 예측: 가장 높은 확률을 가진 클래스를 예측 결과로 선택한다.
Word Embedding
Word Embedding은 단어를 고정된 차원의 실수 벡터로 변환하여, 컴퓨터가 단어 간의 의미적 관계를 이해하고 연산할 수 있게 만든 기술이다. Word Embedding은 단어를 의미적으로 가까운 단어들끼리 벡터 공간에서 유사한 위치에 배치하여, 자연어 처리(NLP)에서 텍스트 데이터를 효과적으로 처리할 수 있도록 한다.
Word Embedding의 필요성
기존의 Bag-of-Words (BoW) 방법은 단어의 빈도수만을 반영할 뿐, 단어 간의 의미적 유사성이나 문맥 정보를 표현하지 못한다. 예를 들어, '강아지'와 '개'는 의미가 비슷하지만, BoW에서는 전혀 다른 단어로 취급되어 벡터 상의 거리가 멀어지게 될 수 있다.
Word Embedding은 이러한 단점을 극복하기 위해 고안된 방법으로, 의미적 유사성을 벡터 공간에 반영하여 단어를 효과적으로 표현한다. 이 방식은 특히 단어 간의 의미적 관계를 파악하는 작업에서 탁월한 성능을 보여준다.
Word2Vec과 Glove
‘Word Embedding’의 대표적인 방법론인 Word2Vec과 Glove이 있다. 이 두 기법은 단어의 의미적 관계와 유사성을 벡터 공간에 반영하여 더 고도화된 문맥 정보를 활용할 수 있다.
1. Word2Vec
Word2Vec은 단어 간의 문맥적 유사성을 반영하여 벡터를 학습하는 방법이다. 구글에서 개발한 이 모델은 신경망 기반으로 단어 벡터를 학습하며, 특히 대규모 텍스트 데이터에서도 효율적으로 학습할 수 있도록 설계되었다.
Word2Vec의 핵심 개념
Word2Vec에는 두 가지 주요 학습 방식이 있다
• CBOW (Continuous Bag of Words): 주변 단어들을 통해 중심 단어를 예측하는 방식이다. 예를 들어, "나는 커피를 마신다"라는 문장에서 "커피를"이 중심 단어라면, "나는"과 "마신다"를 사용해 "커피를"을 예측하는 방식이다.
• Skip-gram: 중심 단어로부터 주변 단어들을 예측하는 방식이다. 예를 들어 "커피를"이라는 중심 단어를 사용해 "나는"과 "마신다"와 같은 주변 단어들을 예측하는 방식이다.
Word2Vec의 특징
- 의미적 유사성 반영: 비슷한 문맥에서 자주 등장하는 단어들은 벡터 공간에서 가까운 거리에 위치한다. 예를 들어, "king"과 "queen", "coffee"와 "tea" 같은 단어들이 비슷한 벡터를 가지게 된다.
- 단어 간 연산 가능: Word2Vec 벡터는 단어 간의 의미적 관계를 유지하여 벡터 연산이 가능하다. 예를 들어, **"king - man + woman ≈ queen"**과 같은 계산이 성립한다.
장점과 한계
장점: 단어의 의미적 관계와 유사성을 잘 포착하며, 연산을 통해 단어 간 관계를 추론할 수 있다. 또한, 큰 데이터셋에서도 빠르게 학습할 수 있도록 최적화되어 있다.
한계: 단어 빈도와 문맥을 기반으로 학습하지만, 문장 전체의 의미나 구문적 관계를 충분히 반영하지는 못합니다. 단어 자체만을 학습 대상으로 삼기 때문에 문장 수준의 문맥 이해에는 한계가 있어요.
2. GloVe (Global Vectors for Word Representation)
GloVe는 스탠포드에서 개발한 방법으로, Word2Vec과는 다르게 전체 코퍼스의 통계 정보를 사용하여 단어 벡터를 학습한다. Word2Vec이 문맥 내에서의 단어 예측을 통해 학습한다면, GloVe는 단어 간 공기 빈도를 활용하여 단어 간의 유사성을 학습한다.
GloVe의 핵심 개념
- 공기 행렬 (Co-occurrence Matrix): GloVe는 전체 코퍼스에서 단어가 함께 등장하는 빈도를 기반으로 단어 벡터를 학습한다. 특정 단어가 특정 문맥에서 얼마나 자주 등장하는지 비율을 계산하여 벡터 공간에 단어를 배치하는 방식이다.
- 비율로 의미적 관계 학습: GloVe는 두 단어가 서로 얼마나 자주 등장하는지를 비율로 계산하여 벡터를 학습한다. 예를 들어, "ice"와 "solid"는 자주 같이 등장하고, "ice"와 "steam"은 상대적으로 낮은 빈도로 등장한다면, 이러한 비율을 바탕으로 단어 간 의미적 거리를 학습한다.
GloVe의 특징
- 전체 코퍼스 기반 학습: GloVe는 모든 단어 쌍의 공기 빈도를 고려하여 학습하므로, 단어들 간의 전반적인 의미 관계를 더 정확하게반영할 수 있다.
- 문맥을 고려한 단어 의미 반영: 단어의 유사성뿐만 아니라, 단어가 전반적인 맥락에서 어떤 의미를 가지는지 잘 반영된다.
장점과 한계
장점: 전체 코퍼스의 통계적 특성을 반영하기 때문에, 단어 간 의미적 유사성을 높은 수준에서 반영할 수 있다. 특히, 대규모 데이터셋에서 좋은 성능을 보이며, Word2Vec에 비해 상대적으로 더 안정적인 학습 결과를 보인다.
한계: 공기 행렬을 기반으로 학습하기 때문에 학습 속도가 다소 느릴 수 있으며, 문장 내에서 동적으로 변하는 의미까지 포착하기에는 한계가 있다.
자연어 처리의 모든 것 : 2주차 [자연어 처리와 딥러닝]
RNN(Recurrent Neural Network)이란?
- RNN: 순차적인 데이터를 처리하기 위해 설계된 딥러닝 모델
- 시간 또는 순서에 따라 연속적으로 발생하는 데이터에서 탁월
- 주요한 특성은 이전 타임스텝의 정보를 다음 타임스텝으로 전달하여 현재 스텝의 예측에 반영한다는 점
- 이러한 특성에 기반해 텍스트, 음성, 시계열 데이터 등 순차적인 패턴이 중요한 데이터에 강력한 성능을 발휘할 수 있음
RNN의 주요 특징
- 재귀적 구조: RNN은 매 타임스텝마다 동일한 가중치와 파라미터를 사용하는 구조로, 이전 타임스텝의 출력을 다음 타임스텝의 입력으로 재귀적으로 연결함→ Recurrent Neural Network라는 이름이 붙여짐
- 메모리 기능: RNN은 과거 정보를 저장해두고 필요할 때마다 이를 활용하여 과거와 현재 정보를 동시에 고려한 예측을 수행함. 이 기능 덕분에 시간에 따라 변화하는 패턴이나 긴 시퀀스를 이해하는 데 적합
RNN의 작동 원리
- 입력과 이전 은닉 상태를 결합하여 새로운 은닉 상태 계산
- 새로운 은닉 상태를 이용해 현재 타임스텝의 출력 계산
- 이 은닉 상태는 다시 다음 타임스텝으로 전달되면서, 순차적인 데이터를 처리할 수 있게 됨
이 과정에서 모든 타임스텝에 동일한 파라미터를 사용하기 때문에, 데이터가 길어지더라도 일정한 모델 크기로 데이터를 학습할 수 있음
RNN 계산 방법
- t : 현재 타임스텝(time step) , w : 웨이트(weight)
- h_t-1 : old hidden-state vector
- x_t : input vector at some time step
- h_t : new hidden-state vector
- f_w : RNN function with parameters W
- y_t : output vector at time step t
1. 이전 은닉 상태와 현재 입력을 기반으로 새로운 은닉 상태 h_t를 계산:
- 은닉 상태는 이전 정보 h_t-1와 현재 입력 x_t 의 결합을 통해 갱신됨
- 수식:
- 는 파라미터 W를 가지는 RNN 함수로, 활성화 함수인 tanh를 사용하여 은닉 상태를 비선형적으로 변환
- 실제로 이 과정을 통해 정보가 전달되고, 과거의 정보가 현재 상태에 반영
2. 은닉 상태 계산:
- 각 타임스텝에서 새로운 은닉 상태 hth_t 는 다음과 같은 과정을 거쳐 계산됨
- 수식:
- : 이전 은닉 상태 h_t-1에 대한 가중치
- W_x : 입력 x_ 에 대한 가중치
- tanh: 비선형 활성화 함수로, h_t가 과거 정보와 현재 입력 정보를 모두 반영하여 계산
3. 출력 계산:
- 새롭게 구해진 은닉 상태 h_t 와 입력 x_t 를 활용하여 현재 타임스텝의 출력 y_ 를 계산
- 수식:
- 여기서 W_y는 은닉 상태에서 출력으로 가는 가중치로, 은닉 상태 h_t의 정보를 출력값 y_t으로 변환
# 정리: RNN의 각 타임스텝에서의 과정
- Step 1: 이전 은닉 상태 h_ 와 입력 x_ 을 결합하여 h_ 를 계산
- Step 2: 계산된 h_ 계산 로 출력 y_
다양한 타입의 RNN 모델
실제 활용 예시를 통해 다양한 타입의 RNN 모델을 구분해보자.
1 | one to one | [키, 몸무게, 나이]와 같은 정보를 입력값으로 할 때, 이를 통해 저혈압/고혈압인지 분류하는 형태의 태스크 |
2 | one to many | '이미지 캡셔닝'과 같이 하나의 이미지를 입력값으로 주면 설명글을 생성하는 태스크 |
3 | many to one | 감성 분석과 같이 문장을 넣으면 긍/부정 중 하나의 레이블로 분류하는 태스크 |
4 | many to many | 기계 번역과 같이 입력값을 끝까지 다 읽은 후, 번역된 문장을 출력해주는 태스크 |
5 | many to many | 비디오 분류와 같이 영상의 프레임 레벨에서 예측하는 태스크 혹은 각 단어의 품사에 대해 태깅하는 POS와 같은 태스크 |
3-1
1.Seq2Seq Model의 기초 이해
Seq2Seq Model과 그 기본 구조인 인코더- 디코더에 대해 다뤘다.
이 모델은 입력과 출력 모두가 시퀀스 형태
입력 시퀀스를 모두 읽은 후 출력 시퀀스를 생성하거나 예측한다.
자연어처리에서 입력은 워드 단위의 문장이고 출력도 이에 대응하는 워드 단위의 문장이 된다.
ex) 챗봇 시스템에서 'Are you free tomorrow'라는 질문에 'Yes, what's up?'이라는 문장을 예측하여 생성하는 과정
2. 인코더와 디코더의 구조와 역할
인코더는 입력 문장을 읽어들이는 RNN모델
이를 통해 입력데이터를 처리한다.
디코더는 출력 문장을 순차적으로 생성하는 RNN모델
각 단어를 하나하나 예측하여 출력한다.
인코더와 디코드는 서로 공유하지 않는 파라미터로 구성되어 있으며 여기서는 LSTM을 사용한 RNN 모델이 채택되고 있다.
특히 인코더의 마지막 타임 스텝에서 생성된 히든 스테이트 벡터는 디코더의 첫 번째 타임 스텝의 입력으로 사용되어, 이전의 입력 정보를 담고 있다.
마지막으로, 이 정보는 인코더에서 축적된 정보를 바탕으로 디코더가 해당하는 단어를 예측하여 출력하는데 기여한다.
3.디코더의 문장 생성 과정
디코더에서 문장을 생성할 때는 SOS(start of sentence)를 첫 번째 단어로 사용하는게 일반적이다.
이 SOS는 디코더의 첫 번째 타임 스텝에 삽입되어 그 이후의 단어 예측을 시작하는 역할을 한다.
문장의 생성은 EOS(end of sentence token)이 생성될 때까지 계속되며 이 토큰이 생성되면 단어 생성을 종료한다.
4.어텐션 메커니즘의 작동과 필요성
어텐션 모듈은 seq2seq 구조에서 정보를 더욱 효과적으로 활용하기 위해 추가된 모듈이다.
RNN 기반 모델은 입력 시퀀스를 순차적으로 처리하지만 긴 문장에서 정보가 소실되는 문제를 겪는다.
히든 스테이트 벡터는 고정된 차원으로 구성되어 있어 입력 문장의 전체 정보를 압축하여 저장해야 하는 제약이 있다.
정보가 오래된 단어로부터 점차 변질되거나 소실될 수 있어 특히 앞부분의 중요한 정보 보전이 어려워진다.
따라서 어텐션 메커니즘은 문장 초반의 주요 정보를 더 잘 보존할 수 있도록 도와준다
5.기계 번역에서의 정보 유실 문제
기계 번역에서 "I go home"을 "나는 집에 간다"로 번역할 경우, 주어의 정보 유실로 인해 첫 번째 단어부터 정확히 생성하지 못하는 현상이 발생한다. 이로 인해 전체 번역 품질이 낮아진다.
이 문제를 해결하기 위해 연구자들은 입력 문장의 순서를 뒤집어 번역하는 방식을 사용하기도 한다. 예를 들어 "home go I"와 같이 문장을 변형하여 초반 정보가 디코더에 잘 전달되도록 하는 기술이 제안되었다.
3-2
1.인코더와 디코더 간의 히든 스테이트 벡터의 역할
인코더의 마지막 타임스텝만의 히든 스테이트 벡터에 의존하는 것이 아니라, 입력 문장 내의 각 단어에 대한 히든 스테이트 벡터들을 순차적으로 사용한다 .
인코더의 히든 스테이트 벡터 H1,H2,H3,H4는 각 단어에 관련된 정보를 담고 있으며, 디코더에 제공된다 .
디코더는 각 타임 스텝에서 단어를 생성할 때, 그에 필요한 인코더의 히든 스테이트 벡터를 선별적으로 활용해 예측을 돕는다 .
이러한 과정은 특정 단어에 대응하는 인코딩 히든 스테이트 벡터가 주된 정보를 포함하도록 한다 .
2. 어텐션 모듈의 기본 아이디어
어텐션 모듈은 입력 정보의 중요한 부분에 집중하여 디코더의 예측 성능을 향상시키는 방식으로 작동한다 .
예를 들어, 프랑스어 문장을 영어로 번역하는 과정에서 RNN 인코더가 생성한 히든 스테이트 벡터는 여러 디멘전으로 구성되어 있으며, 이는 디코더가 사용할 중요한 정보로 활용된다.
어텐션 메커니즘 없이 전통적인 시퀀스 투 시퀀스 모델에서 디코더는 마지막 타임 스텝의 인코더 히든 스테이트 벡터만을 사용하게 되어, 정보 손실이 발생할 수 있다 .
따라서 어텐션 모듈은 인코더에서 생성된 여러 히든 스테이트 벡터 중에서 최적의 정보를 선택할 수 있는 방법으로 가중 평균을 이용한다.
3. 어텐션 모듈의 역할과 디코더의 정보 처리
디코더는 스타트 토큰과 입력으로 주어진 H0를 바탕으로 첫 번째 히든 스테이트 벡터를 생성하며, 이 벡터는 다음 단어 예측과 필요한 인코더 히든 스테이트 벡터 선택에 활용된다.
디코더 히든 스테이트 벡터는 인코더 히든 스테이트 벡터와의 내적을 통해 유사도를 계산하고, 소프트맥스를 통해 확률 값을 도출한다.
이 과정에서 얻어진 가중치는 인코더 히든 스테이트 벡터에 적용되어 가중 평균을 통해 새로운 인코딩 벡터로 변환된다.
또한, 어텐션 모듈의 출력은 하나의 콘텍스트 벡터로 정의되며, 이를 통해 선택적으로 정보가 결합되어 다음 단어 예측에 사용된다.
반복적으로 이러한 과정을 진행하며 각 타임 스텝에서 서로 다른 가중치를 적용하여 성능을 개선하고, 최종적으로 완성된 출력 문장을 생성한다.
4. 디코더 RNN의 역할과 학습 과정
디코더 RNN은 아웃풋 단어를 예측하는 동시에 필요한 정보를 선택하는 두 가지 역할을 수행하도록 학습된다.
이 과정에서 백프로파게이션이 진행되며, 인코더에서 제공된 정보를 기반으로 적절한 어텐션 가중치를 통해 원하는 정보를 선택한다.
각 타임스텝에서 다음에 등장할 단어 예측에 대한 과정을 반복하여, 이전 예측이 잘못되더라도 올바른 그라운드 트루스를 입력으로 사용함으로써 다시 학습하는 시스템을 유지한다.
학습이 완료된 후, 인퍼런스를 통해 첫 번째 단어가 예측될 경우, 해당 단어를 다음 타임스텝의 입력으로 사용하여 예측 과정을 수행한다.
5. 티처 포싱과 모델 학습 방식의 비교
티처 포싱은 학습 과정에서 매 타임 스텝마다 정확한 정보인 groud truth를 입력하여 모델의 예측 성능을 향상시키는 방식이다. 그러나 티처 포싱이 아닌 방식은 모델이 실제 사용되는 환경에 더 가깝다는 점에서 유리하다, 즉 실제 테스트 타임에서의 괴리를 줄일 수 있다. 따라서 모델 학습을 위해 티처 포싱과 비티처 포싱 방식을 적절히 조합한 방법이 존재하며 이 방식은 초기에는 티처 포싱을 사용하여 모델의 예측 정확도를 높이다가, 후반부에는 실제 예측 값을 입력하여 테스트 타임의 상황에 더 부합하도록 조정하는 것이다.
6. 어텐션 메커니즘의 변형과 확장 방안
디코더의 히든 스테이트 벡터와 인코더의 히든 스테이트 벡터 간의 유사도는 내적을 통해 계산된다.
이 유사도를 구하는 과정을 더욱 다양하게 확장하거나 변형하는 방안이 필요하다.
3-3
1.다양한 어텐션 메카니즘
- Luong - dot : 간단한 내적을 통한 유사도(어텐션) 측정하는 기법으로, 학습가능한 파라미터가 존재하지는 않는다.
- Luong - general : 유사도를 구하고자하는 두 벡터 사이에, 학습가능한 파라미터로 구성된 행렬을 사용한다.
- Luong - concat : 유사도를 구하고자하는 두 벡터를 concat하여 선형변환(비선형성(선형변환(x)))으로 감싸서 계산을 진행한다.
** x : 두벡터를 concat한 벡터
2.어텐션의 장점
- 처음 시도했던 분야인 기계번역(NMT)에서 성능 향상을 이뤘습니다. 성능향상 이유에 대해선, 각 디코더 스텝마다 인코더의 어떤 스텝에 더 집중(어텐션)해야할 지 알려줬기 때문이라고 할 수 있다.
- 기존 Seq2Seq구조에서는 인코더에서 디코더로 정보를 넘길 때에는 인코더의 마지막 타임스텝의 hidden state vector를 통해서 넘겼었는데, 여기서 병목현상(bottleneck problem)이 발생합니다. 어텐션은 한번에 정보를 전달하는 것이 아니기 때문에 이 문제를 해결해준다.
- RNN의 한계로 지적됐던 오차역전파 과정에서의 그레디언트 베니싱(gradient vanishing)문제를 해결해준다. 역전파 과정에서 서로 멀리 있어도 여러 스텝을 거쳐 역전파 되지 않고, 어텐션 구조를 통해 한번에 역전파될 수 있기 때문이다.
** 여기서 역전파는 가중치를 업데이트하는 것을 말합니다.
3-4
1.그리디 디코딩의 한계와 해결 방안
그리디 디코딩방식은 매 타임 스텝마다 가장 높은 확률을 가지는 단어 하나만 선택하여 예측하는 방법으로, 전체 문장의 확률을 고려하지 않는다. 따라서 근시안적으로 현재 단어만을 선택하는 형태가 된다.
이 방식은 예를 들어 입력 문장 번역에서 잘못된 단어를 이미 생성하면 그 결과를 바탕으로 뒤쪽 단어를 생성하기 때문에 최적의 예측값을 내지 못하게 된다.
조인트 프로빌리티계산을 통해 입력 문장에 대한 출력 문장의 전체 확률을 최대화하는 방법이 논의되며, 이는 각 단어의 확률값을 곱하여 도출된다. 그러나 이때 첫 번째 단어에서의 최대 확률이 추후 단어 생성 시 그다지 유리하지 않을 수 있음을 알 수 있다.
따라서, 매 타임 스텝마다 가능한 단어 수의 조합을 고려할 경우 기하급수적으로 증가하는 경우의 수는 현실적으로 계산하기 어렵다.
2.빔 서치 알고리즘
빔 서치는 그리드 디코딩과 가능한 모든 조합을 고려하는 방법의 중간에 위치한 접근 방식으로, 매 타임스텝마다 정해진 K개의 후보를 고려한다. 일반적으로 빔 사이즈 K는 5에서 10개로 설정되며, 이는 확률 추적의 효율성을 높이기 위해 중요한 요소가 된다. 빔 서치의 목표는 후보의 조인트 프로빌리티를 최대화하는 것으로, 이는 각 단어의 생성 확률을 로그 함수로 변환하여 계산된다.
매 타임스텝에서 스코어가 가장 높은 K개의 후보를 유지하고 추적하는 것이 빔 서치의 핵심 아이디어이며, 이는 기하급수적으로 증가하는 경우의 수를 비효율적으로 계산하는 대신 더 효율적인 접근을 가능하게 한다.
빔 서치는 예를 들어 빔 사이즈를 2로 설정할 때, 입력 문장에서 첫 번째 단어를 예측하며 여러 후보를 고려하는 방식으로 동작한다. 각 타임 스텝에서 가장 높은 확률을 가진 두 개의 후보 단어를 선택하고, 여기서 예를 들어 "he"와 "I"가 선택된다.선택된 후보 단어의 확률값을 로그를 이용해 처리하여, 가장 높은 값을 가진 단어를 추적하는 방식으로 예측을 진행한다.
이러한 과정을 반복하면서 각 후보의 조인트 프로빌리티를 계산하며, 예를 들어 두 번째 시나리오의 경우까지 포함한 다양한 가능성을 고려한다. 빔 서치는 최대 타임스텝T에 도달하거나 저장된 엔드 토큰의 수가 미리 정해진 N개가 되면 종료된다.
빔 서치가 완료되면, 최종적으로 생성된 여러 하이퍼티시스 리스트가 생성되고, 이 중에서 가장 높은 스코어를 가진 단 하나의 값을 선택해야 한다.
그러나 하이퍼티시스의 워드 개수나 시퀀스 길이가 다르면, 짧은 길이의 하이퍼티시스가 더 높은 조인트 프로빌리티를 가질 가능성이 있어, 긴 시퀀스는 상대적으로 낮은 값이 나온다.
따라서 각 단어 생성 시, 로그 프로빌리티 값에 마이너스 값을 더하게 되어, 더 많은 단어가 생성될수록 조인트 프로빌리티는 더 작은 값으로 나타나며, 이는 의도치 않은 부작용을 초래할 수 있다.
이를 해결하기 위해, 서로 다른 길이의 하이퍼티시스 간의 비교를 위해 각 하이퍼티시스의 단어 개수로 나누고 이의 평균 확률을 기반으로 하여 최종적으로 가장 높은 확률값을 가진 하이퍼티시스를 선정한다.
3-5
1,Precision and Recall (정밀도와 재현율)
정밀도와 재현율은 이진 분류 기법을 사용하는 패턴 인식과 정보 검색 분야에서, 정밀도는 검색된 결과들 중 관련 있는 것으로 분류된 결과물의 비율이고, 재현율은 관련 있는 것으로 분류된 항목들 중 실제 검색된 항목들의 비율이다. 계산을 위해서는 가정을 세워야 한다. 아래 예시는 생성해야하는 정답값(Ground Truth)이 있다는 전제하에 계산을 진행했다.
- Precision(정밀도) = 맞은 단어의 수 / 예측한 문장의 길이
- Recall(재현율) = 맞은 단어의 수 / 정답 문장의 길이
- F-measure = Precision과 Recall의 조화평균
3가지 평균방식
- 산술평균 : n개의 값을 더한 후, n으로 나눠준 값
- 기하평균 : n개의 값을 모두 곱한 값의 n제곱근
- 조화평균 : 주어진 값들을 역수를 취하여 산출평균을 구한 후 역수를 취한 값
- 모든 경우에서 산술평균 >= 기하평균 >= 조화평균 의 값을 가진다.
3-6
1.BLEU score 특징
- recall이 아닌 precision을 기반으로 한다. 그 이유는 번역 태스크에서 정답문장의 몇 단어가 빠져도(재현율이 떨어져도) 문장의 의미가 유사할 수 있지만, 문장에 없는 단어가 오역되어 들어오면(정밀도가 떨어지면) 영향이 클 수 있기 때문이다.
- 문장을 평가할때, n-gram (n은 보통 1~4사이 값)의 n값에 따라 문장을 나눠서 정답값(ground truth)과 얼마나 겹치는 지 다각도로 평가하게 된다.
- n-gram 평가방식을 사용할 때, 단어들의 일치도가 높을지라도 정답문장과 연속적으로 단어가 일치하지 않는다면 BLEU score값이 0이 나올 수도 있다.
2.BLEU score 구하는 방법
- n=1~4에 대한 각각의 precision의 기하평균을 구해준다.
- 문장의 길이가 짧은 경우를 보정하기 위해, brevity penalty를 적용하여 위에서 구한 기하평균에 곱해준다.
** brevity penalty : reference 문장보다 짧은 예측문장을 내놓을 시, 1이하의 값을 곱해서 precision의 값을 낮게 보정해줍니다.
1. Long-Term Dependency
자연어 처리에서 Long-Term Dependency 문제는 긴 시퀀스에서 멀리 떨어진 정보 간의 관계를 포착하는 것의 어려움을 뜻한다. 전통적인 RNN은 이 문제를 해결하는 데 한계가 있었지만, Bi-Directional RNN과 Transformer는 각각 다른 방식으로 이 문제에 접근했다.
Bi-Directional RNN의 접근
Bi-Directional RNN은 시퀀스를 양방향으로 처리하여 Long-Term Dependency 문제를 해결한다:
- 정방향 RNN: 시퀀스를 왼쪽에서 오른쪽으로 처리
- 역방향 RNN: 시퀀스를 오른쪽에서 왼쪽으로 처리
이 두 RNN의 출력을 결합함으로써 각 시점에서 과거와 미래의 정보를 모두 고려할 수 있게 된다. 이를 통해 긴 시퀀스에서도 멀리 떨어진 정보를 더 잘 포착할 수 있다.
Transformer의 접근
Transformer는 Self-Attention 메커니즘을 사용하여 Long-Term Dependency 문제를 해결한다:
- Self-Attention: 시퀀스의 모든 위치를 동시에 고려하여 각 위치의 표현을 계산
- 위치에 관계없이 모든 토큰 간의 관계를 직접적으로 모델링
이를 통해 Transformer는 시퀀스의 길이에 관계없이 모든 위치 간의 의존성을 효과적으로 포착할 수 있다.
Query, Key, Value를 사용한 Attention Score 계산
- 입력 벡터를 Query(Q), Key(K), Value(V) 벡터로 변환한다. 이는 각각 학습 가능한 가중치 행렬 WQ, WK, WV를 사용하여 선형 변환을 수행한다.
- Query와 Key의 내적(dot product)을 계산한다. 이는 두 벡터 간의 유사도를 측정한다.
- 내적 결과를 Key 벡터의 차원의 제곱근으로 나눈다(Scaling). 이는 내적 값이 너무 커지는 것을 방지하여 소프트맥스 함수의 기울기가 너무 작아지는 것을 막는다.
- softmax 함수를 적용하여 어텐션 가중치를 얻는다.
- 이 가중치를 Value 벡터와 곱하여 최종 어텐션 출력을 얻는다.
수식으로 표현하면 다음과 같다:Attention(Q, K, V) = softmax(QK^T / √d_k)V
여기서 d_k는 Key 벡터의 차원이다.
이 과정을 시각화한 이미지는 다음과 같다.
2. Scaled Dot-Product Attention
다음은 내적 기반 어텐션을 수행하는 방법이다.
- Query(q), Key(k), Value(v) 벡터 생성:
- 입력 시퀀스의 각 토큰에 대해 q, k, v 벡터를 생성
- 이는 각각 WQ, WK, WV 가중치 행렬을 통해 선형 변환
- 내적(dot product) 계산:
- q와 k의 내적을 계산한다: q^T * k
- 이 값은 두 벡터 간의 유사도를 나타낸다.
- Scaling:
- 내적 결과를 √d_k로 나눈다. (d_k는 key 벡터의 차원)
- 수식: (q^T * k) / √d_k
- Softmax 적용:
- 스케일링된 결과에 softmax 함수를 적용한다.
- 이를 통해 모든 key에 대한 가중치의 합이 1이 되도록 정규화한다.
- Value와 곱셈:
- softmax 결과를 value 벡터 v와 곱한다.
- 이는 각 value에 대한 가중치 합을 계산하는 것.
실제 Transformer에서는 단일 query 벡터 q가 아닌 query 행렬 Q를 사용하는데, 여러 query를 동시에 처리할 수 있기 때문이다.
- Q, K, V 행렬:
- Q: [n_queries, d_k] 차원
- K: [n_keys, d_k] 차원
- V: [n_keys, d_v] 차원
- 행렬 연산:
- QK^T를 계산한다: [n_queries, n_keys] 차원의 행렬이 생성한다.
- 이는 모든 query와 key 쌍에 대한 유사도를 한 번에 계산한다.
- Scaling:
- QK^T / √d_k로 스케일링한다.
- Softmax:
- 각 행(query)에 대해 독립적으로 softmax를 적용한다.
- Value와의 곱셈:
- softmax 결과와 V를 곱한다: [n_queries, d_v] 차원의 출력이 생성된다.
최종 수식: Attention(Q, K, V) = softmax(QK^T / √d_k)V
Scaling의 필요성
dot product를 진행할 때 scaling은 중요하다. 그 이유는 다음과 같다.
- 내적 결과의 크기 조절:
- q와 k의 내적 결과는 차원 d_k에 비례하여 커지는데, 큰 차원에 대해 내적 값이 커질 수 있기 때문이다.
- Softmax의 안정성:
- 매우 큰 입력값에 대해 softmax 함수는 극단적인 확률 분포를 만들 수 있다.
- 이는 일부 값은 1에 가깝고 나머지는 0에 가까워지는 현상을 초래한다.
- 기울기 문제 해결:
- 극단적인 softmax 출력은 기울기가 거의 0이 되는 문제를 야기할 수 있다.
- 안정적인 학습:
- √d_k로 나누면 내적 결과의 분산을 1로 유지할 수 있다. 즉, 더욱 안정적인 기울기와 학습 과정을 가능하게 한다.
3. Multi-Head Attention
Multi-Head Attention은 여러 개의 Attention 메커니즘을 병렬로 사용하는 기법이다. 이 방식은 모델이 다양한 관점에서 입력 데이터를 분석할 수 있게 해준다. 다음은 multi-head Attention의 계산 방식이다.
- 입력 분할:
- 입력 Q, K, V를 h개의 헤드로 나눈다.
- 각 헤드의 차원은 d_model / h가 된다. (d_model은 모델의 전체 차원)
- 선형 변환:
- 각 헤드에 대해 독립적으로 Q, K, V를 생성한다.
- Q_i = QW_i^Q, K_i = KW_i^K, V_i = VW_i^V
- 여기서 W_i^Q, W_i^K, W_i^V는 각 헤드에 대한 학습 가능한 가중치 행렬이다.
- Scaled Dot-Product Attention:
- 각 헤드에서 독립적으로 Attention을 수행한다.
- head_i = Attention(Q_i, K_i, V_i)
- Attention(Q, K, V) = softmax(QK^T / √d_k)V
- 결과 연결:
- 모든 헤드의 결과를 연결한다.
- Concat(head_1, ..., head_h)
- 최종 선형 변환:
- 연결된 결과에 추가적인 선형 변환을 적용한다.
- MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^O
- W^O는 최종 출력 차원을 조정하는 가중치 행렬이다.
Multi-head Attention은 각 헤드의 연산을 병렬로 할 수 있어서 효과적이다. 다음은 Multi-head Attention의 구조와 작동 방식을 시각화한 것이다.
4. Block-Based Model
Transformer는 여러 개의 동일한 블록(층)을 쌓아 구성된다. 각 블록은 주로 두 가지 주요 하위 층으로 구성된다:
- Multi-Head Attention 층
- Feed-Forward Neural Network 층
이 두 층 각각에 Residual Connection과 Layer Normalization이 적용된다. 다음은 transformer 블록 구조의 모습이다.
Residual Connection
Residual Connection(또는 Skip Connection)은 입력을 변환된 출력에 직접 더하는 기법이다.
Output = F(x) + x
- F(x): 네트워크 층의 출력
- x: 입력
이때, 입력벡터와 출력벡터의 차원은 동일해야 한다.
Layer Normalization
Layer Normalization은 각 층의 출력을 정규화하는 기법이다. 과정은 다음과 같이 진행된다.
- 각 특성(feature)에 대해 평균(μ)과 표준편차(σ) 계산한다.
- 계산된 평균과 표준편차를 사용하여 정규화한다.
- 스케일(γ)과 시프트(β) 파라미터를 적용한다.
LayerNorm(x) = γ * ((x - μ) / σ) + β
5. Positional Encoding
포지셔널 인코딩은 Transformer 모델에서 시퀀스의 순서 정보를 제공하기 위해 사용되는 기법이다. 순서를 구별할 수 있는 유니크한 상수벡터를 더해주는 것이다. Transformer는 순환(RNN) 구조나 합성곱(CNN) 구조를 사용하지 않아 시퀀스의 순서 정보를 자연스럽게 포착하지 못한다. 또한 Self-attention 메커니즘은 순서와 무관하게 작동하므로, 별도의 위치 정보가 필요하다. 포지셔널 인코딩은 토큰의 상대적, 절대적 위치 정보를 모델에 제공하여 시퀀스의 구조를 이해할 수 있게 한다.
다음은 positional encoding의 구현 방법이다.
- 사인과 코사인 함수를 사용한 인코딩:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))여기서 pos는 위치, i는 차원, d_model은 모델의 차원이다. - 이 인코딩은 입력 임베딩에 더해진다.
러닝레이트 스케줄링(Learning Rate Scheduling)
러닝레이트 스케줄링은 학습 과정에서 학습률(learning rate)을 동적으로 조정하는 기법이다. 고정된 학습률은 학습 초기에는 빠른 수렴을 가능하게 하지만, 후기에는 최적점 주변에서 불안정할 수 있다. Learning Rate Scheduling에서 학습 과정에 따라 적절한 학습률을 사용하면 빠르고 안정적인 수렴이 가능할 뿐더러, 지역 최적해(local optima)를 벗어나는 데 도움을 줄 수 있다.
다음은 주요한 스케줄링 방법이다.
- Step Decay: 일정 에폭마다 학습률을 감소시킨다.
- Exponential Decay: 학습률을 지수적으로 감소시킨다.
- Cosine Annealing: 코사인 함수를 사용하여 학습률을 조절한다.
- Warm-up: 초기에 학습률을 서서히 증가시킨 후 감소시킨다.
Transformer에서는 주로 "Warm-up 후 감소" 방식을 사용한다.
- Warm-up 단계: 처음 warmup_steps 동안 학습률을 선형적으로 증가시킨다.
- 감소 단계: 그 후 학습률을 step의 역제곱근에 비례하여 감소시킨다.
수식: lr = d_model^(-0.5) * min(step^(-0.5), step * warmup_steps^(-1.5))
여기서 d_model은 모델의 차원, step은 현재 학습 단계, warmup_steps는 warm-up 기간이다.
이러한 Positional Encoding과 Learning Rate Scheduling 기법들은 Transformer 모델의 성능을 크게 향상시키는 데 기여한다.