AWS re:Invent 2017 참관기

 바로 지난 주, 나와 클라우드플랫폼팀장 제임스 동행으로 여기어때 R&D센터에서 AWS 2017 행사를 참관했다. 덴버/샌프란시스코와는 전혀 다른 라스베가스 스트립의 좌우로 초대형 호텔과 카지노가 즐비한 풍경에 한번 놀랬고, Registration Booth 부터 그 큰 규모에서 두번 놀랬다. 참고로 라스베가스는 이렇게 사람이 많이 모일수 있는 환경을 가지고 있어 대형 세미나가 지속적으로 열린다고 한다 (CES도 동시에 개최된 걸로 안다). 4만 명이 넘는 참가자가 라스베가스 전역에 있는 호텔 행사장에 모였고, 우버 드라이버들은 AWS 컨퍼런스 왔냐고 자연스레 안부 인사를 묻더라. 뭐 이미 잘 알려져 있듯이 한국에 많은 기업이 AWS를 사용하고 있다. 나는 참고로 re:Play 행사에서 오다가다 과거 네이버 동료도 거의 10년만에 만나기도 하였다. :-)

기술 세션들에 대한 리뷰는 모두 참석하지 못했기 때문에 내 눈이 정확하다 말할 순 없지만, 두 가지로 요약된다. Serverless 그리고 AI 다.


Serverless는 프로그래밍 패러다임을 송두리째 바꾸고 있으며, 더 이상 풀스택 엔지니어, 그들의 인프라 노하우와 경험적 스킬은 (희박한 오픈소스 해커 수준 아니고서야) 대우받기 힘든 세상이 되었다.

AI 분야도 마찬가지인데, 이미 학습능력이 클라우드 안으로 들어가기 시작했다.


  • 넷플릭스의 데이터 엔지니어로 유명한 배재현님의 글도 읽어볼 필요가 있음  https://www.facebook.com/jaehb/posts/10214839335118339?pnref=story 


 내 눈에 들어온 슬라이드 한장 … 내가 가장 열성적으로 들었던 딥 러닝 서밋은 장장 4시간 연짱 세션이었고, 그중에 눈에 너무 꽃힌 장표 한장이 있으니 … 주로 내가 많이 얘기하던 내용과 비슷한 면이 있어 그럴수도 있는데, 사용자 경험은 OS에서 웹으로, 웹에서 모바일, 그리고 이제 AI로 넘어가는 과정이라고 볼 수 있다. 우리 IT 기술은 현재 어디에 머물고 있는가? :-)


 여러가지 생각들을 뒤로하고 귀국 바로 전 그랜드 캐년에 들러 광활한 세상을 느끼고 그렇게 한국에 돌아왔다 …

조직 관성(Organizational Inertia)

최근 들어던 세미나에 의하면 자연 법칙으로 존재하는 관성은 조직에도 존재한다.

다소 철학적 고찰이긴 한데, 우선,  관성(inertia)부터 알아보자.

관성이란 버스가 급출발 할 때 뒤로 쏠리는 그 힘이 바로 관성이다.  관성은 원래 상태를 유지하려는 성질에 불과하니 진짜힘이 아니다. 그래서 관성을 가짜힘이라고 한다. 진짜힘은 버스를 급출발 시키는 힘이다.

몸이 뒤로 쏠리는 가짜힘의 크기는 버스를 급출발 시키는 진짜힘의 크기에 의해서만 결정된다. 이게 관성과 운동의 상대성이다.

관성과 운동의 상대성을 생각하면, 조직의 관성은 변화의 크기에 의해서 결정되므로 그것은 요주의 대상이 아니라 오히려 변화의 파도라고 볼 수 있겠다.

텍스트 분류를 위한 Adversarial Training

 최근 뉴럴 네트워크 모델 중에 가장 흥미롭다고 극찬받는 GAN 이라는게 있다. discriminator와 generator networks 두 개를 가지고 학습하는데, 하나는 더 잘 분류하기 위한 네트워크이고 하나는 더 잘 속이기 위한 네트워크로 이를 동시에 학습하면서 정확도를 높인다.

 이 모델을 텍스트 분류에도 적용해봤다는 논문이 바로 Adversarial Training Methods for Semi-Supervised Text Classification [link]. 방식은 다음과 같이 LSTM 네트워크 (분류니까 many-to-one) 두 개를 놓는다:


 (a) 네트워크는 원래대로 실제 데이터를 학습하고,(b) 네트워크는 속이기 위한 가짜를 생성하는데, 논문 Eq.(2) 수식을 보면 \(y\)가 레이블이고 \(x\)는 입력이며 \(r_{adv}\) 이 adversarial noise 값이다.

 이 때 adversarial noise 값은 \(\epsilon\) 보다 작은 범위의 변화이나, 이게 왜 잘 작동할 것 같냐면 원본 텍스트에서 의미는 달라지나 기계가 봤을 땐 거의 똔똔일 것 같은 가짜를 만드는거다. 이걸 보자마자 상당히 가치있는 내용이라는 생각이 들었다. 그 다음으로 semi-supervised learning을 위한 virtual adversarial training이 Eq.(3)(4)(5) 등에 소개되어 있다.


 테스트 데이터는 영화 리뷰 데이터를 사용하였는데 이게 텍스트에 감성이 담겨있어 기계가 해결하기 묘한 데이터라 실험에 적합하다 판단했기 때문이라고 추측한다. 코드나 그런건 Github에 공개되어있진 않다.

