Skip to main content

W&B로 ResNet 살펴보기

이 글에서는 잔차 신경망을 처음부터 구현하고, 기본 아키텍처와 스킵 커넥션의 이론적 배경을 살펴봅니다. 이 글은 AI가 번역한 기사입니다. 오역이 있다면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15

W&B로 ResNet 탐구하기






이 튜토리얼에서는 잔차 신경망의 구현 방법과 기본 아키텍처, 그리고 스킵 커넥션의 이론적 배경을 차례대로 살펴보겠습니다. 잔차 네트워크(ResNet)는 컴퓨터 비전에서 가장 널리 사용되는 아키텍처 중 하나입니다. 스킵 커넥션은 객체 감지와 처리 분야의 최신 모델 대부분에서 사용됩니다.
이 분석을 재현하고 싶다면, 다음을 확인해 보세요 Colab 노트북. 다음에 접속할 수 있습니다 실시간 대시보드 이 분석을 더 자세히 살펴보려면 다음을 확인하세요. 마지막으로 다음은 동영상 튜토리얼 ResNet 연구 논문과 구현에 관하여.


잔차 네트워크란 무엇일까요?

잔차 신경망(ResNet)은 인공 신경망 (ANN)을 기반으로 하는 구성 요소에서 발전한 피라미드 세포 에서 대뇌피질잔차 신경망은 스킵 커넥션, 즉 몇몇 층을 건너뛰는 지름길 연결을 활용한다. 일반적인 ResNet 모델은 두 겹 또는 세 겹의 스킵을 사용하며, 그 사이에 ReLU 같은 비선형 함수와 배치 정규화를 포함해 구현된다.
딥러닝이 처음 급부상했을 때, 더 깊은 모델일수록 더 복잡한 함수를 근사할 수 있다는 점은 비교적 분명했습니다. 연구자들은 다양한 심층 모델을 실험하기 시작했죠. 이들 모델은 역사적인 벤치마크를 세우기도 했지만, 층 차원 설정에 일관된 패턴을 따르지는 않았습니다(예: AlexNet). 이후에는 적절한 필터를 선택해 채널 수를 점진적으로 늘리는 여러 아키텍처가 제안되었습니다. 그러나 곧, 심층 모델이 기대만큼 성능을 내지 못한다는 사실이 관찰되었습니다. 그 주된 이유 중 하나는 심층 신경망이 흔히 겪는 대표적 한계인 그래디언트 소실 때문이었습니다.

그래디언트 소실

그래디언트 소실은 모델의 앞단에 있는 층들에 대한 미분값이 거의 0에 가까울 정도로 작아지는 현상을 말합니다. 이렇게 되면 해당 층들에 대한 가중치 변화가 거의 의미 없을 정도로 미미해집니다. 그 결과, 이 층들은 본래 능력만큼 학습에 기여하지 못하게 됩니다. 따라서 더 깊은 네트워크가 더 복잡한 함수를 근사할 수는 있지만, 그에 앞서 그래디언트 소실 문제를 극복해야 합니다. 이를 해결하는 방법이 바로 스킵 커넥션을 사용하는 것입니다.

스킵 커넥션

스킵 커넥션은 네트워크에서 더 깊은 다른 층의 활성화에 특정 층의 활성화를 직접 더하는 방식이다.

도식에서 보이듯이, 네트워크에서 더 깊은 층인 ‘l’의 활성화에 ‘l−2’ 층의 활성화를 직접 더합니다. 이 과정은 네트워크 전반에 걸쳐 계속되며, 그 결과 각 층의 활성화가 더 깊은 곳까지 전달됩니다. 이는 네트워크 앞부분 층들의 활성화를 더 깊은 층에 직접 더해 줌으로써 그래디언트 소실 문제를 완화하는 데 도움이 됩니다.

Network-in-Network 블록

