728x90

오늘은 태양광 프로젝트를 진행했습니다.

데이터 전처리 예시 중 선형보건법이 있었습니다. 처음 본 방법이라서 신기했어요

이게 없었더라면 결측치를 삭제하거나 아마 ffill / bfill로 채웠을텐데 말이죠 

결측치가 연쇄적으로 따닥 따닥 붙어 있다면 fillna 보다는 선형보건법이 유용할것같네요 

아무튼 오늘 진도 나간 부분은 일기예보 시간 정하기 와 데이터 concat 정도입니다. 

 

주어진 데이터 중에서 일기예보가 있었어요 11시,14시,17시,20시 이렇게 하루에 4번씩 일기예보를 한다고 합니다.

데이콘 예시를 보니까 임의로 11시 일기예보를 사용했더라구요

저는 각 예보의 오차를 알아내서 시간을 정하고 싶었어요 

 

그래서 실제 관측치 데이터를 가지고 직접 MSE 방법으로 오차를 구했습니다. (온도로 비교했습니다)

20시가 가장 오차가 적었는데 사실 4개 모두 대동소이 했어요 

 

시행착오

비교할때 시각화를 그렸는데 온도가 한줄로 쭉 그어져 있더라구요 

띠용했죠 이게 문제가 싶어서 고치고 또 고치고 삽질 좀 하다가

설마해서 Xlim을 제거하니까 제대로 나오더라구요 Xlim에 날짜를 적어 놨는데

데이터에는 index가 그냥 숫자로 되어 있는데 이게 불일치 해서 그런가 싶어요 

 

내일모레는 EDA 목록을 만들고 마무리했습니다 이 전에 택시 프로젝트를 했었던 터라 한결 수월하게 진행 할수 있을것같은 예감이 듭니다 :) 

얼른 EDA끝내고 다음단계로 들어가고 싶네용  

내일은 딥러닝 수학을 진행할 예정입니다 

내일 수업 내용 포스팅을 가지고 다시 돌아오겠습니다

728x90
728x90

Chain  Rule

위 두 함수가 있을때 이를 결합한 Z함수가 아래처럼 있습니다. 

이때, Z함수를 s로 미분한 값을 알아 낼수 있을까요? S는 X,Y에 포함된 element입니다. 

그리고 X,Y는 Z함수안에 포함되어 있습니다. 흐름을 보면 Z함수-X,Y함수-s,t elements 이렇게 관계가 맺어져 있습니다.

이게 무슨 뜻일까요? 이 관계를 한번 들여다 보겠습니다. 

 

Z라는 함수가 바닷물이고 그 바닷물 안에는 X,Y함수라는 물고기가 있고 s,t는 물고기가 잡아 먹은 먹이 같은 구조입니다.

음.. 딥러닝이 가능한 이유는 Back propagation이 있기 때문입니다. 다시말해서 오차를 쪼개서 파라미터를 업데이트해줄때 사용되는게 이 체인 룰입니다.

 

이 바닷물의 수질을 아주 깨끗하게 만들고 싶습니다. 오염도가 2정도 나오면 좋겠는데, 결과는 10이 나와서 

오차가 8이라는 결과를 얻었습니다. 이 8을 쪼갭니다. 각 파라미터들에게 나눠줘서 오차를 줄이는 방향으로 만듭니다.

초록색은 X,Y -> Z로 올라가는 과정(forward propagation)

빨간색은 Z -> X,Y로 내려가는 과정(Back propagation)

 

이때 S라는 먹이감의 변화에 따라서 바닷물의 수질에 얼만큼 영향을 주는지 궁금할수 있습니다. 

S 먹이감이 만일 독극물이라면 그걸먹은 물고기가 바닷물 수질에 악영향을 줄수도 있을것입니다.

반대로 정상적인 먹이라면 깨끗한 수질을 만드는데 최소한 악영향은 주지 않을 것입니다.

 

그래서 우리는 S라는 먹이감 변화에 따른 바닷물 수질 변화량을 알아야 합니다. 이를 구하기 위해서 체인룰이 사용됩니다. 빨간색 미분값을 보면 그 정답을 알수 있습니다. 

파란색 미분값은 파란색 화살표가 그려진 미분값입니다. 보라색은 보라색 화살표 미분값입니다.

