본문 바로가기

Python/DeepLearning

List에 값을 append했을 때 List 전체 값이 변하는 현상

def gradient_descent(f, init_x, lr=0.01, step_num=100):
	x = init_x
	output = []
	for i in range(step_num):
		print(x)
		output.append(x)
		print(output)
		grad = numerical_gradient(f, x)
		x -= lr * grad

신경망 공부 중 갱신 과정을 확인하기 위해 리스트에 값을 담으려고 했다. 하지만 제대로 담기지 않는 것을 확인할 수 있었다. print해보면 x는 제대로 움직이고 있는데 막상 리스트는 for문을 반복한 만큼 마지막 값을 가지고 있었다. 논리적으로 맞는거 같은데 왜 안될까 한참 고민했다.

 이유는 같은 개체를 재사용하고 있기 때문이다. 객체지향에 익숙하지 않아서인데 x를 저장한다고 실제로 x의 value가 저장되는 것이 아니라 x의 address를 저장하기 때문이다. 그렇기때문에 바라보고 있는 x값이 변하니 전부 다 변하게 되고 저런 참사가 났던 것이다. (내가 잘 이해한거였으면 좋겠다)

 결과적으로 x가 아닌 x의 value를 직접 넣어주면 해결된다.

def gradient_descent(f, init_x, lr=0.01, step_num=100):
	x = init_x
	output = []
	for i in range(step_num):
		output.append([x[0],x[1]])
		grad = numerical_gradient(f, x)
		x -= lr * grad	
	return output
 
 #[[-3.0, 4.0], [-2.399999999999622, 3.200000000000088], [-1.9199999999982538, 2.5599999999976717], [-1.535999999998758, 2.0479999999971596], [-1.228799999998806, 1.6383999999969276]]