Neural network loss landscape 시각화하기

|

Neural network loss landscape 시각화하기(Visualizing the Loss Landscape of Neural Nets)

  • Visualizing the Loss Landscape of Neural Nets 논문에 대한 implementation code다.
  • Codes from https://github.com/tomgoldstein/loss-landscape
  • git clone https://github.com/tomgoldstein/loss-landscape.git 로 코드 다운로드

환경 설정

  • 하나 이상의 GPU
  • Pytorch 0.4
    • virtual env를 만들어 별도로 설치
    • pytorch 0.4, python 3.6, cuda 9.0
    • pip install https://download.pytorch.org/whl/cu90/torch-0.4.0-cp36-cp36m-linux_x86_64.whl
  • openmpi 3.1.2
    • https://www.open-mpi.org/software/ompi/v3.1/ 에서 3.1.2 탭의 openmpi-3.1.2.tar.gz 다운로드
    • mkdir ~/openmpi 폴더 만들고 해당 폴더로 openmpi-3.1.2.tar.gz파일 이동 후 tar -zxvf openmpi-3.1.2.tar.gz로 압축 풀기
    • cd openmpi-3.1.2/ 로 폴더 이동
    • ./configure --prefix=$HOME/openmpi로 configure 후 compile
    • make -j8 all로 make(5~10분 소요)
    • make install로 설치
    • vim ~/.bashrc로 bashrc에 path 설정
      • export PATH=$HOME/openmpi/bin:$PATH
      • export LD_LIBRARY_PATH=$HOME/openmpi/lib:$LD_LIBRARY_PATH
    • 저장 후 나가서 source ~/.bashrc
    • mpiexec --versionmpirun --version으로 설치 확인(버전 뜨면 설치 잘 된 상태)
  • mpi4py 2.0.0
    • pip install mpi4py==2.0.0
  • numpy 1.15.1
    • pip install numpy
  • h5py 2.7.0
    • pip install h5py==2.7.0
  • matplotlib 2.0.2
    • pip install matplotlib
  • scipy 0.19
    • pip install scipy
  • seaborn
    • pip install seaborn
  • scikit-learn
    • pip install scikit-learn

Pre-trained models

  • https://github.com/tomgoldstein/loss-landscape 에서 pretrained weight file들을 받아 해당 directory 내의 폴더에 저장
    • ex. ..../loss-landscape/cifar10/trained_nets/

Visualizing 1D loss curve

  • 실제 코드 돌릴때에는 openmpi 사용시 코드가 돌지 않아 그냥 돌렸다.
    • 하기 코드에서 mpirun -n 4를 빼고 돌리면 됨

Creating 1D linear interpolations

  • 1D linear interpolation 방법[1]은 같은 network loss function의 두 개의 minimizer사이의 방향을 따라 loss 값을 평가한다.
  • 이 방법은 다양한 batch size로 학습된 네트워크의 minizer의 평탄도를 비교하기 위해 적용된다[2].
  • 1D linear interpolation plot은 plot_surface.py를 사용하여 생성된다.

mpirun -n 4 python plot_surface.py --mpi --cuda --model vgg9 --x=-0.5:1.5:401 --dir_type states \
--model_file cifar10/trained_nets/vgg9_sgd_lr=0.1_bs=128_wd=0.0_save_epoch=1/model_300.t7 \
--model_file2 cifar10/trained_nets/vgg9_sgd_lr=0.1_bs=8192_wd=0.0_save_epoch=1/model_300.t7 --plot

  • --x=-0.5:1.5:401: Plot의 범위(range)와 해상도(resolution)를 설정한다. Plot의 x축 좌표는 -0.5부터 1.5까지(minimizer들이 각각 0과 1에 위치하므로)로 설정되며, loss값들은 x축을 따라 총 401개의 위치에서 측정된다.
  • --dir_type states: BN layer들의 통계(running_mean과 running_var) 뿐만 아니라 모든 parameter들의 dimension을 포함하는 방향을 의미한다. 하나의 화면에서 두 개의 솔루션을 한번에 plot할 때 running_mean과 running_var를 무시하게 될 경우 올바른 loss값을 생성 할 수 없다.

