1. 기본 개념
지도학습: 샘플에 대응하는 타깃의 정답을 제공하는 방식
샘플: 예측에 사용하는 아이템 (입력, x)
타깃: 샘플에 상응하는 레이블 (정답, y)
모델: 샘플 x를 받아 타깃을 예측하는 함수
파라미터: 모델을 규정 (가중치, w)
예측: 모델이 추측하는 타깃 (y hat)
손실함수: y hat과 y의 차이, 모델의 평가 척도 (L)
2. 경사 하강법
확률적 경사 하강법: 초깃값을 랜덤하게 선택하여 그레디언트 계산, 후에 반복적으로 업데이트(역전파)
정방향 계산: 현재 파라미터 값으로 입력을 평가 -> 손실 함수 계산
역방향 계산: 손실의 그레디언트를 사용 -> 파라미터 업데이트
3. 입력과 타깃을 표현하는 방법
수치 벡터를 사용
원-핫 표현: 0 벡터에서 시작해 사용 단어에 상응하는 원소를 1로 설정
tf 표현: 단순히 소속 단어의 원-핫 표현을 합해 생성
from sklearn.feature_extraction.text import CountVectorizer
vectorizer 생성 -> fit
tf-idf 표현: 흔한 토큰의 점수 하향, 드문 토큰의 점수 상향
IDF(w) = log(N/n)
w: 각 토큰
N: 전체 문장의 개수
n: w를 포함한 문장의 개수
tf-idf 점수 = TF(w) * IDF(w)
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer 생성 -> fit
사이킷런의 idf 계산 식도 존재
기계 번역, 요약, 질의 응답 -> 타깃도 텍스트, 원-핫 인코딩 사용
타깃이 범주형으로 바꿔야 할 때도 있음
4. 계산 그래프
y = wx + b
-> z=wx 와 y=z+b 로 나눔
파이토치로 만들 수 있음
5. 텐서 연산
텐서 -> 다차원의 수학 객체
import torch
tensor = torch.arange(5)
tensor = torch.Tensor(2, 3) -> 리스트를 넣어줄 수도 있음
tensor = torch.rand(2,3) -> uniform
tensor = torch.randn(2,3) -> normal
tensor = torch.zeros(2,3)
tensor = torch.ones(2,3)
tensor = torch.from_numpy(np객체)
tensor.fill_(5)
기본 타입은 float
tensor.long() -> 타입 변경
텐서 생성할때 설정해줄 수도 있음 (dtype=torch.int64)
+ - * / 등의 연산 가능
torch.add(x,x) -> 합
tensor.view(2,3) -> 차원 변경
torch.sum(x, dim=0) -> 행끼리 연산 -> 1x3
torch.sum(x, dim=1) -> 열끼리 연산 -> 2x1
torch.transpose(x,0,1) -> 전치행렬
6. 텐서 인덱스
x -> 2x3 텐서
x[:1, :2] -> 간단한 기본 인덱싱 -> 1x2
indices = torch.LongTensor([0,2])
torch.index_select(x, dim=1, index=indices) -> 0,2 열만 뽑아냄 -> 2x2
indices = torch.LongTensor([0,0])
torch.index_select(x, dim=0, index=indices) -> 첫 행을 두번 뽑아냄 -> 2x3
row = torch.arange(2).long()
col = torch.LongTensor([0,1])
x[row,col] -> (0,0), (1,1) 인덱스에 맞는 데이터 두개 추출
torch.cat([x,x], dim=0) -> 행에 추가
torch.stack([x,x]) -> 차원 늘려서 최고차원에 추가
torch.mm(x,y) -> 행렬 곱 연산
7. 계산 그래프
텐서 만들어줄때 requires_grad = True 해주면 손실과 그레디언트를 기록
8. cuda 텐서
gpu에서 선형 대수 연산 수행 설정
cuda api 사용하여 gpu 활용
torch.cuda.is_available()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
x = torch.rand(3,3).to(device)
같은 장치에 있는 객체들끼리만 연산 가능
9. 말뭉치, 토큰, 타입
말뭉치: 텍스트 데이터 -> 원시 텍스트와 메타 데이터를 포함
토큰: 기본 단위
토큰화: 텍스트를 토큰으로 나누는 과정
샘플(데이터 포인트): 메타 데이터가 붙은 텍스트
데이터셋: 샘플의 모음인 말뭉치
import spacy
nlp = spacy.load('en')
text = "I am ddddddd"
[str(token) for token in nlp(text.lower())] -> 토큰 리스트
10. n-그램
n-그램: 연속된 토큰 시퀀스
11. 표제어
is was -> be
token.lemma_ 해주면 표제어로 바꿔줌
12. 단어 분류: 품사 태깅
token.pos_ -> 품사 리턴
import spacy
nlp = spacy.load('en')
doc = nlp(u"Mary slapped the green witch.")
for token in doc:
print('{} - {}'.format(token, token.pos_))
13. 청크 나누기, 개체명 인식
token.label_ -> 명사구 리턴
import spacy
nlp = spacy.load('en')
doc = nlp(u"Mary slapped the green witch.")
for chunk in doc.noun_chunks:
print ('{} - {}'.format(chunk, chunk.label_))
14. 문장 구조
구성 구문 분석 -> 계층적 구문 분석 트리
의존 구문 분석
15. 단어 의미, 의미론
동음이의어 문제에 직결해야 함
준지도 학습을 통해 해결하지만, 이 책에서 다루지는 않음