• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

미니배치 확률적 경사 하강법

21.02.02 09:46 작성 조회수 457

0

해당 강의와 책에서 미니 배치 확률적 경사하강법이 일반 경사하강법과 비교하였을 떄, 성능 또는 예측 오류 비용의 차이가 거의없으며, 전자가 샘플링을 했기때문에 더 빠른 시간안에 구해졌다고이해했습니다. 그런데 구현한 두 함수를 

time.time() 을 이용해서 시간 비교를  iters=100000 을 두고 했는데 경사하강법이 더 빠른 시간안에 결과를 도출하던데 

10만개의 데이터가 작아서 생기는 문제인가요 아니면 time 패키지를 써서 생기는 문제인가요 아니면 미니배치 확률적 경사하강법이 항상 빠른게 아닌 것 인가요?

+ 추가로, p300~301 예제에서 prev_cost 와 iter_index 는 왜 생성하신 건가요? 혹시 사용한 코드가 누락된게 아닐까요?

답변 2

·

답변을 작성해보세요.

1

loop 내에서 batch의 index를 가져오는 stochastic_random_index = np.random.permutation(X.shape[0]) 가 수행시간의 대부분을 차지하는 군요.

numpy에서 random에 관련된 좀 더 빠른 함수를 찾아봤는데, 매우 빠르게 처리하는 경우를 아직 찾지 못했습니다.

아래 소스와 같이 stochastic_random_index = np.random.permutation(X.shape[0]) 를 Loop 밖으로 빼면 수행 속도가 개선 됩니다.  훌륭한 지적 감사합니다.

import time

def stochastic_gradient_descent_steps(X, y, batch_size=10, iters=1000):
    w0 = np.zeros((1,1))
    w1 = np.zeros((1,1))
    prev_cost = 100000
    iter_index =0
    np.random.seed(0)
    start_time = time.time()

    # 수행 성능을 향상 시키기 위해 iteration loop 밖에서 batch의 index 계산.
    stochastic_random_index = np.random.permutation(X.shape[0])
    #print('start time:', start_time)
    for ind in range(iters):
        # 전체 X, y 데이터에서 랜덤하게 batch_size만큼 데이터 추출하여 sample_X, sample_y로 저장
        #stochastic_random_index = np.random.permutation(X.shape[0])
        sample_X = X[stochastic_random_index[0:batch_size]]
        sample_y = y[stochastic_random_index[0:batch_size]]
        # 랜덤하게 batch_size만큼 추출된 데이터 기반으로 w1_update, w0_update 계산 후 업데이트
        w1_update, w0_update = get_weight_updates(w1, w0, sample_X, sample_y, learning_rate=0.01)
        #w1_update, w0_update = get_weight_updates(w1, w0, X, y, learning_rate=0.01)
        w1 = w1 - w1_update
        w0 = w0 - w0_update
    
    print('end time:', time.time() - start_time)
    
    return w1, w0

0

안녕하십니까,

지적하신대로 강의 설명과 다르게 경사하강법이 더 빠르게 동작하는 군요.

상기 내용은 제가 내용을 다시 검토후에 이번 주말까지 말씀드리겠습니다.

그리고 prev_cost, iter_index는 제가 디버깅용으로 작성한 변수인데 삭제를 안했습니다. 큰 의미가 없습니다.

좋은 지적 감사합니다.