AI · Deep Learning · Computer Vision · Transformer

OUTTA Basic — BERT·Hugging Face·Gemini를 안전하게 정리하기

2026-08-01 · 수정 2026-08-01 · Hyeongrok Ryu

Tokenization, attention mask, BERT output shape와 환경변수를 이용한 Gemini credential 처리를 코드 중심으로 정리했다.

Series
2024 OUTTA AI 부트캠프 Basic · 6
유형 / 난이도
study-note · intermediate
Tools
Python, PyTorch, Transformers
01BERT 입력을 세 부분으로 보기

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

02Attention mask와 shape

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

03Hugging Face 흐름

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

04당시 Notebook에 남은 출력

이 글에서 순서대로 다시 확인하는 학습 포인트입니다.

이 글의 목차에서 자동으로 만든 개념 흐름도입니다.

BERT 입력을 세 부분으로 보기

먼저 BERT가 무엇인지 양방향 Transformer encoder라는 문장만 외우지 않고 입력 embedding을 token·position·segment 세 항의 합으로 정리했다. 40쪽 BERT 모듈을 보면서 [CLS], [SEP], padding이 sequence에 들어가는 위치도 확인했다.

Eᵢ = E(token, i) + E(position, i) + E(segment, i)

문장 분류에서는 [CLS] 위치의 representation을 classifier에 넣지만, token classification은 각 timestep 출력을 사용한다. 같은 BERT라도 output shape를 먼저 보지 않으면 task head를 잘못 연결하기 쉽다.

Token, position, segment embedding을 더해 BERT encoder로 보내고 공개용 교체 코드는 credential을 실행환경에서 읽는 구조
강의 주제에서 공부한 BERT 입력과 공개용 credential 처리 형태를 다시 그렸다. 오른쪽은 옛 Notebook의 동작을 묘사한 화면이 아니라 평문 값을 제거한 교체 패턴이다.

Attention mask와 shape

Self-attention의 핵심은 query와 key의 유사도로 value를 섞는 과정이다.

Attention(Q, K, V) = softmax(QKᵀ / √dₖ + M)V

여기서 mask (M)은 padding 위치가 attention에 들어가지 않게 만든다. Notebook에서 input_ids.shape == attention_mask.shape인지, 둘 다 (batch, length)인지 먼저 확인했다. 분류 logit은 (batch, classes)가 되어야 한다.

Hugging Face 흐름

Hugging Face 실습은 tokenizer와 model checkpoint를 같은 이름으로 맞추는 순서로 정리했다. tokenizer가 만든 dictionary를 그대로 model에 넘기고, 출력 object에서 필요한 logitslast_hidden_state를 명시적으로 선택했다.

encoded = tokenizer(
    texts,
    padding=True,
    truncation=True,
    return_tensors="pt",
)

assert encoded["input_ids"].shape == encoded["attention_mask"].shape
result = model(**encoded)
assert result.logits.shape[0] == len(texts)

당시 Notebook에 남은 출력

Hugging Face 사본에는 39개 cell, 25개 code cell과 125개의 text·table output object가 남아 있었다. code source는 기본본과 같았고 출력만 보존돼 있었다. BERT 사본은 72개 cell과 31개 output object가 있었으며, 32개 code cell 중 17개가 기본본과 달랐다. Gemini 사본에는 33개 cell, 24개 code cell, 10개 output object가 남아 있었다.

이 세 Notebook은 저장된 image output 대신 text와 table 위주라서, 이번 글에서는 tokenization·mask·shape와 코드 흐름을 중심으로 다시 적었다. 당시 결과를 새 실행 결과처럼 바꾸어 쓰지 않았다.

Gemini credential 분리

옛 Gemini Notebook에는 평문 API Key가 남아 있었다. 그 원본은 공개하지 않았다. 기존 키는 소유자 계정에서 폐기·교체해야 하며, 공개 예제는 새 값을 코드에 적지 않고 환경변수에서 읽도록 바꿨다. 실제 값이나 당시 cell 내용은 글에 옮기지 않았다.

import os

api_key = os.environ["GEMINI_API_KEY"]
if not api_key:
    raise RuntimeError("GEMINI_API_KEY is empty")

# SDK client를 만들 때 api_key를 전달하고 출력하거나 저장하지 않는다.

환경변수 이름만 코드에 남고 값은 shell·Colab secret·CI secret 같은 실행 환경이 제공한다. Notebook을 공유하기 전에는 output과 metadata에도 credential이 남지 않았는지 확인해야 한다.

BERT와 GPT 비교

28쪽 GPT 모듈에서는 미래 token을 가리는 causal mask를 사용한다. BERT는 양쪽 문맥을 보며 masked token이나 downstream task representation을 학습하고, GPT 계열은 왼쪽 문맥에서 다음 token을 예측한다. 22쪽 CV·NLP 동향 모듈까지 읽고 나니 pretrained backbone을 가져와 tokenizer·head·loss를 task에 맞추는 공통 흐름이 보였다.

사용한 자료

  • BERT — course-pdf; bidirectional attention과 fine-tuning
  • GPT — course-pdf; causal language modeling
  • CV와 NLP 연구동향 — course-pdf; pretrained model 활용 흐름
  • Gemini API Key 발급 방법 — course-pdf; credential을 코드와 분리하는 계기
논문 첫 페이지 미리보기