| μΌ | μ | ν | μ | λͺ© | κΈ | ν |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- mature-food
- retrieval augmented generation
- digital health
- fooddist
- hin
- Neo4j
- graphrag
- μΆμ² μμ€ν
- heterogeneous graph attention network
- DeepFM
- heterogeneous graph
- μΆμ²μμ€ν
- heterogeneous graph neural network
- nlp
- food recommender system
- GenAI
- graph
- Factorization Machine
- food recommendation system
- gat
- retrieval-augmented generation
- yum-me
- Machine Learning
- Rag
- Today
- Total
π μνμμ AI 곡λΆνκΈ°
κ·Έλν κΈ°λ° μΆμ² μμ€ν λ³Έλ¬Έ
π‘λ€μ΄κ°λ©°
μΆμ² μμ€ν μ νλ λμ§νΈ μλΉμ€μμ νμμ μΈ μμλ‘ μ리 μ‘μμ΅λλ€. λ·νλ¦μ€μ μν μΆμ², μ νλΈμ λμμ μΆμ², μ¨λΌμΈ μΌνλͺ°μ μν μΆμ² λ± μ°λ¦¬μ μΌμμ κΉμμ΄ νκ³ λ μΆμ² μμ€ν μ μ μ λ μ κ΅ν΄μ§κ³ μμ΅λλ€. μ€λμ μΆμ² μμ€ν μ μ΅μ νΈλ λμΈ 'κ·Έλν κΈ°λ° μΆμ² μμ€ν 'μ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€. κΈ°μ‘΄ μΆμ² μμ€ν μ νκ³μ μ μ§μ΄λ³΄κ³ , κ·Έλν κΈ°λ° μ κ·Όλ²μ΄ μ΄λ»κ² μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νλμ§ μμλ³΄κ² μ΅λλ€.
I. κΈ°μ‘΄μ μΆμ² μμ€ν
κΈ°μ‘΄μ μΆμ² μμ€ν μ λ§μ μ¬μ©μλ€λ‘λΆν° μμ§ν μ νΈ μ 보λ₯Ό λ°νμΌλ‘ λ€λ₯Έ μ¬λμ μ νΈλ₯Ό μμΈ‘νλ λ°©μμΌλ‘ μλν©λλ€. ν¬κ² μ½ν μΈ κΈ°λ° νν°λ§(Content-based Filtering)κ³Ό νμ νν°λ§(Collaborative Filtering) λ κ°μ§ λ°©μμΌλ‘ λλ μ μμ΅λλ€.