ResNet 아키텍처들은 모두 더 작은 블록들의 반복으로 ��성됩니다. ResNet 구현에는 두 가지 유형의 블록이 사용되는데, 기본 블록과 병목 블록입니다.
기본 블록은 2개의 합성곱 층과 그에 대응하는 활성화, 배치 정규화로 구성됩니다. 병목 블록은 3개의 합성곱 층으로 이루어지며, 이 중 하나는 1×1 합성곱 블록, 즉 Network-in-Network 블록입니다. Network-in-Network 합성곱을 사용하면 원하는 차원의 출력을 얻기 위해 필요한 연산 수를 크게 줄일 수 있습니다. 매우 큰 깊이를 가진 텐서의 곱셈은 매우 느린 경우가 많기 때문에, 채널(깊이) 수를 줄이는 데 자주 사용됩니다. 이러한 이유로 이 네트워크들이 심층 네트워크에서 큰 인기를 얻게 되었습니다. 다음은 1×1 합성곱의 효과를 간단히 보여 주는 Stack Overflow 답변의 인용문입니다.


이제 구현해 봅시다!

앞서 소개한 기법들을 모두 활용해 PyTorch에서 ResNet을 처음부터 직접 구현해 보겠습니다. 이 튜토리얼에서는 코드를 줄마다 설명하지는 않지만, 구현과 워크스루 링크를 공유하겠습니다. 다음은 코드 링크 그리고 연구 논문과 구현까지 다루었습니다 여기이제 본격적으로 이번 논의에서 중요한 부분을 살펴보겠습니다. 코드에는 resnet이라는 클래스가 있으며, 우리가 사용할 ResNet의 기본 구성 블록을 인자로 받습니다. 여기에는 기본 블록(base block) 또는 병목 블록(bottleneck block)을 사용할 수 있습니다. resnet 클래스의 두 번째 매개변수는 네 개의 숫자로 이루어진 리스트로, 각 채널 단계에서 사용할 선택한 블록의 개수를 나타냅니다. 채널 차원은 순서대로 64, 128, 256, 512의 네 단계가 있습니다. 세 번째 매개변수는 ResNet이 분류해야 하는 클래스 수입니다. 이제 더 구체적으로 이해하기 위해 예시를 살펴보겠습니다.

ResNet-18 구현

ResNet-18을 구현하기 위해 네 개의 단계마다 기본 블록 2개씩을 사용합니다. 각 기본 블록은 합성곱 층 2개로 구성됩니다. 또한 맨 처음에는 합성곱 층을, 맨 끝에는 완전연결 층을 추가합니다. 이렇게 하면 전체 층 수가 18이 되어 이름 그대로 ResNet-18이 됩니다. 이 네트워크는 CIFAR-10 데이터셋 학습에 사용합니다.



ResNet-18 최적화

ResNet-18 구현을 최적화하기 위해 Adam 옵티마이저를 사용하겠습니다. 서로 다른 학습률을 적용하고, wandb 라이브러리를 사용해 성능을 비교하겠습니다.
네트워크의 학습 손실과 테스트 정확도를 기록한 뒤 비교하겠습니다. 값을 기록할 때는 `wandb.log()`를 사용합니다.

이 모델의 다양한 학습률에서의 성능을 살펴보겠습니다. 아래 그래프는 W&B 대시보드를 사용해 생성한 것입니다.

그래프를 보면, 주어진 에포크 수에서 학습률 0.001을 사용할 때 손실이 가장 낮다는 것이 분명합니다. 하지만 손실만으로는 전체를 설명하기 어렵기 때문에, 이제 테스트 정확도를 살펴보겠습니다.


이 시각화는 학습률 0.001이 가장 높은 정확도를 보인다는 이전 결론을 확인해 줍니다.
참고: 에포크 수를 늘리거나 옵티마이저를 변경하거나 배치 크기를 조정하면 결과가 달라질 수 있습니다.
다음으로 넘어가겠습니다. 에포크 수는 그대로 유지한 채, 더 복잡한 모델인 ResNet-50이 이 데이터셋에서 어떻게 성능을 내는지 살펴보겠습니다. 더 복잡한 모델은 상대적으로 더 많은 에포크가 필요하다는 점을 기억하세요.

