๐ ํ์ฌ ์๋ฃ ๋งํฌ : https://colab.research.google.com/drive/148V1ytOU36pT4oX1fbcWUaC3B6F4O62s?usp=sharing
Glove
๐ก ๋ ผ๋ฌธ : https://nlp.stanford.edu/pubs/glove.pdf
1๏ธโฃ glove python
โ ๊ฐ๋ ๋ณต์ต
- ์นด์ดํธ ๊ธฐ๋ฐ + ์์ธก ๊ธฐ๋ฐ์ ๋ชจ๋ ์ฌ์ฉํ๋ ๋จ์ด ์๋ฒ ๋ฉ ๋ฐฉ๋ฒ๋ก
- ์นด์ดํธ ๊ธฐ๋ฐ์ LSA ์ ์์ธก ๊ธฐ๋ฐ์ Word2Vec ์ ๋จ์ ์ ์ง์ ํ๋ฉฐ ๋ณด์ํ๋ค๋ ๋ชฉ์ ์ผ๋ก ๋ฑ์ฅ
โ LSA
- ๊ฐ ๋ฌธ์์์์ ๊ฐ ๋จ์ด์ ๋น๋์๋ฅผ ์นด์ดํธ ํ ํ๋ ฌ์ด๋ผ๋ ์ ์ฒด์ ์ธ ํต๊ณ ์ ๋ณด๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ฐจ์์ ์ถ์(Truncated SVD)ํ์ฌ ์ ์ฌ๋ ์๋ฏธ๋ฅผ ๋์ด๋ด๋ ๋ฐฉ๋ฒ๋ก
- ์ฝํผ์ค์ ์ ์ฒด์ ์ธ ํต๊ณ ์ ๋ณด๋ฅผ ๊ณ ๋ คํ๊ธฐ๋ ํ์ง๋ง '์ผ๋ณธ : ๋์ฟ = ํ๊ตญ : ์์ธ' ๊ฐ์ ๋จ์ด ์๋ฏธ์ ์ ์ถ ์์ (Analogy task)์๋ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค.
โ Word2Vec
- ์ค์ ๊ฐ๊ณผ ์์ธก๊ฐ์ ๋ํ ์ค์ฐจ๋ฅผ ์์ค ํจ์๋ฅผ ํตํด ์ค์ฌ๋๊ฐ๋ฉฐ ํ์ตํ๋ ์์ธก ๊ธฐ๋ฐ์ ๋ฐฉ๋ฒ๋ก
- ๋จ์ด ๊ฐ ์ ์ถ ์์ ์๋ LSA๋ณด๋ค ๋ฐ์ด๋์ง๋ง, ์๋ฒ ๋ฉ ๋ฒกํฐ๊ฐ ์๋์ฐ ํฌ๊ธฐ ๋ด์์๋ง ์ฃผ๋ณ ๋จ์ด๋ฅผ ๊ณ ๋ คํ๊ธฐ ๋๋ฌธ์ ์ฝํผ์ค์ ์ ์ฒด์ ์ธ ํต๊ณ ์ ๋ณด๋ฅผ ๋ฐ์ํ์ง ๋ชปํ๋ค.
- ๋ฒกํฐํ ๊ณ์ฐ ๋ฐฉ๋ฒ : (์๋ฒ ๋ฉ ๋ ์ค์ฌ ๋จ์ด์ ์ฃผ๋ณ ๋จ์ด ๋ฒกํฐ์ ๋ด์ ) ≡ (์ ์ฒด ์ฝํผ์ค ๋ด ๋์ ๋ฑ์ฅ ํ๋ฅ ) ์ด ๋๋๋ก ํ๋ค.
- glove model ์ input ์ ๋ฐ๋์ ๋์๋ฑ์ฅํ๋ ฌ ํํ์ฌ์ผ ํ๋ค โญ
โ ๋์๋ฑ์ฅํ๋ ฌ
โ ๋์๋ฑ์ฅํ๋ฅ
- P(k|i) : ๋์๋ฑ์ฅ ํ๋ ฌ๋ก๋ถํฐ ํน์ ๋จ์ด i (์ค์ฌ ๋จ์ด) ์ ์ ์ฒด ๋ฑ์ฅ ํ์๋ฅผ ์นด์ดํธํ๊ณ , ํน์ ๋จ์ด i ๊ฐ ๋ฑ์ฅํ์ ๋ ์ด๋ค ๋จ์ด k (์ฃผ๋ณ ๋จ์ด) ๊ฐ ๋ฑ์ฅํ ํ์๋ฅผ ์นด์ดํธํ์ฌ ๊ณ์ฐํ ์กฐ๊ฑด๋ถ ํ๋ฅ
โ ์์คํจ์
๐๐ฆบ ๋ผ์ด๋ธ๋ฌ๋ฆฌ import
๐พ glove library
pip install glove_python_binary # ์ฝ๋ฉํ๊ฒฝ
# ๋๋ ์๋ ์ฝ๋
pip install glove_python
(1) ๋์๋ฑ์ฅํ๋ ฌ ์์ฑ
- ์ด์ ์์์ ๋ฌธ์ฅ ๋จ์ด ์ ์ฒ๋ฆฌ+ํ ํฐํ๊ฐ ์ ํ๋์ด์ผ ํจ!
from glove import Corpus, Glove
corpus = Corpus() # vocab ๋จ์ด ์ฌ์ ์ ๋ง๋ค์ด์ฃผ๋ ํจ์ (glove ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด์ฅ๋จ)
# ํ๋ จ ๋ฐ์ดํฐ๋ก๋ถํฐ Glove ์์ ์ฌ์ฉํ ๋์๋ฑ์ฅ ํ๋ ฌ ์์ฑํ๊ธฐ
corpus.fit(result, window = 5)
## corpus ์
๋ ฅ์ผ๋ก๋ ๋ฐ๋์ โญํ ํฐํ๋ ๋ฐ์ดํฐ ํํ์ฌ์ผ ํ๋ค.
## โญ window : ๊ณ ๋ คํ ์ฃผ๋ณ๋จ์ด ๊ฐ์
๐ ๊ตฌ๋ณ๋๋ ๋จ์ด๊ฐ 54775๊ฐ์์ ํ์ธํ ์ ์์!
(2) Glove ๋ชจ๋ธ ํ์ต
# ๋ชจ๋ธ ํ์ต
glove = Glove(no_components = 100, learning_rate = 0.05)
## โญ no_compoenents : 100์ฐจ์์ผ๋ก ์๋ฒ ๋ฉ๋ ๋ฒกํฐ๋ฅผ output ์ผ๋ก ๋์ค๋๋ก
# ํ์ต์ ์ด์ฉํ thread ๊ฐ์๋ 4๋ก ์ค์ . ์ํฌํฌ๋ 20
glove.fit(corpus.matrix, epochs = 20 , no_threads = 4, verbose = False)
## โญ corpus.matrix : ๋์๋ฑ์ฅํ๋ ฌ
- glove ๋ ๋์๋ฑ์ฅํ๋ ฌ์ ์ ๋ ฅ์ผ๋ก ๋ฐ๋๋ค.
(3) ํ๋ ฌ์ index ์ ๋ณด๋ฅผ ์ ๋ ฅ
glove.add_dictionary(corpus.dictionary)
- ์ ์ฌ์ด ๊ฒ์์ ์ํด์๋ sparse matrix ์ ๊ฐ row, column index ์ ํด๋นํ๋ vocabulary ์ ์ ๋ณด๊ฐ ํ์ ๐ dictionary ๋ฅผ add_dictionary ํจ์๋ฅผ ํตํ์ฌ ์ ๋ ฅ
(4) ๊ฒฐ๊ณผ ํ์ธ
print(glove.most_similar("man"))
print(glove.most_similar("america"))
๐พ gensim library
# glove๋ word2vec๊ณผ๋ ์ฝ๊ฐ ๋ค๋ฅธ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋จ์ด ์๋ฒ ๋ฉ์ด๋ค.
# English๋ง ๊ฐ๋ฅ
# ๊ทธ๋ฌ๋ ๋์ผํ ์์ฑ๊ณผ API๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
import gensim.downloader as api
model = api.load("glove-wiki-gigaword-50")
model
model = gensim.models.KeyedVectors.load_word2vec_format('~/gensim-data/glove-wiki-gigaword-50/glove-wiki-gigaword-50.gz')
print(model)
2๏ธโฃ pre-trained glove
โ ์ฌ์ ํ์ต๋ชจ๋ธ
- ์ํคํผ๋์ ๋ฑ๊ณผ ๊ฐ์ ๋ฐฉ๋ํ ์ฝํผ์ค๋ฅผ ๊ฐ์ง๊ณ Word2vec, FastText, GloVe ๋ฑ์ ํตํด์ ๋ฏธ๋ฆฌ ํ๋ จ๋ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ
- kaggle ๋ํ์์ ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ์ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ด ํ์ฉํจ
- ์์์ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ ๋ชจ๋ธ์ ๊ฐ์ค์น๋ค์ ๋ค๋ฅธ ๋ฌธ์ ์ ํ์ต์ํจ ๊ฐ์ค์น๋ค๋ก ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ด๋ค.์ฌ์ ํ์ตํ ๊ฐ์ค์น๋ฅผ ํ์ฉํด ํ์ตํ๊ณ ์ ํ๋ ๋ณธ๋ ๋ฌธ์ ๋ฅผ ํ์๋ฌธ์ ๋ผ๊ณ ํ๋ค.
- pre-trained data ๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆผ
โ ์ค์ต ์์ : ๋ฌธ์ฅ์ ๊ธ๋ถ์ ์ ํ๋จํ๋ ๊ฐ์ฑ๋ถ๋ฅ ๋ชจ๋ธ ๋ง๋ค๊ธฐ
(1) ์ผ๋ผ์ค embedding layer
๐ ์ผ๋ผ์ค์ ์๋ฒ ๋ฉ์ธต
- ์ผ๋ผ์ค๋ ํ ์คํธ ๋ฐ์ดํฐ์ ๋ํด ์๋ ์๋ฒ ๋ฉ์ ์ํํ๋ Embedding layer ๋ฅผ ์ ๊ณตํ๋ค.
- ํ์ฌ ๊ฐ์ง๊ณ ์๋ ํ๋ จ ๋ฐ์ดํฐ๋ก ์ฒ์๋ถํฐ ํ์ต์ ์งํํ๋ ๋ฐฉ๋ฒ : Embedding( )
- ์ด๋ค ๋จ์ด → ๋จ์ด์ ๋ถ์ฌ๋ ๊ณ ์ ํ ์ ์๊ฐ → ์๋ฒ ๋ฉ์ธต → ๋ฐ์ง๋ฒกํฐ(=์๋ฒ ๋ฉ ๋ฒกํฐ)
- ๋ฐ์ง๋ฒกํฐ๋ ์ธ๊ณต์ ๊ฒฝ๋ง์ ํ์ต๊ณผ์ ์์ ๊ฐ์ค์น๊ฐ ํ์ต๋๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ๋ จ๋๋ค.
๐จ great์ ์ ์ ์ธ์ฝ๋ฉ ๊ณผ์ ์์ 1,918์ ์ ์๋ก ์ธ์ฝ๋ฉ์ด ๋์๊ณ ๊ทธ์ ๋ฐ๋ผ ๋จ์ด ์งํฉ์ ํฌ๊ธฐ๋งํผ์ ํ์ ๊ฐ์ง๋ ํ ์ด๋ธ์์ ์ธ๋ฑ์ค 1,918๋ฒ์ ์์นํ ํ์ ๋จ์ด great์ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ก ์ฌ์ฉ
๐จ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ ๋ชจ๋ธ์ ์ ๋ ฅ์ด ๋๊ณ , ์ญ์ ํ ๊ณผ์ ์์ ๋จ์ด great์ ์๋ฒ ๋ฉ ๋ฒกํฐ๊ฐ์ด ํ์ต๋จ
๐พ Embedding
vocab_size = 20000
output_dim = 128
input_length = 500
v = Embedding(vocab_size, output_dim, input_length=input_length)
- vocab_size = ํ ์คํธ ๋ฐ์ดํฐ์ ์ ์ฒด ๋จ์ด ์งํฉ์ ํฌ๊ธฐ
- output_dim = ์๋ ์๋ฒ ๋ฉ ํ์ ์๋ฒ ๋ฉ ๋ฒกํฐ์ ์ฐจ์
- input_length = ์ ๋ ฅ ์ํ์ค์ ๊ธธ์ด. ๋ง์ฝ ๊ฐ๊ณ ์๋ ๊ฐ ์ํ์ ๊ธธ์ด๊ฐ 500๊ฐ์ด๋ผ๋ฉด ์ด ๊ฐ์ 500 ์ด๋ค.
- Embedding ์ 2D ์ ์ ํ ์๋ฅผ ์ ๋ ฅ๋ฐ๊ณ 3D ์ค์ ํ ์๋ฅผ ์ถ๋ ฅ์ผ๋ก ๋ฆฌํดํ๋ค.
1. ๋ฌธ์ฅ์ ๊ธ๋ถ์ ์ ํ๋จํ๋ ๊ฐ์ฑ๋ถ๋ฅ ๋ชจ๋ธ
import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
sentences = ['nice great best amazing', 'stop lies', 'pitiful nerd', 'excellent work', 'supreme quality', 'bad', 'highly respectable']
y_train = [1, 0, 0, 1, 1, 0, 1]
2. ์ผ๋ผ์ค ํ ํฌ๋์ด์ ๋ฅผ ์ฌ์ฉํด ๋จ์ด ์งํฉ ์์ฑ
tokenizer = Tokenizer()
tokenizer.fit_on_texts(sentences)
vocab_size = len(tokenizer.word_index) + 1 # ๐ ํจ๋ฉ์ ๊ณ ๋ คํ์ฌ +1 (0๊ฐ)
print('๋จ์ด ์งํฉ : ', vocab_size)
3. ์ ์ ์ธ์ฝ๋ฉ ์ํ
X_encoded = tokenizer.texts_to_sequences(sentences)
print('์ ์ ์ธ์ฝ๋ฉ ๊ฒฐ๊ณผ : ', X_encoded)
4. ํจ๋ฉ ์งํ
X_encoded = tokenizer.texts_to_sequences(sentences)
print('์ ์ ์ธ์ฝ๋ฉ ๊ฒฐ๊ณผ : ', X_encoded)
5. ๋ชจ๋ธ ์์ฑ ๋ฐ ํ๋ จ
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, Flatten
embedding_dim = 4
model = Sequential()
model.add(Embedding(vocab_size, embedding_dim, input_length = max_len))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics=['acc'])
model.fit(X_train, y_train, epochs=100, verbose=2)
ํ์ต ๊ณผ์ ์์ ํ์ฌ ๊ฐ ๋จ์ด๋ค์ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ค์ ๊ฐ์ ์ถ๋ ฅ์ธต์ ๊ฐ์ค์น์ ํจ๊ป ํ์ต๋๋ค.
(2) ์ฌ์ ํ๋ จ๋ ์๋ ์๋ฒ ๋ฉ
1. ์ฌ์ ํ๋ จ๋ glove ๊ฐ์ ธ์ค๊ธฐ
- glove.68.zop ์ ๋ค์ด๋ก๋ํ๊ณ ์์ถ์ ํ์ด์ glove.6B.100d.txt ํ์ผ์ ์ฌ์ฉํด ํด๋น ํ์ผ์ ์๋ ์ฌ์ ํ๋ จ๋ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ค์ ๋ถ๋ฌ์จ๋ค. 40๋ง๊ฐ ๋จ์ด ์๋ฒ ๋ฉ ๋ฒกํฐ๊ฐ ์กด์ฌํ๋ค.
from urllib.request import urlretrieve, urlopen
import gzip
import zipfile
urlretrieve("http://nlp.stanford.edu/data/glove.6B.zip", filename="glove.6B.zip")
zf = zipfile.ZipFile('glove.6B.zip')
zf.extractall()
zf.close()
# โญ ์ฌ์ ํ๋ จ๋ glove ๊ฐ์ ธ์ค๊ธฐ
import numpy as np
embedding_dict = dict() # ์ฌ์ ํ๋ จ๋ ์๋ฒ ๋ฉ ๋ฒกํฐ ์ฌ์ : key , value ํํ๋ก ๊ฐ์ ธ์ด
f = open('glove.6B.100d.txt', encoding="utf8") # glove.6B.100d.txt์ ์๋ ๋ชจ๋ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ค์ ๋ถ๋ฌ์จ๋ค
for line in f:
word_vector = line.split()
word = word_vector[0]
# 100๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ array๋ก ๋ณํ
word_vector_arr = np.asarray(word_vector[1:], dtype='float32')
embedding_dict[word] = word_vector_arr
f.close()
print('%s๊ฐ์ Embedding vector๊ฐ ์์ต๋๋ค.' % len(embedding_dict))
# 40๋ง๊ฐ์ ์๋ฒ ๋ฉ ๋ฒกํฐ ๊ฐ์ ธ์ค๊ธฐ
2. 'respectable' ๋จ์ด์ ๋ํด ์๋ฒ ๋ฉ๋ ๋ฒกํฐ ํ์ธํด๋ณด๊ธฐ
๋ฌธ์ฅ ๊ธ๋ถ์ ์์ ๋ฌธ์ฅ์์ tokenizer ์ ์ฉํ ๊ฒ (1๋ฒ keras ์ฝ๋ ์ฐธ๊ณ )
print(tokenizer.word_index.items()) # ๊ธฐ์กด ๋ฐ์ดํฐ์ ๊ฐ ๋จ์ด์ ๋งคํ๋ ์ ์๊ฐ
###################
dict_items([('nice', 1), ('great', 2), ('best', 3), ('amazing', 4), ('stop', 5), ('lies', 6), ('pitiful', 7), ('nerd', 8), ('excellent', 9), ('work', 10), ('supreme', 11), ('quality', 12), ('bad', 13), ('highly', 14), ('respectable', 15)])
print('๋จ์ด great์ ๋งตํ๋ ์ ์ :',tokenizer.word_index['great'])
###################
๋จ์ด great์ ๋งตํ๋ ์ ์ : 2
3. ์ฌ์ ํ๋ จ๋ ์๋ ๋ฒกํฐ ํ๋ ฌ๋ก๋ถํฐ, ๊ธฐ์กด ๋ฌธ์ฅ์์ ์ถ์ถ๋ ๋จ์ด์ฌ์ ์ธ๋ฑ์ค์ ๋งคํ๋๋๋ก ๊ฐ์ ์ถ์ถ
for word, index in tokenizer.word_index.items():
# ๋จ์ด์ ๋งตํ๋๋ ์ฌ์ ํ๋ จ๋ ์๋ฒ ๋ฉ ๋ฒกํฐ๊ฐ
vector_value = embedding_dict.get(word)
if vector_value is not None:
embedding_matrix[index] = vector_value
4. ๋ชจ๋ธ ํ๋ จ
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, Flatten
output_dim = 100
model = Sequential()
# โญ embedding layer ์ ์ด๊ธฐ๊ฐ์ผ๋ก embedding_matrix ๋ฅผ ์ค์ ํ๋ค.
# ์ฌ์ ํ๋ จ๋ ์๋ ์๋ฒ ๋ฉ์ 100์ฐจ์์ ๊ฐ์ธ ๊ฒ์ผ๋ก ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ ๋ฉ ์ธต์ output_dim์ ์ธ์๊ฐ์ผ๋ก 100์ ์ค
e = Embedding(vocab_size, output_dim, weights=[embedding_matrix], input_length=max_length, trainable=False)
# โญ trainable = False : ์ฌ์ ํ๋ จ๋ ์๋ฒ ๋ฉ์ ๊ทธ๋๋ก ์ฌ์ฉ (์ถ๊ฐํ๋ จ X)
model.add(e)
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
model.fit(X_train, y_train, epochs=100, verbose=0)
3๏ธโฃ fine tuning glove
โ Fine-Tuning
- ์ฌ์ ํ์ตํ ๋ชจ๋ ๊ฐ์ค์น์ ๋๋ถ์ด ํ์ ๋ฌธ์ ๋ฅผ ์ํ ์ต์ํ์ ๊ฐ์ค์น๋ฅผ ์ถ๊ฐํด ๋ชจ๋ธ์ ์ถ๊ฐ๋ก ํ์ตํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- pretrained model ์ ๋ฐ์ดํฐ์ ์ ์๋ ๋จ์ด๊ฐ ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ ํน์ ๋ฐ์ดํฐ ์งํฉ์ด ๋๋ฌด ์์์ ์ ์ฒด ๋ชจ๋ธ์ ํ๋ จ์ํค๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์ fine tuning ์ ์ฌ์ฉํ๋ค.
โ Mittens
- pre-trained ๋ glove ๋ชจ๋ธ ํ์ฉ์์ ์๋๋ฅผ ๊ฐ์ ํ package
pip install -U mittens
from mittens import GloVe
https://github.com/roamanalytics/mittens
'1๏ธโฃ AIโขDS > ๐ NLP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[cs224n] 13๊ฐ ๋ด์ฉ์ ๋ฆฌ (0) | 2022.07.04 |
---|---|
NER ์ค์ต (0) | 2022.06.02 |
[cs224n] 12๊ฐ ๋ด์ฉ์ ๋ฆฌ (0) | 2022.05.23 |
[cs224n] 11๊ฐ ๋ด์ฉ ์ ๋ฆฌ (0) | 2022.05.19 |
ํ ์คํธ ๋ถ์ โก (0) | 2022.05.17 |
๋๊ธ