Back propgation에서의 전치행렬(transpose matrix) – 2편

1편이 너무 길어 져서 \frac{\partial L}{\partial W} = X^T \cdot \frac{\partial L}{\partial Y}에 대한 유도는 여기로 나누었다.

이제 \frac{\partial Y}{\partial W}를 보면, 얘들도 모두 matrix이니 \frac {\partial Y}{\partial W}는 다음과 같이 생겼다.

\frac{\partial Y}{\partial W} = \begin{bmatrix}\frac{\partial Y}{\partial w_{1,1}} & \frac{\partial Y}{\partial w_{1,2}} & \frac{\partial Y}{\partial w_{1,3}} \\\\ \frac{\partial Y}{\partial w_{2,1}} & \frac{\partial Y}{\partial w_{2,2}} & \frac{\partial Y}{\partial w_{2,3}} \end{bmatrix}

첫번째 원소인 \frac{\partial Y}{\partial w_{1,1}}을 구하기 위해 이전 처럼, W에 대해 Y로 편미분하면 다음과 같이된다.

\frac{\partial Y}{\partial w_{1,1}}=\begin{bmatrix}x_{1,1} & 0 & 0 \\\\ x_{2,1} & 0 & 0\end{bmatrix} \\\\ \frac{\partial Y}{\partial w_{1,2}}=\begin{bmatrix}0 & x_{1,1} & 0 \\\\ 0 & x_{2,1} & 0\end{bmatrix} \\\\ \frac{\partial Y}{\partial w_{1,3}}=\begin{bmatrix}0 & 0 & x_{1,1} \\\\ 0 & 0 & x_{2,1}\end{bmatrix} \\\\ \frac{\partial Y}{\partial w_{2,1}}=\begin{bmatrix}x_{1,2} & 0 & 0 \\\\ x_{2,2} & 0 & 0\end{bmatrix} \\\\ \frac{\partial Y}{\partial w_{2,2}}=\begin{bmatrix}0 & x_{1,2} & 0 \\\\ 0 & x_{2,2} & 0\end{bmatrix} \\\\ \frac{\partial Y}{\partial w_{2,3}}=\begin{bmatrix}0 & 0 & x_{1,2} \\\\ 0 & 0 & x_{2,2}\end{bmatrix}

Matrix W의 각 원소들 역시 scalar이므로 1편에서 X의 경우 처럼, 다음과 같이 나타낼 수 있다.

\frac{\partial L}{\partial w_{1,1}} = \sum_{i=1}{N} \sum_{j=1}{M}\frac{\partial L}{\partial y_{i,j}} \cdot \frac{\partial y_{i,j}}{\partial w_{1,1}}

\frac{\partial L}{\partial w_{1,1}} = (\frac{\partial L}{\partial y_{1,1}} \times x_{1,1}) + (\frac{\partial L}{\partial y_{2,1}} \times x_{2,1}) \\\\ \frac{\partial L}{\partial w_{1,2}} = (\frac{\partial L}{\partial y_{1,2}} \times x_{1,1}) + (\frac{\partial L}{\partial y_{2,2}} \times x_{2,1}) \\\\ \frac{\partial L}{\partial w_{1,3}} = (\frac{\partial L}{\partial y_{1,3}} \times x_{1,1}) + (\frac{\partial L}{\partial y_{2,3}} \times x_{2,1}) \\\\ \frac{\partial L}{\partial w_{2,1}} = (\frac{\partial L}{\partial y_{1,1}} \times x_{1,2}) + (\frac{\partial L}{\partial y_{2,1}} \times x_{2,2}) \\\\ \frac{\partial L}{\partial w_{2,2}} = (\frac{\partial L}{\partial y_{1,2}} \times x_{1,2}) + (\frac{\partial L}{\partial y_{2,2}} \times x_{2,2}) \\\\ \frac{\partial L}{\partial w_{2,3}} = (\frac{\partial L}{\partial y_{1,3}} \times x_{1,2}) + (\frac{\partial L}{\partial y_{2,3}} \times x_{2,2})

