24.11.25 - 24.11.29
저번주에 이어 자연어 처리 과정을 통해 전처리와 Feature Vectorization을 배우고, 이를 활용해 모델을 만들어는 한주였는데, 특히 좋았던 부분은 모델링을 배울때 어떤 구조가 있고 각 구조가 어떠한 한계점을 지녀서 어떤 구조가 생겨나게 됬는지 배울 때였다. 어떤 상황에서는 어떤 구조를 쓰면 좋을지 생각해볼 수 있는 시간이 되었던 것 같다. (무조건 transformer 구조를 쓰는게 nope..!)
그리고 각각의 모델들에 맞게 간단한 챗봇을 구현하는 것도 좋았다. 이론이 실제로 어떻게 적용되는지 체감할 수 있어 두배로 흥미로웠다.
RNN(Recurrent Neural Network) 는 시퀀스 데이터를 처리하도록 설계된 신경망으로서, 이전 단계의 숨겨진 상태(hidden state)를 다음 단계로 전달하며 시퀀스 간의 연속성을 학습한다. (쉽게 말해, 서로의 관계성을 학습을 한다는 뜻!) 근데 이런 RNN에게는 한계가 있는데.. 긴 시퀀스를 처리할 때 '과거 정보를 잃어버린다는 점'이다. 이 한계를 극복하기 위해 등장한 구조가 바로 LSTM 인데! cell state와 gate 라는 개념을 도입시킴으로서 선택적으로 '기억하기'와 '잊기'를 할 수 있게 하는 구조이다.
LSTM의 Gate
- Forget Gate: 이전 정보를 버릴지 결정.
- Input Gate: 새로운 정보를 저장할지 결정.
- Output Gate: 다음 숨겨진 상태로 무엇을 출력할지 결정.
LSTM 개념과 함께 알아두면 좋은 개념에 GRU(Gated Recurrent Unit) 라는 개념도 있는데, LSTM의 많은 계산량을 개선할 수 있는 구조로 LSTM의 간소화된 버전이라고 생각하면 된다.
GRU의 Gate
- Reset Gate: 과거 정보를 얼마나 리셋할지, 얼마나 잊을지를 결정.
- Update Gate: cell의 상태를 얼마나 업데이트 할지, 이전 상태와 현재 상태를 어떻게 조합할지 결정.
GRU는 LSTM보다 연산 속도는 빠르고 메모리 사용량은 적다! GRU는 짧거나 중간 길이 시계열 데이터, 일반화 성능이 좋은 구조다!
Seq2Seq(Sequence-to-Sequence) 라는 구조도 있다! seq2seq는 계열 데이터에서 또 다른 계열 데이터로 변환하는 RNN기반의 딥러닝 모델로, 주로 기계 번역(영어->한국어), 요약(원문->요약), 대화(자신의 발언->상대방의 발언)에서 많이 쓰이고 이 모델의 큰 특징은 Encoder와 Decoder가 있다는 것!
Encoder(인코더): 문장 등의 입력을 압축(=컨텍스트 벡터 생성 => hidden state)
Decoder(디코더): 요약 정보(컨텍스트 벡터)를 기반으로 출력 시퀀스를 생성
GRU는 옆에 애(?)와의 관계성을 알기는 하지만 전체적인 의미를 알기는 어려운데 Seq2Seq는 Encoder에서 전체 의미(특징)을 표현하는 컨텍스트 벡터가 있어서 전체적인 의미를 파악하고 있는 상태에서 decoder가 sequence를 만들어서 output으로 내보내는 특징이 있다.
그런데 아쉽게도 Seq2Seq에도 문제점이 있는데... 하나의 고정된 context vector에 압축하고, 고정된 크기의 vector에 모든 입력 시퀀스의 정보를 넣다보니 정보 손실 + 낭비를 일으킬 수 있다는 점과 토큰마다 참조해야 할 중요도가 다를 수 있는데 그것을 반영할 수 없다는 문제가 있다.
이때 등장하는게 Attention Mechnism이다. Decoder에서 출력 단어를 예측하는 매 시점(time step)마다, Encoder의 입력 문장(context vector)을 다시 참고 하자는 것으로,전체 입력 문장의 단어들을 동일한 비율로 참고하는 것이 아니라, Decoder가 해당 시점(time step)에서 예측해야할 단어와 연관이 있는 입력 부분을 좀 더 집중(attention)해서 참고 할 수 있도록 하자는 것이 기본 아이디어이다! Seq2Seq에 Attention 메커니즘을 추가할도 있다. 그렇지만 입력 시퀀스의 특정 위치에만 초점을 맞추는 방식으로 동작한다는 한계는 있다.
그래서 등장한게 Transformer이다. Transformer에는 Self-Attention이라는 개념이 녹아져 있다! Self-Attention은 Transformer에서 처음 제안된 개념으로, 시퀀스 내 모든 단어(토큰) 사이의 관계를 동적으로 계산한다. 즉, 특정 단어가 시퀀스의 다른 모든 단어와 얼마나 관련이 있는지를 학습을 한다.(사이드 이펙트로 Transformer는 병력적 처리가 가능해서 처리 속도 까지 줄어든다는 장점을 지님!)
특징 | Seq2Seq (RNN 기반) | Transformer |
---|---|---|
입력 처리 방식 | 순차적 (RNN/LSTM/GRU) | 병렬적 (Self-Attention) |
의존성 처리 | 긴 시퀀스에서 정보 손실 가능 | Self-Attention으로 모든 단어 간 관계 처리 |
속도 | 순차적 처리로 느림 | 병렬 처리로 빠름 |
컨텍스트 벡터 | 고정 크기 (정보 손실 가능) | 가변적, 모든 위치 정보 사용 |
Attention | 선택적으로 추가 가능 (Bahdanau or Luong) | 모델의 핵심 메커니즘 (Self-Attention) |
정리하면!
- 기본 Seq2Seq에는 Self-Attention이 없다.
- Attention 메커니즘은 Seq2Seq에도 추가 가능하지만, Transformer의 Self-Attention과는 다르다
- Self-Attention은 시퀀스 내 모든 단어 간의 관계를 병렬적으로 학습한다는 점에서 강력하며, Transformer의 핵심 혁신 중 하나!
현재는 Transformer가 짱! (e.g. BERT, GPT)
오늘도 나는 나의 한계를 느낀다. 열심히 복습+예습하자^^
벡터화된 데이터가 어떻게 모델에 입력되어 의미 있는 결과를 생성하는지에 대한 궁금증이 생겼고 더 깊이 이해하고 싶어졌다. 다가올 LLM(대규모 언어 모델) 수업이 기대가되고, LLM이 단순한 챗봇을 넘어서 더 복잡하고 정교한 자연어 처리 작업을 어떻게 처리하는지 빨리 배우고 싶다.
No Stop! Keep going! 다음주도 화이팅하자~
유나님! 이번주도 RNN부터 GRU까지 각 개념을 체계적으로 잘 정리해주신 것 같아요!!
덕분에 저도 더 공부하고 갑니당..! 흐름을 이해하기 쉽게 풀어서 설명하고 다시 글로 적어보는 과정을 통해서 진짜 내 거로 만들어가시는 것 같아요 :)
나중에 현업 가셔서도 실무하실 때 꾸준히 정리해 놓으신 블로그가 기술적으로 도움 많이 되실 것 같습니닷 ✍️🍀