-
카테고리
-
세부 분야
딥러닝 · 머신러닝
-
해결 여부
미해결
미니배치 확률적 경사 하강법
21.02.02 09:46 작성 조회수 457
0
해당 강의와 책에서 미니 배치 확률적 경사하강법이 일반 경사하강법과 비교하였을 떄, 성능 또는 예측 오류 비용의 차이가 거의없으며, 전자가 샘플링을 했기때문에 더 빠른 시간안에 구해졌다고이해했습니다. 그런데 구현한 두 함수를
time.time() 을 이용해서 시간 비교를 iters=100000 을 두고 했는데 경사하강법이 더 빠른 시간안에 결과를 도출하던데
10만개의 데이터가 작아서 생기는 문제인가요 아니면 time 패키지를 써서 생기는 문제인가요 아니면 미니배치 확률적 경사하강법이 항상 빠른게 아닌 것 인가요?
+ 추가로, p300~301 예제에서 prev_cost 와 iter_index 는 왜 생성하신 건가요? 혹시 사용한 코드가 누락된게 아닐까요?
답변을 작성해보세요.
1
권 철민
지식공유자2021.02.08
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
권 철민
지식공유자2021.02.03
안녕하십니까,
지적하신대로 강의 설명과 다르게 경사하강법이 더 빠르게 동작하는 군요.
상기 내용은 제가 내용을 다시 검토후에 이번 주말까지 말씀드리겠습니다.
그리고 prev_cost, iter_index는 제가 디버깅용으로 작성한 변수인데 삭제를 안했습니다. 큰 의미가 없습니다.
좋은 지적 감사합니다.
답변 2