은닉층의 설계는 어떻게 해야 하는지요?

안녕하세요.

최근 파이토치와 딥러닝에 관심이 생겨 공부를 시작하였습니다.
딥러닝의 개념을 이해하는 것 부터가 첫 난관이라 어려움이 많은데요^^

예제를 보고 테스트 하는 도중 의문이 생겨 질문을 드립니다.

사용환경은 window10, Anaconda에서 jupyter Notebook 입니다.

----- 예제 ------
.
.
.
num_data = 1000
num_epoch = 10000

noise = init.normal_(torch.FloatTensor(num_data,1),std=1) # 랜덤 노이즈 값
x = init.uniform_(torch.Tensor(num_data,1),-15,15) # 랜덤 값 -15 ~ +15
y = (x**2) + 3
y_noise = y + noise # 랜덤 노이즈값을 더함.

---------------------------------------------------------------------------

model = nn.Sequential ( # 신경망 설계 … 이렇게 설계한 이유???
nn.Linear(1,6), # (1,6)
nn.ReLU(),
nn.Linear(6,10), # (6,10)
nn.ReLU(),
nn.Linear(10,6), # (10,6)
nn.ReLU(),
nn.Linear(6,1) # (6,1)
)

nn.Sequential에서 신경망 설계를 선언한것 같은데요.
(1,6) - (6,10) - (10,6) -(6,1) 의 순서로 설계한 이유를 명확히 모르겠습니다.

선배님들의 조언 부탁드리겠습니다.

1개의 좋아요

정확한 답변일지는 확신이 없지만 제가 아는 선에서 답변을 드리겠습니다.
위 예시에서는 입력이 1이기 때문에 어느 정도 늘려야만 하므로 6으로 늘린 것으로 보이고,
출력이 1이기 때문에 다시 줄이는 단계가 필요한 것으로 보입니다.

히든의 크기를 점차 늘였다가 줄였다를 반복하는 것은 정보의 압축과 확장을 반복하는 것과 비슷하다고 할 수 있습니다.
이 과정에서 압축으로 불필요한 정보가 줄어들고, 확장으로 더 많은 표현을 할 수 있게 하려는 의도입니다.
이렇게 줄이고 늘이고를 반복하는 과정은 종종 사용되고 있는 방식입니다.

3개의 좋아요

자세한 설명 감사합니다.

말씀하신대로 입출력을 1로 설정하고, 내부 행렬의 크기를 임의로 조정해서 테스트 해보니
문제없이 잘 작동하는군요.

------- 테스트한 소스 --------

model = nn.Sequential ( # 신경망 설계
nn.Linear(1,10), # (1,6)
nn.ReLU(),
nn.Linear(10,10), # (6,10)
nn.ReLU(),
nn.Linear(10,15), # (10,6)
nn.ReLU(),
nn.Linear(15,12), # (10,6)
nn.ReLU(),
nn.Linear(12,1) # (6,1)
)

2개의 좋아요