μ½ν μΈ κΈ°λ° νν°λ§ (Content-based Filtering)
μ½ν μΈ κΈ°λ° νν°λ§μ μμ΄ν μ νΉμ§μ νμ©νμ¬ μ¬μ©μκ° μ’μνλ μμ΄ν κ³Ό νΉμ§μ΄ λΉμ·ν λ€λ₯Έ μμ΄ν μ μΆμ²νλ λ°©μμ λλ€. μλ₯Ό λ€μ΄, μ¬μ©μκ° λ‘λ§¨ν± μ½λ―Έλ μνλ₯Ό μ£Όλ‘ μμ²νλ€λ©΄, λΉμ·ν μ₯λ₯΄μ λ€λ₯Έ μνλ₯Ό μΆμ²ν΄μ£Όλ λ°©μμ λλ€.
π μλ μ리:
- μμ΄ν (μν, μν λ±)μ νΉμ± μ 보λ₯Ό λΆμ
- μ¬μ©μμ κ³Όκ±° μ νΈ μ΄λ ₯μ λ°νμΌλ‘ μ νΈνλ νΉμ± νμ
- μ μ¬ν νΉμ±μ κ°μ§ λ€λ₯Έ μμ΄ν μΆμ²
νμ νν°λ§ (Collaborative Filtering)
νμ νν°λ§μ λΉμ·ν μ·¨ν₯μ κ°μ§ λ€λ₯Έ μ¬μ©μλ€μ μ νΈλ₯Ό κΈ°λ°μΌλ‘ μΆμ²νλ λ°©μμ λλ€. λ§μ μ¬μ©μλ‘λΆν° μμ§ν νκ° λ°μ΄ν°λ₯Ό λΆμνμ¬ μ μ¬ν μ·¨ν₯μ κ°μ§ μ¬μ©μ κ·Έλ£Ήμ μ°Ύκ³ , κ·Έ κ·Έλ£Ήμ΄ μ’μνλ μμ΄ν μ μΆμ²ν©λλ€.
π μλ μ리:
- μ¬μ©μ-μμ΄ν κ°μ μνΈμμ© λ°μ΄ν° μμ§ (νμ , ν΄λ¦, ꡬ맀 μ΄λ ₯ λ±)
- Matrix Factorization λ±μ κΈ°λ²μ ν΅ν΄ μ¬μ©μμ μμ΄ν μ μ μ¬ μμΈ(latent factor) μΆμΆ
- μ μ¬ν μ νΈλλ₯Ό κ°μ§ μ¬μ©μ κ·Έλ£Ή νμ
- ν΄λΉ κ·Έλ£Ήμ μ νΈ μμ΄ν μΆμ²
Matrix Factorization(MF)μ λν μ΄ν΄
νμ νν°λ§μμ λ리 μ¬μ©λλ Matrix Factorizationμ μ¬μ©μμ μμ΄ν κ°μ νκ° μ 보λ₯Ό λ΄μ Rating Matrixλ₯Ό User Latent Matrixμ Item Latent Matrixλ‘ λΆν΄νλ κΈ°λ²μ λλ€. Rating Matrixλ (μ¬μ©μ μ) × (μμ΄ν μ)λ‘ κ΅¬μ±λλ©°, κ° μ μλ μ¬μ©μμ μμ΄ν νκ° μ μκ° κΈ°λ‘λ©λλ€.
λλΆλΆμ κ²½μ° λͺ¨λ μ¬μ©μκ° λͺ¨λ μμ΄ν μ νκ°νμ§λ μκΈ° λλ¬Έμ Rating Matrixλ λ§μ λΉμΉΈ(sparse matrix)μ ν¬ν¨ν©λλ€. MFλ μ΄λ¬ν νλ ¬ λΆν΄ κ³Όμ μμ λΉμΉΈμ ν΄λΉνλ νμ μ μμΈ‘νλ μν μ ν©λλ€.
νκ° λ°μ΄ν°λ λͺ μμ νΌλλ°±(explicit feedback)μΈ νμ μ΄λ λ³μ μΈμλ, ν΄λ¦, μμ² μκ° λ±μ μμμ νΌλλ°±(implicit feedback)μ νμ©ν μ μμ΅λλ€.
κΈ°μ‘΄ μΆμ² μμ€ν μ νκ³
νμ§λ§ μ΄λ¬ν κΈ°μ‘΄μ μΆμ² μμ€ν μ μ€μ μλΉμ€μ μ μ©νμ λ μ¬λ¬ λ¬Έμ μ μ λλ¬λμ΅λλ€.
- νμ₯μ± λ¬Έμ : μ 체 μ¬μ©μλ₯Ό λμμΌλ‘ μΆμ² κ²°κ³Όλ₯Ό κ³μ°νλ λ° λ무 λ§μ μκ°μ΄ μμλ©λλ€.
- λ°μ΄ν° νμ©μ μ ν: νλ«νΌμ΄ 보μ ν λ€μν λ°μ΄ν°λ₯Ό νΉμ± μ λ³΄λ‘ μΆ©λΆν νμ©νκΈ° μ΄λ ΅μ΅λλ€.
- λͺ¨λΈ μ λ°μ΄νΈ λ¬Έμ : μλ‘μ΄ μ¬μ©μλ μμ΄ν μ΄ μΆκ°λ λλ§λ€ μ 체 λͺ¨λΈμ μ¬νμ΅μμΌμΌ ν©λλ€.
- μ½λ μ€ννΈ λ¬Έμ : μ κ· μ¬μ©μλ μμ΄ν μ κ²½μ° λ°μ΄ν° λΆμ‘±μΌλ‘ μ νν μΆμ²μ΄ μ΄λ ΅μ΅λλ€.
- λ€μμ± λΆμ‘±: μΈκΈ° μλ μμ΄ν λ§ λ°λ³΅μ μΌλ‘ μΆμ²λλ κ²½ν₯μ΄ μμ΅λλ€.
II. κ·Έλν κΈ°λ° μΆμ² μμ€ν
μ΄λ¬ν νκ³λ₯Ό 극볡νκΈ° μν΄ λ€μ΄λ², μκΈ°μ, λ¦¬λ©€λ² λ± λ§μ κΈ°μ λ€μ΄ μ΅κ·Ό κ·Έλν κΈ°λ° μΆμ² μμ€ν μΌλ‘ μ ννκ³ μμ΅λλ€. κ·Έλν κΈ°λ° μ κ·Όλ²μ λ°μ΄ν°λ₯Ό λ Έλ(μ¬μ©μ, μμ΄ν λ±)μ μ£μ§(μνΈμμ©)λ‘ κ΅¬μ±λ λ€νΈμν¬λ‘ λͺ¨λΈλ§νμ¬ λ 볡μ‘ν κ΄κ³λ₯Ό ννν μ μμ΅λλ€.
κ·Έλν κΈ°λ° μΆμ² μμ€ν μ μ₯μ
κ·Έλν κΈ°λ° μΆμ² μμ€ν μ λ€μκ³Ό κ°μ μ₯μ μ μ 곡ν©λλ€:
- λ©λͺ¨λ¦¬ ν¨μ¨μ±: μ ν΄μ§ μμ μΈμ λ Έλλ§ νμν¨μΌλ‘μ¨ λκ·λͺ¨ λ°μ΄ν°μμμ λ©λͺ¨λ¦¬ λ¬Έμ λ₯Ό ν¨κ³Όμ μΌλ‘ ν΄κ²°ν©λλ€.
- λ€μν μ 보 ν΅ν©: μ½ν μΈ κΈ°λ° νν°λ§μ μμ΄ν νΉμ±λ§, νμ νν°λ§μ μ¬μ©μ-μμ΄ν κ΄κ³λ§ μ¬μ©νμ§λ§, κ·Έλν κΈ°λ° μ κ·Όλ²μ νλ«νΌμ΄ κ°μ§ λ€μν μ 보λ₯Ό ν¨κ» νμ©ν μ μμ΅λλ€.
- μ μ°ν μ λ°μ΄νΈ: μ 체 λͺ¨λΈμ μ¬κ΅¬μΆν νμ μμ΄ κ·Έλνμ λ Έλλ μ£μ§λ₯Ό μΆκ°/μμ νλ κ²λ§μΌλ‘ μ λ°μ΄νΈκ° κ°λ₯ν©λλ€.
- μ½λ μ€ννΈ ν΄κ²°: μ κ· μ¬μ©μλ μμ΄ν μ κ³ μ λ°μ΄ν°(λ©νλ°μ΄ν°)λ₯Ό νμ©νμ¬ λ λμ μ΄κΈ° μΆμ²μ΄ κ°λ₯ν©λλ€.
μ€μ μ¬λ‘