이것을 2X3인 matrix로 나타내면

\frac{\partial L}{\partial W} = \begin{bmatrix}(\frac{\partial L}{\partial y_{1,1}} \times x_{1,1}) + (\frac{\partial L}{\partial y_{2,1}} \times x_{2,1}) & (\frac{\partial L}{\partial y_{1,2}} \times x_{1,1}) + (\frac{\partial L}{\partial y_{2,2}} \times x_{2,1}) & (\frac{\partial L}{\partial y_{1,3}} \times x_{1,1}) + (\frac{\partial L}{\partial y_{2,3}} \times x_{2,1}) \\\\ (\frac{\partial L}{\partial y_{1,1}} \times x_{1,2}) + (\frac{\partial L}{\partial y_{2,1}} \times x_{2,2}) & (\frac{\partial L}{\partial y_{1,2}} \times x_{1,2}) + (\frac{\partial L}{\partial y_{2,2}} \times x_{2,2}) & (\frac{\partial L}{\partial y_{1,3}} \times x_{1,2}) + (\frac{\partial L}{\partial y_{2,3}} \times x_{2,2}) \end{bmatrix}

Matrix X와 W원소의 위치를 바꿔서 나타내면

\frac{\partial L}{\partial W} = \begin{bmatrix}(x_{1,1} \times \frac{\partial L}{\partial y_{1,1}}) + (x_{2,1} \times \frac{\partial L}{\partial y_{2,1}}) & (x_{1,1} \times \frac{\partial L}{\partial y_{1,2}}) + (x_{2,1} \times \frac{\partial L}{\partial y_{2,2}}) & (x_{2,1} \times \frac{\partial L}{\partial y_{1,3}}) + (x_{1,1} \times \frac{\partial L}{\partial y_{2,3}})  \\\\ (x_{1,2} \times \frac{\partial L}{\partial y_{1,1}}) + (x_{2,2} \times \frac{\partial L}{\partial y_{2,1}}) & (x_{1,2} \times \frac{\partial L}{\partial y_{1,2}}) + (x_{2,2} \times \frac{\partial L}{\partial y_{2,2}}) & (x_{1,2} \times \frac{\partial L}{\partial y_{1,3}}) + (x_{2,2} \times \frac{\partial L}{\partial y_{2,3}}) \end{bmatrix}

Matrix X와 Y로 구분하면

\frac{\partial L}{\partial W} = \begin{bmatrix}x_{1,1} & x_{2,1} \\\\ x_{1,2} & x_{2,2}\end{bmatrix} \cdot \begin{bmatrix}\frac{\partial L}{\partial y_{1,1}}  & \frac{\partial L}{\partial y_{1,2}} & \frac{\partial L}{\partial y_{1,3}} \\\\ \frac{\partial L}{\partial y_{2,1}} & \frac{\partial L}{\partial y_{2,2}} & \frac{\partial L}{\partial y_{2,3}}\end{bmatrix} = X^T \cdot \frac{\partial L}{\partial Y}이 성립한다.

Back propgation에서의 전치행렬(transpose matrix) – 1편

실제로 전개해보면 다음 식이 도출됩니다([식 5.13]으로 이끄는 과정은 생략합니다).

– p172, 5.6.1 Affine 계층, 밑바닥부터 시작하는 딥러닝

아니! 그걸 생략하면 어떡해요!!

“밑바닥부터 시작하는 딥러닝”을 읽으면서 딥러닝의 개념을 잡는데 많은 도움을 받고 있지만 굳이 단점을 들자면 주요한 공식 들에 대해 설명하지 않고 그냥 넘어 가버리는 경우가 가끔 있다. 위에서 말하는 [식 5.13]은 back propagataion에서 입력에 대한 loss function의 영향과 weight에 대한 loss function의 영향을 계산하는 다음 식을 의미한다.

