python 랜 덤 경사도 하강 법 실현

이 글 을 보기 전에 지난 편 을 보 세 요python 경사도 하강 법 실현:
1.왜 랜 덤 경사도 하강 알고리즘 을 제시 합 니까?
경사도 하강 법권 값 의 업데이트 방식 을 주의 깊 게 보 세 요.

 즉,매번 업데이트 가중치전체 데이터 세트(그 요구 와 기호 에 주의)를 옮 겨 다 녀 야 합 니 다.데이터 양 이 적 을 때 우 리 는 이런 알고리즘 을 받 아들 일 수 있 습 니 다.데이터 양 이 너무 많 으 면 이 방법 을 사용 하면 수렴 과정 이 매우 느 리 고 여러 부분 극소 값 이 존재 할 때 전체적인 최 적 화 를 보장 할 수 없습니다.이러한 문 제 를 해결 하기 위해 경사도 하강 법의 진급 형식 인 랜 덤 경사도 하강 법 을 도입 했다.
핵심 사상
가중치 의 업 데 이 트 는 모든 데이터 세트 를 옮 겨 다 니 지 않 고 그 중의 샘플 을 선택 하면 됩 니 다.(프로그래머 에 게 당신 의 첫 번 째 반응 은 반드시:여기 서 무 작위 함수 로 샘플 을 선택해 야 하지 않 습 니까?)일반적으로 그 보폭 의 선택 은 경사도 하강 법의 보폭 보다 조금 작다.경사도 하강 법 은 정확 한 경사도 를 사용 하기 때문에 전체 국면 에서 가장 좋 은 것(문제 가 돌출 문제 일 때)을 비교적 큰 폭 으로 교체 할 수 있 지만 랜 덤 경사도 법 은 안 된다.왜냐하면 이것 은 유사 경사도 를 사용 하기 때문이다.또는 전체 국면 에서 볼 때 가끔 은 경사 가 내 려 가 는 방향 이 아 닐 수도 있 기 때문에 걸음 이 느 릴 수도 있다.마찬가지 로 이렇게 가 져 온 장점 은 경사 가 내 려 가 는 방법 에 비해 국부 적 인 최 적 화 에 쉽게 빠 지지 않 는 다 는 것 이다.
3.가중치 업데이트 방식

(i 는 견본 의 레이 블 아래 표 시 를 나타 내 고 j 는 견본 의 차원 아래 표 시 를 나타 낸다)
4.코드 실현(대체적으로 경사도 하강 법 과 같 고 while 순환 중의 내용 과 다르다)

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import style
 
 
#    
def get_data(sample_num=1000):
 """
      
 y = 5*x1 + 7*x2
 :return:
 """
 x1 = np.linspace(0, 9, sample_num)
 x2 = np.linspace(4, 13, sample_num)
 x = np.concatenate(([x1], [x2]), axis=0).T
 y = np.dot(x, np.array([5, 7]).T) 
 return x, y
#     
def SGD(samples, y, step_size=2, max_iter_count=1000):
 """
 :param samples:   
 :param y:   value
 :param step_size:         
 :param max_iter_count:        
 :param batch_size:               
 :return:
 """
 #                theta 
 
 m, var = samples.shape
 theta = np.zeros(2)
 y = y.flatten()
 #     
 loss = 1
 iter_count = 0
 iter_list=[]
 loss_list=[]
 theta1=[]
 theta2=[]
 #       0.01              ,  
 while loss > 0.01 and iter_count < max_iter_count:
 loss = 0
 #    
 theta1.append(theta[0])
 theta2.append(theta[1]) 
 #      
 rand1 = np.random.randint(0,m,1)
 h = np.dot(theta,samples[rand1].T)
 #   ,             
 for i in range(len(theta)):
 theta[i] =theta[i] - step_size*(1/m)*(h - y[rand1])*samples[rand1,i]
 #         ,            
 for i in range(m):
 h = np.dot(theta.T, samples[i])
 #          
 every_loss = (1/(var*m))*np.power((h - y[i]), 2)
 loss = loss + every_loss
 
 print("iter_count: ", iter_count, "the loss:", loss)
 
 iter_list.append(iter_count)
 loss_list.append(loss)
 
 iter_count += 1
 plt.plot(iter_list,loss_list)
 plt.xlabel("iter")
 plt.ylabel("loss")
 plt.show()
 return theta1,theta2,theta,loss_list
 
def painter3D(theta1,theta2,loss):
 style.use('ggplot')
 fig = plt.figure()
 ax1 = fig.add_subplot(111, projection='3d')
 x,y,z = theta1,theta2,loss
 ax1.plot_wireframe(x,y,z, rstride=5, cstride=5)
 ax1.set_xlabel("theta1")
 ax1.set_ylabel("theta2")
 ax1.set_zlabel("loss")
 plt.show()
 
if __name__ == '__main__':
 samples, y = get_data()
 theta1,theta2,theta,loss_list = SGD(samples, y)
 print(theta) #     [5, 7]
 
 painter3D(theta1,theta2,loss_list)
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기