ย
3๊ฐ ์ปจํ ์ธ ๊ธฐ๋ฐ ๋ชจ๋ธ
Intoduction
์ปจํ
์ธ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์๊ด๊ด๊ณ๋ฅผ ํตํด ์ ์ฌ์ฑ์ ๋ฐ๊ฒฌํ๊ณ ์ถ์ฒ์ ํ๋ ๋ฐฉ๋ฒ์์ ์กฐ๊ธ ๋ฒ์ด๋ ์ปจํ
์ธ ์ฌ์ด์ ์ ์ฌ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ถ์ฒ์ ํด์ฃผ๋ ๋ชจ๋ธ์
๋๋ค. ์๋ฅผ ๋ค์ด ์์ด์ธ๋งจ ์ํ๋ฅผ ์ฌ๋ฐ๊ฒ ๋ณธ ์ฌ๋์๊ฒ ์ด์ ๋น์ทํ ์ํ์ธ ์ด๋ฒค์ ธ์ค๋ ๋ง๋ธ์๋ฆฌ์ฆ ์ํ๋ฅผ ์ถ์ฒํด ์ฃผ๋ ๋ฐฉ์์ด์ฃ . ์ด๋ฌํ ๋ฐฉ์์ ์๋ก์ด ์์ดํ
์ด๋ ํ๊ฐ๊ฐ ์ ์ ์์ดํ
์ ์ ์ฉํ๊ธฐ ์ข์ต๋๋ค.
ย
Word2Vec
word2vec๋ชจ๋ธ์ ๊ธฐ์กด์ ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ง๋ค์ด์ง ๋ชจ๋ธ์
๋๋ค. ์ ๋ค ๋จ์ด๋ฅผ ํตํด ๋จ์ด๋ฅผ ์ ์ฐจ์์ ๋ฒกํฐ๋ก ์๋ฒ ๋ฉํ๋ ๋ฐฉ์์ด์ฃ . ์ฌ๊ธฐ์ ๋จ์ด๋ฅผ ์์ดํ
์ผ๋ก ๋ฐ๊พธ๊ฒ ๋๋ฉด ์ธ์ ํ ์์ดํ
๋ค์ ํตํด ์์ดํ
์ ๋ฒกํฐํํ ์ ์์ต๋๋ค. ๊ตฌ๊ธplay์์๋ ์ด์ ๊ฐ์ ๋ด์ฉ์ Item2vec์ด๋ผ๋ ๋ชจ๋ธ๋ก ์๊ฐํ์์ต๋๋ค.
ย
CBOW
Word2Vec๋ชจ๋ธ ์ค ํ๋์ธ CBOW๋ชจ๋ธ์ ์ฃผ๋ณ ๋จ์ด๋ค์ ํตํด ์ค์ฌ ๋จ์ด๋ฅผ ์์ธกํ๋ ๋ชจ๋ธ์
๋๋ค. ์ฃผ๋ณ ๋จ์ด๋ค์ ๊ฐ์๋ฅผ window size๋ผ๊ณ ๋ถ๋ฅด๊ณ window๋ฅผ ๊ณ์ ์ฎ๊ฒจ ๊ฐ๋ฉฐ ํ์ต์ ์งํํฉ๋๋ค.
์์ ๊ทธ๋ฆผ์์ w(t)๊ฐ ์ค์ฌ ๋จ์ด์ด๊ณ ๋๋จธ์ง w(t-2) ~ w(t+2)๊น์ง๊ฐ ์ฃผ๋ณ ๋จ์ด์
๋๋ค. ๊ฐ๊ฐ์ ์ฃผ๋ณ๋จ์ด์ ๋ํด์ ๊ฐ์ ์์
์ ๋ฐ๋ณตํด ์ฃผ๊ณ ํ๊ท ์ ๋ด๊ธฐ ๋๋ฌธ์ ํ๋์ ์ฃผ๋ณ ๋จ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ธ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์์ ๊ทธ๋ฆผ์ ํ๋์ ์ฃผ๋ณ ๋จ์ด์ ๋ํ ๋ชจ๋ธ์ ์ธ๋ถ์ ์ธ ๊ตฌ์กฐ์
๋๋ค. ์ด ์ธ๊ฐ์ layer๊ฐ ์๊ณ 2๊ฐ์ ๊ฐ์ค์น ๋ฒกํฐ๊ฐ ์กด์ฌํฉ๋๋ค. Input layer์๋ one-hot ์ธ์ฝ๋ฉ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ง ๋จ์ด ๋ฒกํฐ๊ฐ ๋ค์ด์ต๋๋ค. x๋ v์ฐจ์์ ๋ฒกํฐ์ด๊ณ ์ฒซ๋ฒ์งธ ๊ฐ์ค์น ๋ฒกํฐ์์ ์ฐ์ฐ์ ํตํด N์ฐจ์์ ๋ฒกํฐ๋ก ๋ณํ๋ฉ๋๋ค. N์ฐจ์์ ๋ฒกํฐ๋ ๋ค์ ๊ฐ์ค์น์์ ์ฐ์ฐ์ ํตํด v์ฐจ์์ ๋ฒกํฐ๋ก ๋ณํ๊ฒ ๋ฉ๋๋ค.
์์ ํ๋ฅ ์ ์ต๋ํ ํ๋ ๊ฒ์ด ์ด ๋ชจ๋ธ์ ๋ชฉ์ ์
๋๋ค.
hidden layer์ ์ํ๋ ๋ฒกํฐ๋ค์ ์์ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.
output layer์ ์ํ๋ ๋ฒกํฐ๋ค์ hidden layer๋ฒกํฐ์ Wโ๊ฐ์ค์น๋ฅผ ๊ณฑํ ํํ์
๋๋ค.
softmaxํจ์๋ฅผ ์ด์ฉํด ์ ๊ทํ๋ฅผ ํด์ค๋๋ค.
๋ง์ง๋ง์ผ๋ก ํฌ๋ก์ค ์ํธ๋กํผ๋ฅผ ์ฌ์ฉํ์ฌ loss๊ฐ์ ๊ตฌํฉ๋๋ค.
ย
ํฌ๋ก์ค ์ํธ๋กํผ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํ loss๊ฐ๊ณผ ์ญ์ ํ ๋ฐฉ๋ฒ์ ํตํด ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํ๋ฉฐ ์ค์ฐจ๋ฅผ ์ค์ฌ๋๊ฐ๋๋ค. optimization ๋ฐฉ๋ฒ์ผ๋ก๋ SGD๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ย
ย
Word2vec ์ถ์ฒ์์คํ ๊ตฌํ
#ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ import pandas as pd import numpy as np from sklearn.feature_extraction.text import TfidfVectorizer import gensim
#๊ฒฝ๋ก์ค์ ํ๊ธฐ path_meta = "./drive/MyDrive/machine_learning/movies_metadata.csv" path_ratings = "./drive/MyDrive/machine_learning/ratings.csv"
#ํ๋ค์ค๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ, ๋ฐ์ดํฐ ์ ๋ ฌ movie = pd.read_csv(path_ratings) movie = movie.sort_values(by='timestamp', ascending=True).reset_index(drop=True)
#๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ, column์ด๋ฆ์ ๋ฐ๊พธ๊ณ ๋ฐ์ดํฐ ๋ณํฉ meta = pd.read_csv(path_meta) meta = meta.rename(columns={'id':'movieId'}) movie['movieId'] = movie['movieId'].astype(str) meta['movieId'] = meta['movieId'].astype(str) movie = pd.merge(movie, meta[['movieId', 'original_title']], how='left', on='movieId'
movie = movie[movie['original_title'].notnull()].reset_index(drop=True)
#userId๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด์ฃผ๊ธฐ agg = movie.groupby(['userId'])['original_title'].agg({'unique'}) agg.head()
#๊ฐ๊ฐ์ user๊ฐ ๋ณธ ์ํ๋ผ๋ฆฌ ๋ฌถ์ด์ ์ ์ฅํ๊ธฐ sentence = [] for user_sentence in agg['unique'].values: sentence.append(list(map(str, user_sentence)))
#word2vec ๋ชจ๋ธ ํ์ต from gensim.models import Word2Vec embedding_model = Word2Vec(sentence, size=20, window = 5, min_count=1, workers=4, iter=200, sg=1)
#๊ฒฐ๊ณผํ์ธ embedding_model.wv.most_similar(positive=['The Phantom of the Opera'], topn=10)