\frac{\partial L}{\partial X} = \frac{\partial L}{\partial Y} \cdot W^T \\\\ \frac{\partial L}{\partial W} = X^Y \cdot \frac{\partial L}{\partial Y}

이 식이 도대체 어떻게 유도된 것인지 이리 저리 찾다가 마침 이 부분을 자세히 설명해 주고 있는 미국 어느 대학(!)의 훌륭한 문서(Backpropagation for a Linear Layer, Justin Johnson, April 19, 2017)를 발견했다. 이 포스팅은 해당 문서에 대한 나름의 이해를 정리한 것이다.

밑밥 깔기

Matrix인 입력 X, Weight W가 있다고 할 때, 이 둘의 dot product인 Y는 다음과 같은 모습이다.

X = \begin{bmatrix}x_{1,1} & x_{1,2}\\x_{2,1} & x_{2,2}\end{bmatrix} W = \begin{bmatrix}w_{1,1} & w_{1,2} & w_{1,3}\\w_{2,1} & w_{2,2} & w_{2,3}\end{bmatrix} Y = X \cdot W = \begin{bmatrix}x_{1,1}w_{1,1} + x_{1,2}w_{2,1} & x_{1,1}w_{1,2} + x_{1,2}w_{2,2} & x_{1,1} w_{1,3} + x_{1,2}w_{2,3} \\\\ x_{2,1}w_{1,1} + x_{2,2}w_{2,1} & x_{2,1}w_{1,2} + x_{2,2}w_{2,2} & x_{2,1}w_{1,3} + x_{2,2}w_{2,3}\end{bmatrix}

Back propagation을 통해 최종으로 구하고자 하는 것은 입력의 변화에 따른 loss function의 변화량 \frac{\partial L}{\partial X}과 Weight 변화에 따른 loss function의 변화량 \frac{\partial L}{\partial W}이다. 이것과 관련해 연쇄 법칙(chain rule)에 따라 이전 layer에서 전달 받은 Y = X \cdot W의 변화에 따른 loss function의 변화량인 \frac{\partial L}{\partial Y}를 고려하면 다음이 성립한다.

\frac{\partial L}{\partial X} = \frac{\partial L}{\partial Y} \cdot \frac{\partial Y}{\partial X} \\\\ \frac{\partial L}{\partial W} = \frac{\partial L}{\partial Y} \cdot \frac{\partial Y}{\partial W}

Y의 변화에 따른 Loss function의 변화 \frac{\partial L}{\partial Y}

여기에서 \partial L은 scalar 값 이고 Y는 matrix이므로 \frac{\partial L}{\partial Y}의 모습은 다음과 같다.

\begin{bmatrix}\frac{\partial L}{\partial (x_{1,1}w_{1,1} + x_{1,2}w_{2,1})} & \frac {\partial L}{\partial (x_{1,1}w_{1,2} + x_{1,2}w_{2,2})} & \frac {\partial L}{\partial (x_{1,1} w_{1,3} + x_{1,2}w_{2,3})} \\\\ \frac{\partial L}{\partial (x_{2,1}w_{1,1} + x_{2,2}w_{2,1})} & \frac{\partial L}{\partial (x_{2,1}w_{1,2} + x_{2,2}w_{2,2})} & \frac{\partial L}{\partial (x_{2,1}w_{1,3} + x_{2,2}w_{2,3})}\end{bmatrix}

복잡하니까 조금 간단히 다음과 같이 인덱스로 나타내자.

\frac{\partial L}{\partial Y} = \begin{bmatrix}\frac{\partial L}{\partial y_{1,1}} & \frac {\partial L}{\partial y_{1,2}} & \frac {\partial L}{\partial y_{1,3}} \\\\ \frac{\partial L}{\partial y_{2,1}} & \frac{\partial L}{\partial y_{2,2}} & \frac{\partial L}{\partial y_{2,3}}\end{bmatrix}