forward propagation 할때 이미 미분값을 구해 놨으므로 back propagation할때는 저장해놓은 미분값을 곱하기만 하면 됩니다. 그래서 연산이 빨라지고 딥러닝이 가능해 지는것입니다. 

위 식은 S 먹이감 변화에 따른 수질의 영향을 알기 위한값입니다. 따라서 X 물고기가 먹은 S먹이감 + Y물고기가 먹은 S먹이감 이 둘을 더해서 구할 수 있었습니다.

 

Vector Chain Rule은 위 예시의 스칼라값 대신 벡터 or 매트릭스가 들어가는 형태입니다. 예시를 들자면

위 처럼 각 함수 값이 스칼라가 아닌 백터 형식으로 되어있고 마지막 Z함수는 X+Y를 한 후 1/n으로 나눈 평균값 스칼라가 되겠습니다. 먼저 forward propagation이 실행되므로 각 element로 미분한 값은 아래와 같습니다.

 

 

 

그리고 스칼라 체인룰와 같은 방법으로 back Propagation을 해주면 됩니다.

 

 

위 예시로 계산하면 마지막 결과 shape는 1*n 벡터입니다. 계산을 꼭 해봐야 shape를 알수 있는 것은 아닙니다.

m개의 f함수와 n개의 element가 있을때의 자코비안 shape은 m*n입니다. 이것을 이용하면  

계산하기 전에 shape를 추정해 볼수 있게 됩니다. 결국 최종적으로 가장 아래에 있는 i(먹이) element와 바닷가 수질을 나타내는 f함수의 미분을 구했을때의 shape를 추정해 볼수 있게 됩니다. 

좀 더 구체적으로 보면

위 식을 보면 chain처럼 연결고리가 있다는 걸 직관적으로 알수가 있습니다. 

따라서, 딥러닝의 back propagation은 위 식의 순서대로 오차를 뿌려준다고 생각하면 될것같습니다.

 

 

 

 

728x90
728x90

오늘까지 해서 3일째 프로젝트를 수행하고 있는데

 

사실 잘 진행이 잘...ㅎㅎ;; 

 

심적으로 힘이 드니까 참으로 하루하루가 고역입니다

 

있는 그대로의 제 상태를 적어 놓는 것도 이 블로그의 특징이니까 가감없이 적고 있어요

 

나중에 후회나 되지 않을까 걱정도 됩니다

 

게다가 외부적으로 계속 스트레스 받는 일이 생겨서 

요즘 세상이 나한테 왜이러나 싶기도..

 

프로젝트를 처음 어떻게 구상해야할지를 정의하는데에 꽤 많은 시간을 들이고 있어요

 

어떻게 분석해야겠다 라는 틀이 조금씩 갖춰지고 있어요 

 

욕심내지 않고 배운걸 사용해본다는 생각으로 임하겠습니다. 

728x90
728x90

오늘은 미분부터 jacobian매트릭스까지 간략하게 정리하여 포스팅하겠습니다~

 

여담이지만 전 문과생 출신이라서 작년 자코비안 매트릭스에 대해 공부할때 정말 멘탈이 싹 나갔던 기억이 있습니다

구글링해도 개념이 잘 잡히지 않아서 일단 미루고 있었는데 과연

제가 완전하게 이해를 하게 되었을지 끝가지 읽어 주십사 합니다 ㅎㅎ 

 

*딥러닝에서의 미분이란 뭘까?

흔히 어떤 x가 변화했을때 y의 변화량 이라고 배워왔는데요 

그래도 뭔가 아 그렇구나 하지 와닿지는 않았더라구요 이 수업에서는 딥러닝의 미분을 아래처럼 소개 하였습니다. 

y = 2x^2를 미분하면 y=4x가 됩니다 

하늘색은 x=2를 대입할때 계수가 +8이 나왔고 x=-4를 대입하면 -16이 나왔습니다.

이 둘의 미분계수를 자세히 보겠습니다. 만일 x=2가 아니라 3,4,5 증가하면 y값이 커지게 됩니다. 

x=-4대신 -5-,6,-7 를 넣게 되면 마찬가지로 y값이 커지게 됩니다(그래프에 대입을 하면 간단하게 알수 있습니다)

결국 이 미분계수가 말하는 것은 "Y가 커지는 방향을 가르키고 있습니다"

