[파이토치로 배우는 자연어 처리] 1장. 소개
1장. 소개
1.1 지도학습
- 샘플 = 입력 = x
- 타깃 = 레이블 = y
- 모델: 샘플 x를 받아 타깃 레이블값을 예측하는 함수
- 파라미터 = 가중치 = w
- 예측: 모델이 추측하는 타깃값 y hat
- 손실 함수: 훈련 데이터에 대한 예측이 타깃과 얼마나 멀리 떨어져있는지 비교하는 함수 L
- 손실: 실수 스칼라값, 손실이 낮을수록 타깃 예측을 더 잘하는 모델
- 지도학습: 샘플 n개 전체의 누적 손실을 최소화하는 최적의 파라미터를 찾는 과정
확률적 경사 하강법
- (배치) 경사 하강법 (batch gradient descent): 주어진 데이터셋에서 손실 함수를 최소화하는 파라미터값 (근)의 초기값을 추측한 후, 목적 함수 (objective function)의 값이 임계점 아래로 내려갈 때까지 파라미터 반복 업데이트 (전통적인 경사 하강법)
- 확률적 (stochastic) 경사 하강법: data point를 일부 랜덤하게 선택하여 gradient를 계산하는 방법
- 순수 SGD: 데이터 포인트 하나 사용 (거의 사용 x)
- 미니배치 SGD: 여러개 사용
- 일반적인 SGD 알고리즘의 수렴 속도를 높이는 파생 알고리즘들이 개발됨
- 역전파 (backpropagation): 파라미터를 반복적으로 업데이트하는 과정
- 정방향 계산 (forward pass): 현재 파라미터값으로 입력을 평가하여 손실 함수를 계산
- 역방향 계산 (backward pass): 손실의 그레이디언트를 사용하여 파라미터를 업데이트
1.2 샘플과 타깃의 인코딩
- 입력 인코딩: 샘플과 타깃을 벡터나 텐서의 수치로 표현
1.2.1 원-핫 인코딩
- 휴리스틱 기반의 다눈한 카운트 방식 표현
- 0 벡터에서 시작해 문장이나 문서에 등장하는 단어에 상응하는 원소를 1로 설정
- 구, 문장, 문서의 원-핫 벡터 = 구성하는 단어의 원-핫 표현을 단순히 논리합
1.2.2 TF (Term-Frequency) 표현
- 구, 문장, 문서의 TF 표현은 소속 단어의 원-핫 표현을 합해 만들어짐
- BoW (Bag of Words)라고도 부름
1.2.3 TF-IDF (Term-Frequency-Inverse-Document-Frequency) 표현
- 역문서 빈도 (IDF): 벡터 표현에서 흔한 토큰의 점수를 낮추고 드문 토큰의 점수를 높임
IDF(w) = log(전체 문서 개수 / 단어 w를 포함한 문서 개수)
- TF-IDF 점수 = TF(w) * IDF(w)
- 딥러닝에서는 주로 TF-IDF와 같은 경험적인 방법 대신 정수 인덱스를 사용한 원-핫 인코딩과 특수한 임베딩 룩업 (embedding lookup' 층으로 신경망의 입력을 구성함
1.2.4 타깃 인코딩
- 타깃 변수가 텍스트 형태일 때: 원-핫 인코딩과 같은 방식 사용 (예: 기계 번역, 요약, 질의응답 문제)
- 타깃 변수가 범주형일 때: 레이블마다 고유한 인덱스를 부여하는 방식 사용
- 출력 레이블 수가 커지면 문제가 될 수 있음 (예: 언어 모델링)
- 타깃 변수가 수치일 때: 여러 방법이 있음
- 타깃을 범주형 구간 (bin)으로 바꾸고, 순서가 있는 분류 문제로 다루는 방법
- 구간은 균등하지 않아도 되며, 데이터에 따라 나눌 수 있음
1. 3 계산 그래프
- 계산 그래프를 사용하면 지도학습 시스템에서 데이터 흐름을 간편하게 구현할 수 있음
- 계산 그래프는 수학식을 추상적으로 모델링한 것
- 딥러닝에서는 Theano, TensorFlow, PyTorch와 같은 계산 그래프의 구현이 부가적으로 자동 미분 을 구현함
- 계산 그래프의 표현
- 노드: 수학 연산을 나타냄
- 에지: 노드로 들어가는 에지 = 입력, 나가는 에지 = 출력
1.4 파이토치 기초
- 파이토치는 다른 프레임워크와 달리 테이프 기반 자동미분 방식을 구현함
- 계산 그래프를 동적으로 정의하고 실행할 수 있음
- 디버깅이 편리, 복잡한 모델을 손쉽게 만들 수 있음
- 동적 계산 그래프 vs. 정적 계산 그래프
- 정적: 먼저 계산 그래프를 정의하고 컴파일한 후 실행 - 제품 시스템과 모바일 환경에서 효율적
- 동적: 실행할 때마다 모델을 컴파일하지 않아도 됨 - 연구나 개발할 때 편리
- 특히 입력마다 다른 그래프 구조가 만들어질 수 있는 NLP 모델링 작업에 적합
- 텐서: 다차원 데이터를 담은 수학 객체
- 0차: 하나의 스칼라
- 1차: 숫자 배열 또는 벡터
- 2차: 행렬
- n차: n차원 스칼라 배열
1.4.1 파이토치 설치
1.4.2 텐서 만들기
- 텐서 랜덤 초기화
- 균등 분포, 표준 정규 분포에서 텐서 만들기
- 동일한 스칼라값으로 채운 텐서 만들기
- 밑줄 문자 ()가 있는 메서드: 텐서값을 바꾸는 in-place 메서드 (ex: `fill()`)
- 리스트, numpy 배열을 이용한 텐서 초기화
- 넘파이 배열을 이용하는 경우 텐서 타입이 기본
FloatTensor가 아닌 DoubleTensor가 됨
- 파이토치 텐서 -> numpy 배열로의 변환도 가능
1.4.3 텐서 타입과 크기
- 타입 지정 방법: 특정 타입 생성자 직접 호출 또는
dtype 매개변수 사용
shape, size() 이용해 텐서 차원 확인 가능
1.4.4 텐서 연산
1.4.5 인덱싱, 슬라이싱, 연결
- 파이토치 함수를 사용할 때 인덱스는
LongTensor로
1.4.6 텐서와 계산 그래프
- gradient = 함수 입력에 대한 함수 출력의 기울기를 나타내는 값
- 계산 그래프에서 gradient
- 파라미터마다 존재
- "오류 신호에 대한 파라미터의 기여"
- 파이토치에서 계산 그래프의 노드에 대한 gradient를
.grad 로 참조할 수 있으며, optimizer는 .grad 속성을 사용해 파라미터 값을 업데이트함
1.4.7 CUDA 텐서