평균, 분산, 그리고 표준편차

이산확률변수 \(X = x_1, x_2, \cdots, x_n\) 일 때, 각 확률 \(P = p_1, p_2, \cdots, p_n\)의 합은 \(\displaystyle\sum_{i=0}^n p_i = 1\) 이 된다. 이산확률변수의 평균(기대값)은 \(E(x) = \displaystyle\sum_{i=0}^n x_ip_i\)로 정의된다. 보통 통계에서는 mean 이라고 하며 우리가 아는 그 평균이다. 가령, 10, 20, 30의 평균을 구해라 이러면 각 변수의 확률은 1/3이 되니까, \(\frac{10 + 20 + 30}{3}\)과 같이 식이 간소화 된다. 분산은 각 변수에 mean 값을 뺀 제곱에 확률 값을 곱한 것의 합으로 정의되는데 \(V(x) = \displaystyle\sum_{i=0}^n (x_i - m)^2p_i\), 값이 작으면 조밀하고 크다면 퍼져 있다라고 이해할 수 있다. 마지막으로 표준편차는 분산에 sqrt를 씌우면 되는데 \(\sigma(x) = \sqrt{\displaystyle\sum_{i=0}^n (x_i - m)^2p_i}\) 평균으로부터 얼마나 떨어져 있는지를 나타내는 값이 된다.

그러면 예를 들어보자, 웹사이트 방문자 모집단 체류 시간을 모아서 2d plotting 하면 분포를 눈으로 볼 수 있겠고 (이것만 보더라도 알 수 있는게 많음), 평균, 분산, 표준편차를 구하면 어떤 사용자가 이질적인 성향을 보이는지 등을 추적 할 수 있게 된다.

(딥 러닝) 자연어 처리의 4가지 주요 공식: Embed, Encode, Attend, Predict

자연어 처리 관련 딥 러닝 아키텍처를 보면 대게 Embed, Encode, Attend, Predict 4가지로 구성된다. 때문에 이 4가지만 제대로 알아도 이해가 가능하다.

 그러면, 제일 먼저 Embed. 단어를 n차원 실수 공간으로 옮기는 작업을 말한다. Image 따위를 vector로 변환하는건 다른 위상 공간으로 embedding하는 것이 아니므로 그냥 encoding이라는 표현을 쓴다. 여튼 수학표기는 다음과 같지:

\(W: \mathrm{words} \to \mathbb{R}^n\)


 다음은 Encoding 작업인데, "embedded vectors"를 sentence matrix로 계산하는 과정이다. 여기서 s는 (zero-padded) sentence length이고, d는 embedding의 dimensionality를 뜻한다:

sentence matrix \(A \in \mathbb{R}^{s×d}\)


 다음으로 Attend. "attended vector" 라는 표현을 자주 볼 수 있는데, 이는 행렬이 다시 single vector로 차원 축소되었다는 얘기다. max-pooling, sum-pooling 뭐 그런 방법을 사용하는데, MathJax에 익숙치 않아서 대강 적어보면 요정도 되시겠다:

attention vector \(σ\) = SumPool\((A_{i,1})\), ..., SumPool\((A_{i,K})\)


 마지막으로 Predict. 위 단계에서 구한 "attended vector"가 출력층에 전달되는 과정이다. SoftMax 뭐 그런 확률 모델 등이 있는데 너무 많으니 생략. NLP 모델은 대게 feed-forward 구조라서 보통 이 4가지의 단계를 따른다. Training은 back propagation이 있겠는데 최적화 이론은 조금 긴 얘기라 역시 생략. 

 그림으로 표현해서 구독자들께 전달하고 싶긴하나 귀찮고 어려운 작업이라 .. 검색한 이미지를 가져다 붙이면 대략 이런 느낌이다:


 최근 논문 중 paraphrase detection, factoid Q&A, 기타 등등 대부분은 이 4가지로 끝나는걸 볼 수 있다.

존! 나 고심끝에 이직해

 네이버, KT, 오라클, 그리고 잠깐의 사업을 거쳐 삼성전자에 입사한지도 2년이 지났습니다. 2016년 병신년을 뒤로하며 이번에는 꽤 색다른 도전에 나섭니다. 무슨 일이야!? 국내 O2O 숙박전문 회사 CTO로 조인합니다!


