https://www.youtube.com/watch?v=dKYFfUtij_U&list=PLVNY1HnUlO26qqZznHVWAqjS1fWw0zqnT
1. Bag of Words
1.1 Bag of words는 문장을 숫자로 표현하는 방법 중 하나다.
가방 안에 문장의 단어들을 전부 하나씩 넣는다.
- "awesome thank you" → awesome 1, thank 1, you 1
- "great thank you" → great 1, thank 1, you 1
- "not bad not good" → not 2, bad 1, good 1
출현 빈도로 문장을 나타낸다면 숫자로 보일 것이다.
- "awesome thank you" → [1, 1, 1, 0, 0, 0, 0]
- "great thank you" → [0, 1, 1, 1, 0, 0, 0]
- "not bad not good" → [0, 0, 0, 0, 2, 1, 1]
1.2 수치로 표현된 값의 활용 방법
1. 문장의 유사도를 알 수 있다.
"awesome thank you"와 "great thank you"의 유사도는 각각의 인덱스 값을 곱한 뒤 더해서 구할 수 있다. ⇒ 2
"great thank you"와 "not bad not good"의 유사도는 0이 나온다.
2. 머신러닝 모델의 입력값으로 사용할 수 있다.
머신러닝 모델들은 수학적 모델이라 입력값 x가 숫자여야 한다. Bag of words는 문장을 수치로 변환하기 때문에 모델을 구현할 수 있게 해 준다.
1.3 Bag of words의 단점
1. Sparsity
실제 사전에는 백만 개가 넘는 단어가 있다. 그럴 때 벡터의 차원이 백만이 넘어가기 때문에 머신러닝 학습 시 계산량이 높아지고 메모리도 많이 사용하게 된다.
2. Frequent words has more power
많이 출현한 단어는 힘이 세진다. 위와 같은 방법으로 문장의 유사도를 계산한다고 하자. 그럼 "The man like the girl"과 "The man love the girl"의 유사도보다 "The man love the girl"과 "the the the the the"의 유사도가 더 높게 나온다.
3. Ignoring word orders
단어의 순서를 철저히 무시한다.
"home run" 홈런 치다. /"run home" 집에 달려가다.→ 순서가 다르면 문장의 뜻도 바뀐다. 단어의 순서를 무시하기 때문에 문맥을 완전히 무시한다.
4. Out of vocabulary
보지 못한 단어의 경우 처리하지 못한다. 오타가 나거나 줄임말을 쓸 경우 Bag of words를 쓰기 어려워진다.
2. n-그램
n-그램은 연속적으로 n개의 token으로 구성된 것 ※token: 단어, 캐릭터
1-gram (unigram) (슬라이드 2)
n = 1일 때 unigram이라고 함.
"fine thank you"
word level로 나누면 [fine, thank, you], character level로 나누면 각 캐릭터가 하나의 token으로 구성된다.
2-gram (bigram) (슬라이드 3)
n = 2일 때 bigram이라고 함.
word level로 나누면 붙어있는 두 단어가 하나의 묶음, character level로 나누면 두 캐릭터가 하나의 token으로 구성된다.
3-gram (trigram) (슬라이드 4)
n = 3일 때 trigram이라고 함. 위와 같은 방식으로 세 단어가 한 묶음, 세 캐릭터가 한 묶음으로 tokenizing 된다.
(슬라이드 5)
n-gram을 알아야 하는 이유
자연어 처리에서 n-gram은 많이 사용된다.
1. Bag of words의 단점을 극복할 수 있다.
단어의 순서가 무시되었던 단점이 n-gram을 사용함으로써 약간 극복할 수 있다.
Bag of words를 사용하면 단어의 순서가 무시되기 때문에 not이 어디에 들어가는지 알 수 없다. 정반대의 문장 "machine learning is fun and is not boring"과 "machine learning is boring and is not fun"이 bag of words에서는 같은 표현이 된다.
bigram을 사용한다면 "is fun"과 "not boring"이 캐치가 된다.
2. 다음 단어 예측
나이브하게 예시를 들어보자면, trigram을 사용했을 때 "how are you"가 2번, "how are they"가 1번 나온다. user가 input box에 "how are"까지 입력했을 때 다음 단어를 예측해야 한다면 빈도수가 더 많은 "you"라고 추천해줄 수 있다.
3. Spell checker
간단하게 spell checker도 만들 수 있다.
bigram을 사용한다. input box에 사용자가 "qwal"이라고 쳤다고 가정하자. 그리고 우리가 가진 bigram 데이터에 "qw"와 "wa"가 없다. 그런데 데이터에 "qu"가 3번, "ua"가 2번이나 발생했기 때문에 "qual"로 추천해줄 수 있다.
이런 식으로 n-gram을 사용하면 상당히 많은 자연어 처리 application에 활용할 수 있다.
3. TF-IDF
Term Frequency * Inverse Document Frequency
왜 사용하니?
문서는 단어로 구성되어 있다. 각 단어별로 이 문서의 연관성을 알고 싶을 때 사용한다.
문서 연관성: 문장이 있을 때 각 단어별로 이 문서에 대한 정보를 얼마큼 가지고 있는지를 수치로 나타낸 값
Term Frequency(TF) : 어떠한 문서가 주어졌을 때 이 단어가 몇 번 출현했는지
(TF score example 슬라이드)
문서가 있을 때 단어가 여러 번 출현했다면 출현한 만큼 연관성이 높을 것이다, 라는 가설 안에 TF score를 사용한다.
"a new car, used car, car review"
총 단어 개수 7개. a는 1번 출현했으므로 a의 TF score는 1/7이다. car는 3번으로 3/7이다. 이 말은 car가 가장 중요한 단어라고 말할 수 있다. 이 예제를 봤을 땐 맞는 것 같다.
TF score의 치명적 단점
"a friend in need is a friend indeed"
똑같이 TF score를 구하는데 a와 friend가 2/8로 공동 1등이다. 이 문장에서 가장 중요한 단어는 friend다.
⇒ TF의 가정은 틀렸다. 정관사 a와 같이 연관성은 없음에도 불구하고 자주 출현하는 단어들이 있다. TF score 하나만으로는 단어와 문서의 연관성을 나타내는데 부족하다. 그래서 나온 게 IDF다.
IDF: 정관사같이 자주 출현하지만 중요도는 떨어지는 단어들에 페널티를 주기 위해서 사용한다.
공식: log(총 문장의 개수/이 단어가 출현한 문장의 개수)
0으로 나누는 수학적 에러를 피하기 위해 때로는 분모에 +1을 해준다. (스무딩)
이번 예제에서는 스무딩 없는 공식으로 IDF score를 구해보자.
(슬라이드 IDF)
A: "a new car, used car, car review"
B: "a friend in need is a friend indeed"
총 2개의 문장이 있으니 분자는 2가 된다. a의 경우 두 문장에 다 나오니까 분모가 2가 된다. log(2/2) 이므로 0이 된다. 이런 식으로 IDF의 값을 구할 수 있다.
(슬라이드 TF-IDF)
문장 A에서 TF*IDF 값이 가장 높은 단어는 0.13인 car이다. 가장 중요한 단어가 맞다.
문장 B를 보면 TF 값만 봤을 때는 a와 friend가 똑같은 값이였다. TF*IDF 값에서는 문장 B에서 가장 중요한 단어인 friend가 0.085로 가장 높은 점수를 가지고 있다. a는 IDF 값이 0이었기 때문에 값이 0이다.
TF*IDF는 어떤 문서나 문장이 주어졌을 때 각 단어별로 그 문장의 연관성을 수치로 나타낸 것이다.
4. 자연어 유사도 측정
자연어 처리에서 유사도 측정하는 방법
1. Euclidean Distance
(그래프)
man과 prince의 거리는 man과 princess의 거리보다 짧다. 거리가 짧으면 유사도가 더 높다고 판단하는 것이 유클리디안 거리를 사용한 유사도 측정 방법이다. 계산 방법은 피타고라스 정리를 사용하면 된다.
2. Cosine 유사도
(그래프)
유클리디안 거리를 사용하면 d1의 거리가 d2의 거리보다 짧다. "money money laundering"과 "laundering"의 유사도가 더 높다는 뜻인데 실제로는 "money money laundering"과 "money money money money money money"의 유사도가 더 높다.
벡터의 특성 때문인데, money가 여러번 발생됨으로써 벡터의 크기가 커지는 것이다. 벡터의 magnitude를 무시하고 측정하는 방법이 코사인 유사도 방식이다.
(그래프)
코사인 유사도는 각도만 본다. 각도가 좁을 수록 유사도가 높다고 보는 것이다. 코사인 그래프를 보면 각도가 0일 때는 1이고 90일 때는 0이 나온다. 각도가 좁을수록 유사도는 더 높다는 것을 이 그래프로 알 수 있다.
$cos(\theta )$를 구하는 방법: A와 B 벡터를 곱한 값을 A의 거리와 B의 거리로 나눠준다.
5. TF-IDF 문서 유사도
문서의 유사도를 구할 수 있는 방법
1. Bag of words를 사용하여 코사인 유사도 구하기
(네 문장 있는 슬라이드, Bag of words 슬라이드)
이 네 문장을 Bag of words를 이용하여 벡터로 만들었다. 이 벡터를 cosine similarity에 적용하면 된다.
(d1, d4 유사도 슬라이드)
d1과 d4의 유사도를 구해보겠다. d1 벡터와 d2 벡터를 코사인 유사도 공식에 넣고 계산을 하면 0.82가 나온다.
(슬라이드)
이와 같은 방법으로 d4와의 유사도를 계산한 결과, d1이 0.82로 제일 높게 나왔다. 하지만 d4 처럼 최고의 미국 레스토랑을 검색했을 때 d2 처럼 미국 햄버거 레스토랑이 나오길 원하지 d1과 같은 내용이 나오길 원하지 않을 것이다. 이게 바로 심플한 Bag of words의 단점이다. "the best" 같이 여러번 출현하지만 그 단어의 중요성이 떨어지는 것들에 페널티를 주기 위해 TF-IDF를 사용한다.
2. TF-IDF와 Bag of words를 사용하여 코사인 유사도 구하기
(슬라이드)
TF-IDF를 사용하여 d4와의 유사도를 정리하면 d2가 0.5로 가장 높게 나온다.
TF-IDF의 장점은 무엇인가
① 구현하기 쉽다. ② 중요한 단어의 점수를 그대로 유지하고 ③ 중요하지 않지만 여러 문서에 존재할 경우 점수를 낮춰주는 역할도 제대로 수행한다.
TF-IDF의 단점
- Only based on Terms(words)
- 단어의 속에 있는 유사도는 보지 않는다
- Weak on capturing document topic
- 단어 하나로 토픽을 파악하는데는 무리가 있다
- Weak handling synonym
- 동음이의어를 다루기 어렵다
예시
- U.S President speech in public
- Donald Trump presentation to people
- 이 두 문장은 같은 내용이지만 TF-IDF로 유사도를 측정하면 0이 나온다. 같은 단어가 존재하지 않기 때문. 실제로는 Document similarity가 존재하지만 전혀 없는 것으로 나옴.
- American restaurant menu
- American restaurant menu hamburger pizza
- hamburger pizza
- TF-IDF로 1, 3번 문장의 유사도를 측정하면 0이 나온다. 하지만 실제 의미로는 3번 문장이 1번 문장에 속해있다. 이런 관계를 파악하지 못한다.
단점 극복 방법
- LSA (Latent Semantic Analysis)
- Word Embeddings (Word2Vec, Glove)
- ConceptNet
잠재 의미 분석 (LSA)
- pizza, pizza hamburger cookie, hamburger - 미국 음식
- ramen, sushi, ramen sushi - 일본 음식
Bag of words를 사용한 유사도
Bag of words를 사용하면, pizza와 hamburger의 유사도는 0이다.
pizza와 ramen의 유사도도 0이다. ⇒ 관계가 전혀 없다는 뜻
TF-IDF를 사용한 유사도
TF-IDF를 사용한 유사도도 마찬가지다. pizza와 hamburger 사이에 동일한 단어가 없기 때문에 유사도가 0이 나온다.
왜 이럴까?
TF-IDF 와 Bag of words는 단어 기반의 벡터이기 때문. 단어에서 토픽을 구할 수가 없기 때문에 유사도가 0이 나온다.
LSA
LSA는 topic 기반으로 유사도를 구할 수 있다.
- pizza, pizza hamburger cookie, hamburger
- ramen, sushi, ramen sushi
이 메뉴를 단어와 문장의 매트릭스로 표현 = A
단어는 행으로 표시되고 문장은 열로 표시됨
1:40 뇌절 옴
5. 단어 벡터 변환 (Word2Vec)
input으로는 숫자만 가능하기 때문에 텍스트 데이터를 숫자로 변환하는 인코딩 과정임
One Hot Encoding
- 각각 독립적인 벡터
- 문제는 유사도가 없다.
- 유클리디안 거리 유사도 - one hot vector는 셋의 거리가 다 같다.
- cosine similarity - 각도가 다 90이라 0이 됨
Embedding
encoding 대신 embedding을 사용해서 유사도를 구할 수 있게 해야 함
- one hot vector보다 저차원
- 유사도를 가진다
Word2Vec
embedding 중 하나. 비슷한 위치, neighbor words로 부터 유사도를 얻는다.
skipgram
- King brave man
- queen beautiful woman
(3:02)
window size = 1 ⇒ 왼쪽과 오른쪽으로 하나의 이웃만 보겠다.
window size = 2 ⇒ 더 많은 정보 생기겠지
Word2Vec training architecture
- input layer, hidden layer, output layer
- input, output은 6차원 one hot vector이고 hidden layer는 두 노드.
- hidden layer가 word2vec에 해당함. one hot vector 보다 적은 차원의 벡터.
~5:39 설명 - embedding 값이 w1, w2
github
- 유사도를 위해 자주 사용되는 단어 지우기
def remove_stop_words(corpus):
stop_words = ['is', 'a', 'will', 'be']
results = []
for text in corpus:
tmp = text.split(' ')
for stop_word in stop_words:
if stop_word in tmp:
tmp.remove(stop_word)
results.append(" ".join(tmp))
return results
WMD 문서 유사도 구하기 (Word mover's distance)
- Word2Vec의 Euclidean distance를 사용
What is Word2Vec?
- Word Embedding
- Word similarity comes from the word's neighbor words
- You also can easily download pre-trained word2vec
- GoogleNews-vectors-negative300.bin.gz //가장 유명한 pre-trained word2vec
- king brave man
- queen beautiful woman
train data generation with window size 1
(사진)
word가 input, neighbor이 target으로 neural network에 들어감
Word2Vec Training
(사진)
output과 target 값 비교한 다음 back propagation으로 hidden layer에 있는 w1, w2가 optimize 된다.
이렇게 학습을 마치면 hidden layer 값이 word2vec이 되게 됨
Word2Vec Visualization
(사진)
word2vec 값을 이렇게 받았다고 가정하고 그래프를 보면 유사도가 높은 단어끼리 비슷한 위치에 있음
Word Mover's Distance
(사진)
"prince fearless guy" 라는 문장은 2번과 가까울까, 3번과 가까울까?
(사진)
그래프로 보면 "King brave man"과 가까운 것을 확인할 수 있다. ⇒ 문서 유사도가 더 높다
WMD document representation
WMD의 핵심 알고리즘을 알아보기 위해 Normalized Bag of words를 알아야 함
(사진)(사진)
stop words를 지워준다.
Normalized Bag of Words
(사진)
- D0에서 president는 1번 나오니까 1/4, 0.25다.
- D3에서 Obama가 1번 나오니까 1/3, 0.33이다.
이 방법이 normalized bag of words.
- 하지만 실제로 0이라는 값은 사용하지 않으므로 아래와 같이 간단하게 바꿔준다.
- (0지운 사진)
- 이 숫자들의 의미는 문장에서 그 단어의 "함유량"임
(예제사진)
- 녹색 - D0, 파란색 - D1
- Obama와 가장 가까운 단어는 President다. 이 단어 사이의 거리를 유클리디안 거리로 나타내는데, 함유량을 곱해줌
- 모든 단어들의 거리를 합친 값이 문서의 유사도
(사진)
따라서 d0-d1의 유사도가 d0-d2 보다 높다
What if word counts are different?
(사진)
- D3에서 Obama의 함유량은 0.33이고 D0에서 President의 함유량은 0.25다. Obama 함유량의 0.08이 남으므로 다른 단어에 넘겨준다.
(사진)
WMD performance result
- 문서 유사도 측정 방법이 다른 방법에 비해 월등히 뛰어남
WMD drawback
- Slow computation
- Time Complexity: O(p^3 log p)
- ※ p: 문서에서 유니크한 단어의 개수
- 개선된 방법 Relaxed WMD (RWMD): O(p^2)
RWMD
- WMD보다 속도가 훨씬 빠르면서 성능은 비슷함
[딥러닝] 텐서가 무엇인가요?
tensor의 종류
(사진)
- 넘버 하나만 가진 rank 0 텐서: scalar
- scalar를 여러 개 가진 rank 1 텐서: vector
- vector를 여러 개 가진 rank 2 텐서: matrix
- matrix를 아이템으로 가진 rank 3 텐서: 3 tensor
NLP 예제
(사진)
- 자연어 처리에서는 one hot encoding을 기본으로 사용
- 총 네 개의 인덱스가 있고 해당되는 인덱스만 1로 표시
- 단어를 벡터로 표현했으니 문장도 표현 가능함
(사진)
- 벡터를 input으로 넣어줄 때, 미니 배치(뭉치)로 넣어줌
- 각 word는 숫자 4개로 표현되었고, 각 문장은 두 단어로 이루어짐. 세 문장으로 이루어졌으니 3d tensor → (3, 2, 4)
- (sample dimension, max length of sentence, word vector dimension)
Grayscale image 예제
(사진)
- 3d tensor
RGB color image 예제
(사진)
- 4d tensor
RGB color video 예제
(사진)
- 5d tensor
순환 신경망 (RNN)
- I google at work → google: verb
- I work at google → google: noun
⇒ I 다음에 왔으니 verb, at 다음에 왔으니 noun 추론 가능.
이렇게 추론하는 모델이 RNN
Sequence is important for POS tagging
(사진)
- work가 들어왔을 때, 전의 입력값이 영향을 줌
(사진)
- h1의 값이 y1과 h2로 동일하게 나가는 것을 확인할 수 있음
- 이 셀에는 두 가지 weight이 존재함
- x2에 Wxh가 곱해진 값 + 전 state 값에 Whh가 곱해진 값
- 그리고 bias를 더해줌
- 마지막으로 활성화 함수로 tanh를 적용시켜서 딥러닝 모델에 비선형성을 부과시켜줌
- y 값은 활성화 함수 tanh의 출력값
- softmax를 적용시켜서 noun, pronoun, verb, preposition 확률값으로 나옴 (합 = 1)
- 가장 확률이 높은 품사로 분류
학습과정
(사진)
- softmax에 들어가는 input값은 보통 logit이라고 함
- output은 pred
- supervised learning이니 정답은 target이라 하겠음
- 예측값 pred와 target을 비교하며 오류를 줄여나가는 과정
- 줄여나가는 과정으로 통해 Wxh, b, Whh값을 최적화시킨다 → gradient descent
- Wxh, Whh, b가 4개 써있는데 사실 각각 하나의 변수임
- 여러 변수가 아니라 하나의 변수의 변형이라 back propagation이라고 안하고 back propagation through time이라고 함 (BPTT)
Sentiment Analysis
아까는 POS 태깅이었고 이번에는 어떤 감정인지 보겠음
(사진)
- traffic ticket fines: 티켓 벌금 부과 → unhappy
- traffic is fine: 교통이 좋음 → happy
- POS 태깅은 output 값이 중요했는데 Sentiment는 마지막 state 값이 매우 중요함
- 그래서 softmax가 마지막 state을 input으로 받음
simplify of model diagram
(사진)
LSTM (순환신경망 응용)
빈칸 채우기 → 앞 내용 추론으로 간단히 채울 수 있음
이런 문제는 RNN으로 해결 가능하지만, 긴 문장에 대해서는 문제가 있음
RNN 학습을 이해하기에 앞서 gradient descent를 보겠음
gradient descent weight optimization
(사진1)
(사진2)
BPTT with long sequence
(사진)
Gradient Vanishing
(사진)
Gradient Exploding
(사진)
long sequence에서 나오는 이러한 문제 해결을 위해 나온게 LSTM
LSTM: Introducing memory cell in RNN
(사진)
- 새로 추가된 오렌지 색 선: memory cell
(예제 사진1)
- 오렌지 선은 John에 대한 정보를 간직하고 있음
(예제 사진2)
- John에 대한 정보는 좀 잊고 Jane에 대한 정보를 기억해야 함
- 정보를 기억하는 매카니즘, 잊는 매카니즘 등이 LSTM cell에 들어있음
LSTM cell
(사진)
Squence to Squence + attention
- 문제 1: 한-영 문장구조 순서가 다름
- 문제 2: 단어 별로 번역하면 안 됨 3 단어 (how are you) → 2단어 (잘 지내)
RNN 사용
(사진)
- Encoder: 순차적으로 input을 받아 context vector를 만듦
- Decoder: context vector로부터 기계 번역을 시작
⇒ 단어의 수가 많아지면 문제가 생김
(사진)
- context vector는 고정된 크기의 벡터라 많은 input이 들어오면 다 수용하지 못함
solution
- state 별로 context vector를 만들어 dynamic하게 번역하자
- 인코더에 있던 모든 state 중에서 중요한 단어들에만 집중하자
Attention mechanism
(사진1~4)
- Attention weight : focus 할 비율
teacher forcing
- '난'이 나와야 하는데 '나'가 나오는 경우(처음부터 틀린 prediction)
- prediction 값 말로 정답을 input으로 넣어주는 것
# Transformer (Attention is all you need)
* Encoder/Decoder를 반전시킨 모델
* RNN을 사용하지 않음
* Faster, Better
## 어떻게 더 빠를까?
* RNN을 사용하지 않기 때문
* 병렬을 사용해서 한 방에 처리함
### RNN
* 순차적으로 처리
댓글