일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- triu
- GRU
- tensorflow
- 크롬 원격 데스크톱
- Til
- forward
- band_part
- nn.Sequential
- kernel density estimation
- Chrome Remote Desktop
- ai tech
- LSTM
- 네이버 부스트캠프
- kde
- Linux
- tril
- error
- ubuntu
- pytorch
- RNN
- Today
- Total
무슨 생각을 해 그냥 하는거지
[학습정리] 2021-09-06 본문
※ 정보전달이 목적인 포스트가 아니라 개인 학습 기록 및 정리가 목적인 포스트입니다 ※
해당 포스트는 네이버 커넥트 재단의 부스트캠프 마스터님이신 주재걸 교수님의 강의를 바탕으로 작성되었습니다.
1. 강의 복습 내용
[NLP]
Natural Language Processing
주요 conference: ACL, EMNLP, NAACL
- 보통 단어 == token
- tokenization == 문장을 단어로 쪼개는 것
- stemming == 단어의 어근 추출 (어미 변화에도 같은 의미를 가지기 때문. e.g. study, studied, studying ...)
word / phrase level의 task
- Named entity recognition(NER): 단일 단어, 또는 여러 단어로 이루어진 고유명사를 인식하는 것
- Part-Of-Speech(POS) tagging: 단어들의 문장 내 품사 혹은 성분을 알아내는 task
- noun-phrase chunking
- dependency parsing
- coreference resolution
문장 단계의 task
- sentiment analysis
- machine translation: (e.g. 영어 문장 → 한국어 문장)
Multi-sentence / paragraph level의 task
- Entailment prediction: 문장 간의 모순을 예측
- question answering: 검색 후 단순 키워드를 포함한 사이트를 나열하는 것이 아니라 검색 결과 상단에 답을 표시
- dialog systems
- summarization
Text Mining
주요 conference: KDD, The WebConf (WWW), CIKM, ICWSM
: text나 문서 데이터에서 유용한 정보를 추출, Document clustering, 경향성을 발견하기 좋음 (e.g. SNS text mining을 통해 '혼밥'이라는 키워드가 많아졌다는 것을 통해 사회적으로 혼자 밥먹는 사람이 많아졌다는 것을 알 수 있음)
Information Retrieval
주요 conference: SIGIR, WSDM, CIKM, RecSys
: 이미 많이 발전해서 최근에 연구가 활발한 분야는 아니지만, 추천시스템으로 발전!
[Bag of Words]
Bag of Words representation
1. 중복 단어를 제거해서 vocabulary를 만든다.
"나는 사과를 좋아해.", "나는 오렌지를 좋아해." → vocabulary: {'나는', '사과를', '오렌지를', '좋아해', '.'}
2. categorical variable을 one-hot vector로 만든다.
나는: [1 0 0 0 0]
사과를: [0 1 0 0 0]
오렌지를: [0 0 1 0 0]
..
3. one-hot vector들을 가방에 담는 것처럼 하나의 벡터(one-hot vector와 같은 dimension인)에 다 더한다!
나는 + 사과를 + 좋아해 + . → [1 1 0 1 1]
NaiveBayes Classifier
어떤 주제의 문서인지 분류하는 것을 예로 들어보자. (e.g. CV에 관한 문서, NLP에 관한 문서 ...)
특정 문서를 d라고 하고, 그 문서의 주제인 c를 찾는 것이다.
P(c|d): P of c given d. 특정 문서 d가 주어졌을 때, 그 문서가 c에 속할 확률 분포.
베이즈 정리를 이용하면 다음과 같다.
이때 분모는 P(d)로 특정 문서 d가 뽑힐 확률을 의미하는데, argmax에서는 상수 취급이 가능하다. 따라서 P(d)를 제거하면 아래와 같다.
문서 d는 사실 특정 단어들(w)이 동시에 나온 사건이라 해석할 수 있다.
c가 고정되어 있을 때, 각 단어들이 나올 확률이 독립이라면 모든 단어가 동시에 나올 확률은 각 단어들이 나올 확률들의 곱으로 표현할 수 있다.
예제) 아래 표와 같은 training data가 있다고 생각해보자. (document classification task)
document index (d) |
document words (w) | class (c) |
1 | Image recognition uses convolutional neural networks | CV |
2 | Transformer can be used for image classification task | CV |
3 | Language modeling uses transformer | NLP |
4 | Document classification task is language task | NLP |
CV document가 나올 확률은 P(c_CV) = 2/4 = 1/2,
NLP document가 나올 확률도 마찬가지로 P(c_NLP) = 2/4 = 1/2 이다.
test 문장이 "Classification task uses transformer"일 때, test 문장에 있는 각 단어들이 각 class 별 training data에서 나올 확률을 구하면 아래와 같다. (확률이니까 당연히 중복을 허용하여 계산해야 한다!)
P(w_"classification"|c_CV) = 1/14 (CV class인 document의 모든 단어들 중에서 classification이라는 단어의 등장 횟수)
P(w_"task"|c_CV) = 1/14
P(w_"uses"|c_CV) = 1/14
P(w_"transformer"|c_CV) = 1/14
P(w_"classification"|c_NLP) = 1/10
P(w_"task"|c_NLP) = 2/10
P(w_"uses"|c_NLP) = 1/10
P(w_"transformer"|c_NLP) = 1/10
각 단어들이 나올 확률이 모두 독립이라고 가정하면, 각 주제일 확률 * 각 주제일 때 해당 단어들이 나올 확률을 모두 곱해서 이 문서가 어떤 주제인지 구할 수 있다.
P(c_CV|d_test) = P(c_CV)*(1/14)*(1/14)*(1/14)*(1/14) = 0.000013
P(c_NLP|d_test) = P(c_NLP)*(1/10)*(2/10)*(1/10)*(1/10) = 0.0001
따라서 위 test 문서는 NLP class라고 예측된다.
[Word Embedding]
Word2Vec
Bag of word는 단어들의 유사도를 전혀 고려하지 않고 one-hot vector로 만들어버리기 때문에
모든 벡터간의 유클리디안 거리가 sqrt(2), 코사인 유사도가 0이 된다는 특징이 있다.
word2vec은 단어간의 의미가 비슷하다면, 거리가 가깝도록 단어를 임베딩하는 방법이다.
주변에 있는 단어들로부터 그 단어의 의미를 파악할 수 있다는 것에서 착안한 방법.
The cat purrs. 라는 문장과 The cat hunts mice. 라는 문장이 있다고 생각해보자.
cat과 인접한 단어들은 cat과 관련성이 높은 것으로 생각할 수 있다.
word2vec의 algorithm
"I study math." 라는 문장이 있다.
이 문장을 단어로 쪼개면 {"I", "study", "math"} 라는 vocabulary가 만들어진다.
window size가 3일 때, I가 중심인 경우 (I, study) 라는 쌍이 만들어진다.
window size가 3일 때, study가 중심인 경우 (study, I), (study, math) 라는 쌍이 만들어진다.
window size가 3일 때, math가 중심인 경우 (math, study) 라는 쌍이 만들어진다.
(study, math) 쌍을 예로 학습 과정을 살펴보자.
Input이 "study" [0, 1, 0] 라면 아웃풋은 "math" [0, 0, 1]이 나와야 한다.
input layer의 node 수는 input vector의 dimension이다. 예시로는 3.
hidden layer의 node 수는 hyperparameter로, word embedding을 수행하는 좌표공간의 차원수와 같다. 여기서는 2.
output layer의 node 수는 output vecotr의 dimension이다. input과 마찬가지로 3.
그래서 W1은 2x3, W2는 3x2의 크기를 갖게 된다.
GloVe
: Global Vectors for Word Representation
word2vec과의 차이점은 바로 loss function이다.
단어쌍이 동시에 나오는 횟수를 미리 계산해 log를 취한 값은 ground truth로 사용해 중복된 계산을 줄여준다.
그래서 training이 빠르고, 작은 corpus에도 성능이 괜찮다는 장점이 있다.
2. 과제 수행 과정 / 결과물 정리
[실습1. Naive Bayes Classifier]
from konlpy import tag # 형태소 분석기 클래스
데이터 전처리
train data: 문자열 component를 가지는 list
tokenizer = tag.Okt() # konlpy의 Twitter(Okt) tokenizer
tokenizer.morphs(phrase, norm=False, stem=False) # Parse phrase to morphemes 참고
- 위의 것들을 이용해 tokenization (e.g. "정말 맛있습니다. 추천합니다." → ['정말', '맛있습니다', '.', '추천', '합니다', '.'])
- 각 토큰을 key, 토큰의 등장 횟수를 value로 dictionary를 만든다.
- 단어를 인덱스로 만든다. (단어 등장 횟수가 가장 많은 것부터 내림차순으로)
Naive Bayes Classifier 모델
Laplace smoothing
: test data에 있는 단어가 training data에 없는 경우 확률이 0이 되어버리는 것을 막기 위해 최소 단어 등장 횟수를 더해주는 기법 중 하나.
[실습2. Word2Vec]
공부하자...
CBOW
Skip-gram
nn.Embedding에서 sparse=True
→ nn.Linear처럼 matmul operation으로 단어 vector를 가져오는 것은 비효율적이라 사용. one-hot vector가 아닌 index 기반으로 input을 넣어주기 위해 nn.Embedding을 사용한다. (위의 word2vec algorithm 이미지 참고)
→ sparse gradient를 제공하는 optimizer가 별로 없음에 유의해야 함. optim.SGD, optim.SparseAdam, optim.Adagrad
[필수과제1. Data Preprocessing]
spacy: 자연어처리를 위한 오픈소스 기반 라이브러리
문장을 tokenize 한 뒤 token 객체의 다양한 메서드를 사용할 수 있다.
- token.is_punct : 문장 부호이면 True 아니면 False
- token.is_space : 공백(' ')이면 True 아니면 False
- token.shape_ : 소문자는 x, 대문자는 X 숫자는 d로 표시 (e.g. May → Xxx, 2008 → dddd)
- token.is_stop : 불용어면 True 아니면 False
3. 피어세션 정리
- 새로운 팀원들을 만나 모더레이터 역할, 그라운드 룰 등을 결정했다.
- 협업 툴은 notion을 사용하기로 했다. 잘 모르는 툴이라 걱정되지만 또 하나 할 줄 아는 게 늘었다고 생각하자!
- 딥 러닝을 이용한 자연어처리 입문 : 보면서 공부하면 좋을 것 같다고 추천해주셨다. 강의에서 다루지 않은 내용들이 많아서 보면서 공부하면 좋을 것 같다.
- NLP 논문 스터디를 추가로 하고자 한다.
- 실력이 좋으신 캠퍼분들과 함께 팀이 된 것 같다. NLP는 잘 모르는 분야니까 열심히 공부하면서 뒤처지지 않도록 해야지👊
4. 학습 회고
- 드디어 NLP로 도메인 분리...! CV로부터 벗어나는(?) 첫 번째 도약이다. 설레기도 하고, 기대했던 게 아니어서 실망할까봐 걱정도 된다. 그렇지만 할 수 있는 걸 넓히는 것, 나의 가치를 높이는 것이라고 생각하고 믿고 열심히 해야지.
- CBOW와 skip-gram을 잘 모르는데 다른 거 공부하고 정리하느라 오늘 다 공부를 못했다... 내일은 더 일정이 타이트할 것 같은데 언제 공부하지^^;
- 1일 1커밋 실천하자! (이제 이틀 성공했다..ㅎ 그래도 잘했다 토닥토닥)
- 예전에 자연어처리 스터디를 하면서 이름만 주워담았던 것들인데 부캠에서 공부하니 이제 좀 내 것이 되는 것 같다.
Meet UP <부캠에서 살아남기>
- 자소서 → 자신이 한 걸 담백하게 담아내자. 뻥튀기 금지.. Wrap up report 참고하기
- 이력서 → 대회 같은 것도 스토리 라인 잡아서 쓰기. 수행 역할 명확히 쓰기
- github → 잘 가꾸자.
- 정리의 중요성...
- 어디서도 취업 관련 얘기를 이렇게 깊게 듣지 못했는데 오늘 특강 정말 유익했다..
'Naver AI Tech 2기 > Today I Learned' 카테고리의 다른 글
[학습정리] 2021-09-08 (0) | 2021.09.09 |
---|---|
[학습정리] 2021-09-07 (1) | 2021.09.08 |
[학습정리] 2021-08-27 (0) | 2021.08.27 |
[학습정리] 2021-08-25 (0) | 2021.08.27 |
[학습정리] 2021-08-24 (0) | 2021.08.24 |