1. λ€μ΄λ²μ μΆμ² μμ€ν
λ€μ΄λ²λ Deview 2020μμ 'μΆμ²μμ€ν 3.0'μ λ°ννλ©° κ·Έλν κΈ°λ° μ κ·Όλ²μΌλ‘μ μ νμ 곡μ νμ΅λλ€. κΈ°μ‘΄ μΆμ² λͺ¨λΈμ λΉν΄ CTR(ν΄λ¦λ₯ )μ΄ μ΅λ 16% ν₯μλλ μ±κ³Όλ₯Ό κ±°λμμ΅λλ€.
2. μκΈ°μμ YoSEMITE
μκΈ°μλ GNN(Graph Neural Network)μ νμ©ν YoSEMITE μΆμ² λͺ¨λΈμ κ°λ°νμ΅λλ€. κΈ°μ‘΄ λͺ¨λΈκ³Ό λΉκ΅νμ¬ ν΄λ¦ CVRμ΄ 4.51%, μ£Όλ¬Έ CVRμ΄ 14.84%, κ²°μ κΈμ‘μ΄ 12.80% μ¦κ°νλ ν¨κ³Όλ₯Ό μ»μμ΅λλ€.
3. 리멀λ²μ μΈμ¬ μΆμ² μμ€ν
리멀λ²λ μ§μ κ·Έλνλ₯Ό νμ©νμ¬ μΈμ¬ μΆμ² μμ€ν μ ꡬμΆνμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ μ ννκ³ κ΄λ ¨μ± λμ μΈμ¬ λ§€μΉμ΄ κ°λ₯ν΄μ‘μ΅λλ€.
κ·Έλν λ°μ΄ν° κ΅¬μΆ λ°©λ²
ν μ΄λΈ ννμ λ°μ΄ν°λ² μ΄μ€λ₯Ό κ·Έλνλ‘ λ³ννλ κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€:
1. κ·Έλν κ΅¬μ± μμ μ μ
- λ Έλ(Nodes): μ¬μ©μ, μμ΄ν λ± κ·Έλνμ κ°μ²΄
- μ£μ§(Edges): λ Έλ κ°μ κ΄κ³(μ: μ¬μ©μκ° μμ΄ν μ νμ μ λ¨κΉ)
- λ Έλ νΉμ±(Features): κ° λ Έλμ μμ± μ 보
- λΌλ²¨(Labels): μμΈ‘νκ³ μ νλ λμ(μ: νμ )
2. λ Έλ νΉμ± μΆμΆ
κ° λ Έλμ IDλ₯Ό λΆμ¬νκ³ κ΄λ ¨ νΉμ±μ μΆμΆν©λλ€. μλ₯Ό λ€μ΄:
- μν λ Έλ: μ₯λ₯΄, μ ν(TV/μν), μνΌμλ μ λ±
- μ¬μ©μ λ Έλ: νκ· νμ , νκ° νμ λ±
3. νΉμ± μΈμ½λ©
λ²μ£Όν νΉμ±μ μ-ν« μΈμ½λ©(One-hot encoding)κ³Ό κ°μ λ°©λ²μΌλ‘ λ³νν©λλ€.
4. μ£μ§ μ 보 μΆμΆ
λ Έλ κ°μ κ΄κ³λ₯Ό λνλ΄λ μ£μ§ μ 보λ₯Ό μΆμΆν©λλ€(μ: μ¬μ©μκ° μνμ λ¨κΈ΄ νμ ).
5. κ·Έλν λ°μ΄ν°μ ꡬμΆ
PyTorch Geometricκ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©νμ¬ μ΄μ’ κ·Έλν(Heterogeneous Graph)λ₯Ό ꡬμΆν©λλ€.
III. κ·Έλν κΈ°λ° μΆμ² μμ€ν ꡬν μμ
Anime Recommender Databaseλ₯Ό μ¬μ©ν κ·Έλν κΈ°λ° μΆμ² μμ€ν ꡬν κ³Όμ μ κ°λ΅ν μ΄ν΄λ³΄κ² μ΅λλ€.
1. λ°μ΄ν°μ ꡬμ±
ν΄λΉ λ°μ΄ν°μ μ λ κ°μ μ£Όμ ν μ΄λΈλ‘ ꡬμ±λ©λλ€:
- anime ν μ΄λΈ: μ λλ©μ΄μ ID, μ λͺ©, μ₯λ₯΄, μ ν, μνΌμλ μ, νμ λ±
- rating ν μ΄λΈ: μ¬μ©μ ID, μ λλ©μ΄μ ID, νμ