이제, \frac{\partial Y}{\partial X}\frac{\partial Y}{\partial W}가 남았다.

행렬 X의 원소들에 대한 행렬 Y의 편미분 \frac{\partial Y}{\partial X}

먼저 \frac{\partial Y}{\partial X}를 보면, X와 Y 모두 matrix이니 \frac {\partial Y}{\partial X}는 다음과 같이 생겼다.

\frac{\partial Y}{\partial X} = \begin{bmatrix}\frac{\partial Y}{\partial x_{1,1}} & \frac{\partial Y}{\partial x_{1,2}} & \frac{\partial Y}{\partial x_{1,3}} \\\\ \frac{\partial Y}{\partial x_{2,1}} & \frac{\partial Y}{\partial x_{2,2}} & \frac{\partial Y}{\partial x_{2,3}} \end{bmatrix}

각 원소들은 scalar 값인데 그 중 첫번째 원소인 \frac{\partial Y}{\partial x_{1,1}}를 구하기 위해 Y의 원소들을 x_{1,1}로 편미분 하면 다음과 같이 된다.

\frac{\partial Y}{\partial x_{1,1}}=\begin{bmatrix}w_{1,1} & w_{1,2} & w_{1,3} \\\\ 0 & 0 & 0 \end{bmatrix}

응? 갑자기 이건 뭐냐!

예를 들어 y_{1,1}에 있는 x_{1,1}w_{1,1} + x_{1,2}w_{2,1}x_{1,1}로 편미분하면 w_{1,1}가 되고, x_{1,1}w_{1,2} + x_{1,2}w_{2,2}에 대해서도 같은 방식으로 하면 w_{1,2}가 되는 식으로 Y의 모든 6개의 원소에 적용한 것이다. 이런 짓을 matrix X의 모든 원소인 x_{1, 2}, x_{2,1}, x_{2,2}에 대해서도 모두 구하면 다음과 같이 된다.

\frac{\partial Y}{\partial x_{1,1}}=\begin{bmatrix}w_{1,1} & w_{1,2} & w_{1,3} \\\\ 0 & 0 & 0\end{bmatrix} \\\\ \frac{\partial Y}{\partial x_{1,2}}=\begin{bmatrix}w_{2,1} & w_{2,2} & w_{2,3} \\\\ 0 & 0 & 0 \end{bmatrix} \\\\ \frac{\partial Y}{\partial x_{2,1}}=\begin{bmatrix} 0 & 0 & 0 \\\\ w_{1,1} & w_{1,2} & w_{1,3} \end{bmatrix} \\\\ \frac{\partial Y}{\partial x_{2,2}}=\begin{bmatrix} 0 & 0 & 0 \\\\ w_{2,1} & w_{2,2} & w_{2,3} \end{bmatrix}

행렬 X에 대한 scalar L의 편미분 \frac {\partial L}{\partial X}

\frac{\partial Y}{\partial x_{1,1}}은 matrix X를 구성하는 element인 scalar값이다. 위에서 말한것 처럼 연쇄법칙(Chain rule)에 의해 Y의 모든 원소들에 대하여 다음과 같이 나타낼 수 있다.

\frac{\partial L}{\partial x_{1,1}} = \sum_{i=1}^{N} \sum_{j=1}^{M} \frac{\partial L}{\partial y_{i,j}} \cdot \frac{\partial y_{i,j}}{\partial x_{1,1}}

Matrix X의 첫번째 원소는 {\partial L}를 matrix Y의 각 원소들로 나눈 값들에 Y의 각원소들을 X의 첫번째 원소로 편미분한 값들을 곱한 것을 모두 더한 것이다. 말이 드럽게 복잡해 보이지만, 예를들어, 첫번째 원소인 \frac{\partial L}{\partial x_{1,1}}의 값이 다음과 같이 계산된다는 뜻이다.