ResNet-50 구현

ResNet-50는 보틀넥 블록을 사용해 구현합니다. 네트워크의 4개 스테이지에서 각각 3, 4, 6, 3개의 보틀넥 블록을 사용하겠습니다. ResNet-18과 마찬가지로, 맨 앞에는 합성곱 레이어를 두고 맨 끝에는 완전연결 레이어를 다시 추가합니다. 각 보틀넥 블록은 3개의 합성곱 레이어로 구성됩니다. 이로써 전체 레이어 수가 50이 되며, 그래서 ResNet-50이라는 이름이 붙습니다.

실험에 필요할 경우 가중치를 분석할 수 있도록, 모델의 가중치와 파라미터를 기록하기 위해 `wandb.watch()`를 사용하겠습니다.
이제 모델 최적화로 넘어가겠습니다.

ResNet-50 최적화

이번에도 Adam 옵티마이저를 사용해 ResNet-50 구현을 최적화하겠습니다. 다양한 학습률을 적용하고, wandb 라이브러리를 활용해 성능을 비교하겠습니다.
wandb 대시보드를 사용해 생성한 손실 함수 시각화입니다.

그래프에서 보듯이 학습률 0.001과 0.0001을 사용한 모델의 성능은 거의 동일합니다. 따라서 승자를 가리기 위해 더 많은 지표가 필요합니다.
테스트 정확도 지표를 살펴보겠습니다.

이 시각화는 서로 다른 학습률을 가진 모델들의 성능 차이를 분명하게 보여줍니다. 여기서는 손실이 가장 낮은 모델이 꼭 가장 정확한 모델은 아니며, 이런 경우는 꽤 자주 발생합니다.
이제 두 모델의 성능을 비교해 보겠습니다.

ResNet-18 대 ResNet-50

ResNet-18과 ResNet-50에서 각각 성능이 가장 좋은 설정을 골라 비교해 보겠습니다. 아래는 손실 최소화 관점에서 두 네트워크를 비교한 결과입니다.

이 시각화는 ResNet-18이 손실을 더 잘 최소화하는 듯한 단서를 제공합니다. 하지만 항상 그런 것은 아닙니다. 두 그래프의 모양이 거의 동일하고 시작점만 다르다는 점에 주목하세요. 이는 무작위 가중치 초기화가 ResNet-50보다 ResNet-18에 유리하게 작용했음을 의미합니다. 다른 실행에서는 ResNet-50이 ResNet-18보다 더 잘 동작할 수도 있습니다. 그러니 테스트 정확도 그래프를 살펴보겠습니다.

이 시각화는 내용을 더 분명하게 보여줍니다. 그래프의 마지막 지점에서 두 모델의 정확도가 거의 동일해 보이지만, 여전히 짚고 넘어가야 할 부분이 있습니다. 실험을 위해 각 실행에서 에포크 수는 동일하게 유지했습니다. 앞서 언급했듯이, 더 복잡한 모델일수록 더 많은 에포크가 필요합니다. 여기서는 ResNet-18과 ResNet-50 사이의 층 차이가 상당히 큽니다. 따라서 에포크 수를 동일하게 두었을 때 ResNet-50이 ResNet-18과 비슷한 성능을 보인다면, 에포크 수를 늘렸을 때 ResNet-50이 ResNet-18을 능가할 가능성이 높다고 볼 수 있습니다.

하이퍼파라미터 스윕

이 상황에서는 수동으로 모델을 조정해 최적 구성을 골랐지만, 일반적으로 실제 환경에서는 하이퍼파라미터 튜닝이 지루하고 시간이 많이 들지만 매우 중요한 작업입니다. W&B는 원하는 하이퍼파라미터를 자동으로 튜닝할 수 있는 방법을 제공합니다. 여기서 “파라미터 스윕”이 사용됩니다. 파라미터 스윕을 사용할 때는 튜닝할 파라미터와 그 가능한 값들만 지정하면 되고, wandb가 다양한 하이퍼파라미터 조합을 자동으로 생성해 성능을 기록합니다.
Colab에서 ResNet-50 모델에 대해 바로 파라미터 스윕을 수행해 보겠습니다.

