우리는 이미 소프트 맥스나 워드 인베딩 레이어 같은 많은 층 들을 보며 살아왔다.
하지만, 공식만 알지 이 내부를 깊게 들여다 본 적은 많지 않은 것 같다.
그렇다고 그 레이어에 대해 모르는 건 아니다.
잘 알고 있지만, 그 근본에 대해 깊게 접근하지 못했을 뿐.
따라서, 오늘은 인코더, 소프트 맥스 등 의 레이어를 진짜 깊게 한번 봐 볼까 한다.
얼마나 깊은은 내용일 지 한번 들어가 보도록 하자.
간단한 AI가 존재한다고 치자
인코더, 디코더가 있을텐데,
워드 임베딩 레이어, 트랜스포머 레이어, 소프트맥스 레이어로만 구성되어 있다 치고,
앞선 3개의 레이어에 어떤 차이가 있고, 어떤 노드간의 연결 방식 차이로 인해 레이어의 차이가 생기는지 알아보자.
일단 딥러닝 모델은 전부 ‘레이어(layer)’라는 구조로 이뤄져 있다.
그리고 이 레이어는 ‘노드(node)’들의 집합이다.
여기서 노드는 ‘뉴런(neuron)’이라고도 부르며, 수학적으로는 어떤 값을 받아서 가공한 뒤 출력하는 함수다.
AI는 기본적으로 아래의 구조를 갖는다:
인코더는 말 그대로 ‘코드로 바꿔주는 기계’다.
입력값(예: 단어)을 숫자 벡터로 바꿔주는 역할을 한다.
워드 임베딩 (Word Embedding)
단어를 고정된 길이의 벡터로 바꿔줌.
예: “고양이” → [0.22, -0.44, 0.78, ...]
from tensorflow.keras.layers import Embedding
embedding = Embedding(input_dim=10000, output_dim=512)
embedded = embedding(input_sequence) # input_sequence는 정수 인덱스 벡터
포지셔널 인코딩 (Positional Encoding)
문장의 순서를 알려주는 역할.
위치 정보를 벡터에 더함.
import numpy as np
def positional\_encoding(max\_len, d\_model):
PE = np.zeros((max\_len, d\_model))
for pos in range(max\_len):
for i in range(0, d\_model, 2):
PE\[pos, i] = np.sin(pos / (10000 \*\* ((2 \* i)/d\_model)))
PE\[pos, i + 1] = np.cos(pos / (10000 \*\* ((2 \* (i+1))/d\_model)))
return PE
def scaled_dot_product_attention(Q, K, V): matmul_qk = tf.matmul(Q, K, transpose_b=True) dk = tf.cast(tf.shape(K)[-1], tf.float32) scaled_attention_logits = matmul_qk / tf.math.sqrt(dk) attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1) output = tf.matmul(attention_weights, V) return output, attention_weights ```
디코더는 반대로 숫자 벡터 → 사람이 이해할 수 있는 단어, 문장으로 바꿔준다.
마스킹된 어텐션 (Masked Attention)
미래 단어를 못 보게 막는 구조로, 현재 시점까지만 봄.
디코더 어텐션 (Encoder-Decoder Attention)
인코더의 출력을 참조하여 번역이나 생성에 반영.
문장 분류, 감정 분석 등에 사용.
대표적 예시: BERT
앞 문장만 보고 다음 단어를 예측.
대표적 예시: GPT, LLaMA 등
대표적 예시: 번역 (Transformer), 요약 (T5)
인코더가 6개, 디코더가 6개처럼 겹겹이 쌓이면 더 깊은 관계를 학습 가능.
깊을수록 ‘저수준 특징 → 고수준 의미’를 학습한다.
Query, Key, Value 벡터를 만들고:
결국 수많은 벡터 간의 연결이다.
AI는 복잡해 보이지만, 결국은
초심자도 각 레이어 역할을 이해하면, AI가 문장을 만들고 감정을 판단하고 번역하는 과정을 쉽게 이해할 수 있다.