x 가 음수로 갈수록, 그리고 양수로 갈수록 y값은 어찌됐건 증가 할 수밖에 없습니다. 

우리의 포인트는 증가하는 방향을 알고자 하는게 아닙니다. 바로 감소하는 방향입니다. 왜냐면

딥러닝은 가장 최저점으로 최적화 시켜야 하기 때문이죠. (loss를 줄여야 하니까)

 

그러면 간단하게 생각해 볼수 있는 것은 f(2)라는 함수에 마이너스를 붙이면 해결이 됩니다~

f(-4)를 -f(-4)로 넣어주면 반대방향으로 바뀌게 됩니다. 

 

위와 같은 함수가 있을때 편미분을 하면 아래처럼 계산이 됩니다.

이때 x=5, y=-5를 대입하면 (10,-10)이라는 gradient가 나옵니다.

이 (10,-10)이라는 것은 무슨 의미 일까요? 그리고 (5,-5)는 어떻게 해석하면 될까요?

(5,-5)는 단지 점!!입니다. 좌표처럼 점을 나타내는 것에 불과하고 (10,-10)은 아래 그래프를 보면서 설명하겠습니다.

x=10이고 y=-10 이니까 이 두 값이 만나는 지점이 빨간 화살표가 가르키고 있는 곳입니다.

보시다시피 원이 안에서 밖으로 퍼저나가면서 값이 커짐을 알수 있습니다. 

아까 말씀드린 것처럼 미분계수의 값은 Y가 커지는 방향을 나타냅니다.

여기서 우리의 목적은 가장 최저점인 정 가운데 부분으로 가야하기 때문에 음수를 붙여주게 됩니다.

 

 

 

 

위 같은 경우에는 함수가 스칼라(값이 하나)일 경우에 해당됩니다.

함수가 여러개가 있을수도 있고 independent variable이 여러개 일수도 있습니다. 예를들어 

 

함수가 하나이고, ndependent variable(변수)가 2개 경우입니다. 

 

여러개가 모이면 벡터가 됩니다. 선형수학에서의 꽃은 여러개 값을 한번에 계산 한다는 점이라서

이 벡터와 그리고 벡터가 모인 매트릭스 같은 연산에 대해서 잘 이해 해야 합니다 

 

본론으로 돌아와서

X라는 변수 벡터를 앞으로 θ로 표기하겠습니다. 변수들이 모여서 만든 벡터와, 함수들이 모여서 만들어진 벡터는

아래 이미지처럼 표현이 가능합니다.

그러면 만들수 있는 모든 경의 수를 생각해 봅시다.

그냥 스칼라값을 가진 함수와 변수가 있을테고, 위 이미지처럼 벡터인 함수와 변수가 있으므로 총 네가지의 경의 수가 발생됩니다.

정사각형 박스는 스칼라를, 길쭉한 직사각형은 벡터를 나타냅니다.

왜 이렇게 표현이 되는지는 아래 이미지로 다시 확인해 봅시다

스칼라/스칼라 인 경우는 맨 위에 해봤으니 바로 아래값에 대해 말씀드리겠습니다.

하나의 스칼라 x로 여러개의 함수를 상대해야 하므로 이미지처럼 표현이 가능하겠습니다.

(이때 함수의 갯수는 m개) 

 

계속해서 오른쪽 부분을 보겠습니다.

맨 위를 보면 X에 화살표가 그러져 있는 걸보니 벡터고, 함수는 스칼라 값입니다.

하나의 함수를 가지고 n개의 변수로 각각 미분을 취하는 형식입니다. 

 

그리고 대망의 매트릭스/매트릭스 경우인 맨 아래 입니다.

어려울거 없이 함수가 m가 있고, 변수가 n가 있을때 위 처럼 표현 하다는 것입니다.

각 row에 빨간색으로 칠해져 있는데 이 각각을 gradient라고 합니다. 

즉, 가장 큰 값을 가리키는 방향을 나타내는 벡터인 것이죠. 추가로 이 값에 그냥 마이너스를 붙이면 

가장 최저점으로 이동 시 방향을 알려줍니다. 

 

정리를 한자면 각 row의 gradient는 함수의 가장 큰 값 바양을 나타내므로 이 m*n 매트릭스에 -1를 곱하게 되면

감소하는 방향의 매트릭스가 됩니다.

 

 

 

 