스윕 구성 파일

파라미터 스윕을 수행하려면, 튜닝할 파라미터와 그 가능한 값들을 담은 딕셔너리 형태의 스윕 구성 파일이 필요합니다.
다음은 파라미터 스윕에 사용할 구성 딕셔너리입니다.

원한다면 어떤 수의 파라미터든 실험할 수 있지만, ResNet-50은 학습에 시간이 많이 걸리므로 여기서는 학습률과 옵티마이저만 스윕합니다. 또한 에포크 수는 10으로 설정했으며, 이것 역시 하이퍼파라미터로 사용할 수 있습니다.
method 매개변수는 최적의 하이퍼파라미터 값을 찾기 위해 사용할 탐색 방법을 정의합니다. 여기서는 가능한 최적의 하이퍼파라미터를 무작위로 탐색하고자 ‘random’으로 설정했습니다. metric 매개변수는 최소화하거나 최대화하려는 평가지표를 지정합니다.
다음 단계는 스윕 ID를 만드는 것입니다. 방법은 다음과 같습니다:

sweep() 함수는 구성 파일과 프로젝트 이름을 인자로 받습니다. 그 외의 선택적 매개변수들은 문서 페이지에서 확인할 수 있습니다.

다음 단계는 스윕할 매개변수의 기본값을 지정하고 `init` 함수의 config로 설정하는 것입니다. 여기서 지정한 매개변수들은 실행마다 자동으로 업데이트됩니다.
이제 스윕을 실행할 준비가 되었습니다.

스윕을 실행하는 명령은 `wandb.agent()`이며, 생성한 스윕 ID와 코드가 캡슐화되어 있는 함수 이름을 인자로 받습니다.

하이퍼파라미터 스윕 결과

이제 하이퍼파라미터 스윕을 마치고 시각화와 기타 상세 정보가 wandb 대시보드에 저장되었으니, 다양한 하이퍼파라미터 값으로 실행된 실험들을 비교해 보겠습니다. 먼저 학습 손실부터 살펴보겠습니다.

이 모든 실행은 단 한 줄의 명령으로 자동으로 수행되었습니다. 이것이 하이퍼파라미터 스윕의 장점입니다. 이제 이들을 비교해 최적의 하이퍼파라미터 조합만 찾으면 됩니다.
이제 하이퍼파라미터 스윕으로 생성된 테스트 정확도 시각화를 살펴보겠습니다.

그래프에서 분명히 보이듯, 학습률 0.001과 Adam 옵티마이저를 사용한 모델이 다른 5가지 설정 중 가장 우수한 성능을 보였습니다.

매개변수 중요도

wandb는 최근 각 매개변수의 중요도와 최적화 대상 지표와의 상관관계를 시각화해 주는 새로운 시각화 기능인 매개변수 중요도를 도입했습니다.
학습 손실에 대한 매개변수 중요도 시각화입니다.

테스트 정확도에 대한 매개변수 중요도도 시각화해 보겠습니다.

자, 이제 튜토리얼을 마칩니다. 하이퍼파라미터를 더 다양하게 조정해 보며 모델 성능을 개선해 보세요. 즐거운 코딩 되세요!
이 분석을 재현하고 싶다면, 다음을 확인하세요 Colab 노트북. 다음에 접속할 수 있습니다 실시간 대시보드 이 분석을 더 자세히 살펴보려면 다음을 확인하세요. 마지막으로 다음은 동영상 튜토리얼 ResNet 연구 논문과 구현에 관하여.


























이 글은 AI 번역본입니다. 오역이 있을 수 있으니 댓글로 알려주세요. 원문 보고서는 아래 링크에서 확인하실 수 있습니다: 원문 보고서 보기