페이지

2022년 9월 4일 일요일

STEP 26 계산 그래프 시각화(2)

이전 단계에서는 DOT 언어를 작성하는 방법을 배웠습니다. 이 지식을 바탕으로어번 단계에서는 DeZero 계싼 그래프를 DOT 언어로 변환하려 합니다. 구체적으로 DeZero에서 실행한 계산을 DOT 언어로 변환하는 기능을 구현할 것입니다.

2.54 노드 연결하기

 노드를 연결하려면 두 노드의 ID를 '->'로 연결하면 됩니다. 예를 들어 1 -> 2라고 쓰면 ID가 1인 노드에서 ID가 2인 노드로 화살표가 그려집니다. 다음 dot 파일을 작성해봅시다.

digraph g{

1 [label="x", color=orange, style=filled]

2 [label="y", color=orange, style=filled]

3 [label="Exp", color=lightblue, style=filled, shape=box]

1 -> 3

3 -> 2

}

이 dot파일로부터 [그림 25-4]를 얻을 수 있습니다.


이철럼 노드들을 화살표로 연결할 수 있습니다. DOT 언어는 이외에도 많은 기능을 제공하지만 우리에게는 지금까지의 짓기이면 충분합니다. 이제 DeZero계산 그래프를 그릴 준비가 끝났습니다. 다음 단계에서는 DeZero 계산 그래프를 DOT 언어로 출력하는 기능을 추가하겠습니다.


25.3 노드에 속성 지정하기

 노드에는 '색'과 '모양'을 지정할 수 있습니다. 방금 사용한 sample.dot 파일을 다음과 같이 수정해봅시다.

digraph g{

1 [label="x", color=orange, style=filled]

2 [label="y", color=orange, style=filled]

}

이전과 마찬가지로 각 줄에는 노드 하나의 정보가 담깁니다. 그러나 이번에는 각 줄이 '1'과 '2' 같은 숫자로 시작하고 있습니다. 이 값은 노드의 ID를 나타냅니다. 그리고 해당 ID의 노드에 부여할 속성을 대괄호 [] 안에 적습니다. 예를 들어 label = "x" 라고 쓰면 노드 안에 x라는 문자가 표시됩니다. color=orange는 노드를 오렌지색으로 그리라는 뜻이고, sstyle=filled는 노드안쪽을 색칠하라는 뜻입니다.

노드 ID는 0이상의 정수이며, 다른 노드와 중복되지 않아야 합니다.

앞에서처럼 터미널에서 dot sample.dot -T png -o sample.png 명령을 실행해보세요. 그러면 [그림 25-2]를 얻을 수 있습니다.



[그림 25-2]처럼 오랜지색 노드가 2개 랜더링되었습니다. 여기에 사각형의 하늘색 노드를 추가해보죠,


digraph g{

1 [label="x", color=orange, style=filled]

2 [label="y", color=orange, style=filled]

3 [label="Exp", color=lightblue, style=filled, shape=box]

}


이와 같이 새로운 노드를 추가하고 속성으로 사각형(box)과 하늘색(lightblue)을 지정합니다. 이 파일로부터는 [그림 25-3]을 얻을 수 있습니다.


원형과 사각형 노드를 그릴 수 있으니, 이것으로 DeZero의 '변수'와 '함수'를 그릴 준비가 끝났습니다. 나머지는 노드들을 화살표로 연결하기만 하면 됩니다.

이책에서는 계산 그패프를 그릴때 변수를 원(타원)으로, 함수를 사각형으로 표현했습니다. 그래서 DOT언어를 사용한 시각화에서도 변수는 원으로, 함수는 사각형으로 그리겠습니다.




25.2 DOT 언어로 그래프 작성하기

 그럼 DOT 언어로 그래프를 그려봅시다. 각자 좋아하는 편집기를 열고 다음 테스트를 입력하세요.

digraph g{

x

y

}

DOT 언어의 문법부터 설명핫겠습니다. 우선 반드시 digraph g {...} 구조여야 합니다. 그리고 그리려는 그래프의 정보가 ... 안에 들어갑니다. 앞의 예에서는 x와 y가 등장하는데, 2개의 노드를 그린다는 뜻입니다. 또한 각 노드는 '줄바꿈'으로 구분해야 합니다.

앞의 내용을 입력한 다음 sample.dot 파일로 저장하고 다음 명령을 실행해보세요.

dot sample.dot -T png -o sample.png

그려면 [그림 25-1]의 이미지가 출력됩니다.



이상으로 DOT 언어를 최대한 간단하게 소개해봤습니다.


25.1 Graphivz 설치하기

 Graphivz는 그래프를 시가화해주는 도구입니다(여기서 '그래프'는 계산 그래프와 같이 노드와 화살표로 이뤄진 데이터 구조를 말합니다). Graphviz를 이용하면 예쁜 그림을 쉽게 그릴 수 있습니다. 우선 설치부터 함께 해보겠습니다.


Graphviz는 원도우, macOS, 리눅스에서 사용할 수 있습니다. 이책에서는 macOS와 우분투 에서의 설치 방법을 소개합니다. 다른 OS에서의 설치 방법은 Graphivz의 웹페이지를 참고하세요(https://graphvizgitlab.io/download/)


STEP 25 계산 그래프 시각화(1)

 DeZero는 이제 복잡한 수식도 쉽게 코드로 옮길 수 있습니다. 실재로 24단계에서는 Goldstein-Price 함수라는 매우 복잡한 함수를 코딩했습니다. 그런데 이런 복잡한 식을 계산할 때 그 뒤편에서는 어떤 '계산 그래프'가 만들어지는 것일까요? 그 전모를 눈으로 직접 확인하고 싶지 않나요? 그런 분들을 위해 이번 단계에서는 계산 그래프를 시각화합니다.


계산 그래프를 시각화하면 문제가 발생했을 때 원인이 되는 부분을 파악하기 쉬워집니다. 또한 더 나은 계산 방법을 발견할 수도 있고, 긴경망의 구조를 3자에게 시각적으로 전달하는 용도로도 활용할 수 있습니다.


시각화 도구도 밑바닥부터 만들 수 있지만 이 책의 주제인 딥러닝에서 조금 탈선하는 느낌이라 외부 자원이 Graphivz를 활용하려 합니다. 이번 단계에서는 주로 Graphivz의 사용법을 설명하고, 다음 단계에서 Graphivz를 사용하여 계산 그래프를 시각화하겠습니다.



제 3 고지 고차 미분 계산

 DeZero는 이제 역전파를 완벽하게 구동할 수 있습니다. 아무리 복잡한 계산이라도 문제없이 역전파를 수행해주기 때문에 지금의 DeZero라면 미분 계산이 필요한 문제의 대부분을 해결할 수 있습니다. 하지만 아직 할 수 없는 일도 있는데, 그중 하나가 고차 미분입니다.


고차미분이란 어떤 함수를 2번 이상 미분한 것을 말합니다. 구체적으로는 1차 미분, 2차 미분, 3차 미분. ... 식으로 미분을 반복하는 직업입니다. 파이토치와 텐서플로 등 현대적인 딥러닝 프레임워크에서는 고차 미분을 자동으로 계산할 수 있습니다. 더 정확히 말하면, 역전파에 대한 역전파를 할  수 있습니다(이번 고지에서 원리를 밝혀드립니다).


지금부터 세 번째 고지로 향합니다. 이번 고지에서는 고차 미분을 꼐산할 수 있도록 DeZero를 확장하는 일을 합니다. 그 결과 DeZero의 활용폭이 한층 넓어집니다.