텍스트 분류
- Skip-Gram
- SGNS
- Hirarchical softmax
Hirarchical softmax
- 연산이 많아진단 단점의 softmax를 개선하여 Binary Tree 사용
-
Binary Tree
- iForest 알고리즘, DB indexing
- 각 트리마다 나눠서 연산을 함
-
순서
- vocab 생성 단계에서 단어들을 sort
- 출력층을 binary (huffman) tree
- y와 yHat 사이의 차이를 줄이는 방향으로 역전파
- 기존 softmax는 yHat(확률분포 형태)를 구하는 부분에서 계산량이 많다. 이걸 binary tree를 사용하는 것.
-
그렇게 되면 기존 yHat은 0.01, 0.03 ... 등으로 출력됐는데, 0.6, 0.42 등으로 출력되어 기존의 방법보다 계산량이 작아져 속도도 빨라진다.
-
word2vec
- 의미 공간이라는 고차원의 공간에 각 단어의 좌표값(벡터)을 부여한다
- 기준점이 달라지면 숫자도 달라지는 상대적인 거리로 단어 간의 유사도/차이를 분석할 수 있다.
PV-DM
- paragraph vector
-
doc2vec
에 사용됨- distributed word representation(분포확률/가설 이론 사용)
- 한 문장에 같이 쓰인 단어들끼리의 유사성이 높을 것이란 가설 이론
-
word vector 가 아닌 paragraph 단위의 vector 표현
- paragraph : 문장, 문서 단위
- paragraph : 문장, 문서 단위
- word2vec → (발전 시킴) Doc2vec
- USL
- 유사도 계산에 순서 고려까지 하는 알고리즘
그림 출처: 아마추어 퀀트, blog.naver.com/chunjein
- concat 후 lstm 넣으면 정보가 조금은 유실된 채로 넣어지는 것이라 우리는 지금까지 embeding layer 거친 것을 바로 lstm으로 넣었음.
-
원리:
- 문장 -1 "doc#1" : the cat sat on the table 가 있을 때,
- 문장마다 unique한 ID(Paragraph id)를 붙여놓고 이것도 하나의 문장으로 취급함.
-
paragraph vector
- 이것들이 추후엔 word가 됨
- 즉, paragraph token은 또 다른 word라 생각하면 됨
- 모든 문장의 paragraph vector를 공유함
-
따라서
- concat으로 합쳐져서 y 값이 나오도록 역전파
- x의 fix value는 3, y는 1라면, window size = 4로 설정
context x(vocab의 index로 입력) y(vocab의 index로 출력) missing value doc - # 1(7) the(1), cat(3), sat(4) on(13) doc - # 1(7) cat(3), sat(4), on(13) table(8) the(1) 이렇게 학습 시킨다.
*'이렇게 학습' : Distributed memory model of paragraph vector(PV-DM): missing된 값을 기억한다
- 학습 후에는 paragraph vector가 1개의 colum vector(word vector)가 됨
- 단점: 학습 단계는 괜찮은데, prediction 단계에서는 새 문장에 paragraph id를 알 수 없어 값을 넣지 못한다는 점
-
해결: inference step(추론 단계) 필요
- 학습에 사용되지 않은 문장에 대해서는 inference step이 필요하다.
- GD 방법에 의해 얻을 수 있다.
-
따라서 알고리즘 순서:
- 2개의 주 Stage가 있다.
- W, D, U 결정(학습단계) 및 고정
-
inferece stage가 필요
- GD(학습) 통해 알아냄.
- 위에서 학습 완료된 W(embedding layer 거친 word vector), U(softmax 가중치), b(softmax의 bias) 고정 시킴
- 일반적으론 model.fit(x, y)로 학습 한 후, model.predict(x)로 예측했는데
-
inference 때에는 D(paragraph Matrix) 값을 모르니 D를 random하게 둔다
- 따라서 model.fit(x, y)로 학습 한 후, model.predict(new x) 수행
- advantage paragraph vector
PV-DM에서는 다음과 같은 크게 두 가지 단계를 거쳐서 문장의 발화 의 도를 예측한다.
- 주어진 데이터로 W(word vectors), U(softmax weights), b(softmax weights), D(paragraph vectors)를 학습한다.
- 새로운 문장에 대해서 이미 학습했던 W, U, b는 유지하면서 D에 column을 추가하고 기울기 하강기법(gradient descent)을 적용하여 새로운 문장에 대한 벡터(D’)을 만들게 된다. 두 번째 단계에서 얻은 D’은 인식기를 통해 미리 정의한 발화 의도 집합 중 하나로 분류된다
출처: 최성호, 김은솔, 장병탁. 2016. Paragraph Vector를 이용한 문장 의도 예측 기법. 2016년 한국컴퓨터종합학술대회 논문집
PV-DBOW
- PV-DM과 반대
CNN & LSTM
그림 출처: 아마추어 퀀트, blog.naver.com/chunjein
-
Word2vec
: LSTM/CNN- 위 그림 中 1번 그림이다.
- 1개 문장 안에서 단어들의 sequence 분석한다.
- 즉, 순서/흐름에 주목한 모델이다.
-
부족한 부분은 padding 처리하며 time step을 통일 시켜주었다.
-
근데 "time step의 크기를 굳이 통일시킬 필요가 있나?" "어떤 batch는 부족하면 안 되나? "
- 부족해도 된다. 경우에 따라 padding을 써주는데 쓰는 게 일반적이다.
-
-
Doc2vec
:- 위 그림 中 2번 그림일 때, batch가 문장 1개라 sequence 분석이 불가능
- 기계가 입력값을 기억하지 못한다.
-
인공지능 로봇으로 따지면,
나: "지니야 내가 방금 뭐라고 그랬지?"
기계: "무슨 말씀인지 모르겠어요."
- 따라서 3번 그림.
Episodic stroy
개념 사용하여 episode가 batch 역할을 한다. - 기계가 입력값을 기억할 수 있다.
-
인공지능 로봇으로 따지면,
나: "지니야 내가 방금 뭐라고 그랬지?"
기계: "오늘 날씨가 어떠냐고 물어봤죠?"
- 현재 개발이 되고는 있지만 쉽지 않은 영역이라 발전은 더딘 편이다.
- 만약 개발이 된다면, A 작가의 40년치 소설을 모델에 넣어 학습 시켜 가지고 그 작가의 문체적 특징을 파악할 수 있지 않을까?
-
원리:
- 1개 episodic내에서 문장(문단)의 sequence 분석 시행
- LSTM layer에 입력
- chatbot의 경우: 대화 내용의 흐름이 존재. 이걸 학습하기 위해 (내가 챗봇과 대화하는 하나의 세션(대화주제) 개념으로의)episodic story 활용
-
이때, time step을 굳이 지정해서 길이를 통일시키지 않아도 된다.
x.shape = (None, 문장 개수, vector_size)
xInput = Input(batchshape = (None, None, vectorsize))
- 다만, 입력된 문장 개수에 따라 recurrent 횟수가 가변적이다.
- 추후 학습 시: model.fit(x,y, batch_size=1) 필요.
- 단점: 학습 시간이 오래 걸린다.
-
참고:
- 아마추어 퀀트, blog.naver.com/chunjein
- 코드 출처: 전창욱, 최태균, 조중현. 2019.02.15. 텐서플로와 머신러닝으로 시작하는 자연어 처리 - 로지스틱 회귀부터 트랜스포머 챗봇까지. 위키북스