Producing plots along random normalized directions

  • 모델에서 생성된 parameter들과 동일한 차원의 random direction을 만들고 filter-normalize된다. 다음으로 loss값을 그 방향에 따라 sample할 수 있게된다.

mpirun -n 4 python plot_surface.py --mpi --cuda --model vgg9 --x=-1:1:51 \
--model_file cifar10/trained_nets/vgg9_sgd_lr=0.1_bs=128_wd=0.0_save_epoch=1/model_300.t7 \
--dir_type weights --xnorm filter --xignore biasbn --plot

  • --dir_type weights: Direction이 BN 레이어의 bias 및 parameter들을 포함하며, 학습 된 parameter와 동일한 크기를 가진다.
  • -- xnorm filter: Filter level에서의 random direction을 normalize한다. 여기서 filter는 single feature map을 생성하는 parameter들을 의미한다. Fully connected layer의 경우 filter는 단일 뉴런에 기여하는 weight를 포함한다.
  • --xignore biasbn: Bias 및 BN parameters에 해당하는 direction을 무시한다.(Random vector의 해당 항목을 0으로 채움)

Visualizing 2D loss contours

  • Loss contour을 plot하기 위해 두 개의 임의의 방향을 선택하고 1D plotting과 같은 방식으로 정규화(normalize)한다.

mpirun -n 4 python plot_surface.py --mpi --cuda --model resnet56 --x=-1:1:51 --y=-1:1:51 \
--model_file cifar10/trained_nets/resnet56_sgd_lr=0.1_bs=128_wd=0.0005/model_300.t7 \
--dir_type weights --xnorm filter --xignore biasbn --ynorm filter --yignore biasbn  --plot

  • 우선 surface가 생성되고 .h5파일에 저장되면, plot_2D.py파일을 이용해 contour plot을 cutomize하고 생성 할 수 있다.

python plot_2D.py --surf_file path_to_surf_file --surf_name train_loss

  • --surf_name: Surface의 타입을 명시한다. 기본은 train_loss이다.
  • --vmin, --vmax: Plot 될 값들의 범위를 설정한다.
  • --vlevel: Contour의 step을 설정한다.(얼마나 촘촘히/듬성듬성)

Visualizing 3D loss surface

  • ploy_2D.py는 matplotlib 라이브러리를 이용하여 기본적인 3D loss surfcace를 plot한다. 만약 조명을 이용한 세부 정보를 표시할 수 있도록 보다 세부적인 렌더링이 필요할 경우 ParaView를 이용하여 loss surface를 렌더링 할 수 있다.
    1. .h5파일을 .vtp파일로 변환한다.
      • python h52vtp.py --surf_file path_to_surf_file --surf_name train_loss --zmax 10 --log
      • 위 스크립트를 통해 log scale로 최댓값이 10인 loss surface 정보를 담고있는 VTK파일을 생성한다.
    1. ParaView를 이용하여 .vtp파일을 연다. ParaView에서 VTK reader를 이용하여 .vtp파일을 연다. Figure가 보이도록 하기 위해 Pipeline Browser의 눈 모양 아이콘을 누른다. Surface를 따라 drag를 할 수도 있으며, Properties창에서 색을 바꿀 수도 있다.
    1. 만약 surface가 매우 얇거나 바늘처럼 좁게 보일 경우 왼쪽의 control panel의 transforming 파라미터를 조절한다. 넓게 하고 싶은 축의 ‘scale’ 값에 1 이상의 값을 넣는다.
    1. 결과를 영상으로 저장하려면 File 메뉴의 Save screenshot을 누른다.

References

  • [1] Ian J Goodfellow, Oriol Vinyals, and Andrew M Saxe. Qualitatively characterizing neural network optimization problems. ICLR, 2015.
  • [2] Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy, and Ping Tak Peter Tang. On large-batch training for deep learning: Generalization gap and sharp minima. ICLR, 2017.