*딥러닝에서 사용되는 Element-wise Binary operation

 

그런데 이 자코비안 매트릭스는 특정한 상황에서 특이한 모습을 보입니다.

바로 각 함수가 특정한 변수에만 영향을 받을 경우입니다. 

f1 함수는 θ1에 대해서만 영향이 있고, f2도 θ2에서만 있습니다. 좀더 이해하기 쉽게 다른 예제를 가져오면

알파라는 variable 벡터와 함수 벡터가 있습니다. 식을 보면 함수 하나당 한개 변수로 구성되어 있습니다.

이를 미분한다는 얘기 입니다. 딱 봐도 미분을 하게 되면 뭔가 특이한 모양이 나올거라 예상이 됩니다

위 식 처럼 계산이 이루어 집니다. 식은 복잡해 보여도 한줄 씩 뜯어보면 간단합니다. 이 매트릭스를 미분하게 되면

대각행렬(diagonal matrix)이 나오게 됩니다. 이 대각행렬의 값은 고정은 아니지만 비 대각 성분은 모두 0으로 고정되어 버립니다. 이처럼 한 함수에 한가지 변수만 영향을 주게 되면 위처럼 계산이 됩니다.

 

또 다른 예를 가져오면

대각성분은 다르게 나오지만 비 대각 성분은 똑같이 0으로 계산되었습니다. 이 연산이 딥러닝에서도 사용이됩니다. 

만일 이 두개를 더해서 자코비안 매트릭스를 구하면 어떻게 표현이 될까요?

바로 위 식대로 연산을 해보겠다는 의미입니다. 모든 식을 나열하기엔 너무 많아서 글로 표현을 하겠습니다. 

벡터끼리 더해지므로 

이렇게 표현이 가능합니다. 이 값을 각각 알파와 베타로 편미분을 하면 되는데, 

당연하게도 알파로 편미분을 하게되면 알파만 있는 f함수에만 적용되고 베타가 있는 g함수는 0으로 처리가 될것입니다

반대로 베타가 포함된 g함수는 적용이 되고 f함수는 0으로 떨어지게 됩니다.

이 개념을 가지고 아래 이미지를 살명하겠습니다.

 

Z1_1, Z1_2는 각각 n개의 independent variable로 구성되어 있습니다. Z2는 이 두 벡터를 합한 벡터입니다.

그러면 Z2를 각각 Z1_1, Z1_2로 편미분 하게 되면

 

Z1_2도 같은 모습으로 표현 됩니다. 대각 성분이 1로 통일되였는데 1 값이 달라지면 언제든지 바뀔수 있습니다.

 

 

여기까지가 오늘 수업에서 배운 내용을 정리한 내용입니다. 

작년의 벡터로 미분하고 매트릭스가 나온다~ 라는 수업내용을 따라가지 못해서 답답했었는데

이번 강의를 통해서 한번에 깨끗하게 해결되었습니다. 이거 때문에 작년에 서점가서 이공계 수학책을 본적이 있는데

제가 원하는 결과는 얻지 못했어요 워낙 광범위하더라구요 

그래서 이 강의 듣기 전까지는 미분하면 복잡하다 라는 인식이 있었는데 

해결이 된것같아서 뿌듯하고 재미있었습니다

728x90
728x90

오늘은 딥러닝 수학 강의를 수강하기 시작했습니다. 

chapter1을 수강했는데 간단한 딥러닝 개요와 파이썬 리뷰? 까지 수강했습니다.

 

class 부분은 제 약점인데 설명을 너무 잘해주셔서 실습하는 동안 신기하면서 재밌게 진행할수 있었어요

처음 class에 대해 배울때는 당최 무슨 말인지 몰랐는데 지금은 한결 수월했어요 

class 외에도 다른 문법들 복습해 보면서 자잘하게 깨달은 부분이 있었어요

 

내일 모레 부터는 본격적으로 수학에 관련된 내용이 진행됩니다.

수학강의는 따로 D-Day를 정하지 않고 강의 하나하나 신중하게, 이해를 위주로 천천히 곱씹으며 진도를 나갈생각입니다. 강사도 그렇게 하는게 좋다고 하더라구요 

 

어제는 제가 기록을 못적었지만 dacon 태양광 발전량 예측 프로젝트를 시작했었는데요

요즘들어서 마음잡고 공부하기가 정말 힘들었어요 지금도 마찬가지구욥..

