본문 바로가기

AI/PyTorch

[PyTorch] torch.optim의 인자 model.parameters()

optimizer 클래스 초기화

 

 

제일 중요한 매개변수는 신경망의 파라메터이다. Variable 타입의 파라메터들을 iterable 오브젝트로 넣어줘야한다. 그 외에는 각 optimizer 타입에 따라 learning rate, weight decay 등을 넣어주면 된다.

 

parameters() 메소드는 모듈의 파라메터들을 iterator로 반환한다고 적혀있다.

 

신경망 구조를 구현할때 보통 아래와 같이 하위 모듈을 추가하는식으로 구현을 하기 때문에, 파라메터를 직접 추가할 일이 거의 없었다.

 

class MyModule(torch.nn.Module):
    def __init__(self):
    	super(MyModule, self).__init__()
        self.A = torch.nn.Linear(100, 200)
        self.B = torch.nn.Linear(200, 10)
 	
    def forward(input):
    	return self.B(self.A(input))

 

하위 모듈만 추가해도 자동으로 파라메터가 설정되는 마법(?)은 어떻게 구현된 것일까?

 

 

    def __init__(self):
        """
        Initializes internal Module state, shared by both nn.Module and ScriptModule.
        """
        torch._C._log_api_usage_once("python.nn_module")

        self.training = True
        self._parameters = OrderedDict()
        self._buffers = OrderedDict()
        self._backward_hooks = OrderedDict()
        self._forward_hooks = OrderedDict()
        self._forward_pre_hooks = OrderedDict()
        self._state_dict_hooks = OrderedDict()
        self._load_state_dict_pre_hooks = OrderedDict()
        self._modules = OrderedDict()

 

위 코드는 torch.nn.Module 클래스의 생성자를 정의하는데, _parameters _modules 라는 딕셔너리 타입의 멤버변수들이 있는것을 볼 수 있다. 당연하지만 _paramters는 파라메터들이, _modules에는 하위 모듈들이 들어간다. (key: 이름, value: 인스턴스)

 

조금 더 코드를 읽어본 결과, parameters() 메소드는 먼저 모든 하위 모듈들을 탐색하고(recursive=True), 각 모듈의 _parameters에 들어있는 파라메터들을 하나씩 반환해주는 함수였다.

 

아래의 그림은 모듈의 한 예시인데, 이 경우 A.parameters()를 호출하면, [A.B.weight, A.B.bias, A.C.D.weight, A.C.D.bias]가 반환된다. (물론 recursive=False를 지정하면 직접 A에 속한 파라메터만 반환하는데, 아래 경우에는 아무것도 반환되지 않게된다.)

 

모듈의 트리구조 (예시)


 

torch.optim

신경망 훈련에는 SGD, Adam등의 상황에 따라 다양한 optimizer가 사용된다. 파이토치에서는 torch.optim 모듈을 이용해서 optimizer를 지정하는데, 베이스 클래스인 torch.optim.Optimizer를 상속받아서 여러가.

easy-going-programming.tistory.com

 

 

torch.optim — PyTorch 1.8.1 documentation

torch.optim torch.optim is a package implementing various optimization algorithms. Most commonly used methods are already supported, and the interface is general enough, so that more sophisticated ones can be also easily integrated in the future. How to us

pytorch.org

 

 

torch.nn.Module.parameters() 는 정확히 어떤 값을 돌려줄까?

신경망 파라메터를 optimizer에 전달해 줄 때, torch.nn.Module 클래스의 parameters() 메소드를 사용한다. optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) 위와 같은 경우, parameters()는..

easy-going-programming.tistory.com