\frac{\partial L}{\partial x_{1,1}} = (\frac{\partial L}{\partial y_{1,1}} \times \frac{\partial y_{1,1}}{\partial x_{1,1}}) + (\frac{\partial L}{\partial y_{1,2}} \times \frac{\partial y_{1,2}}{\partial x_{1,1}}) + (\frac{\partial L}{\partial y_{1,3}} \times \frac{\partial y_{1,3}}{\partial x_{1,1}}) + (\frac{\partial L}{\partial y_{2,1}} \times \frac{\partial y_{2,1}}{\partial x_{1,1}}) + (\frac{\partial L}{\partial y_{2,2}} \times \frac{\partial y_{2,2}}{\partial x_{1,1}}) + (\frac{\partial L}{\partial y_{2,3}} \times \frac{\partial y_{2,3}}{\partial x_{1,1}})

이것도 뭐 딱히 깨끗해 보이진 않지만… 여튼, matrix Y의 각원소들에 대해 x_{1,1}로 편미분한 결과를 위 식에 적용해 보면 다음과 같이 된다.

\frac{\partial L}{\partial x_{1,1}} = (\frac{\partial L}{\partial y_{1,1}} \times w_{1,1}) + (\frac{\partial L}{\partial y_{1,2}} \times w_{1,2}) + (\frac{\partial L}{\partial y_{1,3}} \times w_{1,3}) + (\frac{\partial L}{\partial y_{2,1}} \times 0) + (\frac{\partial L}{\partial y_{2,2}} \times 0) + (\frac{\partial L}{\partial y_{2,3}} \times 0) \\\\ = (\frac{\partial L}{\partial y_{1,1}} \times w_{1,1}) + (\frac{\partial L}{\partial y_{1,2}} \times w_{1,2}) + (\frac{\partial L}{\partial y_{1,3}} \times w_{1,3})

같은 방법을 \frac{\partial L}{\partial X}의 모든 원소들에 적용하면

\frac{\partial L}{\partial x_{1,1}} = (\frac{\partial L}{\partial y_{1,1}} \times w_{1,1}) + (\frac{\partial L}{\partial y_{1,2}} \times w_{1,2}) + (\frac{\partial L}{\partial y_{1,3}} \times w_{1,3}) \\\\ \frac{\partial L}{\partial x_{1,2}} = (\frac{\partial L}{\partial y_{1,1}} \times w_{2,1}) + (\frac{\partial L}{\partial y_{1,2}} \times w_{2,2}) + (\frac{\partial L}{\partial y_{1,3}} \times w_{2,3}) \\\\ \frac{\partial L}{\partial x_{2,1}} = (\frac{\partial L}{\partial y_{2,1}} \times w_{1,1}) + (\frac{\partial L}{\partial y_{3,2}} \times w_{1,2}) + (\frac{\partial L}{\partial y_{3,3}} \times w_{1,3}) \\\\ \frac{\partial L}{\partial x_{2,2}} = (\frac{\partial L}{\partial y_{2,1}} \times w_{2,1}) + (\frac{\partial L}{\partial y_{3,2}} \times w_{2,2}) + (\frac{\partial L}{\partial y_{3,3}} \times w_{2,3})

이것을 matrix의 형태로 나타내면

\frac{\partial L}{\partial X}=\begin{bmatrix}(\frac{\partial L}{\partial y_{1,1}} \times w_{1,1}) + (\frac{\partial L}{\partial y_{1,2}} \times w_{1,2}) + (\frac{\partial L}{\partial y_{1,3}} \times w_{1,3}) & (\frac{\partial L}{\partial y_{1,1}} \times w_{2,1}) + (\frac{\partial L}{\partial y_{1,2}} \times w_{2,2}) + (\frac{\partial L}{\partial y_{1,3}} \times w_{2,3}) \\\\ (\frac{\partial L}{\partial y_{2,1}} \times w_{1,1}) + (\frac{\partial L}{\partial y_{3,2}} \times w_{1,2}) + (\frac{\partial L}{\partial y_{3,3}} \times w_{1,3}) & (\frac{\partial L}{\partial y_{2,1}} \times w_{2,1}) + (\frac{\partial L}{\partial y_{3,2}} \times w_{2,2}) + (\frac{\partial L}{\partial y_{3,3}} \times w_{2,3})\end{bmatrix}

