문서 검색 시스템 예제
[2] 컴퓨터는 언어를 어떻게 이해할까?
- Embedding
[BONUS] 벡터 , numpy를 사용한 기본 연산
[3] 문서 검색 시스템 개발
- SentenceBERT
- Streamlit(web application)
상사님 : 검색 시스템 개발해봐
주피터노트북 실험한걸 주면 별로 안좋아하심
내가 혼자 실험 용도로
내가 누군가에게 서비스를 보여주려면 웹 애플리케이션으로
보여드리는게 좋다
잘하는 사람들은 역시 서비스 단위로 기획을 하는구나 ..
Embeddings
- Word2Vec
1-1) Skip-gram
“나 (target) 를 보고 주변 단어(context)를 맞춰봐
- Context : 주변 단어
- Target : 중심 단어
- Window size : 주변 단어 개수
- Context 개수 = window size * 2
나를 보고 주변 단어를 맞춰.!
1-1) Skip -gram
“ 하루 커피 최소 3잔은 마셔야 살 수 있어.”
-window size :2
- Target : “3잔은”
- Context : “커피”, “최소”, “마셔야”, “살”
정답 레이블에 대해 원핫인코딩을 수행해준다.
Error = Actual Target - Model Prediction
파라미터를 업데이트한다.
주변 단어의 “순서” 고려 X
주변 단어의 순서는 고려하기 어렵고 학습하기 어려움
Hidden layer = parameter ?
Source : https://jalammar.github.io/illustrated-word2vec/
학습데이터셋 구성
(입력값, 출력값)
(3잔은, 커피)
(3잔은, 최소)
(3잔은, 마셔야)
(3잔은, 살)
CBOW
“ 주변 단어(context)를 보고 나 (target)를 맞춰봐”
“ 하루 커피 최소 3잔은 마셔야 살 수 있어.”
- 특징
학습 데이터셋
- 주변 단어를 보고 나를 맞춘다
(입력값, 출력값)
(커피, 3잔은)
(최소, 3잔은)
(마셔야, 3잔은)
(살, 3잔은)
대게 Wod2vec은 Skip-gram을 선호
- 학습할 데이터가 많아짐 -> 복잡도가 높아짐
- Word2Vec은 Embedding Matrix와 Context Matrix로 구성됨
Word2vec
- Skip-gram 모델의 단점
-
- weight의 크기가 큼 (이전 예제에서만 300x1000x2 = 6백만)
- 데이터셋이 큼
- 따라서 학습시간이 오래 걸림
- 제안1. Subsampling Frequent Words
- 자주 등장하는 단어를 코퍼스에서 제거함. 따라서 학습 데이터셋에 단어 등장 빈도를 줄임
- 제안2. Negative Sampling(오답만듬) (Skip-gram Negative Sampling; SKNS)
- Logistic Regression task로 변형 (softmax -> sigmoid) + negative sampling (노이즈 추가)해 복잡도 감소
- 3잔은 -> 커피 (맞습니다 : 1) 3잔은 -> 주스 (아닙니다 : 0), 3잔은 -> 물 (아닙니다: 0) (단순 이진분류로 바꿈)
- 학습 과정에서 Embedding Matrix , Context Matrix를 업데이트
- Embedding Matrix를 word embedding으로 사용함
- Dot product : 벡터간의 dot product를 하면 -> 스칼라 값이 나옴 (곱하고 더해주는것 = dot product)
- Hyperparameter
- Window size (context : (window_size-1 ) /2 )
- #negative samples (1이냐 0이냐가 몇개)
- 데이터셋 규모 작아지면 : 5~10 / 데이터셋 규모 크면 : 2~5
- Embedding size (벡터가 몇차원일지 설정 ) -> 크면 클수록 학습속도가 느림
Gensim 실습
Conda activate nlp
Jupyter notebook —help
Jupiter notebook —allow-root —no-browser —port 8889
Pip install gensim
[BONUS] 벡터, numpy를 사용한 기본 연산
Vector (linear algebra)
- Magnitude (값)
- Direction (차원)
2차원 : matrix
Source : https
Vector (computer science)
- 1 dimensional array
- Shape : 각 dimension
[BONUS] 벡터, numpy를 사용한 기본 연산 (보통 L2를 많이 사용함)
Vector norm (L2)
= vector 크기 또는 길이
Dot product
a1b1 + a2b2 + a3b3
= |a||b| cos
= 벡터와 벡터의 유사도를 측정할 때 cosine similarity를 사용함
어떤 문서의 유사도, 클러스터링 -> 단어 문장 유사도 , 단어 길이 찾기 위해 많이 쓰임
비주얼 벡터
[BONUS[ 벡터 numpy를 사용한 기본 연산
Cosine distance
= 1 - cosine similarity
Cosine similarity = 1 -> distance = 0
Cosine similarity = 0 -> distance = 1
Cosine similarity = -1 -> distance = 2
1000억개 뉴스 토큰 등을 공개하고 학습했다고함
300개 단어와 딕셔너리가 들어있음
공개한다 이거 써
https://code.google.com/archive/p/word2vec/
[2] 컴퓨터는 언어를 어떻게 이해할까 ?
Embeddings
- Pre-trained model (BERT: Bidirectional Encoder Representation of
- MLM (Masked Language Model)
- Bidirectional
- 만약 문장내 모든 단어를 본다면 ?
- Next Sentence Prediction
- 두 문장 사이의 관계 학습
정답과 예측값을 비교해서 차이가 너무 크면 다시 back-propagatioin 해서 업데이트 한다
Pre-trained model (BERT)
- MLM (Masked Language Model)
- Mask 를 씌운다
- 앞에 있는 단어로만 학습하지 않는게 아니라 뒤에 있는 단어도 학습한다 bidirectional
- NSP (next Sentence Prediction)
- GPT는 이런게 없음
- Binary classification으로 풉니다
- Semi-supervised -> 사람이 레이블한게 맞아 ?
- Negative data도 만들어야함 -> 학습에 활용
- 금융 코퍼스 가져와서 금융 Bert 만들고
- 뷰티 버트를 만들고 싶으면 뷰티 Bert를 만들고
Source: https://jalammar.github.io/Illustrated-bert
[3] 문서 검색 시스템 개발
SentenceBERT
Fixed-size sentence vector
문장 A와 문장 B가 유사한가
하나의 모델의 문장 2개 인풋으로 넣고 매번 버트 모델이 넣어서 유사도를 비교하기 어려움
Ex) A와 B 비교, A와 C 비교 .. 어려움..
Bert는 워드벡터가 있음
토큰1 부터 토큰 n
문장에 대한 고정된 벡터를 만들면 너무 편하지 않을까 ?
몇 초마다 새로운 문서가 계속 업데이트 됨
문서를 벡터화 함
찐코딩 야식 벡터 유사한 문서를 가져올 수 있지 않을까
비슷한 문장 거리를 계산할 수 있을까 ?
문서간의 유사도, 키워드 간의 유사도를 개발할 것이다
Sham network -> 파라미터가 동일하다
학습을 할때 똑같은 파라미터를 가진, 파라미터를 공유하는 것을 가져옴
얘네들의 유사도를 본다고 할때, supervised learning이기 떄문에
같으면 0, 다르면 1, 정답 유사도간의 비교를 해서 업데이트를 한다
둘 안의 파라미터는 공유된다
새로운 벡터를 만들게 된다. 또 다른 벡터를 만든 다음에
레이어가 하나 있는 classifier에 넣어서 예측하는 모델
조합해서 하는 모델이 sentence 모델인 것이다
Softmax 2개 3개 4개 클래스 모두 가능
Shape 인풋 전체를 넣는다 전체와 더하면 1이 됨
Sigmoid 전체 확률 값을 고려하지 않음
타겟에 위치에 있는 인덱스만 들어간다
Pip install datasets
hugginface.co/datasets/ag_news 에서 label 값을 가져온다
벡터의 연산은 GPU가 CPU보다 빠르다
Bert.
Pip install sentence_transformers
streamlit
웹 어플리케이션을 빠르게 만들 수 있는 UI 사이트
pip install streamlit
streamlit run main.py
numpy.argsort() : 오름차순한 value의 인덱스를 가져와줘
pickle 라이브러리를 통해 바이너리 파일을 바로 저장할 수 있음
임베딩으로 풀수 있는 문제들이 많다
'자연어 처리' 카테고리의 다른 글
자연어처리_챗봇_23-08-14 (0) | 2023.08.14 |
---|---|
자연어처리_챗봇_23-08-11 (0) | 2023.08.14 |
자연어처리_챗봇_23-08-09 (2) | 2023.08.10 |
자연어처리_챗봇구축_23-08-08 (0) | 2023.08.08 |
자연어처리_챗봇구축_230807 (0) | 2023.08.07 |