잡설 1
지금 사는 행신에서 직장이 있는 을지로까지 출퇴근 하는데, 대략 한시간이 덜 걸린다. 행신역에서 전철을 타고 갈 수 있고, 집 앞 버스 정류소에서 버스를 타고 신촌으로 나올 수도 있다. 전철을 타면 신촌/홍대입구까지 전철 타는 시간만 20분 남짓이면 되지만, 버스는 막히면 40분을 넘기기 일쑤다.
그럼에도 종종 버스를 타고 출근을 하는 이유는 나름 상반된 풍경을 즐길 수 있어서다.
베드타운 성격이 강할지언정 나름 도시의 모습을 잘 갖춘 행신을 빠져나오면 쭉 뻗은 도로 양 옆으로 간판이 바랜 상점들이 꽤 즐비하게 서있다. 하지만, 그 뒤로는 멀리 북한산이 보이고, 넓은 초지가 펼쳐져있어 마치 한적한 시골에 와 있는 느낌이 든다. 그렇게 한 15분여를 달리면 서울의 경계에 있는 수색에 다다른다.
수색과 가좌는 2010년도 넘어서나 재개발이 이루어진 곳이라 참 묘한 풍경을 하고 있다. 도로가에는 딱 봐도 정말 오래된 상점들과 상가들이 있지만, 바로 뒤 블럭을 보거나 조금만 그 곳을 지나가면 새로지은 거대한 아파트 단지가 눈에 들어온다. 또 눈을 오른쪽으로 돌리면 '디지털미디어시티'라는 거창한 이름을 가진 거대한 상업/업무지구가 눈에 들어온다.
이곳을 지날때마다 과연 이런 개발이 이루어지기 전 이곳의 모습이 어땠을지 궁금해진다. 길가를 따라 들쭉날쭉 지어진 허름한 건물들이 주는 풍경과, 무 자른 듯 딱 떨어지는 각도로 서있는 아파트의 풍경이 너무나도 대조적이기 때문이다.
아마도 예전엔 그저 사람들이 소소히 모여사는 작은 마을이었겠지. 아니면 이전에도 이미 사람들이 몰려사는 시끄러운 동네였을까. 누군가는 재개발의 수혜를 입었을테고, 누군가는 삶의 터전을 빼앗겼겠지. 이런저런 생각이 든다.
그리고 이런 대조적 풍경도 지나고 거대도시 속으로 버스는 쑥 빨려들어간다. 대충 시간을 계산해보면 늦지는 않겠구나 안도하며 지하철로 갈아타고 나는 인파속으로 총총히 사라진다.
완벽한 공부법 (2017, 고영성, 신영준)

