A Neural Probabilistic Language Model
Bengio, Yoshua, Réjean Ducharme, and Pascal Vincent. "A neural probabilistic language model." Advances in Neural Information Processing Systems 13 (2000).
NPLM์ ๋จ์ด๋ฅผ ์๋ฒ ๋ฉํ์ฌ ๋ฒกํฐ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์์ ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ์ ๊ธฐ๋ฒ์ ์ ์ํ์ฌ ํฅํ Word2Vec์ผ๋ก ๊ฐ๋ ๊ธฐ๋ฐ์ด ๋์๋ค๊ณ ํ๋ค.
๊ฐ๋จํ๊ฒ
- ํ์ต ๋ฐ์ดํฐ์ ์กด์ฌํ์ง ์๋ n-gram์ด ํฌํจ๋ ๋ฌธ์ฅ์ด ๋ํ๋ ํ๋ฅ ์ 0์ผ๋ก ๋งค๊ธด๋ค
- n์ 5์ด์์ผ๋ก ์ค์ ํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๋ฌธ์ฅ์ ์ฅ๊ธฐ ์์กด์ฑ์ ํฌ์ฐฉํด๋ด๊ธฐ ์ด๋ ต๋ค.
- ๋จ์ด/๋ฌธ์ฅ ๊ฐ ์ ์ฌ๋๋ ๊ณ ๋ ค ํ์ง ์๋๋ค.
neural net์ ์ฐ๊ธฐ ์ด์ ์๋ smoothing( ์์ ์์๋ฅผ ๋ํด์ 0์ด ์๋์ค๋๋ก) ๋๋ backoff๋ฅผ ์ฌ์ฉํด์ data sparcity๋ฅผ ํด๊ฒฐํ๋ค. long-term dependencies ๋ฌธ์ ๋ n๊ฐ์ ํ ํฐ๋ง ๊ฒ์ํ๋ฏ๋ก ๋ค์ ํ ํฐ์ ์ถ๋ก ํ ์ ์๋ค๋ ๋ฌธ์ ์ธ๋ฐ ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด n์ ๋๋ฆฌ๋ฉด ๋๋ค์ data sparcity์ ๋ง์ฃผํ๊ฒ ๋๋ค. n-gram์ผ๋ก๋ long-term dependencies๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
nplm์ ์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ๋ํ๋ฌ๋ค.
Abstract(Eng)
A goal of statistical language modeling is to learn the joint probability function of sequences of words in a language. This is intrinsically difficult because of the curse of dimensionality: a word sequence on which the model will be tested is likely to be different from all the word sequences seen during training. Traditional but very successful approaches based on n-grams obtain generalization by concatenating very short overlapping sequences seen in the training set. We propose to fight the curse of dimensionality by learning a distributed representation for words which allows each training sentence to inform the model about an exponential number of semantically neighboring sentences. The model learns simultaneously (1) a distributed representation for each word along with (2) the probability function for word sequences, expressed in terms of these representations. Generalization is obtained because a sequence of words that has never been seen before gets high probability if it is made of words that are similar (in the sense of having a nearby representation) to words forming an already seen sentence. Training such large models (with millions of parameters) within a reasonable time is itself a significant challenge. We report on experiments using neural networks for the probability function, showing on two text corpora that the proposed approach significantly improves on state-of-the-art n-gram models, and that the proposed approach allows to take advantage of longer contexts.
Abstract (Kor)
ํต๊ณ ์ธ์ด ๋ชจ๋ธ๋ง์ ๋ชฉํ๋ ์ธ์ด ๋ด ๋จ์ด์ ์ํ์ค์ ๊ณต๋ ํ๋ฅ ํจ์๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฐจ์์ฑ์ ์ ์ฃผ๋ก ์ธํด ๋ณธ์ง์ ์ผ๋ก ์ด๋ ต์ต๋๋ค. ๋ชจ๋ธ์ ํ ์คํธํ ๋จ์ด ์ํ์ค๋ ํ๋ จ ์ค์ ๋ณผ ์ ์๋ ๋ชจ๋ ๋จ์ด ์ํ์ค์ ๋ค๋ฅผ ์ ์์ต๋๋ค. n-gram์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ธฐ์กด์ ๋งค์ฐ ์ฑ๊ณต์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๊ต์ก ์ธํธ์์ ๋ณผ ์ ์๋ ๋งค์ฐ ์งง์ ์ค์ฒฉ ์ํ์ค๋ฅผ ์ฐ๊ฒฐํจ์ผ๋ก์จ ์ผ๋ฐํ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ ํ๋ จ ๋ฌธ์ฅ์ด ์๋ฏธ๋ก ์ ์ผ๋ก ์ธ์ ํ ๋ฌธ์ฅ์ ๊ธฐํ๊ธ์์ ์ธ ์๋ฅผ ๋ชจ๋ธ์ ์๋ฆด ์ ์๋ ๋จ์ด์ ๋ถ์ฐ ํํ์ ํ์ตํจ์ผ๋ก์จ ์ฐจ์์ฑ์ ์ ์ฃผ์ ์ธ์ธ ๊ฒ์ ์ ์ํฉ๋๋ค. ๋ชจ๋ธ์ (1) ๋จ์ด ์ํ์ค์ ๋ํ ํ๋ฅ ํจ์์ ํจ๊ป ๊ฐ ๋จ์ด์ ๋ํ ๋ถ์ฐ ํํ์ ๋์์ ํ์ตํ๋ฉฐ, ์ด๋ฌํ ํํ์ผ๋ก ํํ๋ฉ๋๋ค. ์ผ๋ฐํ๋ ์ด์ ์ ๋ณผ ์ ์์๋ ์ผ๋ จ์ ๋จ์ด๋ค์ด ์ด๋ฏธ ๋ณธ ๋ฌธ์ฅ์ ํ์ฑํ๋ ๋จ์ด์ (์ฃผ๋ณ ํํ์ ๊ฐ๋๋ค๋ ์๋ฏธ์์) ์ ์ฌํ ๋จ์ด๋ก ๋ง๋ค์ด์ง๋ค๋ฉด ๋์ ํ๋ฅ ์ ์ป๊ธฐ ๋๋ฌธ์ ์ป์ด์ง๋๋ค. ํฉ๋ฆฌ์ ์ธ ์๊ฐ ๋ด์ ์๋ฐฑ๋ง ๊ฐ์ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ๋ชจ๋ธ์ ๊ต์กํ๋ ๊ฒ ์์ฒด๊ฐ ํฐ ๊ณผ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ฅ ํจ์์ ์ ๊ฒฝ๋ง์ ์ฌ์ฉํ๋ ์คํ์ ๋ํด ๋ณด๊ณ ํ๋ฉฐ, ์ ์๋ ์ ๊ทผ๋ฒ์ด ์ต์ฒจ๋จ n-๊ทธ๋จ ๋ชจ๋ธ์ ํฌ๊ฒ ๊ฐ์ ํ๊ณ ์ ์๋ ์ ๊ทผ๋ฒ์ด ๋ ๊ธด ๋งฅ๋ฝ์ ํ์ฉํ ์ ์์์ ๋ ๊ฐ์ ํ ์คํธ ๋ง๋ญ์น์ ๋ณด์ฌ์ค๋๋ค.
OverView
Neural Probabilistic Language Model (NPLM) ์ Distributed Representation์ ์ฌ์ฉํ๋ ๋ฐฉ์ ์ค ํ๋์ด๋ค.
Distributed Representation (๋ถ์ฐํํ) ๋ถ์ฐ ํํ์ ๋ถํฌ ๊ฐ์ค์ ์ด์ฉํ์ฌ ํ ์คํธ๋ฅผ ํ์ตํ๊ณ , ๋จ์ด์ ์๋ฏธ๋ฅผ ๋ฒกํฐ์ ์ฌ๋ฌ ์ฐจ์์ ๋ถ์ฐํ์ฌ ํํํจ.
๊ธฐ์กด์๋ ๋๋ถ๋ถ one-hot-encoding์ ์ฌ์ฉํ๋ค. One-hot-encoding๋, ์ ์ฒด Vocabulary์ ๊ฐ ๋จ์ด์ ๋ํด์ ๊ฐ๊ฐ ๊ณ ์ ํ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ๋ค. ๊ฐ ๋จ์ด์ word vector๋ vocabulary ํฌ๊ธฐ์ ๋์ผํ๊ฒ ์์ฑ๋๊ณ , ํด๋น ๋จ์ด์๊ฒ ๋ถ์ฌ๋ ์ธ๋ฑ์ค์ ๊ฐ์ 1๋ก, ๋๋จธ์ง ๊ฐ๋ค์ ๋ชจ๋ 0์ผ๋ก ํํํ๋ ๋ฐฉ์์ด๋ค. ์๋ฅผ ๋ค์ด, arsenal, chelsea, liverpool, manchaster๋ก ๊ตฌ์ฑ๋ volabulary๊ฐ ์กด์ฌํ๋ค๊ณ ํ์ ๋, arsenal์ ํํํ๊ธฐ ์ํด์๋ ์ฒซ ๋ฒ์งธ ๊ฐ์ 1๋ก ํ ๋นํ๊ณ ๋๋จธ์ง ๊ฐ๋ค์ ๋ชจ๋ 0์ผ๋ก ํ ๋นํด์ ํํํ๋ ๋ฐฉ์์ด๋ค.
one-hot-encoding ์ ๋จ์
- ์ ์ฒด vocabulary์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ ๊ฒฝ์ฐ, ํ ๋จ์ด๋ฅผ ๋ํ๋ด๋ ๋จ์ด ๋ฒกํฐ์ ํฌ๊ธฐ๋ ํจ๊ป ์ปค์ง. ์ ์ฒด ๋จ์ด ๋ชฉ๋ก์ด ๋งค์ฐ ์ปค์ง๋ ๊ฒฝ์ฐ, ํ ๋จ์ด๋ฅผ ํํํ๊ธฐ ์ํ ๋ฒกํฐ ๋ํ ๋งค์ฐ ์ปค์ง๋ค.
- ๋ ๋จ์ด ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํํํ์ง ๋ชปํจ. ์๋ก ๋ค๋ฅธ ์๋ฆฌ๊ฐ 1๋ก ๋์ด ์๊ณ , ๋๋จธ์ง ์๋ฆฌ๋ ๋ชจ๋ 0์ด๊ธฐ ๋๋ฌธ์, ๋ ๋ฒกํฐ๋ฅผ ๋ด์ ํ๋ ๊ฒฝ์ฐ ๋ฌด์กฐ๊ฑด 0์ด ๋์จ๋ค. ๋ ๋ฒกํฐ๊ฐ ์ง๊ตํ๋ค๋ ๋ป์ธ๋ฐ, ์ด๋ฌ๋ฉด ๋ ๋ฒกํฐ๋ ๋ฒกํฐ ๊ณต๊ฐ์์ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ค๊ณ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก, one-hot-vector๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ๋ฒกํฐ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ํ๋ผ ์ ์๋ค.
๋ ๋ฒ์งธ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ฐ, ์ค์ ์ํ ์์์๋ ๋จ์ด๋ค ์ฌ์ด์ ๊ด๊ณ๊ฐ ์กด์ฌํ๊ณ , ๊ทธ ๊ด๊ณ๋ฅผ ํํํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด์ distributed representation์ ์ฌ์ฉํ๊ฒ ๋๋ค.
NPLM์์๋ ์ฌํ๊น์ง ์ฃผ์ด์ง ํ์ฌ ๋จ์ด๋ฅผ ์ด์ (n-1)๊ฐ์ ๋จ์ด๋ฅผ ์ด์ฉํด์ ์์ธกํ๊ฒ ๋๋ค. ์ฆ, t๋ฒ์งธ ๋จ์ด๋ (t−1)๋ฒ์งธ ๋จ์ด๋ถํฐ (t−n+1)๋ฒ์งธ ๋จ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ธก์ ํ๋ค๋ ๋ป์ด๋ค. ์ด๋ฅผ ์์์ผ๋ก ์ฐ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
NPLM์ ์์ ์กฐ๊ฑด๋ถ ํ๋ฅ ์ ์ต๋ํํ๋ ๋ฐฉ์์ผ๋ก ํ์ต์ ํ๊ฒ ๋๋ค. ์ด์ ์ (n-1) ๊ฐ์ ๋จ์ด๋ฅผ ์ด์ฉํด์ ํ์ฌ ๋จ์ด๋ฅผ ์์ธกํ๊ธฐ ๋๋ฌธ์, n-gram ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค๊ณ ๋ณผ ์ ์๋ค.
์์ ์กฐ๊ฑด๋ถ ํ๋ฅ ์ ์ต๋ํํ๊ธฐ ์ํด์๋ ๋ถ์๋ฅผ ์ต๋ํํ๊ณ ๋ถ๋ชจ๋ฅผ ์ต์ํํด์ผ ํ๋ค.
NPLM์ ์ถ๋ ฅ์ธต์์๋ V-์ฐจ์์ ์ ์ ๋ฒกํฐ(score vector)์ ํด๋นํ๋ y_wt ๊ฐ์ softmax ํจ์๋ฅผ ํต๊ณผ์์ผ ๋์จ ํ๋ฅ ๋ฒกํฐ๋ฅผ ์ ๊ณตํ๋ค. ํ๋ฅ ๋ฒกํฐ์์ ๋์ ํ๋ฅ ๊ฐ์ด ์ ๊ณต๋๋ ์ธ๋ฑ์ค์ ๋จ์ด๊ฐ (one-hot-vector๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์) ์ค์ ์ ๋ต์ ํด๋นํ๋ ๋จ์ด์ ์ผ์นํ๋๋ก ํ์ต์ ์งํํ๋ค.
NPLM์ ์ ๋ ฅ์ธต์์๋ (n-1)๊ฐ์ ์ ํํ๋ ๋จ์ด๋ค์ one-hot-vector๊ฐ ์ ๋ ฅ์ผ๋ก ๋ค์ด์จ๋ค. One-hot-vector์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ฒกํฐ๋ V-์ฐจ์์ผ ๊ฒ์ด๋ค. ๊ฐ ๋ฒกํฐ๋ค์ C ์ ์ฐ์ฐ์ ํตํด์ ์ง์ ๋ ํฌ๊ธฐ์ธ m์ฐจ์์ ์ ๋ ฅ ๋ฒกํฐ๋ก ๋ณํ๋๋ค. ํด๋น ๋ณํ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ๋ ฅ ๋ฒกํฐ x_t ๊ฐ m ์ฐจ์์ด๊ธฐ ๋๋ฌธ์, ํด๋น ์ฐจ์์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด ๋ด๊ธฐ ์ํด์ C๋ m×|V|์ ์ฐจ์์ ๋ณด์ ํ๊ฒ ๋๋ค. One-hot-vector๋ก ๊ตฌ์ฑ๋ w_t์ C๊ฐ ์ฐ์ฐ์ ํ๋ค๋ ๊ฒ์, Cํ๋ ฌ์์ t ๋ฒ์งธ์ ์ด๋ง ์ฐธ์กฐ(lookup)ํ๋ ๊ฒ๊ณผ ๋์ผํ ์ฐ์ฐ์ด๋ค.
Curse of Dimensionality with Distributed Representations
์ ์๋ ๋จ์ด๋ฅผ ์ปดํจํฐ์๊ฒ ์ ๋ ฅ์ํค๋ ๊ณผ์ ์์ ๊ทธ ์ฐจ์์ด ์ปค์ง๋ ๊ฒ์ด ํ์ต์ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ผ๊ณ ๋งํ๊ณ ์๋ค. ์๋ฅผ ๋ค์ด, 10000๊ฐ์ Vocabulary size๊ฐ ์๊ณ ๋จ์ด๋ฅผ one-hot-encoding ์ผ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด ํด๋นํ๋ ๋จ์ด์ element๋ง 1์ด ๋ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ 0์ด ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋ฒกํฐ๋ sparse vector์ด๋ฉฐ ์ฌ๋ฌ ์ธก๋ฉด์์ ํจ์จ์ฑ์ด ๋งค์ฐ ๋จ์ด์ง๊ณ , Vocabulary size๊ฐ ๋งค์ฐ ํฐ real problem์์๋ ๊ณ์ฐ๋ณต์ก๋๊ฐ ํฌ๊ฒ ๋์ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ต์ ๋ฐฉํดํ ๊ฒ์ด๋ค. ๋ํ ์ ์๋ ๋จ์ด๊ฐ์ ์๋ฏธ์ , ๋ฌธ๋ฒ์ ์ ์ฌ์ฑ์ ํํํ๋ ๊ฒ ์ญ์ ์ค์ํ๋ ์ด๋ฐ ์ ๋ ์ ์ด๋ค์ง์ง ์๊ณ ์๋ค๊ณ ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด ๊ณ ์๋ ๊ฒ์ด ๋ถ์ฐํํ(Distributed Representation) ์ด๋ค.
๋ถ์ฐํํ์ ๋จ์ด๋ฅผ ๊ธฐ์กด์ ์ํซ๋ฒกํฐ์ฒ๋ผ ์ฐจ์์๋ฅผ Vocabulary size ์ ์ฒด๋ก ํ๋ ๊ฒ์ด ์๋๋ผ ๊ทธ๋ณด๋ค ํจ์ฌ ์์ m์ฐจ์ ๋ฒกํฐ๋ก ํํํ์ฌ sparse vector๊ฐ ์๋ Dense vector ๋ก ๋ํ๋ผ ์ ์๊ฒ ํ๋ค. ์ด๋ element๋ค์ discreteํ variable์ด ์๋ continuousํ variable์ธ๋ฐ, ์ ์๋ Continuous variable๋ค์ modeling ํ ๋๊ฐ smoothness ์ธก๋ฉด์์ discrete variable๋ณด๋ค ํจ์ฌ ์ฝ๊ณ ํจ์จ์ ์ด๋ผ๋ฉฐ Continuous variable์ ์ค์์ฑ์ ๊ฐ์กฐํ๊ณ ์๋ค. ์ฐจ์์๋ฅผ ์ค์ด๋ ๊ฒ์ด ์ฃผ ๋ชฉ์ ์ด์ง๋ง element๋ค์ด Continuous variable์ด๊ธฐ ๋๋ฌธ์ ๋ฒกํฐ๊ฐ ์ ์ฌ๋์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ด ๊ฐ๋ฅํ๊ณ ์ด๋ ๊ณง ์์์ ์ธ๊ธํ ๋จ์ด์ ์ ์ฌ์ฑ์ ํํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ๋ป์ด๋ค.
n-gram
Statistical Language Model(ํต๊ณ์ ์ธ์ด๋ชจ๋ธ) ์ ์ด์ ๋จ์ด๋ค์ด ์ฃผ์ด์ก์ ๋์ ๋ํ ๋ค์ ๋จ์ด์ ์กฐ๊ฑด๋ถ ํ๋ฅ ๋ค์ ๊ณฑ์ผ๋ก ํํ๋๋ค.
์ฌ๊ธฐ์ ๋จ์ด ์์๋ฅผ ๊ณ ๋ คํ๋ ์ด์ ์ ์ด๋ฆฌ๊ณ Word Sequence์์ ๊ฐ๊น์ด ๋จ์ด๋ค์ ํต๊ณ์ ์ผ๋ก ๋ dependentํ๋ค๋ ์ฌ์ค์ ์ ์ฉ, ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ ํ์ฌ ์ด์ n-1๊ฐ๋ง์ ๋จ์ด๋ค ํน์ ๋งฅ๋ฝ(context)์ ๋ํ ์กฐ๊ฑด๋ถ ํ๋ฅ ์ ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก n-gram model์ด๋ค.
๊ทธ๋ฌ๋, ๋ง์ฝ ์ด๋ค n๊ฐ์ word sequence๊ฐ Training corpus(๋ง๋ญ์น)์ ์๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น? ํ๋ฅ ์ 0์ผ๋ก๋ ํ ์ ์์๊ฒ์ด๋ค. ์ ์๋ ์๋ก์ด word sequence๋ ์ผ๋ง๋ ์ง ๋ฑ์ฅํ ์ ์๊ณ context๊ฐ ์ปค์ง ์๋ก ๋์ฑ ์ด๋ฐ ์ํฉ์ด ๋น๋ฒํ ๊ฒ์ด๋ผ๊ณ ์๊ธฐํ๋ค. ์ด์ ๋ํ ๋ํ์ ์ธ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ ์์ context๋ฅผ ์ฌ์ฉํด ์ดํด๋ณด๋ Back-off ๋ฐฉ๋ฒ(Katz, 1987)๊ณผ, ํน์ ํ ๊ฐ์ ๋ํด ํ๋ฅ ์ 0์ผ๋ก ๋ง๋ค์ง ์๋ Smoothing ๋ฐฉ๋ฒ์ด ์๋ค. ์ ์๋ ๊ทธ๋ฌ๋, ์ด n-gram ๋ชจ๋ธ์ context ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋จ์ด์์ ์ฐ๊ด์ฑ์ ๊ณ ๋ คํ์ง ์์ผ๋ฉฐ ๋จ์ด๊ฐ ์ ์ฌ์ฑ์ ๊ณ ๋ คํ์ง ์๋๋ค๊ณ ๋งํ๊ณ ์๋ค.
NPLM์ n-gram๋ชจ๋ธ์ ๋ณธ์ง๋ก ํ๋, ์ด๋ฌํ ๋จ์ ๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด ์์์ ์ธ๊ธํ ๋ถ์ฐํํ(Distributed Representation)์ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
what is NPLM?
NPLM (Neural Probabilistic Language Model)์ 2003๋ ์ ๊ฐ๋ฐ๋ ์๋ฒ ๋ฉ ๊ธฐ๋ฒ์ผ๋ก, n-1๊ฐ ๋จ์ด ์์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ n๋ฒ์งธ์ ๋ฑ์ฅํ ๋จ์ด๋ฅผ ๋ง์ถ๋ n-gram ์ธ์ด ๋ชจ๋ธ์ด๋ค.
์ด๋ ๊ธฐ์กด์ ์ธ์ด ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ๋ฌธ์ ์ ์ ๋ณด์ํ ๋ชจ๋ธ์ด๋ค.
- ์กด์ฌํ์ง ์๋ n-gram์ ๋ํ ํ๋ฅ 0์ผ๋ก ๋ถ์ฌํ๋ ๋ฌธ์ ์
- ์ฐจ์์ ์ ์ฃผ : n์ ํฌ๊ฒ ์ค์ ํ๋ฉด ์์ ๊ฐ์ด ํ๋ฅ ์ด 0์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ๋ฌธ์ ์
- ๋จ์ด ๊ฐ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ ์ ์๋ ๋ฌธ์ ์
w_t๋ ๋ฌธ์ฅ์์ t๋ฒ์งธ์ ๋ฑ์ฅํ๋ ๋จ์ด.
index~ for~ w_t๋ t๋ฒ์งธ์์ ๊ฐ๋ฆฌํค๋ one-hot vector์ด๋ค.
ํ๋ ฌ C๋ ๊ฐ ๋จ์ด์ ๋ํ ๋ฒกํฐ๊ฐ ํ์ผ๋ก ์์ฌ ์๋ ํ๋ ฌ์ด๋ฉฐ, ์ด๊ธฐ๊ฐ์ ๋๋ค์ผ๋ก ๋ถ์ฌ๋๋ค.
t๋ ์์ธกํ ๋จ์ด๊ฐ ๋ฑ์ฅํ๋ ์์น์ด๊ณ , n์ ์ ๋ ฅ๋๋ ๋จ์ด ๊ฐ์.
t-(n-1)๋ฒ์งธ๋ถํฐ t-1๋ฒ์งธ ๋จ์ด์ ๋ํ one-hot vector๊ฐ์ด ์ ๋ ฅ์ผ๋ก ๋ค์ด๊ฐ.
์ ๋ ฅ์ธต (input layer)
t-(n-1) ๋ถํฐ t-1๋ฒ์งธ ๋จ์ด ๋ฒกํฐ ์์น๋ฅผ ๋ํ๋ด๋ one-hot vector์ ํ๋ ฌ C๊ฐ ๋ด์ ์ผ๋ก ๊ณฑํด์ง๋ฉฐ ํด๋น ๋จ์ด์ ๋ฒกํฐ๊ฐ์ด ๋์จ๋ค. ์ด ๋์ค๋ ๋ฒกํฐ๊ฐ๋ค์ ๊ฐ๊ฐ x_k๋ผ๊ณ ํ๋ฉฐ ์์ผ๋ก concatenateํ์ฌ x๋ก ๋ํ๋ธ๋ค.
์๋์ธต (hidden layer)
tanh ํจ์๋ฅผ ์ด์ฉํ์ฌ score vector ๊ฐ์ ๊ตฌํ๋ฉฐ, ๊ณต์์ ๋ค์๊ณผ ๊ฐ๋ค.
y = b + Wx + U*tanh(d+Hx) (b, W, U, d, H๋ ๋งค๊ฐ๋ณ์)
(b์ d๋ ๊ฐ๊ฐ bias term H๋ hidden layer์ weights
W๋ input layer์ output layer์ direct connection์ ๋ง๋ค ๊ฒฝ์ฐ์ weights๋ฅผ ์๋ฏธ)
์ถ๋ ฅ์ธต (output layer)
y๊ฐ์ softmax ํจ์๋ฅผ ์ ์ฉ์ํค๋ฉฐ, ์ ๋ต one-hot vector์ ๊ฐ์ ๋น๊ตํ์ฌ ์ญ์ ํ(back-propagation)๋ฅผ ํตํด ํ์ต๋๋ค.
๋จ์ด๋ค์ โฃVโฃ๋ณด๋ค ์์ ์ฐจ์์ ๋ฒกํฐ๋ก ํํํ ์ ์๋ค๋ ์๋ ๋๋ถ์ ์ดํ Word2vec์ผ๋ก ๋ฐ์ ํ ์ ์์๋ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ update ํด์ผํ ํ๋ผ๋ฏธํฐ๊ฐ ๋ถ์ฐํํ์ ๋ด๋นํ๋ C์ธ์๋ H, U๋ฑ์ด ์์ด ์ฌ์ ํ ๊ณ์ฐ๋ณต์ก์ฑ์ด ๋๋ค๋ ๊ฒ์ด ๋ฌธ์ ์ด๋ค. ์ค์ ๋ก Word2Vec์ ์ด๋ฌํ ๋ฌธ์ ์ ์ ๊ณ ์น๊ธฐ ์ํด ํ์ตํด์ผํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ฌ๋๋ค๊ณ ํ๋ค.
์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import torch
import torch.nn as nn
import torch.optim as optim
device = "CUDA" if torch.cuda.is_available() else "cpu"
print(f"Using {device} device")
def make_batch():
input_batch = []
target_batch = []
for sen in sentences:
word = sen.split()#์๋ฅด๊ณ
input = [word_dict[n] for n in word[:-1]] #์ธํ์ 1~ n-1๊น์ง
target = word_dict[word[-1]] # ์์ํ์ n
input_batch.append(input)
target_batch.append(target)
return input_batch, target_batch #๋ฐฐ์น์ฌ์ด์ฆ ๋ง๋ค์ด์ ๋ฐํ
# NPLM ๋ชจ๋ธ ์ ์
class NNLM(nn.Module):
def __init__(self): #๊ณ์ธต(Layer)
super(NNLM, self).__init__()
#์๋ฒ ๋ฉ์ธต
self.C = nn.Embedding(n_class, m) #์๋ฒ ๋ฉํ ๋จ์ด๋ค์ ๊ฐฏ์(๋ฃฉ์
ํ
์ด๋ธ), ์๋ฒ ๋ฉํ ๋ฒกํฐ์ ์ฐจ์
#๋ ์ด์ด ์ธต ์ถ๊ฐ
self.H = nn.Linear(n_step * m, n_hidden, bias=False) #์ธํ = ์คํ
์*์ฐจ์ , ์์ํ = ํ๋ ์ฌ์ด์ฆ
#ํ๋ผ๋ฏธํฐ ์ถ๊ฐ
self.d = nn.Parameter(torch.ones(n_hidden)) #Bias Term
#๋ ์ด์ด ์ธต ์ถ๊ฐ
self.U = nn.Linear(n_hidden, n_class, bias=False) #์ธํ = ํ๋ ์ฌ์ด์ฆ, ์์ํ = ๋ฃฉ์
ํ
์ด๋ธ
#๋ ์ด์ด ์ธต ์ถ๊ฐ
self.W = nn.Linear(n_step * m, n_class, bias=False) #์ธํ = ์คํ
์*์ฐจ์, ์์ํ = ๋ฃฉ์
ํ
์ด๋ธ
#Bias ์ถ๊ฐ
self.b = nn.Parameter(torch.ones(n_class)) #Bias Term
def forward(self, X): #Output ๋ฐํ
X = self.C(X) #์๋ฒ ํ
๋ ์ด์ด์ ๋ฃฉ์
ํ
์ด๋ธ ๋ฃ์
X = X.view(-1, n_step * m) # X๋ฅผ [batch_size, n_step*m]๋ก ํํ ๋ณ๊ฒฝ
tanh = torch.tanh(self.d + self.H(X)) # [batch_size, n_hidden]
output = self.b + self.W(X) + self.U(tanh) # [batch_size, n_class]
# NPLM์ ์ค์ฝ์ด ๋ฒกํฐ y = b + Wx + U*tanh(d+Hx)
return output
if __name__ == '__main__':
n_step = 2 # ์คํ
์ ์, ๋
ผ๋ฌธ์์๋ n-1๋ก ํํ
n_hidden = 2 # ํ๋ ์ฌ์ด์ฆ ์, ๋
ผ๋ฌธ์์์ h
m = 2 # ์๋ฒ ๋ฉ์ฌ์ด์ฆ, ๋
ผ๋ฌธ์์์ m
sentences = ["i like dog", "i love coffee", "i hate milk"]
word_list = " ".join(sentences).split() #join์ผ๋ก ํ์ค๋ก ๋ง๋ ๋ค์์ split์ผ๋ก ์๋ฆ
word_list = list(set(word_list)) #['like', 'coffee', 'love', 'milk', 'hate', 'dog', 'i']
word_dict = {w: i for i, w in enumerate(word_list)} #{'like': 0, 'coffee': 1, 'love': 2, 'milk': 3, 'hate': 4, 'dog': 5, 'i': 6}
number_dict = {i: w for i, w in enumerate(word_list)} #{0: 'like', 1: 'coffee', 2: 'love', 3: 'milk', 4: 'hate', 5: 'dog', 6: 'i'}
n_class = len(word_dict) # 7
model = NNLM()
criterion = nn.CrossEntropyLoss() #๋ค์ค๋ถ๋ฅ
#optim์ ์ฌ์ฉํด์ ๊ฐ์ค์น ๊ฐฑ์ ๋ฐฉ๋ฒ์ ๊ตฌํํจ.
optimizer = optim.Adam(model.parameters(), lr=0.001) #๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ = <generator object Module.parameters at 0x00000221A1AE2EB0>
input_batch, target_batch = make_batch()
input_batch = torch.LongTensor(input_batch) # type intํ์ธ ํ
์๋ก ๋ฐ๊พธ๊ณ
target_batch = torch.LongTensor(target_batch)
# ํ์ต
for epoch in range(5000):
#Pytorch์์๋ gradients๊ฐ๋ค์ ์ถํ์ backward๋ฅผ ํด์ค๋ ๊ณ์ ๋ํด์ฃผ๊ธฐ ๋๋ฌธ"์
#ํญ์ backpropagation์ ํ๊ธฐ์ ์ gradients๋ฅผ zero๋ก ๋ง๋ค์ด์ฃผ๊ณ ์์์ ํด์ผํจ
optimizer.zero_grad()#๋ณํ๋ ๋ฒํผ๋ฅผ 0์ผ๋ก ๋ง๋ฌ. ์ค์
output = model(input_batch)
# output : [batch_size, n_class], target_batch : [batch_size]
#์์ค ํจ์๋ (output, target)์ ํ ์(pair)์ ์
๋ ฅ์ผ๋ก ๋ฐ์,
#์ถ๋ ฅ(output)์ด ์ ๋ต(target)์ผ๋ก๋ถํฐ ์ผ๋ง๋ ๋ฉ๋ฆฌ ๋จ์ด์ ธ์๋์ง ์ถ์ ํ๋ ๊ฐ์ ๊ณ์ฐํจ.
loss = criterion(output, target_batch)
if (epoch + 1) % 1000 == 0:
print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))
loss.backward() #์ญ์ ํํ์ฌ ๊ฐ์ค์น ๋ณํ ์
๋ฐ์ดํธ
optimizer.step() #์
๋ฐ์ดํธ ์งํ
# ์์ธก
predict = model(input_batch).data.max(1, keepdim=True)[1]
# ํ
์คํธ
print([sen.split()[:2] for sen in sentences], '->', [number_dict[n.item()] for n in predict.squeeze()])
A neural probabilistic language model, The Journal of Machine Learning ResearchVolume 33/1/2003 pp 1137–1155
https://misconstructed.tistory.com/35
https://heehehe-ds.tistory.com/entry/NLP-NPLMNeural-Probabilistic-Language-Model
https://velog.io/@donggunseo/NPLM
https://nobase2dev.tistory.com/24