더북(TheBook)

4.4.3 똑똑한 스텝

눈을 가린 채로 바위투성이 들판이나 어린 아이 방을 가로지른다고 상상해 보세요. 앞으로 나아가기 위해 주변을 머뭇머뭇 밟아 볼 것입니다. 한 걸음을 내딛고 나면 다른 발로 근처에 평평한 곳이 있는지 찾아보겠죠. 적당한 곳을 발견하면 그곳으로 이동하는 것입니다.

 

In [21]:

# 위아래로 이동하는 가상의 스텝을 보고
# 둘 중 더 나은 결과를 선택합니다
# 선택한 결과로 더 나은 값을 얻을 수 있다면 그 스텝을 채택합니다
num_steps = 1000
step_size = .02

best_guess = np.random.uniform(low=tgt.min(), high=tgt.max())
best_dist = np.sum((tgt - best_guess)**2)
print("start:", best_guess)
for s in range(num_steps):
    # 빼기 연산을 위해 np.newaxis로 데이터 크기를 맞춥니다
    guesses = best_guess + (np.array([-1, 1]) * step_size)
    dists = np.sum((tgt[:,np.newaxis] - guesses)**2, axis=0)

    better_idx = np.argmin(dists)

    if dists[better_idx] > best_dist:
       break

    best_guess = guesses[better_idx]
    best_dist = dists[better_idx]
print("end:", best_guess)
start: 9.575662598977047
end: 8.835662598977063

 

자, 정말 좋지 못한 곳에 갇힌 것이 아니라면, 이 방법으로 무작위 스텝보다 더 좋은 결과를 얻을 수 있습니다. 임의의 위치에서 우리는 가능한 선택지를 확인하고 그중 최고 결과를 얻을 수 있는 선택을 합니다. 아무 도움이 되지 않는 무작위 스텝을 효과적으로 제외함으로써 좋은 답을 향해서 전진할 수 있습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.