게다가 요즘 부모님과 사이가 좀 틀어져서 

많은 생각들을 하게 만드는 요즘입니다 

 

내일만 생각하면 한숨이 절로 나오지만 최대한 힘내보도록 하겠습니다 :) ㅎㅇㅌ

 

728x90
728x90

남아 있던 실습프로젝트 2개를 마저 복습하면서 포스팅 작업을 진행했습니다.

어제 말씀드린 것처럼 이 강의 덕분에 얻은게 참 많았던 것같아요

자신감도 좀 붙은 것같기도 합니다

 

내용이 너무 많으면 핵심이 가려질것같아서 요약하여 포스팅했습니다~

만일 이 강의를 듣고 싶은 분이 있다면 패스트캠퍼스 사이트에서 찾을 수 있습니다~^^

 

일단 강의와 실습만으로는 체득이 안됐기 때문에 데이콘에서 시계열 데이터 관련한 프로젝트를

진행 하려고 합니다 

 

이미 데이터까지 받아 놔서 진행만 하면 될것같아요 다음주 월요일부터 시작할 생각입니다.

이번 참여 목표는 수상이 아니라 제가 배운 내용을 적용 하는데에 중점을 두고 진행하고자 합니다. 

 

마지막 실습 코드 내용은 아래에 링크 걸어 놓았습니다 :)

2021.04.16 - [실습 note] - 자전거 수요예측 실습

2021.04.16 - [실습 note] - 주택 가격 예측실습

728x90
728x90

오늘 드디어 시계열데이터 심화편 강의를 완강했습니다

100강의 정도 되는 분량이였는데 차근차근 하다보니까 완강까지 하게되었습니다

 

일단 심화편이라서 그런지 정말 많은 정보를 얻을수 있었습니다.

더군다나 시계열데이터는 구글링해도 충분치 못한 영역이라고 생각했어요

 

잘 정리된 페이지도 있었지만 글로만 보면서 이해를 한다는게 쉽지 않는 공부였습니다. 

이번 기회에 시계열데이터의 흐름을 알게 된것같아서 뿌듯합니다.

 

완강했다고 끝은 아닙니다. 부족한 점이 군데군데 있습니다. 복습 해야할 부분도 있구요

이 강의 끝으로 자전거 수요와 주택가격 예측 실습을 진행했는데요

 

이 실습 내용은 내일 올리도록 하겠습니다. 오늘은 마저 못한 bitcoin실습 내용을 포스팅 겸 복습하면서 마무리 

할 생각입니다. 

2021.04.14 - [기록 note] - 2021-04-14(시계열데이터 심화18_bitcoin 실습편)

728x90
728x90

오늘은 bitcoin 실습을 진행했습니다 

강의는 5개 구성 되어 있어서 짧았는데 중간에 막혀서 몇시간을 고생했습니다

 

막혔던 부분이 뭐였나면

딥러닝의 input shape 였어요 강사가 이 부분이 중요하다고 중점적으로 말씀을 해주셨는데 

 

한번에 이해 하기가 힘들었어요 

MLP에서 (train.shape[1],)으로 입력하면 feature 수가 노드 수 만큼 증가되고

시계열 딥러닝은 (train.shape[1],train.shape[2])로 입력하면 feature가 아닌 sequense 길이가 노드 수 만큼 증가가 된다 

 

라는 얘기는 아직도 무슨얘기인지 이해하지 못했어요 

다른건 해결 했는데 이 부분이 ... 막힌다 말이죠 

 

대략 무슨 얘기인지는 알것같은데 이런 직감적으로 알것 같은건 100% 알고 있는게 아니라고 생각해요

그래서 찜찜합니다 어떻게 구글링 하면 좋을까 생각도 해보고 있습니다 

 

내일은 RNN,LSTM,GRU 실습 내용을 까지 포함해서 업데이트 하도록 하겠습니다.

2021.04.14 - [실습 note] - bitcoin 예측 실습

 

bitcoin 예측 실습

시계열 데이터 심화 강의의 마지막 단계 프로젝트 실습들 중 bitcoin을 포스팅하겠습니다. MLP from keras.models import Sequential, Model, load_model from keras.layers import Input, Dense, Activation, Fla..

ghdrldud329.tistory.com

728x90

+ Recent posts