물론 블로그나 유튜브 컨텐츠는 질이 나쁜 경우도 많다. 그럼에도 종종 유튜브에서 굉장한 고수들을 발견하기도 한다. 가끔은 두꺼운 책이나 긴 강의보다는, 그런 분들의 짧은 유튜브 동영상에서 많은 것을 배울 때가 있다. 오늘은 Viking Penguin님의 "Implementing Dropout as a Bayesian Approximation in TensorFlow" 동영상을 소개하고자 한다.
https://www.youtube.com/watch?v=aa9AC3dTKUQ
구독자 172명, 조회수 6,402 정도로 별거 아니어 보이는데, 26분짜리 이 동영상을 보면, 이 사람의 넘쳐나는 내공을 느낄 수 있다. 해당 동영상에서는 Yarin Gal의 한 논문을 설명하고, 이를 TensorFlow로 구현하는 과정을 라이브 코딩한다! Yarin Gal의 논문에서는, Dropout이라는 게 random하게 neural network를 sample할 수 있다는 관점에서, output도 random하게 sample할 수 있음을 제안한다. 이런 걸 variational inference라고 이야기하던 것 같은데, 이때 output의 variance를 통해 모델의 uncertainty를 측정하고자 하는 논문이다. 그래서 원 논문에서는 난해한 수학과 method가 사용되는데, Viking Penguin님은 이를 굉장히 명확하게 이해하고 코드로 표현한다.
사실 원 논문의 이해에는 수학도 중요하지만, 난 이 사람의 코딩 방식에서도 많은 깨달음을 얻었다. 사실 딥러닝 분야에서, 수학도 잘하고, 코딩도 잘하는 사람은 굉장히 드문데, 이 사람은 둘 다 잘한다. 이 사람은 그냥 즉석에서 뚝딱 만들고 바로 테스트하고 성공한다. 오늘 포스팅에서는, 이 사람의 라이브 코딩을 열심히 관찰하고, 숨겨진 코딩 습관을 캐치해보고자 한다. 참고로 난 영어공부랍시고 이 26분짜리 동영상을 작년에 20번 들었다..
- if True:라는 코드를 사용함. 이게 논리적으로는 의미 없지만, 예를 들어 figure 그리는 코드와 같이, 내가 on-off하고 싶은 분기 지점을 관리하기 편한 듯.
- 파이썬 코딩 스타일을 굉장히 잘 따름. class 뒤에는 2번 개행. class 사용 시 """ 주석도 해줌. class에서는 init과 call을 따로 관리하고. class 네이밍은 CamelCase로 작성하는 것도 지킴. import는 맨 위에서. 띄어쓰기도 항상 정확함. 심지어는 @property로 private같은 것도 관리함.
- 정수는 10 혹은 3과 같이 표현하지만, 실수인 경우는 무조건 5. 혹은 3.과 같이 소수점을 표기함. 이게 float임을 명시하는 의도인데, 굉장히 좋은 습관인 듯.
- print할 때는 print("a: {:4f}".format(a)) 이런 식으로 변수를 출력하고자 함. 실제로 string print에서는 "a_" + str(n) + "_b"처럼 + 연산을 쓰는 것보다, {}를 써서 변수를 출력하는 방식이 더 권장되고 있음.
- string을 표현할 때 "를 사용함. 그래서 '는 안 씀. 실제로 python 포맷팅 툴 중에 black에서는 '를 모두 "로 바꿔주기도 함.
- 주석을 지나치게 많이 작성하지 않음. 굳이 사용한다면, class 사용 시의 """ 이런 거라던가, 혹은 주피터적 셀 의미에서 한 번씩 # 써주는 듯. 코드를 주석 처리하는 경우는 없고, 말을 주석으로 넣음. 그리고 주석을 마무리할 때 .을 찍는다. 실제로 Clean Code에서 말하기를, 주석 없는 코드가 좋은 코드라고 하니까.
- 복붙, 즉 Ctrl-C, Ctrl-V를 지나치게 많이 쓰지 않음. 비슷한 코드를 작성하는 경우에도, 이 사람은 오히려 타이핑을 많이 함.
- tensor size는 직접 값을 관리하지 않고 변수로 관리함. n_samples, n_hidden 이런 거.
- reshape을 잘 안 쓰고 squeeze나 atleast_2d, ravel 이런 걸 사용함. 실제로 reshape은 연산적으로 비효율적인 방식이고, squeeze처럼 용도에 명시적인 방식이 효율적이라고 알려져 있음.
- 코딩 환경은 맥북프로에 emacs를 쓰고 있음. 검은 배경에 적절한 색깔 넣어주고. 플러그인은 대충 보니까 레인보우 괄호라던가, 아니면 함수에서의 태그도 보여주고, 자동 완성도 잘 되는 편 같고, 문법 에러도 왼쪽에 점으로 표시해줌. visual select한 후에 괄호를 양옆으로 해주는 플러그인도 있나 봄. 라인 넘버 표시하는 것도 해놨음. 괄호 한쪽만 하면 나머지 자동으로 해주는 플러그인도 있음. 탭 같은 공백을 시각화해주는 플러그인도 있음.
- 고수들은 키보드만 쓰나 싶었는데, 이 사람은 의외로 마우스도 많이 사용함. 커서 이동하거나, 페이지 넘길 때 마우스 사용. 엄밀하게는, 아마 트랙패드인 듯(소리상).
- 학문적으로도 열심히 했는지, 이렇게 multiple mode가 나타남이 나의 favorite한 부분이다라고 이야기함. 다른 동영상 보니까, 아마 이렇게 random sample을 얻는 분야에서 대학원 다녔을 것으로 추정함.
- 근데 아무리 생각해도, 내 생각엔 대본이라던가, 미리 뽑아둔 본인의 자료 보면서 라이브 코딩하고 있는 것 같긴 함. 너무 잘하잖아..