Machine Learning/시계열 데이터 예측

멀티태스크를 통한 플레이어 수 예측

뉴욕킴 2024. 10. 27. 16:25

플레이어 수 예측

  • 주 태스크로 하고 그 예측값을 사용하여 미분 가능한 효율성 계산을 수행하며 두 태스크의 손실을 동시에 최적화시키기

 

목적: 플레이어 수를 효율성을 계산하며 예측하기

# 1단계: 플레이어 수 예측
predicted_players = model.predict(input_data)

# 2단계: 효율성 계산
efficiency = (predicted_players / (tables * 5)) * 100

 

문제점: 플레이어 수를 예측하고 효율성을 예측하면 두 단계가 독립적으로 수행되어, 효율성 계산이 예측에 영향을 주지 못한다.

# 이렇게 하면 각각 따로 계산됨
predicted_players = model.predict(input_data)  # 첫 번째 모델
efficiency = calculate_efficiency(predicted_players)  # 두 번째 단계

# 문제점:
# - 효율성 계산이 예측에 영향을 주지 못함
# - 두 단계가 독립적으로 수행됨

 

도전: 미분 가능한 효율성 계산을 사용해보자

@tf.function  # 텐서플로우 연산으로 변환
def calculate_efficiency(players, tables):
    players_per_table = tf.math.divide_no_nan(players, tables)
    efficiency = (players_per_table / 5.0) * 100
    return efficiency

class Model(tf.keras.Model):
    def call(self, inputs):
        # 한 번에 계산
        players = self.predict_players(inputs)
        efficiency = calculate_efficiency(players, tables)
        return players, efficiency

 

장점1. 역전파(Backpropagation) 가능

# 효율성 오차가 플레이어 예측에도 영향을 줌
loss = player_loss + efficiency_loss
gradient = tape.gradient(loss, model.variables)

 

장점2. 최적화 

# 만약 실제 상황:
actual_players = 15
actual_tables = 5
target_efficiency = 60%  # (15 / (5 * 5)) * 100 = 60%

# 모델 예측:
predicted_players = 20  # 좀 높게 예측
predicted_efficiency = 80%  # (20 / (5 * 5)) * 100 = 80%

# 두 가지 손실 발생:
player_loss = (20 - 15)²  # 플레이어 예측 오차
efficiency_loss = (80 - 60)²  # 효율성 오차

# 이 두 손실이 모두 영향을 주어 예측 개선

 

이에 대한 효과

# 기존 방식
predicted_players = 20  # 플레이어 수만 보고 예측

# 새로운 방식
predicted_players = 17  # 효율성도 고려하여 예측 조정
# 왜? 효율성이 너무 높아지면 그에 대한 손실도 발생하기 때문

 

결론

 

  • 플레이어 수 예측과 효율성 계산을 하나의 연결된 과정으로 만듦
  • 효율성이 너무 높거나 낮아지는 것을 방지하면서 플레이어 수를 예측
  • 두 가지 목표(정확한 플레이어 수 예측 + 적절한 효율성 유지)를 동시에 달성하려고 시도

 

모델이 플레이어 수만 보는 것이 아니라, 그 예측이 실제로 테이블 효율성에 어떤 영향을 미칠지도 고려하면서 학습하며 " 두 태스크의 손실을 동시에 최적화" 하기 위해 노력.

 

'Machine Learning > 시계열 데이터 예측' 카테고리의 다른 글

[LSTM] T4 GPU와 L4 GPU의 차이  (3) 2024.10.27