ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 강화학습 추천 알고리즘 모델
    카테고리 없음 2024. 12. 3. 01:42

    강화학습 기반 추천 알고리즘은 모델을 만드는 과정이다.

     

    강화학습은 에이젼트가 환경과 상호작용 하며 보상을 최대화 하도록 학습하는 방법이다.

     

    이걸 아로마플레이어 플랫폼에 적용하면, 사용자와 플랫폼 간의 상호작용 데이터를 기반으로 시간이 지날수록 더 나은 추천을 할 수 있는 모델을 만드는 것이다.

     

    간단한 앞으로의 과정을 살펴보면,

    1. 에이젼트 : 추천 알고리즈밍 에이전트 역할을 한다.

    2. 환경 : 사용자와 상호작용 데이터를 환경으로 삼는다. 즉 영상이 될것이다.

    3. 상태 : 사용자의 현재 행동, 과거 선호도, 관심사 같은 정보가 상태로 표현된다.

    4. 행동 : 에이젼트가 추천하는 아이템. 즉 영상이 된다.

    5. 보상 : 사용자가 좋아요를 누르거나 시청을 위해 섬네일을 클리가게 되면 보상이 주어지고, 그렇지 않으면 낮은 보상이 부여된다.

     

    백엔드가 거의 완성된 지금, 강화학습 모델을 학습한다.

     

    aormaplayer의 video 도메인을 보면 

    조회수

    좋아요수

    싫어요수

    플레이리스트

    클릭률

     

    보상 = w1 * 조회수 증가 + w2 * 좋아요 획득 - w3 * 싫어요 획득 + w4 * 클릭률 + w5 * 플레이리스트 추가

     

    이런식으로 식을 작성해볼 수 있다. w는 가중치이다.

     

    DB데이터만으로는 총 영상 재생시간을 알 수 없고, 실시간으로 수집하거나 로그 시스템을 구축해야한다.

     

    DB를 거치지 않고 사용자 행동 로그를 수집해 모델을 학습할 수도 있는데 

    예를들면 재생시작 로그, 재생종료 로그를 둘다 알면 차이로 재생시간을 알 수 있다.

     

    레디스를 활용해 실시간 재생 시간을 캐싱할 수도 있다. (대규모로 커질 시)

     

    총 재생시간을 보상으로 활용하면 단순 클릭, 조회수로 이루어진 보상보다 더 정교한 알고리즘을 만들 수 있다.

     

    또한 영상마다 특성이나 기준(카테고리)가 있어야 강화학습이 학습할 수 있다.

     

    가장 기본적인 특성이라 하면 제목인데, 비슷한 제목을 추천해줄 수도 있다.

     

    생각해야할 것.

     

    즉 영상마다 어떤 기준을 부여할지 업로드 단계에서부터 정해야하고, DB에도 저장해야한다.

    그러나 현재 DB에는 강화학습의 기준이 되는 Feature이 없다.

     

    또한 DB안의 모든 영상 데이터를 알아야 추천해줄때도 Video_ID로 Spring에 넘겨주어야 하는가? 에 대한 문제도 생길 수 있다.

     

    만약 Redis를 활용한다고 하더라도 전체 데이터가 Redis 메모리에 올라가는것은 무리가 있기 때문에 각 카테고리의 인기영상 등 특정 조건에 맞는 영상들만 리스트업해서 Redis에 동기화시키고 그 데이터를 통해 파이썬과Spring에서 활용하는 방안이 적합해 보인다.

     

    또한 모든 사용자에 대해 주기적으로 추천데이터를 생성하면 부하가 커지기 때문에

    최근에 활동한 사용자만 추천데이터를 생성한다던지, 어느 데이터가 이상 확보된 유저들 부터 순차적으로 일정 시간마다 업데이트를 하는식으로 최적화 과정이 있어야 한다.

     

    카테고리도 생각해보아야 하는데, 일관성을 위해 프론트에서 정해진 카테고리가 아닌 이상 입력할 수 없도록 해야한다.

     

     

     

    DB와의 접근방식

    일반적으로 SpringBoot의 서버와 파이썬 모델의 서버를 별개로 가동 후 api로 통신하는 방법을 사용한다.

    혹은 직접 DB와 소통하도록 할 수 있는데 어차피 항상 spring서버가 돌아기때문에 전자의 방식을 사용하는것이 좋아보인다.

     

    즉 작업흐름이 다음과 같다.

     

    1. 클라이언트 -> SpringBoot 요청

    2. SpringBoot -> Python 서버 요청

    3. Python 서버에서 전달받은 상태데이터를 기반으로 강화학습 모델 실행 -> SpringBoot로 추천 결과 반환

    4. SpringBoot -> 클라이언트

     

     


    데이터가 충분하지 않은 사용자들을 대상으로는 부하도 문제지만 초기에 추천해줄 알고리즘이 필요하다.

     

    가입시 간단한 설문조사로 취향을 체크하고, 취향기반 인기 콘텐츠를 추천해준 다음, 강화학습의 조건을 넘길떄까지 콘텐츠 기반 추천알고리즘을 통해 데이터를 확보하고 이후 강화학습을 통해 더 개인화시켜나가는 방법이 초기 데이터가 별로 없는 아로마 플레이어에 적합해 보인다.

     

    콘텐츠 기반 추천 알고리즘은 단순히 사용자가 시청한 영상의 카테고리에 기반에 비슷하 영상을 추천해주는 방식이다.

     

    여기서도 java로 직접 코사인유사도 등 코드를 직접 구현하는 방식, 파이썬으로 라이브러리를 사용해 강화학습을 사용하는 서버에서 구동하는 방식 두가지가 존재한다.

     


    결론 (구현해야 할것들)

     

    프론트와의 협업 - 처음 가입을 진행할때 간단한 설문조사 진행, 영상업로드 시 정해진 카테고리로만 입력 가능하도록

     

    백엔드 - 스프링에 작업해야할 것

    User_Video_Interaction 테이블 설계 (사용자가 본 동영상, 좋아요, 조회시간, 클릭로그 등 상태data저장 table)

     

    콘텐츠 기반 추천은 spring boot으로 구동, 강화학습 추천 모델 설계 및 구현은 파이썬으로.

     

    강화학습 모델 설계

     

    강화학습 모델을 정의

    상태(state): 사용자의 시청 기록, 클릭 수, 좋아요 등

    행동(action): 추천할 동영상

    보상(reward): 동영상 클릭, 재생 시간, 좋아요 수.

     

    데이터 준비

    DB에서 사용자 행동 데이터를 가져오는 Python 스크립트 작성

    User_Video_Interaction 데이터를 Pandas DataFrame으로 로드.

     

    강화학습 구현

    Python으로 강화학습 알고리즘 구현

    Stable-Baselines3 또는 커스텀 DQN/REINFORCE 알고리즘 사용

    모델 학습 스크립트 작성:

    학습된 모델을 파일(model.zip)로 저장.

     

    강화학습 모델 API 서버

    Flask 또는 FastAPI로 Python 모델을 RESTful API로 감싸기

    API 엔드포인트: /recommend

    입력: 사용자 ID, 상태 데이터

    출력: 추천 동영상 리스트.

Designed by Tistory.