존! 나 고심끝에 이직해~

 그간 입사 제의를 받더라도 이직 자체가 비용이며 리스크이기 때문에 움직일 생각은 별로 안하고 있었습니다. 그런데, 특별히 이런 결정을 내린 계기가 있느냐 ...

 누군가 나에게 "당신이 생각하는 4차 산업 혁명의 키워드를 대봐라" 하면 AI, IoT internet, On-demand economy, O2O commerce 라 딱 4개 대답합니다.

 앞의 AI와 IoT internet은 주도 기술이며 뒤의 On-demand economy, O2O commerce는 기술 변화에 따른 경제 구조와 소비 양식의 변화를 말합니다.

 영리기업의 인공지능 R&D는 결국 지능적 서비스-이익 체인 시스템을 위한 겁니다. O2O 상거래 순환 구조 안에 그러한 기술이 총망라 될 것으로 보고 있고, 온-오프 사업자, 광고주, 그리고 소비자 간 win-win-win 모델이 형성되며 신종 B2C, B2B 신규 사업 확장의 기회 또한 상당히 클 것이라 내다 보고 있지요.

 이러한 변화는 어느 정도 예견은 되고 있었습니다. 그게 생각보다 상당히 빠르게 다가오고 있는게 현실인데, 역시나 이를 잘 대응하는 것은 대기업이 아니라 startup들입니다.

 모텔/숙박 O2O 또한 그 지점 한켠에 잘 포지션 되어있는데, 가령 기존 소비 패턴인 웹을 통한 숙박정보 조사와 예약 과정의 틈을 사이언스와 정보기술 엔지니어링으로 잘 메울 경우, 소비자는 다양한 편의성과 비용절감 효과가, 비즈니스 소유자는 완전히 추적 가능한 매출 흐름을 창출 할 수 있게 됩니다. 광고주는 지역 비지니스 특성상 필요한 마케팅 지출을 효과적으로 집행하도록 하는 한편 ROI를 온전히 보상받을 수 있게 되죠.

 결론적으로, 기업의 아이덴티티, 그리고 CTO라는 포지션으로 접하게 될 과제가 너무 기대되고, 개인적으로 경험할 것과 배울 것 또한 많다는게 이유입니다.

 앞으로 잘 지켜봐주세요.

Java에서 Aparapi를 이용하여 GPU 활용해보기

AMD에서 개발한 Aparapi를 이용하면 Java에서도 굉장히 편하게 GPU를 활용해볼 수 있다. 먼저 AMD APP SDK (AMD OpenCL™ Accelerated Parallel Processing) 를 설치해보자: 다운로드
 % bzip2 -d AMD-APP-SDKInstaller-v3.0.130.136-GA-linux64.tar.bz2 
 % tar xvf AMD-APP-SDKInstaller-v3.0.130.136-GA-linux64.tar 
 % sh ./AMD-APP-SDK-v3.0.130.136-GA-linux64.sh 
 % ls ~/AMDAPPSDK-3.0/include/
기타 설정은 https://wiki.tiker.net/OpenCLHowTo 에서 확인할 수 있고, 최종 설치가 잘 완료 되었는지 확인을 위해서 tools-master를 사용해보면 devices 정보가 나온다. 실험장비에는 Tesla k80이 총 16개 꽂혀있다.
 $ curl https://codeload.github.com/hpc12/tools/tar.gz/master | tar xvfz -
 $ cd tools-master
 $ make OPENCL_INC=/home/edward.yoon/AMDAPPSDK-3.0/include/
 $./print-devices 
./print-devices: /usr/local/cuda-7.5/lib64/libOpenCL.so.1: no version information available (required by ./print-devices)
platform 0: vendor 'NVIDIA Corporation'
  device 0: 'Tesla K80'
  device 1: 'Tesla K80'
  device 2: 'Tesla K80'
  device 3: 'Tesla K80'
  device 4: 'Tesla K80'
  device 5: 'Tesla K80'
  device 6: 'Tesla K80'
  device 7: 'Tesla K80'
  device 8: 'Tesla K80'
  device 9: 'Tesla K80'
  device 10: 'Tesla K80'
  device 11: 'Tesla K80'
  device 12: 'Tesla K80'
  device 13: 'Tesla K80'
  device 14: 'Tesla K80'
  device 15: 'Tesla K80'
이제 Aparapi를 써보자. Aparapi도 바이너리 릴리즈가 없고 직접 github source build 해야한다.
 $ git clone https://github.com/aparapi/aparapi.git
 $ ant -Dapp.sdk.dir=/home/edward.yoon/AMDAPPSDK-3.0/
빌드가 완료되면, 간단한 행렬 곱셈 프로그램을 구현해서 바로 실험해볼 수 있다. 코드가 1차 배열인 이유는 Aparapi는 다차배열 처리를 지원하지 않기 때문.
실험에서는 빠른 테스트를 위해 복붙 from https://vasanthexperiments.wordpress.com/ 100x 정도를 기대했지만, 10x 정도까지는 가속을 해주는 것으로 보인다.
edward.yoon@dl03:~$ javac -g -classpath .:/home/edward.yoon/aparapi.jar Test.java
edward.yoon@dl03:~$ java -classpath ./:/home/edward.yoon/aparapi.jar Test
Time taken for kenel execution in GPU mode is :43320
Time taken for kenel execution in Sequential CPU mode is :342491