0. 이 책은 2017년 초반 발행되어 베스트셀러에 등극하며 나름 센세이션을 일으켰다.
1. 이런 류의 자기 계발 서적은 어떤 것은 너무 자기 위주의 내용을 진리인양 써서 거부감을 일으키기도 하고 현실과 어울리지 않는 경우도 많이 있다. 이 책은 조금 다른 것이 저자들이 이것 저것 열심히 찾아보고, 공부하고, 짜집고 쓴 책이기 때문에 꽤나 도움되는 내용이 많다. 거기에 저자들의 경험이 녹아들어 한 번쯤은 읽어보는 것이 도움될 듯 하다.
2. 완벽한 공부법의 내용을 요약하면 다음과 같은 키워드로 정리할 수 있다. 기억을 더듬기 위해 가끔 들춰보면 앞으로도 도움이 많이 될 듯하다.
- 자기 자신을 믿고 작은 성공부터
- 자기 자신을 아는 메타인지
- 기억 잘하기(공부는 어렵게)
- 시험효과
- 인출효과(시험,안성,토론,요약,글쓰기,발표 등)
- 분산연습 - 몰아치는 것이 아닌 시기를 나눠서
- 교차 - 두 가지 이상을 번갈아가며
- 그 외 - 자기참조, 맥락, 심상활용, 조직화, 첫 낱자 조합
- 감정
- 부정적 감정보다 긍정적 감정이 학습효과를 높임
- 부정적이거나 걱정되는 감정을 표현하거나 긍정적 감정으로 바꿔주면 효율이 높아짐
- 사회성
- 외로운 사람은 학습 능력 저하
- 사람과의 관계를 잘 유지해야 함
- 환경
- 습관은 의지력이 아닌 알람으로 고침
- 스스로 집중이 잘 되는 환경 필요
- 스마트폰 쉣
- 창의성
- 있던 아이디어들의 새로운 조합
- 그래서 다양한 경험 필요(취미, 여행, 독서 등)
- 독서
- 다양한 경험 필요
- 독서를 많이 해라
- 다독 후 정독으로
로건(2017)
0. 만화로만 보던 'X-men'이 처음 실사 영화로 나왔을 때 그 충격은 이루 말할 수 없었다. 개인적으로 원작 팬이 아니었음에도 내용 자체에 빨려들어가서 푹 빠졌었다. 정말 양키스러운 원작의 코스츔을 입혀놓지 않아서 그런지 내용 몰입에 이질감이 없었다.
이 캐릭터 중 '울버린'을 맡은 '휴 잭맨'은 그가 아니면 울버린을 생각할 수 없을 정도로 엄청난 싱크로율을 보여주기도 했다.
1. 영화상의 설정이 아무리 늙지않는 뮤턴트이라 한들 사람이 늙지않을리 만무하다. 17년 전 휴 잭맨의 싱그러움은 세월 속으로 날아가고, 어느덧 얼굴에 깊게 패인 주름이 자리잡았다. 아무리 몸 관리를 한다고 해도 흐르는 세월을 속일 수는 없겠지. 확실히 울버린 스핀오프 시리즈를 보면 뒤로 갈수록 어쩔수 없이 느껴지는 세월의 흐름으로 아쉬움이 느껴지긴 했다. 상황이 이러면 영화를 제작하는 입장에서도 세대교체를 준비해야할 것이고, 특히 이 울버린이라는 정말 사랑받는 캐릭터의 경우는 그 고민이 더 깊었으리라 생각된다.
2. 마블 스튜디오는 로건의 퇴장을 비장하지만 오버하지 않는 이 <로건>이라는 영화를 통해 시도한다. 자연스럽게 새로운 울버린 X-23과 접점을 찾고, 구 배우들의 퇴장을 준비한다. 19금 히어로 무비라는 참 어색한 조합으로 영화가 나왔을 때 우려의 목소리가 있었으나, 오히려 작정한 듯한 액션이 이야기의 현실성을 더해준다. 여기에 세월에 찌든 로건의 자연스러운 욕지거리도 현실감에 한 몫한다.
3. 함께 하던 것과의 이별은 언제나 슬프다. 갓 성인이 되기 시작할 때부터 꼭 챙겨보던 X-men 시리즈의 한 세대가 그 끝을 고하는 모습을 보며 나 또한 그만큼 나이가 먹었음을 깨닫는다. 영화 자체의 건조하고 우울한 분위기도 한 몫하는 것 같다. 이렇게 멋지지만 슬픈 퇴장을 준비한 마블 스튜디오는 정말 장인정신이 있다는 생각도 들었다. 울버린, 프로페서 X, 그간 너무 행복했습니다.
X-men의 팬이라면, 아니 팬이 아니더라도 청소년 관람불가 히어로 무비가 궁금한 사람이라면 꼭 봐야할 영화.
이 캐릭터 중 '울버린'을 맡은 '휴 잭맨'은 그가 아니면 울버린을 생각할 수 없을 정도로 엄청난 싱크로율을 보여주기도 했다.
1. 영화상의 설정이 아무리 늙지않는 뮤턴트이라 한들 사람이 늙지않을리 만무하다. 17년 전 휴 잭맨의 싱그러움은 세월 속으로 날아가고, 어느덧 얼굴에 깊게 패인 주름이 자리잡았다. 아무리 몸 관리를 한다고 해도 흐르는 세월을 속일 수는 없겠지. 확실히 울버린 스핀오프 시리즈를 보면 뒤로 갈수록 어쩔수 없이 느껴지는 세월의 흐름으로 아쉬움이 느껴지긴 했다. 상황이 이러면 영화를 제작하는 입장에서도 세대교체를 준비해야할 것이고, 특히 이 울버린이라는 정말 사랑받는 캐릭터의 경우는 그 고민이 더 깊었으리라 생각된다.
2. 마블 스튜디오는 로건의 퇴장을 비장하지만 오버하지 않는 이 <로건>이라는 영화를 통해 시도한다. 자연스럽게 새로운 울버린 X-23과 접점을 찾고, 구 배우들의 퇴장을 준비한다. 19금 히어로 무비라는 참 어색한 조합으로 영화가 나왔을 때 우려의 목소리가 있었으나, 오히려 작정한 듯한 액션이 이야기의 현실성을 더해준다. 여기에 세월에 찌든 로건의 자연스러운 욕지거리도 현실감에 한 몫한다.
3. 함께 하던 것과의 이별은 언제나 슬프다. 갓 성인이 되기 시작할 때부터 꼭 챙겨보던 X-men 시리즈의 한 세대가 그 끝을 고하는 모습을 보며 나 또한 그만큼 나이가 먹었음을 깨닫는다. 영화 자체의 건조하고 우울한 분위기도 한 몫하는 것 같다. 이렇게 멋지지만 슬픈 퇴장을 준비한 마블 스튜디오는 정말 장인정신이 있다는 생각도 들었다. 울버린, 프로페서 X, 그간 너무 행복했습니다.
X-men의 팬이라면, 아니 팬이 아니더라도 청소년 관람불가 히어로 무비가 궁금한 사람이라면 꼭 봐야할 영화.
Machine Learning을 이용한 주가 패턴 분석(2) - Genetic Algorithm
0. 회사일 짬짬히 하다보니 아무래도 진도가 빠르진 않다. 하지만 하나 하나 해보며 정리를 하다보면 언젠간 결과가 나올 것이다.
일단 지난번에 Random Optimization을 가지고 테스트를 해봤다. 최적화라는 것이 어느정도 무작위성을 가지고 있는 것은 맞다. 아무래도 처음 답을 찍어서 이리저리 흔들어보며 더 나은 방향으로 나아가기 때문일 것이다. 하지만 너무 대놓고 무작위로 답을 찾아들어가면 작업을 많이 돌리면 돌릴수록 결과가 나아질 가능성이 높아지긴 하나 그 보장이 없으므로 무엇인가 안정적이면서 멋도 조금 나는 것들을 찾아보기로 했다.
최적화의 기본적인 알고리즘인 Hill Climb의 경우 이웃 해답이라는 개념이 있어야 하는데, 내가 풀고자 하는 문제에서는 이웃 해답을 정의하기가 애매했다. 그래서 멋도 나고 쓸만한 것으로 유전자 알고리즘을 선택하기로 했다.
1. 유전자 알고리즘은 일단 무작위로 임의의 갯수로 답을 찾는다. 그리고 이를 모집단으로 사용하여 가장 적은 비용을 갖는 몇 개의 해답을 골라내고(엘리트), 이 해답들을 약간 비틀어(변이를 일으켜) 다시 같은 작업을 반복한다. 이렇게 하면 좋은 답에서 얻어진 유전자를 바탕으로 더 좋은 답을 얻을 수 있다는 것이 유전자 알고리즘의 기본 사상이다.
내가 풀고자 하는 문제는 찾아야 할 것이, 주가 추세 직선을 구성하는 점의 갯수와 그 점의 위치이다. 여기서 어떤 것을 변이시킬지 찾아야 한다. 여기서 점 자체를 변이시키면 변이에 대한 경우의 수가 너무 많다. 해서 점의 갯수를 변이 시키기로 하고, 그에 따라 현재 물려받은 점 들에 새로운 점을 추가하거나, 기존의 점을 삭제하기로 했다.
$$
P_i = \{ (x_1, y_1), ... ,(x_n, y_n) | n \} \rightarrow P_{i+1} = \{(x_1, y_1), ... , (x_m, y_m)|m\}, m = n+1
$$
위의 경우는 $i$에서 $i+1$로 세대가 넘어가면서 점이 하나 추가된 경우이다. 단 기존 세대에서 받아온 점은 그대로 유지하고 새로운 점만 하나 더 추가를 한다. 이 때 추가 또는 삭제 대상 점의 선정은 무작위로 하도록 했다. 이렇게 하면 엘리트 집단 안의 하나의 엘리트는 각자 두 개의 자손(더하기, 빼기)을 갖게 된다.
앞서의 과정을 임의의 충분한 횟수만큼 돌리거나, 몇 세대동안 더이상 발전이 없을 경우(최선의 답이 바뀌지 않을 경우) 멈추는 방식으로 구현한다.
2. 이 작업을 하면서 비용 함수를 조금 손을 봤다. 일단 점의 갯수에 패널티를 줄 때, 스케일을 고려하여 점의 갯수에서 전체 데이터 수를 나누어 일종의 비율로 나타내도록 했다. 즉, 다음과 같은 비용 함수를
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + \omega m
$$
다음과 같이 고쳤다.
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + m / n
$$
여기서 $n$은 전체 데이터의 갯수이다.
그리고 여기다 하나 더 추가했다. 무릇 추세선이라고 하면 그럴싸하게 넓직하게 나와야 더 좋아보일 것이다. 그래서 점간 거리($x$의 거리)를 비용으로 추가하기로 했다. 그러면 아무래도 바로 옆 점을 추가하는데 부담을 느끼게 될 것이고 추세를 나타내는 점이 조금 더 넓게 퍼질 것으로 기대할 수 있다. 일단, 점 간거리를 다음과 같이 정의하자.
$$
D = \{x_i - x_{i-1}\}, i=2,...n
$$
이 값을 비용으로 사용하기 위해서는 점 간거리가 가까울수록 비용 부과를 더 해야하니 위의 벡터의 요소들을 각각 역수를 취하자.
$$
\hat{D}=\{ \frac{1}{x_i - x_{i-1}}\}
$$
비용은 $\hat{D}$의 각 요소의 제곱의 합으로 나타내면 되므로 $ \hat{D}^T\hat{D}$ 로 표현할 수 있다. 그래서 최종적으로 현재 구현한 비용 함수는 다음과 같다.
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + m / n + \hat{D}^T\hat{D}
$$
이런 식으로 찾아낸 주가 패턴 두가지를 아래 그림으로 첨부한다.
3. 이제 이런 방식으로 구해진 패턴 데이터를 어떻게 머신 러닝에 적용할 데이터로 만들지 고민해봐야 한다. 아마도 텐서플로를 기반으로 작업을 진행할 것 같으니, 앞으론 텐서플로를 정리해보도록 하겠다.
일단 지난번에 Random Optimization을 가지고 테스트를 해봤다. 최적화라는 것이 어느정도 무작위성을 가지고 있는 것은 맞다. 아무래도 처음 답을 찍어서 이리저리 흔들어보며 더 나은 방향으로 나아가기 때문일 것이다. 하지만 너무 대놓고 무작위로 답을 찾아들어가면 작업을 많이 돌리면 돌릴수록 결과가 나아질 가능성이 높아지긴 하나 그 보장이 없으므로 무엇인가 안정적이면서 멋도 조금 나는 것들을 찾아보기로 했다.
최적화의 기본적인 알고리즘인 Hill Climb의 경우 이웃 해답이라는 개념이 있어야 하는데, 내가 풀고자 하는 문제에서는 이웃 해답을 정의하기가 애매했다. 그래서 멋도 나고 쓸만한 것으로 유전자 알고리즘을 선택하기로 했다.
1. 유전자 알고리즘은 일단 무작위로 임의의 갯수로 답을 찾는다. 그리고 이를 모집단으로 사용하여 가장 적은 비용을 갖는 몇 개의 해답을 골라내고(엘리트), 이 해답들을 약간 비틀어(변이를 일으켜) 다시 같은 작업을 반복한다. 이렇게 하면 좋은 답에서 얻어진 유전자를 바탕으로 더 좋은 답을 얻을 수 있다는 것이 유전자 알고리즘의 기본 사상이다.
내가 풀고자 하는 문제는 찾아야 할 것이, 주가 추세 직선을 구성하는 점의 갯수와 그 점의 위치이다. 여기서 어떤 것을 변이시킬지 찾아야 한다. 여기서 점 자체를 변이시키면 변이에 대한 경우의 수가 너무 많다. 해서 점의 갯수를 변이 시키기로 하고, 그에 따라 현재 물려받은 점 들에 새로운 점을 추가하거나, 기존의 점을 삭제하기로 했다.
$$
P_i = \{ (x_1, y_1), ... ,(x_n, y_n) | n \} \rightarrow P_{i+1} = \{(x_1, y_1), ... , (x_m, y_m)|m\}, m = n+1
$$
위의 경우는 $i$에서 $i+1$로 세대가 넘어가면서 점이 하나 추가된 경우이다. 단 기존 세대에서 받아온 점은 그대로 유지하고 새로운 점만 하나 더 추가를 한다. 이 때 추가 또는 삭제 대상 점의 선정은 무작위로 하도록 했다. 이렇게 하면 엘리트 집단 안의 하나의 엘리트는 각자 두 개의 자손(더하기, 빼기)을 갖게 된다.
앞서의 과정을 임의의 충분한 횟수만큼 돌리거나, 몇 세대동안 더이상 발전이 없을 경우(최선의 답이 바뀌지 않을 경우) 멈추는 방식으로 구현한다.
2. 이 작업을 하면서 비용 함수를 조금 손을 봤다. 일단 점의 갯수에 패널티를 줄 때, 스케일을 고려하여 점의 갯수에서 전체 데이터 수를 나누어 일종의 비율로 나타내도록 했다. 즉, 다음과 같은 비용 함수를
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + \omega m
$$
다음과 같이 고쳤다.
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + m / n
$$
여기서 $n$은 전체 데이터의 갯수이다.
그리고 여기다 하나 더 추가했다. 무릇 추세선이라고 하면 그럴싸하게 넓직하게 나와야 더 좋아보일 것이다. 그래서 점간 거리($x$의 거리)를 비용으로 추가하기로 했다. 그러면 아무래도 바로 옆 점을 추가하는데 부담을 느끼게 될 것이고 추세를 나타내는 점이 조금 더 넓게 퍼질 것으로 기대할 수 있다. 일단, 점 간거리를 다음과 같이 정의하자.
$$
D = \{x_i - x_{i-1}\}, i=2,...n
$$
이 값을 비용으로 사용하기 위해서는 점 간거리가 가까울수록 비용 부과를 더 해야하니 위의 벡터의 요소들을 각각 역수를 취하자.
$$
\hat{D}=\{ \frac{1}{x_i - x_{i-1}}\}
$$
비용은 $\hat{D}$의 각 요소의 제곱의 합으로 나타내면 되므로 $ \hat{D}^T\hat{D}$ 로 표현할 수 있다. 그래서 최종적으로 현재 구현한 비용 함수는 다음과 같다.
$$
C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + m / n + \hat{D}^T\hat{D}
$$
이런 식으로 찾아낸 주가 패턴 두가지를 아래 그림으로 첨부한다.
3. 이제 이런 방식으로 구해진 패턴 데이터를 어떻게 머신 러닝에 적용할 데이터로 만들지 고민해봐야 한다. 아마도 텐서플로를 기반으로 작업을 진행할 것 같으니, 앞으론 텐서플로를 정리해보도록 하겠다.
조금 더 복잡한 Chain Rule
0. PDE를 써서 FDM으로 만들 때 복잡한 수식을 변환하거나, 격자 자체의 방향을 틀어버리는 목적으로 변수 치환을 많이 한다. 그 때 연산자 변환을 위해서 chain-rule을 자주 사용하는데, 2차 미분으로 넘어가면서 헷갈리는 경우가 많아 정리를 해두려 한다.
1. 복잡한 chain-rule에 대해 이해를 해보려다가 인터넷을 뒤적거리다 보니, 꽤 괜찮은 방법을 찾았다. 그 것은 바로 일종의 이항트리를 이용하는 방식이다. 다음과 같은 함수가 있다고 가정하자.
여기서 $x$와 $y$를 변수로 갖는 함수를 $f(x, y)$로 하고 $\psi$와 $\eta$를 변수로 갖는 함수를 $g(\psi, \eta)$라고 하자. 여기서 $f(.) = g(.)$이라 하면, 내가 관심있는 것은 $\partial{f} / \partial{x}$를 어떻게 $\psi$와 $\eta$에 대해 변환할 수 있을까이다.
변환을 시작하기 전에 다음과 같은 다이어그램을 그려보자.
$ g \\
/ \backslash \\
\psi \eta \\
/ \backslash / \backslash \\
x y x y $
뭔가 좀 후지긴 한데... 어쨌든, $g$는 $\psi, \eta$의 함수이고, 또 각각은 $x, y$의 함수라는 의미이다. 그래서 chain-rule을 이용하여 미분을 할 때 각 트리를 따라 내려가면 수월하게 할 수 있다. 트리의 가지를 하나 내려올 때마다 미분이 추가된다고 보면 된다. 즉, $g$에서 $\psi$로 오면 $g$를 $\psi$로, $\psi$에서 $x$로 오면 $\psi$를 $x$로 미분한다는 의미이다.
2. 1차 미분
$\partial{f}/\partial{x}$를 변환하기 위해서, 즉 $\partial{g}/\partial{x}$를 찾기 위해서는 위 트리를 따라 내려가며 $x$가 나올 수 있는 경우를 모두 찾는다. 여기서는 $g \rightarrow \psi \rightarrow x$와 $g \rightarrow \eta \rightarrow x$의 두가지가 있다. 즉, $\psi, \eta$ 각각에 대해 미분을 해줘야 한다는 의미이다. 그래서 종합하면 다음과 같다.
$$ \frac{\partial f}{\partial x} = \frac{\partial g}{\partial \psi} \frac{\partial \psi}{\partial x} + \frac{\partial g}{\partial \eta} \frac{\partial \eta}{\partial x} $$ 그리고 앞에 정의한 $\psi, \eta$를 $x$에 대해 미분해서 넣어주면 다음과 같은 결과가 나온다.
$$ \frac{\partial f}{\partial x} = \frac{\partial g}{\partial \psi} + \frac{\partial g}{\partial \eta} ... (1)$$
만약 $y$에 대해서 찾는다면 위와 같은 방식으로 트리를 타고 내려오면 쉽게 이해할 수 있다.
3. 2차 미분
이제 $\partial^2 f/\partial{x}^2$를 변환하고 싶다. 그럼 앞의 그래프에서 $g$를 (1)번 식의 각 항으로 바꾸어 각각 진행한다. 즉, 두 항에 대해 앞과 같은 그래프 태우기를 한다. 그럼 다음과 같은 순서로 진행된다.
$$ \frac{\partial^2 f}{\partial{x}^2} = \frac{\partial}{\partial x} (\frac{\partial g}{\partial \psi} +
\frac{\partial g}{\partial \eta} ) \\ = (\frac{\partial^2 g}{\partial{\psi}^2} \frac{\partial{\psi}}{\partial x}
+ \frac{\partial^2 g}{\partial{\psi}\partial{\eta}}\frac{\partial \eta}{\partial x})
+ (\frac{\partial^2 g}{\partial{\eta}^2} \frac{\partial{\eta}}{\partial x}
+ \frac{\partial^2 g}{\partial{\psi}\partial{\eta}}\frac{\partial \psi}{\partial x}) $$
즉, 트리의 각 가지를 타고 내려오며 해당 미분을 해주면 된다는 의미다.
4. 합성 미분
합성 미분도 위의 방식대로 $x$가 필요할 때는 $x$를 찾는 방향으로, $y$가 필요하면 $y$를 찾는 방향으로 움직이면 된다.
1. 복잡한 chain-rule에 대해 이해를 해보려다가 인터넷을 뒤적거리다 보니, 꽤 괜찮은 방법을 찾았다. 그 것은 바로 일종의 이항트리를 이용하는 방식이다. 다음과 같은 함수가 있다고 가정하자.
$$ \psi = x+y, \eta = x-y $$
여기서 $x$와 $y$를 변수로 갖는 함수를 $f(x, y)$로 하고 $\psi$와 $\eta$를 변수로 갖는 함수를 $g(\psi, \eta)$라고 하자. 여기서 $f(.) = g(.)$이라 하면, 내가 관심있는 것은 $\partial{f} / \partial{x}$를 어떻게 $\psi$와 $\eta$에 대해 변환할 수 있을까이다.
변환을 시작하기 전에 다음과 같은 다이어그램을 그려보자.
$ g \\
/ \backslash \\
\psi \eta \\
/ \backslash / \backslash \\
x y x y $
뭔가 좀 후지긴 한데... 어쨌든, $g$는 $\psi, \eta$의 함수이고, 또 각각은 $x, y$의 함수라는 의미이다. 그래서 chain-rule을 이용하여 미분을 할 때 각 트리를 따라 내려가면 수월하게 할 수 있다. 트리의 가지를 하나 내려올 때마다 미분이 추가된다고 보면 된다. 즉, $g$에서 $\psi$로 오면 $g$를 $\psi$로, $\psi$에서 $x$로 오면 $\psi$를 $x$로 미분한다는 의미이다.
2. 1차 미분
$\partial{f}/\partial{x}$를 변환하기 위해서, 즉 $\partial{g}/\partial{x}$를 찾기 위해서는 위 트리를 따라 내려가며 $x$가 나올 수 있는 경우를 모두 찾는다. 여기서는 $g \rightarrow \psi \rightarrow x$와 $g \rightarrow \eta \rightarrow x$의 두가지가 있다. 즉, $\psi, \eta$ 각각에 대해 미분을 해줘야 한다는 의미이다. 그래서 종합하면 다음과 같다.
$$ \frac{\partial f}{\partial x} = \frac{\partial g}{\partial \psi} \frac{\partial \psi}{\partial x} + \frac{\partial g}{\partial \eta} \frac{\partial \eta}{\partial x} $$ 그리고 앞에 정의한 $\psi, \eta$를 $x$에 대해 미분해서 넣어주면 다음과 같은 결과가 나온다.
만약 $y$에 대해서 찾는다면 위와 같은 방식으로 트리를 타고 내려오면 쉽게 이해할 수 있다.
3. 2차 미분
이제 $\partial^2 f/\partial{x}^2$를 변환하고 싶다. 그럼 앞의 그래프에서 $g$를 (1)번 식의 각 항으로 바꾸어 각각 진행한다. 즉, 두 항에 대해 앞과 같은 그래프 태우기를 한다. 그럼 다음과 같은 순서로 진행된다.
$$ \frac{\partial^2 f}{\partial{x}^2} = \frac{\partial}{\partial x} (\frac{\partial g}{\partial \psi} +
\frac{\partial g}{\partial \eta} ) \\ = (\frac{\partial^2 g}{\partial{\psi}^2} \frac{\partial{\psi}}{\partial x}
+ \frac{\partial^2 g}{\partial{\psi}\partial{\eta}}\frac{\partial \eta}{\partial x})
+ (\frac{\partial^2 g}{\partial{\eta}^2} \frac{\partial{\eta}}{\partial x}
+ \frac{\partial^2 g}{\partial{\psi}\partial{\eta}}\frac{\partial \psi}{\partial x}) $$
즉, 트리의 각 가지를 타고 내려오며 해당 미분을 해주면 된다는 의미다.
4. 합성 미분
합성 미분도 위의 방식대로 $x$가 필요할 때는 $x$를 찾는 방향으로, $y$가 필요하면 $y$를 찾는 방향으로 움직이면 된다.
Machine Learning을 이용한 주가패턴 분석(1) - Cost Function, Random Optimization
0. 시작
최근 AI가 화두인지라 귀가 얇은 나도 역시 관심을 갖게 되었다. 그리고 업 자체가 금융업이다보니 시장을 AI를 이용하여 분석한다면 무엇인가 괜찮은 프로젝트가 나올 것 같다는 생각이 들었다. 하여, 주가패턴을 분석하는 프로젝트를 시작하고자 한다. 앞으로 올릴 포스트들은 그 프로젝트를 진행하면서 진행 상황을 기록하기 위한 목적이다.
1. 방법론 선택
일단 주가 차트를 분석하기 위해서는 일정 기간의 주가 차트를 일정한 패턴으로 만들어내야 한다. 결국 추세를 어떻게 표현할지가 관건이다. 추세를 나타내는 방법은 MA(Moving Average)를 그린다든가 어떤 Regression 기법을 이용하여 그리는 방법을 사용할 수 있을 것이다. 하지만 이 방법들은 추세 표현력은 좋으나 Machine Learning을 사용하기 위한 데이터로 전환할 수 있는 방법이 쉽게 떠오르지 않았다. 그래서 더 단순하고 직관적인 방법을 찾으려 했다.
나의 멘토이신 C박사님의 아이디어는 주가 차트를 임의의 직선의 조합으로 나타내 보자는 것이었고, 이 방식이라면 패턴 분석용 데이터를 만드는데 더 수월할 것이라는 판단이 들었다. 직선의 경우 기울기, 시작점, 끝점으로 단순히 표현할 수 있기 때문이다. 그래서 최적화 기법을 이용하여 직선 및 점의 갯수를 찾아내고 그 데이터를 이용하여 패턴 분석을 하기로 했다.
2. 프로그래밍 언어
일단 최적화를 구현하기 위한 언어는 R로 선택하였다. 처음에 python과 R을 모두 고민했으나, 내 손에 편하고 데이터 분석에 강점이 있는 R을 사용하기로 했다.
3. 데이터
주가 데이터는 팀 내의 데이터베이스 또는 블룸버그 터미널을 이용하여 S&P500 주가를 다운받아서 사용하였다. 단, 주가 자체의 값을 그대로 데이터로 이용할 경우 Cost Function을 구현하는데 있어 어떤 가중치를 정하는데 지수마다 달라질 수 있으므로, 주가를 정규화(normalization)을 한다. 여기서는 나에게 매우 익숙한 로그 수익률을 사용하였다.
여기서 $y_i$는 정규화한 수익률이고 $S_i$는 포인트의 주가, $S_0$는 시작 지점의 주가이다. 그리고 x축의 경우 휴일 등의 변수가 있으므로 날짜로 하기보단 1부터 n까지의 정수를 사용하기로 했다.
4. Cost Function(비용 함수)
최적화를 하기 위해서는 비용 함수가 중요하다. 이는 내가 생각한 답이 어느정도의 오류를 가지고 있는지 표현하기 위한 함수이다. 최적화는 이 오류(비용) 값을 가장 적게 할 수 있는 답을 찾는 것이다. 비용 함수에서 비용은 '직선 추정치($\hat{y}$)과 실제 주가수익률($y$)의 차이'가 하나 있고, 추정을 위해 사용하는 점의 수가 너무 많을 경우 overfitting의 문제가 있으므로 점의 갯수도 비용으로 들어가야 한다.
주가 추정에 의한 차이는 잘 알려진 Least square로 하고 점의 갯수에 의한 패널티는 간단하게 일정 가중치를 점의 갯수에 곱하여 더하기로 했다.
여기서 $n$은 전체 점의 갯수이고, $m$은 직선을 구성하기 위한 점의 수이다. 그리고 $\omega$는 패널티를 주기 위한 가중치인데, 앞으로 이 값을 어떻게 조절하느냐가 꽤 중요할 것이다. 이제 이 비용 함수를 이용하여 최적화 기법을 구현해보도록 하자
5. 가장 단순한 Random Search
Random Search는 말 그대로 무작위로 추정용 점의 갯수와 위치를 찾는 방법이다. 테스트를 할 때 1만번을 돌도록 구현했고, 이 방법은 추후 구현할 최적화 기법과의 비교 용도로 사용할 것이다. 아래 간단한 결과 그래프를 첨부한다. 푸른색이 실제 주가 수익률이고 붉은색이 추정한 수익률이다.
최근 AI가 화두인지라 귀가 얇은 나도 역시 관심을 갖게 되었다. 그리고 업 자체가 금융업이다보니 시장을 AI를 이용하여 분석한다면 무엇인가 괜찮은 프로젝트가 나올 것 같다는 생각이 들었다. 하여, 주가패턴을 분석하는 프로젝트를 시작하고자 한다. 앞으로 올릴 포스트들은 그 프로젝트를 진행하면서 진행 상황을 기록하기 위한 목적이다.
1. 방법론 선택
일단 주가 차트를 분석하기 위해서는 일정 기간의 주가 차트를 일정한 패턴으로 만들어내야 한다. 결국 추세를 어떻게 표현할지가 관건이다. 추세를 나타내는 방법은 MA(Moving Average)를 그린다든가 어떤 Regression 기법을 이용하여 그리는 방법을 사용할 수 있을 것이다. 하지만 이 방법들은 추세 표현력은 좋으나 Machine Learning을 사용하기 위한 데이터로 전환할 수 있는 방법이 쉽게 떠오르지 않았다. 그래서 더 단순하고 직관적인 방법을 찾으려 했다.
나의 멘토이신 C박사님의 아이디어는 주가 차트를 임의의 직선의 조합으로 나타내 보자는 것이었고, 이 방식이라면 패턴 분석용 데이터를 만드는데 더 수월할 것이라는 판단이 들었다. 직선의 경우 기울기, 시작점, 끝점으로 단순히 표현할 수 있기 때문이다. 그래서 최적화 기법을 이용하여 직선 및 점의 갯수를 찾아내고 그 데이터를 이용하여 패턴 분석을 하기로 했다.
2. 프로그래밍 언어
일단 최적화를 구현하기 위한 언어는 R로 선택하였다. 처음에 python과 R을 모두 고민했으나, 내 손에 편하고 데이터 분석에 강점이 있는 R을 사용하기로 했다.
3. 데이터
주가 데이터는 팀 내의 데이터베이스 또는 블룸버그 터미널을 이용하여 S&P500 주가를 다운받아서 사용하였다. 단, 주가 자체의 값을 그대로 데이터로 이용할 경우 Cost Function을 구현하는데 있어 어떤 가중치를 정하는데 지수마다 달라질 수 있으므로, 주가를 정규화(normalization)을 한다. 여기서는 나에게 매우 익숙한 로그 수익률을 사용하였다.
$ y_i = \ln(\frac{S_i}{S_0}), i=1, ..., n $
4. Cost Function(비용 함수)
최적화를 하기 위해서는 비용 함수가 중요하다. 이는 내가 생각한 답이 어느정도의 오류를 가지고 있는지 표현하기 위한 함수이다. 최적화는 이 오류(비용) 값을 가장 적게 할 수 있는 답을 찾는 것이다. 비용 함수에서 비용은 '직선 추정치($\hat{y}$)과 실제 주가수익률($y$)의 차이'가 하나 있고, 추정을 위해 사용하는 점의 수가 너무 많을 경우 overfitting의 문제가 있으므로 점의 갯수도 비용으로 들어가야 한다.
주가 추정에 의한 차이는 잘 알려진 Least square로 하고 점의 갯수에 의한 패널티는 간단하게 일정 가중치를 점의 갯수에 곱하여 더하기로 했다.
$ C = \sum_{i=1}^{n}(\hat{y}_i - y_i)^2 + \omega m $
여기서 $n$은 전체 점의 갯수이고, $m$은 직선을 구성하기 위한 점의 수이다. 그리고 $\omega$는 패널티를 주기 위한 가중치인데, 앞으로 이 값을 어떻게 조절하느냐가 꽤 중요할 것이다. 이제 이 비용 함수를 이용하여 최적화 기법을 구현해보도록 하자
5. 가장 단순한 Random Search
Random Search는 말 그대로 무작위로 추정용 점의 갯수와 위치를 찾는 방법이다. 테스트를 할 때 1만번을 돌도록 구현했고, 이 방법은 추후 구현할 최적화 기법과의 비교 용도로 사용할 것이다. 아래 간단한 결과 그래프를 첨부한다. 푸른색이 실제 주가 수익률이고 붉은색이 추정한 수익률이다.
확실히 뭔가 어중간한 느낌은 있으나 나름 잘 찾아낸 것 같다. 앞으로 다양한 최적화 알고리즘을 구현하면서 그 결과를 살펴볼 것이다.
A Brief History of Time - Stephen Hawking
0. 선물받은 킨들의 첫 도서이다. 아무래도 공대생이지만 물리학에 약해 읽는데 걱정이 많았으나, 그래도 꽤 부드럽게 읽을 수 있었다. 물론 책 중반부터 아무리 쉽게 얘기하고 싶어도 애초에 어려운 내용들을 풀어나가다보니 한 번 읽어서 이해 안되는 부분이 꽤 많았다. (그렇다고 다시 읽거나 하진 않았다. -_-)
1. 고전의 시대부터 사람들은 주변에 관심을 갖고, 자신만의 생각을 발전시킨다. 지구와 우주의 구성을 땅, 물, 불 등이라고 생각했던 고대 철학자, 우주의 중심을 지구라 생각했던 종교인들도 있었다. 그리고 시간이 지나며 많은 사람들이 관찰하고 실험하고 이론을 만들면서 과학이 발전한다.
인간의 우주를 이해하고자하는 끝없는 노력은 우주를 설명하고자 하는 하나의 통합하는 이론을 만드는 것을 지향점으로 삼는다.
2. 뉴턴부터 시작되는 역학은 아이인슈타인의 상대성 이론을 거쳐 불확실성을 고려하는 양자역학으로 흐르고, 쿼크와 전자의 저에너지부터 빅뱅과 우주 생성을 생각하는 고에너지까지 사람의 과학적 호기심과 탐구는 우주의 진리를 찾기위해 동분서주한다. 하지만 그 어느 것도 완벽하게 우주를 하나의 모습으로 설명할 수 없다는 것은, 아직 인간이 관찰하고 실험할 수 있는 영역은 우주의 크기에 비해 매우 적다는 것으로 이해되고, 그와 더불어 그렇게 상상력을 발휘하여 이만큼 발전시킨 것도 정말 놀랍다고 할 수 있다.
3. 이 책은 우주와 시간을 이해하기위한 인간의 노력을 한권에 담았다. 스티븐 호킹 박사가 워낙 물리학계의 거두이다 보니 어려운 이론도 쉽게 말로 풀어쓰는 저력이 있다. 물론 모두 다 쉬운 것은 아니고 이해를 다 할 수도 없지만, 사람들의 우주와 시간을 이해하기 위한 노력을 이렇게 한 눈으로 볼 수 있다는 것은 정말 행운이리라.
피드 구독하기:
글 (Atom)
인생논어 - 1
0. 조형권님이 쓴 <<인생논어>> 를 읽고 필사한다는 생각으로 구문들을 옮겨 적으려 한다. 1. 나만의 속도를 유지하라. 子曰, 射不主皮 爲力不同科 古之道也 (자왈, 사부주피 위력부동과 고지도야) 해석: 활을 쏠 때 ...