Matrix Y와 W를 구분해 보면

\frac{\partial L}{\partial X}=\begin{bmatrix}\frac{\partial L}{\partial y_{1,1}} & \frac{\partial L}{\partial y_{1,2}} & \frac{\partial L}{\partial y_{1,3}} \\\\ \frac{\partial L}{\partial y_{2,1}} & \frac{\partial L}{\partial y_{2,2}} & \frac{\partial L}{\partial y_{2,3}}\end{bmatrix} \cdot \begin{bmatrix} w_{1,1} & w_{2,1} \\\\ w_{1,2} & w_{2,2} \\\\ w_{1,3} & w_{2,3}\end{bmatrix}

Weight matrix W의 전치행렬(transpose matrix)를 곱하는 것이 되므로,

\frac{\partial Y}{\partial X}=\frac{\partial L}{\partial Y} \cdot W^T이 성립한다.

Weight에 대한 loss function의 변화인 \frac{\partial L}{\partial W} = X^T \cdot \frac{\partial L}{\partial Y}도 기본적으로 같은 방법으로 유도 되는데 너무 길어져서 2편에서 간단히 다루도록 한다.

[Tip] Mac version docker에서 띄운 (웹) 서버에 접속하기

Mac version Docker에 띄워둔 web server에 host에서 접속하려면 어떻게 해야 할까? 실행할 때 ‘–network=host’를 주면 된다는 얘기가 있어서 해봤는데, Mac에서는 통하지 않았다 이건 linux용이라고… Networking features in Docker Desktop for Mac에 따라 실행할 때 port를 매핑하는 것으로 이 문제를 해결할 수 있다.

Docker의 9090 port에 Mac의 9090 port로 접근하려면 다음과 같이 -p option으로 port를 매핑해서 docker를 띄운 후 서버를 실행한다.

이제 Mac의 web browser로 해당 포트에 접근할 수 있다.

Gitlab test-runner의 FATAL: the “HOME” is not set 문제

GitLab Runner 문서를 보고 열심히 따라하고 설정까지 마쳤는데 러너가 동작하지 않고 commit을 하면 CI가 한 참 동안을 pending 상태에 있다가 실패했다는 에러 메일 보내 버리는 증상이 있다. Systemctl로 서비스 상태를 보니 제대로 올려지지 않고 ‘inactive’이거나 ‘activating’에 계속 머물러 있다. 하지만 만약 background 서비스로 동작시키지 않고 다음과 같이 run command로 foreground에서 돌리면 잘 동작한다. 환경 설정에는 ‘거의’ 문제가 없다는 뜻 이겠지..

$ sudo /usr/local/bin/gitlab-runner run

Journalctl로 서비스 로그를 보니 FATAL에러가 하나가 잡힌다.

$ journalctl -u gitlab-runner.service

오호라. HOME 환경 변수를 찾으려 했는데 없어서 죽은 거고만! 해결책은 간단히 HOME 환경 변수를 선언해 주면 된다. 서비스 설정파일 (/etc/systemd/system/gitlab-runner.service)를 열고 [Service] 항목에 환경 변수를 추가해 준다. 만약 proxy환경이고 환경변수로 설정하고 있다면 서비스에서는 환경변수를 접근할 수 없으므로 여기에 함께 선언해 준다.

이제 서비스를 다시 로드하고 Gitlab runner를 재 시작한다.

Systemctl에서 상태를 확인한다. 물론 CI test도 함께.

AWS Lightsail에 둥지 틀기