2. κ·Έλν κ΅¬μ± μμ μ μ
μ΄μ’ κ·Έλν(Heterogeneous graph) ννλ‘ λ°μ΄ν°λ₯Ό λͺ¨λΈλ§ν©λλ€:
- λ Έλ μ ν: μ¬μ©μ(User), μ λλ©μ΄μ (Anime)
- μ£μ§: μ¬μ©μκ° μ λλ©μ΄μ μ νμ μ λΆμ¬ν¨
- λ Έλ νΉμ±: μ λλ©μ΄μ (μ₯λ₯΄, μ ν, μνΌμλ μ), μ¬μ©μ(νκ· νμ , νκ° νμ)
- λΌλ²¨: μμΈ‘ν νμ κ°
3. ꡬν κ³Όμ
μ λλ©μ΄μ λ Έλ νΉμ± μΆμΆ:
# λ
Έλμ ID λΆμ¬
sorted_df = anime.sort_values(by="anime_id").set_index("anime_id")
sorted_df = sorted_df.reset_index(drop=False)
movie_id_mapping = sorted_df["anime_id"]
# λ
Έλ νΉμ± μ ν
node_features = sorted_df[["type", "genre", "episodes"]]
# μ₯λ₯΄ μ²λ¦¬ (첫 λ²μ§Έ μ₯λ₯΄λ§ μ ν)
genres = node_features["genre"].str.split(",", expand=True)
node_features["main_genre"] = genres[0]
# μ-ν« μΈμ½λ©
anime_node_features = pd.concat([node_features, pd.get_dummies(node_features["main_genre"])], axis=1, join='inner')
anime_node_features = pd.concat([anime_node_features, pd.get_dummies(anime_node_features["type"])], axis=1, join='inner')
anime_node_features.drop(["genre", "main_genre"], axis=1, inplace=True)

