딥드림(Deep Dream)이란 입력 이미지를 환영이나 꿈같은 이미지로 만들어주는 알고리즘입니다.
마치 어린 아이들이 구름을 보며 구름과 비슷한 동물 또는 사물을 떠올리는 것과 같습니다.
이미 훈련된 신경망 모델이 원본 이미지에서 특정 패턴을 더 부각해 몽환적이고 새로운 이미지를 만들어주는 방식입니다.



출처:https://www.telegraph.co.uk/technology/google/11730050/deep-dream-best-images.html
딥드림을 이해하려면 먼저 기존 딥러닝 신경망을 알아야합니다.
기본적으로 딥러닝 신경망은 경사하강법으로 손실값을 최소화하는 방향으로 훈련을 진행합니다.
여러 레이어를 거쳐 fully connected layer에 도달해 최종 분류값을 결과물로 출력하죠.
그 다음, 이 최종 분류값과 실제값 사이의 손실을 계산합니다.
마지막으로 오차값이 줄어드는 방향으로 역전파를 적용해 레이어 내 뉴런의 가중치를 업데이트합니다.
하지만 딥드림 신경망의 학습 방법은 이와 반대입니다.
먼저 경사하강법이 아닌 경사상승법으로 훈련합니다.
즉, 손실을 최소화하는 방향으로 훈련하는 것이 아닌 최대화하는 방향으로 훈련을 진행합니다.
거기에 가중치를 업데이트를 하는 것이 아닌 이미지의 픽셀을 직접 수정하면서 훈련을 합니다.
👏 일반적인 신경망 모델 : '경사하강법'을 통해 손실을 '최소화'하는 방향으로 뉴런의 '가중치'를 업데이트
👏 딥드림 신경망 모델 : '경사상승법'을 통해 손실을 '최대화'하는 방향으로 이미지의 '픽셀'을 수정
딥드림의 모든 계층마다 손실을 최대화하도록 훈련하면 이미지가 너무 엉뚱해지고 이상해질 것입니다.
특정 계층만 선택해서 그 계층 위주로 이미지 픽셀을 수정하도록 훈련해야합니다.
그래야 원본 이미지의 형태도 어느 정도 유지를 하면서 환상적인 이미지를 만들 수 있습니다.
다시 말해, 딥드림은 활성화할 하나 이상의 계층을 선택해 손실이 커지도록 이미지 픽셀을 수정하며 선택한 계층을 '과잉해석' 하게끔하는 원리입니다.
딥드림이 얼마나 화려하게 만들어질지는 어떤 계층을 선택했냐에 따라 달라집니다.
만약 입력층과 가까운 하위 레이어를 중심으로 훈련한다면 획이나 코너같은 간단하고 지역적인 패턴이 생성됩니다.
출력층과 가까운 상위 레이어를 선택한다면 복잡한 패턴이나 물체의 전체 모습같은 전역적인 패턴을 생성할 수 있습니다.