본 글은 메타코드 M에서 제공하는 강좌의 내용이 포함되어 있습니다.
추천 시스템을 설계할 때에는 Collaborative Filtering, MF와 같은 베이스 라인의 모델을 구축하여 성능 테스트를 진행한 성능을 고도화 하기 위한 노력을 진행합니다.
이를 개선하는 방법은 주로 다음 두 방향의 방법이 존재합니다.
이번 글에 정리할 내용은 Deep Learning 모델에 대해 설명하빈다.

딥러닝 기반 회귀모델로 해당 실습에서는 다음의 구성을 지닌다.
from keras.models import Sequential
from keras.layers import Dense, Dropout, BatchNormalization
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping, ReduceLROnPlateau
# Define the model
model = Sequential()
model.add(Dense(128, activation='relu', input_shape=(X_train.shape[1],))) # fully connected, 레이어 입력층 선언
model.add(BatchNormalization()) # 레이어의 출력을 정규화하여 학습을 안정적으로 만듦
model.add(Dropout(0.2)) # 랜덤하게 20% 가중치 삭제
model.add(Dense(64, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(16, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(Dense(1)) #출력층으로, 1개의 노드만 가짐. 출력값이 하나(연속형 값)로
# learning_rate=0.01 학습 속도, 학습이 진행될수록 decay=0.01를 통해 학습률이 점점 감소
optimizer = Adam(learning_rate=0.01, decay=0.01)
model.compile(optimizer=optimizer, loss='mean_squared_error')
early_stopping = EarlyStopping(monitor='val_loss', patience=5, min_delta=0.001) #reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, min_lr=0.0001)
model.fit(X_train, y_train, epochs=20, batch_size=256, validation_split=0.2,
callbacks=[early_stopping, reduce_lr])

# Neural Collaborative Filtering model
n_latent_factors = 64
user_input = Input(shape=(1,))
item_input = Input(shape=(1,))
user_embedding = Embedding(n_users, n_latent_factors)(user_input)
user_vec = Flatten()(user_embedding)
item_embedding = Embedding(n_items, n_latent_factors)(item_input)
item_vec = Flatten()(item_embedding)
concat = Concatenate()([user_vec, item_vec])
dense = Dense(256, activation='relu')(concat)
dense = BatchNormalization()(dense)
dense = Dropout(0.2)(dense)
dense = Dense(128, activation='relu')(dense)
dense = BatchNormalization()(dense)
dense = Dropout(0.2)(dense)
output = Dense(1)(dense)
model = Model([user_input, item_input], output)
model.compile(optimizer='rmsprop', loss='mean_squared_error')
model.fit([X_train['user_id_mapped'], X_train['isbn_mapped']], y_train, epochs=2, batch_size=128, validation_split=0.2)
y_pred = model.predict([X_test['user_id_mapped'], X_test['isbn_mapped']])