여러 국내 호스팅 업체들을 거쳐서 여러 곳에서 WordPress 호스팅 서비스로 추천되는 Siteground에 한동안 정착하는 듯 했다. 준수한 속도에 비해 합리적인 가격($3.95/월) 때문에 당분간 정착할 거라고 생각하고 있었는데 일년이 지나서 서비스 갱신기간이 되자 가격이 세배 넘게 올라서 1년에 $143을 달라고 한다.($11.95/월).
“이건 너무 한 거 아니냐고!”

WordPress hosting은 더 비싸다

대안으로 생각한 것은 1) wordpress.com hosting과 2) AWS Lightsail이었는데, 발견한 한 가지 놀.라.운. 사실은 WordPress hosting에서 플러그인을 설차하려면 한달에 $25 짜리 business plan 이상을 계약해야 한다는 것이다. 한달에 $25라니!!! 멋 모르고 카드 결재를 하고 이리저리 플러그인 설치를 시도하다가 아래의 표를 발견하고는 미련 없이 ‘refund’ 버튼을 눌렀다.

AWS Lightsail은 한 달간 무료 시험기간을 주기 때문에 Siteground 계정이 종료하기 전에 미리 설치를 마쳤다. 인스턴스 리전을 한국으로 할까 하다가 이전 Siteground와 같은 위치인 싱가포르로 선택했고 WordPress의 export/import 기능 덕에 마이그레이션은 수월하게 진행되었다. Domain name은 호스팅 업체와 같은 곳으로 이전하는게 좋다고 해서 AWS Route 53으로 이전 및 1년 연기 등록을 했는데 상위 도메인에 따라 다르지만 .com의 경우 $13.2(세금포함)가 소요된다. 어라? 그러고 보니 Siteground에서 도메인을 연장하는 서비스는 $15.95였는데? 이눔 시키들…

도메인 이전과 새로운 IP 연결

도메인 이전을 요청하니 이전 관리자였던 Siteground에서 확인 메일이 왔고, 수락한 이후에는 하루 후에 AWS로 도메인이 이전되었다. 그 후에는 Lightsail의 네트워킹 탭에서 고정 IP와 DNS 영역을 생성해서 A 레코드를 추가하고 IP와 도메인 이름을 연결 시켜 주었다.

그리고 나서 한참을 DNS가 업데이트 되기를 기다렸다. nslookup은 여전히 예전 IP를 보여줬지만 48시간 까지 걸릴 수 있다는 말에 이틀정도를 기다렸는데도 IP가 업데이트 되지 않았다. AWS Route 53에 가보니 ‘registered domains > [domain name]’ 아래에 Name Servers 항목이 있는데 혹시 이것 때문인가 싶어서 고정 IP를 만들때 나왔던 네임서버 목록으로 업데이트를 해주었다. 그리고 나서 잠시 후 드디어 새로운 IP로 접속되었다!

계속 예전 IP로 돌아가는 도메인 문제와 해결

기쁜 마음으로 꿀잠에 들었는데 다음날 아침에 보니 Jetpack에서 서버연결 붙었다가 끊어졌다가 했다는 연락이 와 있었다. 혹시나 싶어서 서버를 재부팅 해봤더니 재부팅하는 순간 잠깐 IP가 새 것으로 붙었다가 다시 예전 IP로 돌아가는게 보였다. 그니까 누가 AWS 알고 있는 것과 다른 예전 정보를 자꾸 준다는 거지…” 혹시나 하는 마음에 Siteground의 cPannel > Advanced DNS zone editor에 들어가 봤더니 역시나 얘가 예전 주소를 꼭 쥐고 있었다. 예전 사업자의 도메인 서버를 AWS 고정 IP로 수정해 주고 났더니 Jetpack이 사이트 살아났다고 축하한댄다. 다행히 그 후로는 다시 끊어지는 일은 없었다.

도메인 관리자를 변경하고 새로운 IP를 연결 했으니 이전 네임 서버에서는 자동으로 놔 주겠거니 하고 잘 못 생각하고 있었던게 문제 였던듯 싶다.