μ¬μ©μ λ Έλ νΉμ± μΆμΆ:
# μ¬μ©μλ³ νκ· νμ κ³Ό νκ° νμ κ³μ°
mean_rating = rating.groupby("user_id")["rating"].mean().rename("mean")
num_rating = rating.groupby("user_id")["rating"].count().rename("count")
user_node_features = pd.concat([mean_rating, num_rating], axis=1)
# μ¬μ©μ ID μ¬λ§€ν (0λΆν° μμ)
user_node_features = user_node_features.reset_index(drop=False)
user_id_mapping = user_node_features["user_id"]
μ£μ§ μ 보 μΆμΆ:
# ID λ§€ν μ μ©
movie_map = movie_id_mapping.reset_index().set_index("anime_id").to_dict()
rating["anime_id"] = rating["anime_id"].map(movie_map["index"]).astype(int)
user_map = user_id_mapping.reset_index().set_index("user_id").to_dict()
rating["user_id"] = rating["user_id"].map(user_map["index"]).astype(int)
# μ£μ§ μΈλ±μ€ μΆμΆ
edge_index = rating[["user_id", "anime_id"]].values.transpose()
κ·Έλν λ°μ΄ν°μ ꡬμΆ:
from torch_geometric.data import HeteroData
data = HeteroData()
# λ
Έλ νΉμ± μ μ₯
data['user'].x = user_node_features
data['movie'].x = anime_node_features
# μ£μ§ μΈλ±μ€ μ μ₯
data['user', 'rating', 'movie'].edge_index = edge_index
# λΌλ²¨ μ 보 μ μ₯
data['user', 'movie'].y = y
IV. κ²°λ‘ π―
κ·Έλν κΈ°λ° μΆμ² μμ€ν μ κΈ°μ‘΄ μΆμ² μ κ·Όλ²μ νκ³λ₯Ό ν¨κ³Όμ μΌλ‘ 극볡νλ©°, λ μ ννκ³ λ§₯λ½μ λ§λ μΆμ²μ μ 곡ν©λλ€. λ€μ΄λ², μκΈ°μ, λ¦¬λ©€λ² λ± μ€μ μλΉμ€μμμ μ±κ³΅ μ¬λ‘λ κ·Έλν κΈ°λ° μ κ·Όλ²μ ν¨κ³Όλ₯Ό μ μ¦ν©λλ€.
μ£Όμ μ₯μ μΌλ‘λ νμ₯μ± ν₯μ, λ€μν λ°μ΄ν° ν΅ν© λ₯λ ₯, μ μ°ν λͺ¨λΈ μ λ°μ΄νΈ, μ½λ μ€ννΈ λ¬Έμ ν΄κ²° λ±μ΄ μμ΅λλ€. νΉν μ κ· μ¬μ©μλ μμ΄ν μ λν μΆμ² μ±λ₯μ΄ ν¬κ² ν₯μλμ΄, μΆμ² μμ€ν μ μ λ°μ μΈ νμ§μ λμΌ μ μμ΅λλ€.
μμΌλ‘ κ·Έλν μ κ²½λ§(GNN)κ³Ό κ°μ κ³ κΈ κΈ°μ μ νμ©ν κ·Έλν κΈ°λ° μΆμ² μμ€ν μ λμ± λ°μ ν κ²μΌλ‘ μμλ©λλ€. μ¬λ¬λΆμ μλΉμ€μλ κ·Έλν κΈ°λ° μ κ·Όλ²μ κ³ λ €ν΄λ³΄λ κ²μ΄ μ’κ² μ΅λλ€.
μ°Έκ³ λ¬Έν:
- λ€μ΄λ² Deview 2020, "μΆμ²μμ€ν 3.0: λ₯λ¬λ νκΈ°μλμμ λ°μ΄μ΄μ€, κ·Έλν, κ·Έλ¦¬κ³ μΈκ³Όκ΄κ³μ μ€μμ±"
- μκΈ°μ κΈ°μ λΈλ‘κ·Έ, "GNNμ νμ©ν μκΈ°μμ μΆμ² λͺ¨λΈ YoSEMITE"
- λ¦¬λ©€λ² λΉ λ°μ΄ν°μΌν° AI Lab, "μ§μ κ·Έλνλ₯Ό μ΄μ©ν μΈμ¬ μΆμ² μμ€ν "
- "Converting a Tabular Dataset to a Graph Dataset for GNNs", https://youtu.be/AQU3akndun4
'Food_Health_AI > μΆμ² μμ€ν ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| Heterogeneous Graph Attention Networkμ μ΄ν΄μ νμ© (0) | 2025.04.07 |
|---|---|
| κ·Έλν κΈ°λ° μΆμ² μμ€ν : GraphSAGEμ μ리μ νμ© (0) | 2025.04.03 |
| DeepFM (0) | 2025.03.30 |
| Factorization Machine (FM) (2) | 2025.03.30 |