여러분이 broadcasting operations사용하게 할 수 있게 해주는 파이썬의 능력과 그그리고 더 일반적으로, 파이썬 넘파이 프로그램 언어의 큰 유동성은, 프로그램 언어에서 장점과 동시에 단점이 동시 있습니다. 이것이 강점인 이유는 언어의 표현 성을 생성하기 때문이죠. 언어의 유동성은 여러분이 단순히 한 줄의 코드로도 많은 것을 해낼 수 있게 해줍니다. 그렇지만, broadcasting에서 약점도 있는데요, 이런 큰 유동성 때문에, 아주 감지하기 힘든 버그나 또는 매우 이상하게 생긴 버그를 들여올 수 있습니다. 만약 broadcasting의 복잡한 구조와 특성에 대해서 익숙하지 않으면 말이죠. 예를 들어, 세로줄 벡터를 가져서 

가로줄 벡터에 더하면, 다이멘션의 불일치가 생기거나 오류가 생길 것으로 예상할 텐데요, 반면에 가로벡터와 세로벡터의 함을 통해 매트릭스 값이 나올 수도 있겠죠. 이러한 특이한 파이썬의 특성에는 그에 상응하는 내부 로직이 있는데요. 만약 파이썬에 익숙지 않은 경우, 저는 몇몇의 학생들이 정말 이상하거나, 매우 찾기 힘든 버그들을 갖는 것을직접 보았습니다. 그러므로 이 비디오에서는 몇 가지 팁을 공유하고, 저희 코드에 있는 이상하게 생긴 버그를 제거하거나 심플하게 만드는 비법을 공개하겠습니다. 그리고 이러한 팀과 비법을 통해서 여러분이 버그로부터 자유로운 파이썬 그리고 넘파이 코드를 만들 수 있을 것입니다. 파이썬-넘파이의 조금 덜 직관적인 효과를 보여드리자면, 특히, 벡터를 파이썬-넘파이에서 만드는 방법에 대해서 말이죠. 빠른 데모를 보여드리죠. a를 np.random.randn(5)로 설정하겠습니다. 이것은 그러면 임의로 5개으 Gaussian 변수를 만들어 주는데요 이 값들은 array a에 보관됩니다. 이print(a)를 해보죠, a의 shape은 이렇게 하면, 5개의 콤마구조를 갖습니다. 파이썬에서 이것은 랭크 1 array라고 하는데요, 이것은 row 벡터도 아니고 

column 벡터도 아닙니다. 이런 것이 조금 더 직관적이지 않은 부분으로 이어지는데요, 예를 들거, 제가 만약 a transpose 를 print 하면, 이것은 a와 동일하게 보입니다. 그러면 a와 a transpose는 똑같이 보이고 있죠. 그리고 만약 제가 a와 a transpose의 안쪽 프로덕트들을 프린트하면, 여기서 a 곱하기 a transpose는 밖았쪽 프로덕트라고 생각할 수도 있는데요, 매트릭스를 줄 수도 있다고 생각할 수 있는데요, 그러나 이렇게 하면, 대신에 이러한 숫자 값을 갖게 됩니다. 그러므로 제가 추천 드리는 것은, 만약 여러분이 신경망을 코딩 하는 경우에는, 데이터구조를 사용하는 것이 아니라, 모양이 5 콤마나, n 콤마나, rank 1 array등과 같은 것이 아니라, 이렇게 a를 np.random.randn(5, 1)로 지정해서 그러면 a가 5, 1 세로 벡터가 되게끔 해주는데요, 이전에는 a 와 a transpose가 똑같이 생겼었지만, 이제는 a transpose를 print하면, a transpose는 row vector죠, 이제 작은 차이를 보겠습니다. 여기 데이터 구조를 보시면, 

2개의 대괄호가 있습니다. a transpose를 프린트하는 경우에 말이죠. 이전에는 1개의 대괄호가 있었죠. 이것이 바로 여기 1 x 5 매트릭스와 여기 rank 1 array중의 하나와의 차이입니다. 그리고 만약 여러분이 a 와 a transpose의 프로덕트를 프린트하면, 이것은 그러면 벡터의 밖았쪽 프로덕트를 줍니다. 맞죠? 그래서 벡터의 밖았쪽 프로덕트들이 매트릭스를 만드는 것이죠. 여기서 본 것에 대해 조금 더 자세히 다루겠습니다 방금 명령한 것은, 이거 였습니다. 이것은 a.shape라는 데이터 구조를 만들었고요, 이것은 조금 우습게 생긴 (5, ) 라는 것을 주었습니다. 이것은 rank 1 array라고 부릅니다. 아주 우스운 모양의 데이터 구조인데요 이것은 row vector 나 column vector와 같이 균일하게 행동하지 않습니다. 그렇기 때문에 이 특성이 직관적이지 않은 것이죠. 그러므로 제가 여러분에게 추천 드리는 것은 프로그래밍 연습 과제를 할 때, 아니면 로지스틱 회귀분석을 도입할 때, 또는 이런 rank 1 array를 이용하지 말라는 것입니다. 대신에, array를 생성할 때마다, 여기와 같이 세로줄 벡터를 만듭니다. 그러면 (5, 1) 벡터가 생성되는데요, 또는 row vector를 만듭니다. 그렇게 되면 여러분의 벡터는 이해하기 쉽게 행동할 것입니다. 이 경우, a.shape는 5, 1이 될 것입니다. 이것은 column vector와 같이 행동할 텐데요, 사실 이것이 column vector입니다. 그리고, 그렇기 때문에 이것을 (5, 1) 매트릭스로 생각할 수 있는 것입니다.이것은 column vector이기도 하죠. 그리고 여기서는 a.shape가 1, 5일 것입니다. 이것은 일관되게 row vector처럼 행동할 것입니다. 그러므로 여러분이 벡터가 필요한 경우, 이것이나 이것을 이용하길 권장 드립니다. rank 1 array는 말고 말이죠. 또 한가지 제가 제 코드에서 많이 할 것은 벡터의 다이멘션이 정확히 무엇인지 모르는 경우, assertion 문구를 이렇게 넣어서, 이 경우, (5, 1) 벡터가 되도록 말이죠. column 벡터 말이죠. 이런 assertion은 실행을 목적으로 하는데요 코드를 기록화하는 역할도 있습니다. 그러므로 이렇게 assertion 문구를 넣고 싶을 때, 주저하지 마시고 넣으십시오. 마지막으로, 어떤 이유에서든, rank 1 array를 갖게 되면, 이것을 다시 만들 수 있는데요, a=a.reshape ( (5, 1))처럼 말이죠, 또는 (1, 5) array로 변형해서 column vector 또는 row vector와 조금 더 맞게 행동할 수 있도록 해줄 수 있습니다. 저는 그래서 가끔식 학생들이 아주 타자내기 어려운 버그를 갖게 되는 경우를 봤는데요, 그 이유는 이러한 rank 1 array에 직관적이지 않은 부분 때문입니다. 이전 코드에서 rank 1 array를 제거함을 써, 저의 코드는 더욱 간소화됐습니다. 그리고 코드를 표현하는데 딱히 제한을 느끼나 그러지는 않았습니다. 저는 그냥 절대로 rank 1 array를 사용하지 않습니다. 그러면 코드를 심플하게 만들려면 rank 1 array들을 사용하지 말라는 게 이번 강의의 주요 포인트입니다. 항상 n x 1 매트릭스를 이용하고, 즉 column vector 또는 1xn 매트릭스를 이용, 즉row vector를 이용합니다. 그리고 assertion 문구는 언제든지 사용해도 좋으며, 여러분의 매트릭스의 다이멘션 이나 array는더블체크하십시요. 그리고 reshape operation을 부르는 것을 두려워하지 마십시요. 매트릭스 또는 벡터의 다이멘션이 원하는 형을 갖추도록 말이죠. 그럼 이 내용이, 이러한 제안들이 여러분의 버그 원인들을 파이썬에서 알아내고 없애는데 도움이 됐으면 합니다. 그리고 연습문제로 더 쉽게 풀 수 있기를 희망합니다.


























모든 배운 내용을 바탕으로 과제를 시작할 준비가 되어있으실 텐데요. 시작하기에 앞서 Coursera에 있는 iPython notebooks에 대해 짧게 보여드리겠습니다. 여기서 보이듯이, Jupiter iPython notebook라는 것인데요, Coursea에서 찾을 수 있습니다. 몇 가지 특징을 보여드리도록 하겠습니다. iPython notebook에 대한 설명은 여기 텍스트로 준비되어 있습니다. 여기 보이는 길다란 연회색 블럭은 코드를 보여주는데요. 가끔씩, 여기 이 블럭에서 START CODE HERE 와 END CODE HERE 라고 적혀있는 것이 보일 텐데요 연습 학습을 하기 위해서는 반드시 여러분의 코드를 START CODE HERE 와 END CODE HERE 사이에 기입해주세요. 예를 들어, print Hello world를 치면 코드 브럭을 실행시키기 위해서는 shift키와 enter키를 눌러서 이 코드 브럭을 실행시킵니다. 이 경우에는 print Hello world라고 쳤는데요 이렇게 하면, Hello World를 프린트하게 됩니다. 셀을 운영하려면, 이 코드 브럭의 셀을 운영하려면, 셀 을 클릭하고, run cell 을 클립 합니다. 실행을 위해서 말이죠. 여러분 컴퓨터에 셀 이라는 바로 가기 옵션이 있을 수도 있습니다. run cell은 shift+enter를 누르는 것과 다를 수 있습니다. 저의 맥이나 PC에서는 모두 shift+enter이긴 한데요. 여러분도 같은 옵션일 수 있겠습니다. 여러분이 설명을 읽으시는 경우 잘못해서 더블 클릭을 하는 경우, mark down된 언어 글자로 변경될 수 있습니다. 이렇게 우습게 생긴 글꼴로 변경되면, 다시 되돌리기 위해서 이 셀을 run하면 됩니다. 셀로 가셔서, run cell 또는 shift+enter를 치면 됩니다. 이렇게 하면 mark down을 실행하고 이렇게 정상화된 코드로 되돌려 줍니다. 또 다른 팁을 드리자면, 이런 코드를 실행시키는 경우, Kernel을 기반으로 운영됩니다. 서버에서 운영되는 코드위에 말이죠. 만약 여러분이 굉장히 큰 양의 업무를 운영하거나 컴퓨터를 오래 켜두거나, 컴퓨터가 이상해지는 경우, 인터넷 접속이 이상하거나 할 수 있겠죠. 뒤에서의 Kernel이 다운될 확률이 있습니다. 이런 경우, Kernel을 클릭해서 다시 시작하십시오. 이상적으로는, Kerner이 리부팅되어 다시 정상작동 할 것입니다. 여러분이 작은 양의 업무를 다루거나 iPython notebook을 시작한지 얼마 안된 경우에는 괜찮을 것입니다. Kernel이 다운됐다는 오류 메시지가 뜨는 경우, Kernel, restart 를 진행하실 수 있습니다. 마지막으로 iPython notebook에서는, 이렇게 코드 브럭이 여러 개 일 수 있습니다. 만약에 이전 코드 브럭 이 코드가 없더라도 이 코드 브럭을 반드시 실행하도록 하십시오. 예시와 같이, 너파이를 np로 불러오는 것과 같이, 나중에 lower 코드 브럭에서 필요 할만한 변수를 미리 설정해줍니다. 그러므로 반드시 코드를 쓰라는 말이 없더라도 위에 있는 것들을 실행시키기 바랍니다. 마지막으로, 솔루션 도입과정을 모두 마친 경우, 우측 상단에 파랑색의 submit assignment 버튼이 있습니다. 이 버튼을 클릭하여 솔루션을 제출하여 채점을 받을 수 있습니다. 저는 iPython notebooks의 상호적인 명령 성향이 교육에 큰 도움을 준다고 생각합니다. 몇 줄의 코드를 도입시키고 결과를 얻고, 빠르게 학습할 수 있는 것이죠. 그러므로, Coursera에서의 연습 학습을 통해 Jupiter iPython notebooks를 통해 여러분이 빨리 배우고 알고리즘을 실험할 수 있었으면 좋겠습니다. 이 비디오 이후로 한 개의 강의가 더 마련되어 있는데요 이 비디오는 선택적인 비디오입니다. 로지스틱 회귀분석의 비용함수에 대해 다루겠습니다. 보셔도 되고 안 보셔도 됩니다. 어떻게 하셔도 좋습니다. 시청 여부와 상관없이 2주차 과제를 마치는데 행운을 빕니다. 3주차에서 여러분을 기다리겠습니다.


















In [34]:
[0.90432037 0.43603738 0.45652704 0.55891457 0.31400995]
In [33]:
vectorized version :2.4199485778808594ms
vectorized version value:249866.3828776729
non-vectorized version :737.0290756225586ms
non-vectorized version value:249866.38287766944





다시 환영합니다. vectorization은 기본적으로 코딩에서 명백한 for loop들을 제거하는 기술인데요 딥러닝 세대에서, 특히 딥러닝 실행부분에서는 여러분은 비교적 큰 데이터세트에서 트레이닝 하는 것을 보실 텐데요, 그 이유는 그 분야에서 딥러닝 알고리즘이 특출 나기 때문입니다. 그렇기 때문에 코딩을 빨리 진행하는 것이 매우 중요합니다. 딥러닝이 빅 데이터세트에서 실행되기 때문에, 여러분의 코드가 실행하는데 오래 걸릴 수도 있는데요, 그렇게 되면 결과값을 기다리는데 오래 걸릴 수도 있게 됩니다. 그러면 딥러닝 세대에서는, 제 생각에는 vectorization을 진행 할 수 있는 것이 핵심 기술인 것 같습니다. 예제를 보겠습니다. 우선 예제를 봅시다. vectorization은 무엇일까요? 로지스틱 회귀분석에서는 z = w transpose x 더하기 b를 계산해야 됩니다. w는 세로줄 벡터이고 x도 이런 벡터였죠. 여러 가지 특성이 있으면 벡터도 큰 것으로 이루어질 수 있겠죠 그러면 w 와 x는 모두 여기 R 의 n이거나 R의 nx dimension의 벡터겠죠. 그러면 w transpose x를 계산하자면, 여러분이 만약 non-vectorized 도입을 했다면, z 가 0인 것으로 했을 것입니다. 그리고 i는 n-x의 범위를 갖도록 하구요 즉, i 가 1에서 nx까지 인 것이죠, z 플러스는 wi 곱하기 xi입니다. 그리고 z 플러스 b를 끝에 할 수도 있겠죠. 이것이 non-vectorized 도입 방식인데요, 이렇게 하면 매우 느릴 것입니다. 반대로, vectorized 된 도입은, w transpose x를 직접 계산합니다. 파이썬이나 넘피에서 말이죠, 쓰는 명령은 z = np 점 (w, x)인데요 이 값은 w tanspose x입니다. 그리고 직접 b를 여기다 더할 수도 있습니다. 이것이 더 빠른 것을 느끼실 텐데요, 데모를 통해 한번 묘사해보겠습니다. 이것은 Jupiter notebook인데요, 여기다가 파이썬 코드를 적어보겠습니다. 처음으로는, 넘피 library를 불러오겠습니다. as np로 말이죠, 예를 들어, A를 작성해서, array로 말이죠, 그리고 print a를 타입 해보겠습니다. 그럼 여기 코드를 적었으니, 이제 shit + enter를 누르면, 코드를 실행합니다. 이제 array A를 생성했고 print out 합니다. 이제 vectorization 데모도 한번 해보겠습니다. 이제 time library를 불러올 텐데요, 이것을 이용하기 때문이죠, 다른 운영작업이 얼마나 걸리는지 시간을 재기 위해서 말이죠. array A를 생성할 것입니다. 이것은 random 점 rand 이고... 이제 백만 다이멘션을 만들어보겠습니다. b = np.random.rand.입니다. 그리고 또 하나의 백만 개 array이고요, 이제 tic=time.time인데요, 이것은 현재시간을 측정합니다. c = np.dot (a, b)이고요, toc은 time.time입니다. 이제 프린트 해볼까요? 이것은 vectorized 버전인데요, vectorized version을 타이핑하겠습니다. 그러면 이제 이전 것을 print out 할 텐데요, 이것은 toc 빼기 tic 곱하기 100인데요 이렇게 해서 밀리세컨즈로 표현하겠습니다. ms가 밀리세컨즈입니다. 이제 shift+enter를 칠 것입니다. 그러면 이 코드를 만드는 세 3 milliseconds가 걸렸거나 이번 경우 1.5인데요, 한번에 1.5 또는 3.5 밀리세컨즈 소요됩니다. 제가 실행하면서 조금씩 다르긴 한데요, 평균적으로는 1.5 밀리세컨즈가 소요되는 것 같습니다. 이것을 실행하면 2 밀리세컨즈 소요될 수 있죠. 자 그럼, 좋아요. 이런 코드 블럭을 계속 더해보겠습니다. 이제는 non-vectorize 버전을 도입해보겠습니다. c=0이고요, 그리고 tic = time.time 이제 공식을 도입해보겠습니다. I의 범위가 백만이고 0의 개수를 잘 썼길 바랍니다. C += (a, i) x (b, i)이고요, 그리고 toc는 time.time입니다. 마지막으로, print "for loop"을 칩니다. 소요되는 시간은 여기 1000 곱하기 tox - tic + "ms" 입니다. 밀리세컨즈로 표기하기 위해 말이죠. 한가지만 더 하겠습니다. 여기 C의 값을 print out 하겠습니다. 저희가 계산한 값을 print out해서 2가지의 경우 모두 동일한 값임을 확인하겠습니다. 저는 이제 shift + enter를 눌러서 실행하고 확인해보겠습니다. 두 가지 경우 모두, vectorized 버전과 non-vectorized version모두 동일한 값을 산출했습니다. 여러분도 알다시피 2.5에서 6.99 등등 말이죠 vectorized 버전은 1.5 밀리세컨즈가 소요됐고 explicit for loop non-vectorized 버전은 400, 거의 500밀리세컨즈 소요됐습니다. 이렇게 non-vectorize 버전이 거의 300배 가까이 더 오래 걸렸습니다. 이번 예제를 통해서 여러분이 코드만 vectorize 할 줄 알더라도 300배는 더 빨리 실행된다는 것을 보았습니다. 다시 한번 실행해보겠습니다. 다시 한번이요. 예, 맞죠, vectorized 버전은 1.5 밀리세컨즈, 그리고 for loop 의 경우 481 밀리세컨즈 입니다. 거의 300배는 느리죠. for loop의 경우가요. 300배 느린 점의 차이는 여러분의 코드가 1분이 걸리거나 5시간이 걸리는 차이이기도 합니다. 그리고 여러분이 딥러닝 알고리즘을 도입하는 경우에 결과값을 훨씬 더 빨리 알아낼 수 있습니다. code를 vectorize하는 경우 훨씬 더 빠를 것입니다. ‘Scalable Deep Learning’ 도입이 GPU 또는 Graphic Processing Unit에서 이루어진다는 것을 들으셨을 것입니다. 하지만 제가 the Jupiter notebook에서 방금 한 데모들은 모두 CPU에서 한 것입니다. 알고 보면 CPU와 GPU 모두 parallelization instruction이 있습니다. 가끔씩 이런 것을SIMD instructions이라 합니다. 이것은 single instruction multiple data의 약자입니다. 기본적으로 무슨 뜻이냐면, 이런 빌트인 기능을 이용하면, np. function 이나 다른 for loop의 도입이 필요 없는 기능을요, 그런 경우, 파이썬 Pi 가 parallelism을 활용할 수 있게 계산을 빨리 처리하도록 해줍니다. 이러한 산출에 관련한 내용은 CPU와 GPU에서 모두 적용되고요. 하지만 GPU가 특별히 SIMD calculations 에 뛰어나기 때문에 그렇습니다. 하지만 CPU도 나쁘지 않습니다. GPU보단 조금 못하더라도 말이죠. 여러분은 어떻게 vectorizarion이 여러분의 코드의 속도를 현저하게 높일 수 있는지 보실 수 있습니다 기억하실 경험 의거 규칙은 가능하면, explicit for loop을 사용하는 것을 피하라는 것입니다. 다음 비디오로 넘어가서 더 많은 vectorization 예제를 살펴보고 로지스틱 회귀분석을 vectorization하는 방법을 배우겠습니다.


















:
[[1 1 1 1 1]
 [2 2 2 2 2]
 [3 3 3 3 3]
 [4 4 4 4 4]
 [5 5 5 5 5]]
[[55 55 55 55 55]]



















이전 강의에서 여러분에게 이번 비디오에서는, vectorization을 이용하여, 예측수치를 산출하는 방법을 배웠는데요, 전체 트레이닝 세트 O에 대해서 소문자 a들을 상대로 말이죠. 이번 비디오에서는 vectorization을 이용해서 어떻게 M 트레이닝 샘플들 데 대해 기울기를 산출할 수 있는지 보겠습니다. 다시 한번, 모두 한꺼번에 말이죠. 그리고 비디오 마지막 부분에서는, 모두 취합하여, 매우 효율적인 로지스틱 회귀분석의 도입을 가능케 할지 한번 보여드리겠습니다. 기울기 강하 산출에는 기억하시겠지만, 첫 번째 예시에 대해서 dz1을 계산하고, 이 값은 a1 빼기 y1 그리고 dz2는 a2 빼기 y2 등등 말이죠. 모들 m 트레이닝 예시에 대해서 말이죠. 이제 저희는 새로운 변수를 정의할 것입니다. dZ는 dz1, dz2, dz2이 될 텐데요, 다시 한번, d 소문자 z의 변수는 가로로 쌓입니다. 그러면 이것은 1xm 매트릭스 또는 m차원의 벡터입니다. 이전 슬라이드에서 아시겠지만, 대문자 A를 구하는 방법은 알아냈는데요, a1에서 am까지 말이죠. 그리고 여기 대문자 Y는 y1에서 ym까지의 값입니다. 이것 또한, 가로로 쌓인 것이죠. 이러한 정의를 바탕으로, 직접 보실 수도 있겠지만, dz은 A 빼기 Y로 계산되는데요, a1 - y1이기 때문에 이것은 first element가 되고, a2 - y2는 second element이렇게 이어집니다. 그렇기 때문에 first element인 a1-y1은 dz1의 정의와 똑같습니다. second element 는 dz2와 동일하구요, 그렇게 해서 한 줄의 코드로, 모든 값을 한번에 산출해낼 수 있습니다. 이전의 도입에서 보면, 1개의 for loop를 이미 없앴는데요, 여기 두 번째 for loop은 트레이닝 예시에 대해 아직 있었습니다. 그래서 dw를 0으로 초기화하고, 0의 벡터로 말이죠. 하지만 아직도 트레이닝 예시 에 대해 loop over해야 합니다. dw 플러스는 x1 곱하기 dz1 인데요, 첫 번째 트레이닝 예시에 대해 말이죠, dw 플러스는 x2 dz2 등등으로 이어집니다. 이것을 M번 반복하여 dw 나누기=M과 같이 됩니다. B도 비슷하게 말이죠. 맞죠? db는 0으로 포기화됐고, db 플러스는 dz1, db 플러스는 dz2 이렇게 말이죠, dz(m)까지 이어지는 데요, db /=M이 됩니다. 이것이 이전 도입에 있었던 내용인데요, 1개의 for loop은 이미 없앤 상태입니다. 이제 적어도 dw은 벡터이고 개별적으로 dw1, dw2, 등등을 업데이트 해줬습니다. 이제 이미 없앴긴 했지만, 아직도 트레이닝세트에서 m 개의 예시에 대해서는 for loop이 있었습니다. 그러면 여기 절차를 이용해서 vectorize 시켜 보겠습니다. 저희가 할 수 있는 것은 이렇습니다. db의 vectorize 도입을 위해서는, 저희는 기본적으로 이것을 더하는 것입니다. 여기 모든 dz들을 더한 후에, m으로 나누어 주는 것이죠, db는 1 나누기 그리고 합의 공식은 i=1 에서 m까지 적용되는데요, 그 공식은 dzi 입니다. 여기서 모든 dz는 row vector입니다. 그러므로 파이썬에서는, 여러분이 할 것은, 1/m np. dz의 합을 도입시킵니다. 그러면 여기 변수를 가지고 np.sum 함수라고 부르십시오. 그러면 db를 줄 것입니다. dw는 어떨까요? 올바른 공식을 적을 테니 나중에 확인하셔도 됩니다. 1 나누기 m, 곱하기 X매트릭스 곱하기 dz transpose입니다. 왜 이런 건지 조금 보자면, 이건은 1 나누기 m, 그 다음에 매트릭스 x들인데요, x1에서 xm까지 세로로 쌓이고, dz transpose는 이렇게 dz1에서 dzm까지 이어질 것입니다. 그러면 여기 이 매트릭스와 여기 매트릭스를 곱하면 되는 값을 보자면, 1 나누기 M 곱하기 x1dz1 더하기... 더하기 xm dzm이 됩니다. 그러면 이것은 n x 1벡터인데요, 이것이 남게 됩니다. dw와 같이 말이죠, 그 이유는 dw는 xi dzi와 같은 값을 더해서 생기는 것인데요, 여기 이 매트릭스를 곱하면서 그런 작용이 일어납니다. 그러면 가시, 한 줄의 코드를 이용해서, dw를 계산할 수 있습니다. 그래서 derivative 계산에 대한 vectorized 도입은 이렇습니다, 여기 이 라인을 이용해서 db를 도입하고, 여기 이 라인을 이용해서 dw를 도입합니다. 그리고 아시겠지만, 트레이닝 세트에

거쳐서 for loop를 이용해 이제는 파라미터에서 원하는 업데이트를 계산할 수 있습니다. 이제, 모든 것을 취합해서 로지스틱 회귀분석을 어떻게 도입할지 보겠습니다. 이것이 원본인데요, 매우 비효율적인 non-vectorized 도입 방식입니다. 이전 비디오에서 처음으로 한 것은 여기 이 볼륨을 없앴습니다. 맞죠? 그러면 dw1, dw2 등에 looping over하는 대신에, 이 값을 벡터 값인 dw, 그 값이 dw+=xi인 값으로 대체했습니다. 이제는 이 값이 벡터 곱하기 dz(i)죠. 하지만 이제, 어떤 줄에서의 for loop를 없애는 것뿐만 아니라 여기 전체 for loop를 없앨 수 있다는 것을 알죠. 이렇게 하는 것입니다. 이전 슬라이드에 있는 내용을 사용하면, 대문자 Z가, w transpose X 더하기 B이고, 사용하는 코드는 np w transpose X 더하기 B입니다. 그리고 a는 대문자 Z의 시그마입니다. 그럼 여러분은 이제 여기 모든 값을 구했고, 모든 i값에 대해 여기 있는 값들을 구했습니다. 다음으로, 이전 슬라이드에서는, dz는 A -Y로 계산한다고 했죠. 그리고 여기 있는 모든 것을 i의 모든 값에 대해 구했습니다. 마지막으로, dw=1 나누기 m 곱하기 dz transpose t 그리고 db는 1 나누기 m 그리고 sum (dz) 입니다. 그러면 여러분은 전 방향전파 과 후 방향전파를 했고, 예측 값과 derivative를 계산함으로써, 모든 M 트레이닝 샘플에 대해서 말이죠, for loop사용 없이 말입니다. 그러면, 기울기 강하 업데이트는 , w 는 w 빼기 러닝속도 곱하기 dw dw는 위에서 계산했고요, b는 b 빼기 러닝속도 곱하기 db로 업데이트 됩니다. 특정 방법 이 있는 걸 볼 수 있습니다. 저도 생각해보면 이 표기법을 그리 일관되게 쓰진 않았네요. 이렇게 하여, 로지스틱 회귀분석에서 single iteration의 기울기 강하를 방금 도입했습니다. 제가 일정한 for loop을 없앨 수 있을 때 무조건 없애야 한다고 했는데요, 만약 여러분이 복수의 iteration을 통해 도입하고 싶은 경우 몇몇의 iteration에서 for loop이 필요할 수 있습니다. 여러분이 만약 기울기 강하의 1000개의 iteration을 갖고 싶으면, 이 숫자까지 for loop이 필요할 것입니다. 이렇게 가장 바깥 쪽의 for loop이 있는 경우엔, 여러분이 아마 for loop를 없앨 수 있는 방법이 없을 것입니다. 하지만 제 생각에는 적어도 한번의 기울기 강하의 iteration을 for loop없이 도입할 수 있다는 것은 꽤 멋진 것 같습니다. 자 이게 본 강의 내용의 전부인데요, 

이제 여러분은 vectorize되고, 매우 효율적인 로지스틱 회귀분석 기울기 강하 도입을 압니다. 한가지 더 내용이 있는데요, 이것은 다음 비디오에서 이야기하겠습니다. 여기에서 앞서 언급한 broadcasting에 대한 내용인데요, 파이썬 넘파이가 특정 부분의 코드에서 더 효율적으로 될 수 있도록 가능케 하는 기술이 바로 broadcasting 입니다. broadcasting에 대한 더 자세한 내용은 다음 비디오를 통해 보겠습니다.



















다시 온 걸 환영합니다. 이번 강의에서는, 환영합니다. 이비디오에서는 여러분이 로지스틱 회귄분석을 위한 기울기 강하를 도입하기 위해서 derivative를 산출하는 방법에대해 이야기하겠습니다. 여기서 가장 중요한 부분은 어떤 것을 도입하느냐 입니다. 즉, 로지스틱 회귀분석을 위한 기울기 강하를 도입하기 위한 중요 공식들에 대한 부분입니다. 이번 비디오에서는, 산출 그래프를 이용해서 이런 계산을 해보겠습니다. 인정해야하는 부분이지만, 로지스틱 회귀분석의 기울기 강하를 갖기 위해 산출 그래프를 이용하는 것은 조금 오버이기는 합니다. 하지만 이러한 아이디어들에 대해 여러분이 익숙해지게 하기 위한 목적으로 이런 방법을 통해 설명해보겠습니다. 바라건대, full-fledged 신경망을 이야기할때 조금 더 이해가 되시길 바랍니다. 그러면 이제 로지스틱 회귀분석을 위한 기울기 강하에 대해 알아보겠습니다. 복습하자면 이전에 로지스틱 회귀분석을 이렇게 설정했었는데요, 예측 값 ŷ은 이렇게 정의되었는데요, z는 이것이구요, 일단 1가지 example에 초점을 맞추면, loss는 여기 example에 대해서는 이렇게 정의됩니다. A가 로지스틱 회귀분석의 결과값이고 Y는 ground truth 레이블입니다. 이제 산출 그래프 형식으로 적어보겠습니다. 여기 예제에서는 x1, x2와 같은 2개의 특성만 있다고 해보겠습니다. z를 산출하기 위해서는, w1, w1, 그리고 b를 입력해서 하는데요, x1, x2의 특성에 부가적으로 말이죠. 산출 그래프에서 이런 것들은, z를 산출하는데 쓰이는데요, w1, x1 + w2 x2+b입니다. 여기 직사각형으로 둘러서 표시하겠습니다. 그러면 저희는 ŷ의 값을 구하거나 A= z의 시그마를 구합니다. 이것이 산출그래프에서의 다음 단계인데요, 그 이후에 마지막으로 L, AY를 구합니다. 여기서는 이제 공식을 다시 복사하지는 않겠습니다. 로지스틱 회귀분석에서는, w와 b의 파라미터를 변형시킬 것입니다. 여기 loss 값을 줄이기 위해서 말이죠. 저희는 하나의 트레이닝 example에서 전 방향전파 step을 이용해서 loss를 계산하는 방법을 배웠는데요, 이제는 거꾸로 derivative를 산출하는 방법에 대해 이야기 해보겠습니다. 여기 깔끔한 버전의 다이아그램입니다. 이제 loss에 대한 derivative를 계산하고 싶은 것이기 때문에, 첫번째로 해야할 것은, 뒤로 가는 경우에 말이죠, loss의 derivative를, 여기는 script가 있는데요, 여기 A변수에 대해서 산출해야 합니다. 그렇기 때문에 여기 코드에서 DA를 이용해 변수를 표기하는데요, 만약 여러분이 미적분학과 익숙하면 이것이 -y 나누기 a 더하기 (1 빼기 y) 나누기 (1 빼기 알파)라는 것을 보여줄 수 있습니다. 이것을 하는 방법은 loss에 대한 공식을 가지고 하는 것인데요, 미적분학에 익숙하면 여기 소문자 a 변수에 대한 derivative을 계산하는 것입니다. 그렇게 하면 여기 이 공식이 나오게 됩니다. 만약 여러분이 미적분학에 익숙하지 않은 경우라면, 걱정하지 마십시요. derivative 공식을 제공하겠습니다. 여러분이 코스에서 필요한 분에 대해서 말이죠. 여러분이 미적분학에 능숙한 경우헨, 이번 슬라이드의 loss 공식을 보도록 권장드립니다. 이 공식을 보고, 미적분을 이용해 a에 대한 derivative를 구해보십시요. 만약 여러분이 미적분학에 익숙하지 않으시면, 걱정하지 마십시요. 그러면 이제 DA의 양을 계산했는데요, 그리고 마지막 변수 알파를 A에 대해서 derivative값도 구했습니다. 그러면 이제 거꾸로 갈 수 있는데요, 이제 여러분은 DZ를 보여줄 수 있는데요, 이 부분은 파이썬 코드의 변수이름인데요, 여기는 이제 loss의 derivative가 될 것입니다. z 나 l 에 대해서 말이죠. 아니면 A와 Y가 포함된 파라미터를 이용하여 loss를 나타낼 수 있습니다. 맞죠? 둘 중의 아무 표기 방식이나 상관 없습니다. 그러면 이것이 a-y라는 것을 보여줄 수 있습니다. 미적분학에 능숙한 분들을 위해서만 몇가지 말씀드리겠습니다. 익숙치 않으시면 신경 안 쓰셔도 됩니다. 여기 DL 과 DZ는 보면, 여기는 DL_DA_곱하기_DA_DZ로 나타낼 수 있습니다. 그리고 여기 da / dz는 a 곱하기 1 빼기 a인데요, 그리고 dl da는 이전에 계산했지만, 여기 2값을 보면, dl / da와 여기 이 항이죠, 그리고 da /dz 는 여기 이 항이죠, 그리고 여기 2개의 것들을 가지고 곱해줍니다. 그렇게 되면 이 공식들은 a 빼기 y로 간략해지죠. 이렇게 공식을 만드는 것입니다. 이것은 이전에 간략히 이야기 했던 chain rule이기도 한데요, 얼마든지 미적분학에 익숙하신 분이라고 하면 이 계산을 한번 더 해보십시요, 만약 익숙치 않은 경우, 오로지 아셔야하는 부분은 DZ를 a 빼기 y로 계산할 수 있다는 것입니다. 계산은 이미 저희가 다 해놨기 때문이죠. 그러면 이 산출법에서 마지막 단계는 w와 b를 얼마나 바꿔야 하는지 계싼하는 부분입니다. 특히, w1에 대한 derivative가 x1 곱하기 dz라는 것을 보여줄 수 있는데요, 코딩에서는 이것을 dw1이라고 합니다. 그리고 비슷한 방법으로, dw2, 즉 w2를 얼마나 바꿔야하는지 알려주는 수치는 x2 곱하기 dz 와 b입니다. 아 죄송합니다. b가 아니라 db죠, 이 값은 dz와 동일합니다. 여러분이 만약 1가지 example에 대한 기울기 강하를 원할 경우, 이렇게 하면 됩니다. 여기 공식을 사용해서 dz를 계산합니다. 그리고 여기 이 공식들을 사용해서 dw1, dw2, db 그리고 여기 update를 실행합니다. w1은 w1 빼기 러닝속도 알파 곱하기 dw1입니다. w2도 이와 같이 업데이트 될텐데요, 그리고 B는 B 빼기 러닝속도 곱하기 DB로 설정됩니다. 그러면 1개의 example의 경우를 보여주는 단계입니다. 여러분은 방금 1개의 트레이닝 example에 대해서 로지스틱 회귀분석을 위한 기울기 강하 도입법을 배웠는데요, derivative를 산출해서 

구하는 방법을 배웠습니다. 하지만 로지스틱 회귀분석모델을 트레이닝 하는 경우, 1개의 트레이닝 샘플만 있는 것이 아니라 M세트의 트레이닝 샘플이 있습니다. 다음 비디오에서는 이러한 아이디어를 가지고 러닝에 어떻게 적용시키는지 한가지 샘플이 아닌 전체 트레이닝 세트에서의 환경에서 살펴보겠습니다.















이전 비디오에서는 1개의 트레이닝 example에 대해서 로지스틱 회귀분석을 위한 기울기 강하를 도입하기 위해 derivative를 산출하는 방법을 배웠는데요, 이제는 m개의 트레이닝 example에 대하여 구하고 싶습니다. 시작하기에 앞서, j의 비용함수 정의에 사시 한번 짚고 넘어가겠습니다. J(w, b) 비용함수는 여기 이 것의 평균값인데요 1 나누기 m 의 합, l이 1에서 m 까지의 합이고, 알고리즘 결과값의 loss가 a i 이고 y example에 대한 것입니다. 그리고 ai는 i번째의 트레이닝 example의 예측 수치입니다. 그것은 zi의 시그마인데요 이 값은 또 w transpose 더하기 b의 시그마입니다. 이전 슬라이드에서는, 1개의 트레이닝 example에 대해서 d의 derivative 값을 구하는 방법에 대해 배웠는데요, 

즉, dw1, dw2, 그리고 db인데요, 이제는 위 첨자 i를 표기해서 이전 슬라이드에서 했던 것을 똑같이 하면 나오는 값을 표현하겠습니다. 1개의 트레이닝 example인 xi, yi를 이용했을 때 말이죠. 죄송합니다. 여기 i가 빠졌네요. 그러면 여러분도 아시겠지만, 전체 비용 함수는 합, 아니 사실 평균이죠, 여기 1 나누기 m 에 대한 loss값에서 말이죠. w1에 대한 derivative는 전체 비용함수에서 마찬가지로 w1에 대한 derivative의 개인 loss 항들에 대한 평균값이 될 것입니다. 하지만 이전에 이 항을 계산하는 방법을 보여줬듯이, dw i라고 했는데요, 맞죠. 이것을 이전 슬라이드에서는 1개의 트레이닝 example의 경우 계산하는 방법을 알려드렸는데요, 이제 여러분은 여기 dervative를 이전의 트레이닝 example에서 보여줬듯이 계산해야 합니다. 그런 다음에 평균치를 구하면, 기울기 강하를 바로 도입할 수 있는 전체 기울기 값을 구할 수 있는 것입니다. 지금 다룬 내용이 굉장히 많은 양인데요, 이것들을 모두 모아서 더 구체적인 알고리즘을 만들어 봅시다. 기울기 강하와 로지스틱 회귀분석이 같이 도입된 잘 작동하는 알고리즘으로 말이죠. 이제 여러분이 할 수 있는 것은 이런데요, 

J=0으로 초기화 하고, dw1 = 0, dw2 = 0, db = 0으로 설정하고, 이제 할 것은 이런 트레이닝 세트에 for loop를 사용해서 각각의 트레이닝 example에 대해서 derivative 값을 구한 뒤에, 그 값들을 더할 것입니다. 이제 이렇게 하는데요, i가 1에서 m까지, m은 트레이닝 example의 개수입니다. zi 는 w transpose xi 더하기 b이고요, 예측 값 ai는 zi 의 시그마 그리고 j를 더해보도록 하죠. j 플러스는 yi log ai 더하기 1 빼기 yi 의 로그 1 빼기 ai하고 나서 전체 괄호 바깥으로 마이너스 부호를 앞에 두겠습니다. 그리고 이전에도 봤듯이 dzi는 ai 빼기 yi 이고요 dw 플러스 값은 x1 i 곱하기 d zi 입니다. dw2 플러스는 xi 2 dzi 입니다. 아 그리고 저는 이 계산들을 오로지 2개의 특성만 있다는 가정하에 진행하고 있는 것입니다.

즉, n= 2인 경우이죠, 안 그러면, 아니면 이것을 dw1, dw2, dw3 등등 이어서 하겠죠, 그러면 db 플러스는 dzi 인데요, 이렇게 하면 for loop의 끝입니다. 이렇게 m트레이닝 example에 대해서 모든 것을 마치면, 아직도 M으로 나누어야 할 텐데요, 평균을 구하는 것이기 때문입니다. 그러므로 dw1을 나눈 값이 m이고, dw2를 나누면 m이고, db 나누면 m이 되겠죠. 모든 평균에서 말이죠 그러면 전체 모든 계산에서 3개의 parameter w1, w2, b에 대한 j 비용함수의 derivative를 계산했는데요, 저희가 무엇을 했는지 조금 더 커멘트 해드리자면 저희가 dw1, dw2와 b를 이용하는데요, 누산기들 (accumulators)로 말이죠, 그렇기 때문에 계산 이후에는 dw1이 전체 비용함수의 derivative와 일치 하다는 것을 알 수 있습니다. w1에 대해서 말이죠. 비슷하게 dw2와 db에서도 말이죠. 보시면 알겠지만 dw1과 dw2는 위 첨자 i가 없습니다. 그 이유는 여기 코드에서 이것을 누산기들로 이용해서 전체 트레이닝 세트에 대해 사용하기 때문입니다. 반면에, dzi는 여기서 1개의 트레이닝 샘플에 대한 dz 값이었는데요, 그렇기 때문에 1개의 트레이닝 샘플임을 나타내기 위해 위 첨자 i가 있었던 것인데요, 이제 이런 계산을 모두 마쳤는데요, 기울기 강하의 1개의 단계를 도입하기 위해서는 w1을 도입하고, 이것은 w1 빼기 러닝속도 곱하기 dw1으로 업데이트 되고요. dw2는 w2 빼기 러닝속도 곱하기 dw2로 업데이트 됩니다. 그리고 b는 b 빼기 러닝속도 곱하기 db로 업데이트됩니다. 그리고 dw1, dw2, db는 이전에 왼쪽에서 계산했던 대로의 값입니다. 마지막으로 여기 J는 비용함수의 올바른 값일 것입니다. 그러면 이제 슬라이드의 모든 내용은 1가지 단계의 기울기 강하를 도입하는 것인데요, 여기 슬라이드에 있는 모든 내용을 복수로 반복해야 복수의 gradient descent 단계를 갖출 수 있습니다. 여기 상세 내용이 조금 너무 복잡하다고 생각되면, 다시 말씀 드리지만 너무 걱정하지 마십시요 아직 까지는요, 연습문제에서 이것들을 도입하게 되면 더 명백해질 것입니다. 여기 도입한 것과 같이 계산부분에 있어서는 2가지의 단점이 나타날 수 있는데요, 로지스틱 회귀분석을 이렇게 도입하기 위해서는 2개의 for loop을 써야 합니다. 첫 번째 for loop은 여기 m 트레이닝 example에 대한 for loop 이고요, 두 번째는 여기 모든 특성에 대한 for loop입니다. 여기 예제에서는 저희는 단순히 2개의 특성만 있었는데요, 

즉 n=2 그리고 x=2였죠, 하지만 더 많은 특성이 있을 시, dw1 과 dw2를 쓰게 될 텐데요 그리고 dw3로 비슷한 산출 법이 적용됩니다. dw n까지 말이죠. 그러므로 이렇게 n 개의 특성에 거쳐 for loop을 필요로 합니다. 딥러닝을 알고리즘을 도입하는 경우에 명백한 for loop을 갖는 경우, 코딩에서 말이죠, 이런 경우, 알고리즘이 덜 효율적으로 운영됩니다. 그러므로 딥러닝 시대에 데이터세트는 더욱 커지고 커지는데요, 알고리즘을 명백히 for loop을 알고리즘에 도입시키지 않고 진행하는 것이 굉장히 중요합니다. 그리고 더 많이 큰 데이터세트를 스케일링 할 수 있도록 도와주겠죠. vectorization이라고 하는 한가지 세트의 기술이 있는데요, 이 기술은 for loop을 코드에서 제거하게 해주는데요, 딥러닝 전 시대에는, 즉 딥러닝이 급부상하기 전에 말이죠, vectorization을 갖는 것이 좋았습니다. 가끔씩은 빠르게 하기 위해서 쓰였고 안 그럴 수도 있는데요, 딥러닝 세대에는, vectorization이 for loop을 이렇게 제거함으로써 또는 이렇게 말이죠, 아주 중요하게 되었습니다. 왜냐면 이제는 더욱 더 큰 데이터세트에서 트레이닝 시키기 때문입니다. 그렇기 때문에 여러분의 코드를 효율적으로 만드는 게 매우 중요해졌습니다. 다음 몇 개의 비디오에서는 vectorization에 대해 이야기하고 한 개의 for loop도 없이 이 모든 것을 도입하는 방법에 대해 배워보겠습니다. 그렇게 해서 로지스틱 회귀분석을 또는 기울기 강하를 도입하는 방법에 대해 이해하셨길 바랍니다. 연습문제를 진행하는 경우에

조금 더 명백히 이해하실 수 있을 것입니다. 하지만 연습문제를 하기에 앞서, 먼저 vectorization에 대해 이야기해보겠습니다. 그러면, 여기 모든 내용에 for loop없이 기울기 강하의 single iteration을 통해 도입할 수 있을 것입니다.



2-4 Gradient Descent





로지스틱 회귀분석 모델을 보았는데요, 싱글 트레이닝 example에서 얼마나 잘하는지를 측정하는 비용함수를 보았었는데요, 또한, 파라티터 w와 b가 전체 트레이닝 세트에서 얼마나 잘하는지를 측정하는 비용함수도 같이 봤습니다. 이제는 기울기 강하 알고리즘을 어떻게 이용하여 w와 b를 트레이닝세트에서 트레이닝 또는 학습할 수 있는지 배워보도록 하겠습니다. 복습하자면, 이것이 어디서 많이 눈이 익숙한 로지스틱 회귀분석 알고리즘이죠. 

 2번째 줄에는 J라는 비용함수가 있습니다. 이 함수는 파라티터 w와 b에 대한 함수입니다. 그리고 이것은 평균값으로 정의되죠. 그러므로 1 나누기 m 곱하기 이 loss함수의 합입니다. 그렇게해서 loss함수는 각각의 트레이닝 example에 대해서 알고리즘에 결과값 ŷ(i)이 얼마나 잘 쌓거나 ground true label y(i)과 

얼마나 잘 비교되는지 측정합니다. 전체 공식은 오른쪽에 펼쳐져있습니다. 자 그래서, 비용함수는 트레이닝세트에서 파라티터 w와 b가 얼마나 잘 하는지를

측정하는데요 w와 b라는 파라티터를 배우기 위해서는, w와b가 비용함수 J(w, b)를 최소화시키는 값을 찾는게 자연스러운 단계이겠죠? 이것이 gradien descent의 모습입니다. 


 이 표에서는 가로축이 공간 매개 변수 w와 b를 나타냅니다. 실제로 w는 다 큰 다이멘션일 수 있지만 표에 나타내기 위해 w와 b가 실수라고하겠습니다. J(w, b, ) 비용함수는 그러면 이 가로축 w와 b 표면 어딘가에 있을 것입니다. 표면의 높이는 특정지점에서 J(w, b)의 값을 가르키는데요 저희는 J라는 비용함수가 최소값이 되는 w와 b의 값을 구해야 합니다. 알고보면, 이 J 비용함수는 볼록함수입니다. 하나의 그릇 모양이라고 할 수 있는데요, 이것이 볼록함수이고, 이런 여러개의 local이 있는 비볼록 함수와는 다르죠. 이렇게 정의된 비용함수 J(w, b)는 볼록하고, 그렇기 때문에 이와 같은 비용함수 J를 이용하는 것입니다. 로지스틱 회귀분석에서 말이죠. 파라티터의 적합한 값을 찾으려면, w와 b를 최초값으로 초기화해야 합니다. 이 빨간 점이 상징하듯이 말이죠. 로지스틱 회귀분석에서는 거의 모든 초기화 방법이 잘 구현됩니다. 일반적으로 0으로 초기화시키는데요, 무작위로 초기화 시키는 방법도 효율적입니다. 그렇지만 대부분의 사람은 보통 이러한 방법은 잘 사용하지 않죠. 이 함수가 볼록함수이기 때문에 어느 지점에서 초기화하더라도 똑같은 지점에 도달하거나 거의 비슷한 점에 도달할 것입니다. 

 기울기 강하 가 하는 것은,  처음 시작점에서 시작해서 가장 기울기가 높은 내리막길 방향으로 이동합니다. 그렇기 때문에 기울기 강하 이후로는 이 점에 도착할 수도 있습니다. 그 이유는, 기울기 강하 가 가장 경사가 높은 내리막길 방향으로 향하기 때문입니다. 최대한 빠른 속도로 말이죠. 이것이 기울기 강하 의 반복업무 중 하나입니다. 기울기 강하를 2번 진행한 이후, 이곳으로 넘어갈 수도 있습니다. 3번째에는 여기로 말이죠, 이것이 이제는 표에 가려질텐데요, 결과적으로 이상적으로는 전역최적점으로 모이거나 근접한 지점에 도달할 것입니다. 이 그림은 기울기 강하 알고리즘을 나타내고 있습니다. 조금 더 상세히 적어보겠습니다. 

 조금 더 쉽게 나타내기위해 J(w)라는 함수가 있다고 해보겠습니다. 이 값을 최소화시키고 싶은데요, 이렇게 생겼다고 해보겠습니다. 더 쉽게 그리리 위해서, 

일단은 b를 무시하고, 다차원이 아닌 1차원적인 표로 만들겠습니다. 기울기 강하 가 이렇게해서, 해당 update를 계속 반복적으로 진행할 것입니다. w값을 갖고 업데이트할 것입니다. 콜론표시로 w를 업데이트함을 표시할텐데요, w를 w 빼기 알파로하고, 이것은 derivative dJ(w)/dw입니다. 이것을 알고리즘이 합쳐질때까지 반복하겠습니다. 알아둘 점은, 여기 알파는 학습 속도를 뜻하고, 한번에 얼마만큼 기울기 강하를 진행할 수 있는지 조절해줍니다. 학습 속도인 알파를 어떻게 선택하는지는 나중에 자세히 이야기하겠습니다. 2번째로, 여기 이 값은 derivative입니다. 이것은 업데이트 또는 w에 얼마나 변화를 줄지 여부를 알려주는 값입니다. 기울기 강하를 도입하기 위한 코드를 만들기 시작하면 dw라는 변수가 derivative를 나타내도록 규칙을 만들 것입니다. 그렇게해서 코드를 만드는 경우, w : 는 w 빼기 알파 곱하기 dw 라고 적어볼 텐데요 dw를 변수 이름으로 만들어서 이 derivative 항을 뜻하게 만듭니다. 

 자 이제 해당 기울기 강하 업데이트가 말이 되도록 만들겠습니다. w가 여기 있었다고 하죠. 그러면 비용함수 J(w)에서 이 지점에 있습니다. 기억할 것은, derivative의 정의가 특정 지점에서 함수의 기울기라는 것입니다. 함수의 기울기는 높이 나누기 너비, 맞죠? 이 작은 삼각형에서 말이죠, 기울기는 J(w) 에서 이 탄젠트 지점이 됩니다. 그렇게해서, derivative는 양수입니다. W는 w 빼기 학습 속도 곱하기 derivative 값만큼 업데이트 되는 것입니다. derivative값은 양수이고, 그렇기 때문에 w에서 빼게되는 것인데요 그러므로 왼쪽으로 진행합니다. 만약 이 큰 w값으로 시작했다고하면 기울기 강하는 알고리즘이 천천히

파라티터를 줄이도록 할 것입니다. 다른 예제로, 만약 w가 여기 있었다고 하면 이 지점에서는 dJ/dw의 기울기는  음수일 것입니다. 이 경우, 기울기 강하 업데이트는 알파 곱하기 음수의 값을 뺄 것입니다. 결과적으로 w를 천천히 증가시킬텐데요, w를, 기울기 강하 의 반복을 통해 점점 더 크게 만드는 효과가 있습니다. 그러므로 왼쪽에서 초기화를 진행하던 오른쪽에서 진행하던, 기울기 강하는 이 전역 최소값을 향해 움직일 것입니다. 

 여러분이 derivative이나 미적분학에 익숙해 있지 않으신 경우이거나, dJ(w)/dw가 뜻하는 바가 무엇인지 잘 모르시더라도 너무 걱정하지 마십시요. derivative에 대해서는 다음 비디오에서 더욱 자세히 다루겠습니다. 미적분학을 잘 아시면, 신경망이 어떻게 작동하는지 잘 이해하실 수 있을 것입니다. 하지만, 미적분학에 익숙하지 않더라도 다음 비디오를 통해, derivative와 미적분학에 대한 직관적인 부분을 다뤄서 신경망을 잘 다룰 수 있도록 하겠습니다. 일단은 이런 항이 기울기를 뜻한다는 것을 이해하시고, 현재 매개 변수 값에서의 함수 기울기를 찾고 가장 높은 기울기에서, 비용함수 J인 경우, 어느 방향으로 이동할지 여부를 알아내는 것입니다. 오로지 w가 파라티터인 경우, J(s)에 대한 기울기 강하를 적었습니다. 로지스틱 회귀분석에서는 비용함수가 w와 b라는 파라티터에 대한 함수입니다. 이 경우, 기울기 강하의 inner loop는, 이와 같이 생긴 것인데요, 반복해야하는 이 것은 아래와 같습니다. w를 w 빼기 학습 속도 곱하기 w에 대한 J(w, b) derivative로 업데이트 합니다. b는 b빼기 학습속도 곱하기 b에 대한 비용함수의 derivative로 b를 업데이트 합니다. 그래서 이 밑에 있는 2개의 공식이 실제로 도입하는 업데이트입니다. 따로 말씀 드릴 부분이 있는데요,  미적분학에서 쓰는 표기가 어떤 분들에게 조금 헷갈릴 수 있는데요. 미적분학을 이해하는 것이 굉장히 중요하다고 할 수 없지만 이런 것을 보면, 너무 많이 생각하지 않으시길 바랍니다. 여기서 보이는 미적분학에서 쓰는 항은 이렇게 쓰는데요, 이 구부려진 모양입니다. 이 심볼은, 이렇게 멋지게 쓰인 것은 소문자 d이구요 조금 특화된 글꼴로 쓰는데 이러한 표기를 보면, J(w, b)의 기울기라는 것입니다. w방향으로 J(w, b)함수가 얼마나 기울고 있는지를 나타냅니다. 미적분학에서의 규칙이 아주 타당하다고는 생각되지 않지만, 이 규칙이오히려 더 헷갈리게 만드는 것 같은데요 만약 J가 2개 또는 그 이상의 변수로 이루어져 있을 시, 소문자 d를 쓰는 대신에 이 우습게 생긴 심볼을 사용합니다. 이것을 partial derivative(편미분) 심볼이라고 하는데요. 일단 신경쓰지 마십시요. 그리고 J가 만약 한개의 변수를 가진 함수라면 소문자 d를 사용합니다. 그렇기 때문에 이 우습게 생긴 partial derivative 심볼을 사용하는 경우와 소문자 d를 위와 같이 사용하는 경우의 차이는 J 함수가 2개 이상의 변수를 가지고 있는지의 차이입니다. 그런 경우, 이 partial derivative 심볼을 쓰고, 1개의 변수가 있는 경우, 소문자 d를 사용합니다. 이런 것이 바로 미적분학에서 쓰이는 조금은 웃긴 표기법인데요. 오히려 더 헷갈리게 만드는 것 같습니다. partial derivative 심볼를 보시면 단순히 함수의 기울기가 이 변수들 중 하나에 대하여 계산된다고 생각하면 됩니다. 비슷하게, 앞서 다룬 미적분학 표기법을 동일하게 적용합니다, 그 이유는 여기서는 J가 2개의 입력값이 있기 때문이죠. 이 밑에 있는 부분은 이 partial derivative 심볼과 같이 쓰여야 합니다. 이 것은 거의 똑같은데요, 소문자 d가 의미하는 것과 거의 비슷합니다. 마지막으로 이것을 코드에 도입시킬 때는, 이 양이, 즉 w를 업데이트하는 정도의 양을, dw 변수로 코드에서는 표기될텐데요 이 값 맞죠? b를 업데이트하고 싶은 정도는 코드에서의 db 변수로 표기될 것입니다. 자 이렇게 gradiend descent를 도입할 수 있는 것입니다. 만약 여러분이 미적분학을 수년동안 접하지 않으셨다면, 지금 본인의 현재 편안한 정도의 레벨보다 미적분학에서 더 많은 derivative를 다룬다고 생각하실텐데요, 만약 여러분이 이렇게 느끼시면 걱정하지 마십시요. 다음 비디오에서는 derivative에 대한 조금 더 직관적인 이해를 돕도록 하겠습니다. 미적분학에 대한 깊은 수학적인 지식없이도 직관적인 미적분학의 이해만으로도 신경망을 조금 더 효율적으로 만들 수 있을 것입니다. 다음 비디오로 넘어가서 derivatice에 대해 조금 더 이야기해보도록 하겠습니다.









2-7.computation graph






*쉽게 생각하면, 

J = 3(x+z*g), u=z*g, v=x+z*g

에서 각 x,z,g,u,v에 대해 편미분한 값(x,z,g,u,v가 1씩 증가할때 J는 얼마만큼 변하는지 알아보는 것)





지난 강의에서 이전 비디오에서는, 산출 그래프응 이용한 예제를 통해서 J함수를 계산하는 방법을 배웠습니다. 이제 깨끗한 전환을 통해산출 그래프에 대해 알아보도록 하겠습니다. 그리하겨, 이 그래프를 통해 J함수의 derivative를 계산하는 방법을 알아보겠습니다


여기 산출 그래프가 있습니다. 여러분이 J v에 대한 derivative를 계산하고 싶다고 해보겠습니다. 이것을 무엇일까요? 여기 v의 값을 갖고 살짝 변경한다고 하면 J의 값은 어떻게 변할까요? 여기서 J v의 값의 3배로 정의됩니다. 그리고 현재 v의 값은 11입니다. 만약에 v의 값을 11.001로 조금 높히면, J 3v 이기 때문에, 현재 시점에는 그 값이 33입니다. 이 값은 그러면 33.003으로 되겠죠. 그러면 v의 값이 0.001로 늘어났습니다. 그러면 최종 결과는 J 3배로 늘어난다는 것입니다. 그러면 J v에 대한derivative 3입니다. J의 증가분은 v의 증가분의 3배이이 때문입니다. 이 예제는 이전 비디오에서 다뤘던 예제와 유사한데요, f(a)=3a 였던 예제와 말이죠. 그 이후, df/da를 약간 심플하게 만들어서 가지고 왔는데요, 대충 표현하면, df/da = 3으로 나타낼 수 있습니다. 그러므로 이렇게 J = 3v로 나타나는데요, 이 경우, dJ/dv 3이 됩니다. 여기서는 J f의 역할을 하는데요, 이전 비디오 예제에서 v a의 역할을 학구요, 그러므로 후 방향전파의 용어에서 만약 여기 마지막 변수 결과값의 derivative를 산출하고 싶은 경우, 주로 가장 신경쓰는 변수이기도 합니다만, v에 대한 값인데요, 후 방향전파의 첫번째 단계를 진행했습니다. 이 그래프에서 one step backwards라고 합니다


다른 예제를 하나 더 보겠습니다. dJ/da 는 무엇일까요? 다시 말해, a의 값을 올리면, 이것이 J의 값에 어떤 영향을 미칠까요? 예제를 통해 살펴보겠습니다.

 여기서 a의 값은 5입니다. 이제 이 값을 5.001로 올려보겠습니다. 순영향은 v가 이전에는 a+u였죠,이 값이 11이였는데요, 이제 이 값이 11.001이 될 것입니다. 그리고 이미 위와 같이 봤습니다만, J의 값은 33.003으로 증가합니다. 그러면 여기서 볼 수 있는 것은 0.001만큼 증가시키면 J 0.003만큼 증가합니다. 여기서 a 증가라고 하는 것은 여기 5라는 값에 새로운 값을 대입시키는 것입니다. 그러면 a의 변화는 그래프의 오른족으로 반영되어 J의 값이 33.003이 될 것입니다. 그러면 J의 증가가 a의 증가분과 비교하였을 때 3배가 되는 것입니다. 그러면 여기 derivative값은 3이라는 것입니다. 이것을 간단히 분해해서 설명하면 a를 변경하면 그 변경한 값이 v를 변경할 것입니다. 그렇게 v가 변경되면 그 변화는 또 J를 변경시킬 것입니다. 그러므로 값을 증가시켰을 때의 총 J의 총 변화는, a의 값을 아주 조금 올렸을 때, a를 변경하면서, v를 증가시키게 됩니다. 그러면 v는 얼마나 늘어날까요? dv/da로 결정된 만큼 증가할 것입니다. 그리고 v의 변화량이 J를 증가시킬 것입니다. 그리하여 미적분에서는 이것을 chain rule이라고 하는데요a v에 영향을 주면, J에 영향을 주고a의 값을 약간 변경하면서 J가 변하는 양은 a를 변화시킬때 변하는 v의 양 곱하기 v값이 변할때 변하는 J의 양입니다. 다시 말씀드리면, 미적분에서는 이것을 chain rule이라 합니다


이번 계산을 통해 배운 것은값을 0.001로 증가시키면, v도 똑같은 양 만큼 변한다는 것입니다. 그러므로 dv/da의 값은 1이 됩니다. 이전에 끝낸 값을 대입시키면, dv/dJ 3이되고, dv/da 1이 됩니다. 이 값의 곱셈은 3곱하기 1이구요, 그러면, 알맞은 값인 dJ//da의 값이 3이 나옵니다. 이렇게 나온 값과 같이,

 dJ/dv, , 이 변수에 대한 derivative값인데요, 이 값을 통해 dJ/da도 계산을 할 수 있습니다. 또 다른 역산출의 예입니다. 표기법에 관련해 한가지 말씀드릴 것이 있는데요, 후 방향전파 도입을 위해 코드를 쓰는 경우, 여러분이 정말로 신경쓰는 결과값 변수가 있을 것입니다. 이런 결과값 변수는 여러분이 최적화 시키고 싶은 값이디고 하죠. 이런 케이스의 경우, 최종 결과값 변수는 J입니다. 여러분의 산출 그래프에서 마지막 노드에 해당하는 부분입니다. 그러므로, 수 많은 산출 그래프들이 최동 결과값 변수에 대한 derivative값을 산출하려고 할 것입니다. , 다른 어떤 변수에 대한 최종 결과값 변수의 d 겠죠. 이것을 dvar라고 하겠습니다. 이렇게 최종 결과값 변수에 대한 derivative J와 같이 계산하는 경우가 많을 것입니다중간중간 변수들이 있는 경우이죠. 변수들은 a, b, c, u, 또는 v와 같을 수 있습니다. 이것을 소프트웨어에 도입시키면 이런 변수를 뭐라고 부를까요? 한가지 할 수 있는 방법은 파이썬에서, 아주 긴 이름을 부여할 수 있습니다dFinalOurputVar/dvar와 같이 말이죠. 하지만 이것은 너무 긴 변수 이름이겠죠. 제 생각에는 dJdvar라고 부를 수도 있을 것 같습니다. 하지만 여려분은 dJ에 대해서 derivative값을 갖기 때문에, , 여기 최종 결과값 변수에 대해서 말이죠.

  그러므로 새로운 표기법을 소개하겠습니다. 코딩에서, 여기 이것을 산출할때, 그냥 dvar이라는 변수이름을 사용하겠습니다여기 이 양을 나타내기 위해서 말이죠. 그러므로 코드에서 쓰는 dvar J와 같은 최종 결과값 변수의 derivative를 나타낼 것입니다. 가끔씩은 코딩에서 여러 중간 값의 양에 대한 마지막 l을 나타낼 것입니다. 그러므로 코딩에서 여기 이 부분은 dv를 사용해서 이 값을 나타냅니다. 그러면 dv 3이 될 것입니다. 그러면 여러분의 코드는, 여기 이것을 da로 표기하느데요, 여기서 이 값은 3이라는 것을 알아냈는데요, 저희는 이 산출 그래프를 통해 부분적으로 후 방향전파 진행했는데요, 나머지 부분은 다음 슬라이드에서 진행하겠습니다. 이제 깨끗한 버전의 산출그래프로 이동하겠습니다. 반복하자면, 이제까지는 여기서 거꾸로가서dv의 값이 3이라는 것을 알아냈습니다. 그리고 dv의 정의, 이것은 그냥 변수 이름이구요, 코드가 dJ/dv입니다. da의 값이 3이라는 것을 찾았습니다. da는 역시 여러분의 코드에서 쓰이는 변수 이름인데요, 이것은, dJ/da의 값입니다. 그리고 우리는 우리가 어떻게 이렇게 두 모서리를 거꾸로 갈 수 있는지 조심해야 한다. 그럼 계속해서 derivative를 계산해보겠습니다. u의 값을 보겠습니다. dJ/du 는 무엇일까요? 이전에 계산했던 것과 비슷하게, u6이라는 값으로 시작합니다. u의 값을 6.001로 증가시키면, v는 이전에 11이였는데요, 이 값이 11.001이 됩니다. 그럼 J 33에서 33.003이 됩니다. 그러면 J의 증가분은 3배인데요, u에 대한 분석은 우리가 이미 실행한 a에 대한 분석과 매우 흡사합니다. 이것은 dJ/dv 곱하기 dv/du로 계산되는데요, 이것은 이전에 계산한것과 같이 3입니다. 그리고 이것은 1이구요. 그러면 후 방향전파에서 또 한단계 진행했는데요, du는 또, 3이라는 결과를 계산합니다. 그리고 du 당연히 여기 dJ/du 입니다. 마지막 예제로 들어가겠습니다. dJ/db는 무엇일까요? 여기서 b의 값을 바꿔도 된다고 해봅시다. b를 조금 바꿔서 J의 값을 최소화 시키거나 최대화시키기 위해서 말이죠. 그러면 여기 J비용함수의 기울기는 또는 derivative b의 값을 조금 바꾸는 경우 어떻게 될까요? 미적분학의 chain rule을 이용하여, 2가지 값의 곱하기로 나타낼 수 있습니다. 여기 dJ/du 곱하기 du/db로 말이죠

 그 원리는b를 조금 바꾼다고하면, b 3에서 3.001로 말이죠. J가 미치는 영향은, 먼저 U가 먼저 영향을 받을 것입니다. 그러면 u는 얼마나 영향을 받을까요? u b곱하기 c로 정의되는데요, 그럼 이값은 6에서 b 3인 경우에 말이죠, 6.002로 변할 것입니다. 여기서 c의 값은 2이기 때문에 그렇습니다., 그러면 du/db 2라는 것을 알려줍니다. 그러면 b 0.001로 증가시키면u는 그것의 2배만큼 증가합니다. , du/db 2가 됩니다. 이제 u의 값이 2배로 늘어난 것을 확인할 수 있는데요, b가 늘어난 것과 비교했을 때 말이죠, 그러면 dJ/du는 무엇일까요? 이것은 이미 3이라는 것을 알아냈었습니다. 그럼 이 값들을 곱해서 dJ/db 6이라는 것을 알 수 있습니다. 그리고 두번째 부분에 대한 설명입니다. u의 값이 0.002 만큼 늘어나면 J의 영향은 어떻게 되는지에 대go 설명말이죠, dJ/du 3이라는 사실은 u 0.002만큼 늘어나면 J의 값은 그것의 3배만큼 늘어난다는 뜻입니다. , J 0.006만큼 늘어나겠죠. 이것은 dJ/du 3이라는 사실에 근거합니다. 수학적인 부분을 자세히 보면, d 3.001이 된다는 것을 알게되고, 그러면 u 6.002가 되면, 결국 v 11.002가 됩니다. 그러면 저것은 a+u이고, 저것은 5+u가 됩니다. J 3곱하기 v이며, 그 값은 33.006이 됩니다. 이렇게해서 dJ/db값은 6이 나오게 되는데요, 이 부분을 채우기 위해서는, 거꾸로 가는 경우 말이죠이건 db이고 그 값이 6입니다. db는 쉽게 말해 dJ/db의 파이썬 변수 코드 이름입니다. 마지막 예제는 자세히 들어가진 않겠습니다. dJ를 계산하면, 여기 이 값은 dJ/du 곱하기 du가 되는데요, 그러면 여기 이 값은 9가 되고이 값은 3곱하기 3입니다. 이 예제는 자세히 다루지 않겠습니다. 여기 마지막 단계를 통해dc가 이렇다는 것을 알아낼 수 있습니다. 이 비디오에서 중요한 내용은여기 예제에서와 같이 derivative를 계산하고, 여기 모든 derivative들을 계산할때가장 효율적인 방법은 여기 빨간색 화살표와 같은 방향으로 오른쪽에서 왼쪽으로의 계산을 진행하는 것입니다. 특리 v에 대한 derivative를 먼저 계산하겠습니다. 그러면 저것이 a에 대해서 derivative를 찾는 것과 u에 대해서 derivative를 찾을 때 유용하게 쓰입니다. 그리고 여기 이 예제에서 u에 대한 derivative 여기 이 항과 여기 이 항의 같은 경우과 같이 말이죠. 이것들은 결과적으로 b에 대해서 derivative를 찾는데 유용하게 쓰입니다. c에 대해서 derivative를 구할때도 마찬가지로 말이죠. 이제까지 산출 그래프 내용을 이야기 했는데요, , 최적화 시키고 싶은 J비용함수에서 계산하는 forward, left to right 계산법에 대해 알아봤습니다 그리고 derivative를 산출하기 위한 backwards, right to left 계산법도 알아봤습니다. 여러분이 만약 미적분학이나 chain rule에 대한 내용이 생소하게 들리시면, 저도 이런 내용을 빨리 진행해서 넘어갔는데요, 자세한 내용을 모르시더라도 걱정하지 마십시요. 다음 비디오에서는 로지스틱 회귀분석법에 연관지어 다시 그 내용을 알아보도록 하겠습니다. 그리하여 산출법을 도입하기 위해서 정확히 어떻게 해야하는지 로지스틱 회귀분석 모델의 derivative를 계산하기 위한 방법을 다뤄보겠습니다.

 

 

 

 













\



안녕하세요. 다시 오신 것을 환영합니다. 이번 주에는 신경망 프로그래밍의 기초에 대해 알아보도록 하겠습니다. 신경망을 구현할 때에는 매우 중요한 몇 가지 기술이 있습니다. 예를 들어, m개의 학습 표본을 가진 학습 세트가 있으면, m개의 학습 표본에 대해서 for문을 돌리면서 하나씩 학습 세트를 처리 해 왔을 것입니다. 하지만 신경망을 구현할 때는 전체 학습 세트를 돌리는데 for문을 사용하지 않고 처리하고자 합니다. 따라서, 이를 어떻게 하는지 강의를 통해 알아보도록 합시다. 또다른 아이디어에는, 신경망으로 계산을 할 때 보통 순방향경로 혹은 순전파, 그 다음엔 역방향경로 혹은 역전파 계산법을 사용합니다. 따라서, 이번 주 강의에서 신경망을 학습시킬 때 왜 순전파와 역전파를 이용하여 계산을 하는지 소개하도록 하겠습니다. 이 강의에서 저는 이해를 돕고자 로지스틱 회귀를 통해 아이디어를 전달하려 합니다. 하지만 예전에 로지스틱 회귀에 대해서 들어보셨을지라도, 이 강의에서 얻을 수 있는 새롭고 흥미로운 아이디어가 있을 것이라 생각합니다. 그럼 시작해보도록 합시다. 로지스틱 회귀는 이진 분류를 위한 알고리즘입니다. 문제를 통해 이야기해 보도록 합시다. 여기 예로 이진 분류 문제가 하나 있습니다. 여기와 같이 입력 이미지가 있습니다. 이미지를 인식하기 위해서 고양이일 때에는 1로, 고양이가 아닐 때는 0으로 레이블을 출력하려 합니다. 그리고 출력 레이블을 나타내기 위해 y를 사용하도록 하겠습니다. 이미지는 컴퓨터에서 어떻게 표현되는지 살펴보도록 하겠습니다. 이미지를 저장하기 위해서 컴퓨터는 각각 빨간색, 녹색, 파란색 채널에 대응하는 세 개로 분리된 행렬을 사용합니다. 그래서 입력 이미지가 64x64 픽셀이라면 빨간색, 녹색, 파란색 픽셀의 채도에 해당하는 값을 가진 3개의 64x64 행렬을 있을 것입니다. 좁은 슬라이드에 표현하다 보니깐 최대한 작게 그렸는데, 여기에는 64x64 대신에 5x4 행렬이 사용 되었습니다. 이 픽셀들의 채도값을 특징벡터로 바꾸기 위해 여기 픽셀값 모두를 하나의 입력 특징벡터 x에 펼쳐 보았습니다. 모든 픽셀 채도값을 특징벡터에 나열하기 위해서 이미지에 해당하는 특징벡터를 다음과 같이 정의해 봅시다. 255, 231, ... 255, 231, ... 이런식으로 빨간색 픽셀값 모두를 나열합시다. 다음엔 255, 134, ... 255, 134, ... 여기 이미지에 있는 빨간색, 녹색, 파란색 픽셀 채도를 모두 여기 기다란 특징벡터에 나열해봅시다. 그래서 이미지가 64x64 이미지라면, 이 특징벡터 x의 전체 차원은 64x64x3이 될 것입니다. 이는 여기 세 개의 행렬 안에 있는 모든 값들의 수이기 때문입니다. 이 경우에는 12,288이 되겠고 여기 모든 숫자를 곱하면 얻을 수가 있습니다. 그래서 입력 특징 x의 차원을 nx = 12,288로 표현하겠습니다. 가끔 간결하게, 입력 특징벡터의 차원을 소문자 n으로 쓰겠습니다. 따라서 이진 분류에서, 우리의 목표는 입력 벡터 x로 표현된 이미지를 입력으로 주어 분류자를 학습시키고, 출력 레이블 y가 1인지 0인지 예측하려 합니다. 즉, 고양이인지 고양이가 아닌지 예측합니다. 앞으로 이 강의에서 사용하게 될 몇 가지 표기법을 정리하도록 하겠습니다. 하나의 학습 표본은 순서쌍 (x,y)로 표기됩니다. 여기서 x는 x차원을 가진 특징벡터이고, y는 0 혹은 1중에 하나의 값을 가지는 레이블입니다. 학습 세트는 m개의 학습 표본으로 구성되어 있습니다. 그리고 학습 세트는 첫번째 학습 표본의 입력값과 출력값 (x(1),y(1)), 두번째 학습 표본 (x(2),y(2))에서 마지막 학습 표본 (x(m), y(m))으로 적을 수가 있습니다. 그래서 이것들이 모두 합쳐진 것이 전체 학습 세트입니다. 학습 표본의 수를 나타내기 위해 소문자 m을 사용하도록 하겠습니다. 그리고 가끔 학습 표본의 수라는 것을 강조하기 위해 이것을 m=m_train으로 적도록 하겠습니다. 그리고 테스트 세트를 말할 때는, m_test로 테스트 표본의 수를 나타내겠습니다. 그래서 이것은 테스트 표본의 수입니다. 마지막으로 모든 학습 표본을 더욱 간결하게 표현하기 위해서 대문자 X로 행렬을 정의하겠습니다. 이 행렬은 학습 세트 입력값들 x(1), x(2), ... 을 가져와서 세로줄로 입력값들을 쌓은 것입니다. 그래서 x(1)을 가져와서 여기 행렬의 첫번째 열에 놓고 x(2)는 두번째 열, 이런식으로 x(m)까지 놓겠습니다. 그러면서 행렬 X가 만들어지겠습니다. 따라서 이 행렬은 학습 표본의 수인 m개의 세로줄 행렬의 높이인 nx개의 가로줄을 가지게 됩니다. 주의할 것이 있는데, 다른 강의에서 가로줄로 학습 표본을 쌓아서 행렬 X를 표현하는 것을 보셨을 겁니다. x(1) 전치시키고, 아래로 가서 x(m)까지 전치시키고 이런식으로요. 하지만 신경망을 구현할 때 왼쪽에 제가 쓴 표기법이 훨씬 더 쉽다는 것이 알려졌습니다. 그래서 요약하면, X는 nx x m차원을 가진 행렬이고, 파이썬을 코딩할 때 나오는 X.shape()는 행렬의 형태를 알기 위한 명령어이고 (nx, m)을 출력합니다. 따라서 그것은 단순히 nx x m차원의 행렬을 의미합니다. 여기까지 학습 표본의 입력 x를 어떻게 행렬에 묶는지 알아보았습니다. 그렇다면 출력 레이블 Y는 어떻게 할까요? 신경망을 좀 더 쉽게 구현할려면 출력 레이블 Y도 세로줄로 해서 쌓는 것이 더 편리합니다. 따라서 대분자 Y를 이런식으로 y(1), y(2), ... y(m)와 같아지도록 정의하겠습니다. 그러면 여기 있는 Y는 1 x m 다이멘션얼 매트릭스가 되겠죠. 그리고 다시 Y 모양없이 표기하면, Y는 1, m이 되겠죠. 즉, 이것은 1 x m 매트릭스가 됩니다. 여러분이 차차 새로운 네트워크, mtrain discourse에 영향을 주면서, 다른 트레이닝 example과 연관된 데이터를 적용시키는 것이 

유용하다고 느끼실 것입니다. 여기서 데이터는 x 또는 y또는 나중에 다룰 데이터의 양입니다. 다른 트레이닝 example과 연관된 데이터를 적용시켜서 마찬가지로 x와 y에서 했던 것처럼 다른 줄에 쌓는 방식으로 

진행합니다. 이것은 회귀를 가르키는데 쓰는 표기방식이구요, 다름 코스에서 다룰 신경망에 대한 표기법입니다. 여러분이 만약 표기문자가 뜻하는 것을 까먹는 경우,

예를 들어, M이 무엇인지 N이 무엇인지, 다른 어떤 표기 방법은 또 무엇인지, 

이런 내용을 코스 웹사이트 notation guide로 포스팅했기 때문에 여러분이 빠르게 궁금해하는

표기를 확인할 수 있습니다. 자 그럼, 다음 비디오로 넘어가겠습니다. 다음 비디오에서는 이 표기를 사용하여 

선형회귀를 도출하는 법을 다루겠습니다.




In this video, we'll go over logistic regression. 이 러닝 알고리즘은 지도학습 문제에서 결과값 레이블 Y의 값이 0 이거나 1인 경우 사용되는 학습 알고리즘입니다 즉 이진 분류 문제의 경우이죠. 입력 특성 벡터 X가 고양이이거나 고양이가 아닌 사진을 분류하는 이미지에 해당하는 경우 결과값을 예측하는 알고리즘이 필요할 것입니다. 이것을 ŷ (y hat) 이라고 하겠습니다. 이것은 Y의 평균값이죠. 공식적으로는, ŷ 의 값이 Y가 주어진 입력 특성 X가 되는 확률로 만드는게 좋습니다. 다시 말해서, X 가 사진이면, 저번 비디오에서 본 것처럼 말이죠, ŷ 은 이 사진이 고양이일 확률은 얼마나 되는가? 를 말해주는 것이 좋습니다. 그러므로, 저번 비디오에서 본 것과 같이 X는 X 다이멘션얼 벡터입니다. 로지스틱 회귀분석법의 매개변수가 W이고, W가 동시에 X 다이멘션얼 벡터이며, 실수인 b도  x 다이멘션얼 벡터인 경우 말이죠. 그러므로, 입력값 X와, 매개변수가 W와 b인 경우, ŷ 결과값은 어떻게 생성할까요? 시도할 수 있는 방법은, 물론 안되겠지만, ŷ 이 w transpose값 곱하기 X + b입니다. 입력값 X의 일차함수인 것처럼 말이죠. 사실 말한 것 그대로, 이것을 선형회귀에 씁니다. 그렇지만 이항분류문제로는 그닥 좋지 않은 알고리즘인데요, ŷ 이 Y가 1일 확률이 되도록 만드는 것이 좋기 때문입니다. 결과적으로 ŷ 이0에서 1사이에 있어야 하는데, 이렇게 만들기가 쉽지 않죠, W transpose 곱하기 X 플러스 B값이 1보다 훨씬 더 크고 마이너스일 수도 있기 때문입니다. 확률적인 측면으로 비추어보았을때, 말이 안되죠. 이것이 0에서 1사이에 있도록 하는 것이요. 로지스틱 회귀분석법에서는 결과값이 ŷ = 이 만큼의 양이 적용된 시그모이드 함수가 될 것입니다. 

 시그모이드 함수는 이렇게 생겼습니다. 가로축에 Z를 넣으면, Z의 시그모이드 함수는 이렇게 생깁니다. 부드럽게 0에서 1로 가죠. 축을 이렇게 넣겠습니다. 이 값은 0이고 세로축을 0.5에서 교차합니다. Z의 시그모이드 함수는 이렇게 생겼구요, 이 W transpose 곱하기 X 더하기 B에 대한 양을 나타내기 위해 Z를 쓰겠습니다. 여기 시그모이드 함수에 대한 공식입니다. Z의 시그모이드에서 Z는 실수, 1 나누기 1+E의 의 마이어스 Z승입니다. 2가지 알만한 사항이 있는데요. 만약 Z의 값이 매우 크면 E의 -Z승은 0에 가까울 것입니다. Z의 시그모이드는 대략 1 나누기 1 플러스 0에 가까운 값일 것입니다. 그 이유는 E의 아주 큰 숫자의 승은 0에 가깝디 때문이죠. 그러므로 이 값은 1에 가깝죠. 그럼 보시다시피, 왼쪽을 보시면 Z의 값이 매우 큰 경우, Z의 시그모이드는 1과 매우 가깝운 값이 됩니다. 반대로 Z의 값이 작으면, 또는 아주 큰 음수인 경우, Z의 시그모이드는 1 나누기 1+E의 -Z승이 됩니다. 이 값은 아주 큰 값이 되겠죠. 그러면 이 것은, 1 나누기 1 더하기 아주 큰값이라고 생각해보십시요. 0에 가까운 값이 되겠죠. 그러면 Z의 값이 매우 큰 음수의 값이 되면서, Z의 시그모이드는 0과 가까운 값이 됩니다. 그러므로 로지스틱 회귀분석을 도입하는 경우에는, 여러분의 임무는 parameter W와 B를 배워서 ŷ 이 Y=1이 되는 확률을 잘 추정한 수치가 나올 수 있도록 하는 것입니다. 넘어가기에 앞서, 표기에 관한 내용을 이야기하겠습니다. 신경망을 프로그래밍할때, W와 B 매개변수를 따로 다룰텐데요, 여기서 B는 인터-스펙트럼의 끝을 나타냅니다. 다른 코스에서 이 표기방법을 다르게 하는 경우를 보셨을 수도 있는데요, 간혹, x0이라는 특성을 정의해서 이 값을 1로 만들어주는데요, 이 경우 x는 R의 nx+1승에 속하는데요, 그 다음에 ŷ 은 theta transpose x 곱하기 시그마가 되도록 합니다. 다른 방법의 표기방식에서는, 벡터 parameters 인 쎄타가 있는데요 쎄타0, 쎄타1, 쎄타2, 쎄타 NX까지 말이죠, 쎄타0은 쎄타 B줄이구요 이것은 단순 줄을 나타내는 것입니다. 쎄타1에서 쎄타 nx까지는 W줄가지 속합니다. 여러분이 신경망 네트워크를 도입하는 경우, B와 W 매개변수를 따로 취급하는 것이 훨씬 더 쉽습니다. 이번 수업에서는 여기 빨간색으로 적은 표기법은 쓰지 않도록 하겠습니다. 이전에 다른 코스에서 이런 표기법을 본 적이 없으시면, 신경 쓰실 필요 없습니다. 이미 이 표기방식을 접한 분들을 위해서 단순히 직접적으로 언급해서 이러한 표기법을 해당 코스에서느 쓰지 않는 것을

알려드리고 싶었습니다. 본 적이 없으시면 중요하지 않기 때문에 걱정하지 않으셔도 됩니다. 이제 여러분은 로지스틱 회귀분석 모델이 어떻게 생겼는지 보셨는데요, 다음은, W와 B 매개변수를 바꾸기 위해서는 비용함수를 정의해야 합니다. 다음 비디오에서 해보도록 하죠.





*loss function에서 손실은 작으면 작을수록 좋으므로 -logy에서 logy는 크면 클수록 좋다.





이번 비디오에서는, 로지스틱 회귀분석법을 보았는데요, 회귀분석 모델에서 W와 B 파라미터를 트레이닝 시키기 위해서는 먼저 비용함수를 정의해야 합니다. 로지스틱 회귀 분석에 사용할 수 있는 비용 함수에 대해 살펴보도록 하죠. 복습하자면, 이전 슬라이드에서 찾았던 내용인데요. 결과값 ŷ은 w의 시그모이드 transpose x 더하기 b 이고, Z의 시그모이드는 이렇게 정의됩니다. 모델에 대한 파라미터를 학습하기 위해 m개의 트레이닝 example로 이루어진 트레이닝 세트가 주어지고, 트레이닝세트에서 매개 변수 W와 B를 찾는 것이 자연스러운 것 같습니다. 여러분의 트레이닝세트에 대한 예상치는 ŷ (i) 이라고 표기하는데요 트레이닝세트에서 나온 ground truth label y_i값과 비슷할 것입니다. 위에 있는 공식에대해 조금더 상세히 알려드리자면, 앞서 ŷ은 위처럼 정의된다고 했었죠, x 트레이닝샘플에 대해서 말이죠. 그리고 각각의 크레이닝 샘플에 대해서요. 밑에 이 아래첨자에 괄호를 사용해서 인덱싱하고 example들을 차별화하시켰습니다. 트레이닝 샘플 (i)의 예상치는 ŷ(i)이며, 기 값은 시그모이드 함수를 W transpose X값에 적용하여, (i) 트레이닝 example 입력값 더하기 V를 통해 Z(i)도 정의할 수 있습니다. Z(i)는 W transpose x (i) 플러스 b입니다. 이번 코스를 통해 우린 규칙화된 표기법을 쓸 것인데요, 위 첨자의 괄호 i는 데이터를 뜻합니다. X 또는 Y 또는 Z 또는 i번째 트레이닝 example과 연관된 i번째 example인거죠. 이것이 위 첨자 i가 의미하는 것입니다. 자 그럼 이제 알고리즘이 얼마나 잘 작동하고 있는지를 알아내기 위해 사용할 수 있는 loss 함수 또는 오류함수를 보도록 하겠습니다. 한가지 방법은 loss를 알고리즘의 결과값이 ŷ이고 true label인 Y가 제곱 오류 또는 0.5제곱 오류가 되게하는 것입니다. 


(이렇게 할 수 있는데요, 로지스틱 회귀분석법에서는 사람들이 이렇게 잘 하지 않습니다. 파라미터를 배우면서 알게되면, 최적한 문제에서 나중에 배우겠지만 비볼록하게 됩니다. 결과적으로 복수 국부 최적의 optimization 문제를 갖게 됩니다. 그렇게해서 gradient descent가 전역 최적값을 못 찾을 수 있습니다. 방금 이야기한 것들이 잘 이해가 안 가셨다고 하면 너무 걱정하지 마십시요. 추후 강의에서 더 자세히 다루도록 하겠습니다. 지금 이해햐셔야할 직관적인 부분은 L이라는 loss 함수는 true label y를 갖는 경우, 얼마나 정확히 ŷ 결과값을 산출하는지 정의할 때 사용합니다. 제곱 오류 값이 오히려 더 합리적인 방법이라고 생각할 수 있지만 gradient descent가 잘 안나온다는 단점이 있습니다. 그러므로 로지스틱 회귀분석법에서는, 여러가지 제곱 오류와 비슷한 역할을하는 loss함수를 정의해서 볼록한 최적화 문제를 주도록 할 것입니다. 그렇게되면 나중에 비디오 강의를 통해 보시겠지만, 최적화를 하기가 훨씬 더 쉬워집니다. )


로지스틱 회귀분석법에서 사용하는 것은 여기 위에 있는 loss함수입니다. 여기서는 마이너스 y 로그 ŷ 더하기 1, 이 선은 y log 이 선은 ŷ 입니다. 직관적으로 이 loss 함수가 왜 말이 되는지 설명해드리겠습니다. 아셔야 할 것은, 제곱오류를 사용하는 경우, 이 값이 최대한 작아야 좋습니다. regression loss함수를 이용하면, 이 것 또한 작은 값일 수록 좋죠. 

 이 것이 왜 말이 되는지, 2가지의 케이스를 통해서 보도록 하겠습니다. 

 첫번째 경우에는 Y가 1, 그리소 loss 함수 ŷ 컴마 y는 이 마이너스 부호를 쓸 수 있도록 해주죠. 그러므로 마이너스 로그 ŷ 만약 y가 1인 경우 말이죠. 그 이유는 y가 1이면, 두번째 항인 1-Y 는 0이 됩니다. 그럼 y가 1이면, 마이너스 로그 ŷ은 큰 값이되게 하는게 좋습니다. (log ŷ가 커질수록 -log ŷ는 극소화되고 이는 곧 loss의 극소화를 의미하기 때문)그 뜻은 즉 log ŷ을 큰 값으로 만드는게 좋은것 인데요 최대한 크게 만드는 것이 좋기 때문에 ŷ이 큰 값을 갖게 하는 것이 좋겠죠. 그렇지만 ŷ은 아시다시피, 시그모이드 함수이기 때문에 1보다 큰 값을 가질 수 없습니다. 즉, y가 1인 경우 ŷ 값이 최대한 큰 값을 갖도록 하는 것이 좋다는 것을 알게 됩니다. 그렇지만 이 값은 절대로 1보다 큰 값이 될 수 없기 때문에, ŷ을 1과 최대한 가깝게 하는 것이 목표라고 해석할 수도 있습니다. 

 2번째 경우는 y가 0인 경우인데요, 만약 y가 0인 경우, loss 함수의 첫번째 항이 0이 됩니다. y 가 0, 그러면 2번째 항이 loss함수를 정의하게 되죠. 이렇게 되면 loss는 마이너스 로그 1 마이너스 ŷ이 됩니다. 여러분의 러닝 단계에서 loss 함수를 작게 만들려고 한다면, 로그 1 마이너스 ŷ이 최대한 값을 갖길 원한다는 뜻입니다. 그리고 여기가 마이너스 부호이기 때문에 이 작은 이유 하나로 해당 loss 함수가 ŷ의 값을 최대한 작은 값으로 하려고 하는 것을 알 수 있습니다. 또, ŷ이 0에서 1사이 값을 가져야 하기 때문에 만약 y가 0이라면 loss 함수는 파라미터가 일을해서 ŷ이 최대한 0에 가까운 값이되도록 할 것입니다.   ㅍ  

 

 Rafidah's effect가 작용하는 여러가지 함수가 있는데요, 만약 y가 1인 경우, ŷ을 최대한 크게하고, Y가 0인 경우 ŷ을 작게하는 것입니다. 여기 초록색으로 된 부분을 아주 편안하게 비용함수에 대해 정의했는데요, 이 부분은 선택적인 비디오 강의 시청을 통해 조금 더 공식적인 배경을 설명하겠습니다. 왜 로지스틱 회귀분석법에서 이런 형식의 loss 함수를 사용하는지 말이죠. 


 마지막으로, loss 함수는 single training example을 바탕으로 정의되었었는데요, single training example에서 얼마나 잘 작동하는지 여부를 측정합니다. 비용함수를 정의해볼텐데요, 이것은 전체적인 트레이닝세트에서 얼마나 잘 작동하는지 여부를 측정해 줄 것입니다. 비용함수 J는 W 파라미터에 적용될텐데요, B 파라미터는 각각의 트레이닝 샘플에 

적용된 m개의 loss 함수의 합과 함께 평균치가 될 것입니다. 그리고 여기 ŷ은 당연히, 로지스텍 회귀분석법 알고리즘에 의거한 결과값의 예상치입니다, W와 B 파라미터세트를 사용해서 나온 값 말이죠. 부가 설명을 드리자면, 이 것은 1 나누기 m이 비용함수가 1에서 m까지의 합인 경우입니다. 그러므로 이값은 y (i) Log ŷ (i) 더하기 1 선을 적용하면 y (i) log one 선을 적용하여 ŷ (i)가 됩니다.. 여기에 대괄호를 기입할 수도 있겠죠. 여기 마이너스 부호는 밖에 위치시킵니다. 여기서는 이런 표현를 쓸텐데요. loss 함수가 single training example에 적용되었다고 말이죠. 비용함수는 파라미터의 비용을 나타낸 것이구요, 그러므로 로지스틱 회귀분석법 모델을 트레이닝 시키는데 있어, W와 B라는 파라미터를 찾고 밑에 있는 전체적인 기계의 비용 J를 줄일 것입니다. 이제까지 로지스틱 회귀분석법 알고리즘의 세팅, 트레이닝 example의 비용함수, 그리고 알고리즘의 전체 비용함수의 파라미터 알고보니 로지스틱 회귀분석법은 아주 아주 작은 신경망 네트워크로 볼 수 있겠습니다. 다음 비디오에서는 이 내용에 대해 다룰텐데요 신경망의 직관적인 부분은 미리 생각해 놓으실 수 있습니다. 자 그럼 다름 비디오로 넘어가서 어떻게 로지스틱 회귀분석법을 아주 작은 신경망으로 볼 수 있는지 알아보겠습니다.



1-1.what is neural network







딥러닝 이라는 용어는 신경망의 트레이닝을 일컫는 말인데요, 가끔은 매우 큰 신경망을 의미하기도 합니다. 그럼 신경망이라고 하는 것은 정확히 무엇을 뜻하는 걸까요? 이번 비디오를 통해 몇가지 기본적이면서 직관적인 부분을 설명해드리도록 하겠습니다. 집값을 예측하는 툴을 예시로 살펴보도록 하겠습니다. 6개의 가구로 이루어져있는 데이터 세트가 있다고 해봅시다. 제곱 피트나 제곱티어 단위로 말이죠.

또한, 집값 또한 알고 있고 집 크기의 함수에 대입하여 미래 집값을 예측합니다. 그래서 만약 여러분이 linear regression에 익숙하시면, 여기 데이터에 일직선을 그으면

이런 선이 나올텐데요. 조금 더 멋있게 설명하자면 가격이 마이너스가 될 수는 없기 때문에 일직선이라고 표현하기보다는, 여기에 이렇게 커브로 바꾸어보도록 하겠습니다. 그러면 이 부분은 0이 되겠죠. 그렇게 해서 두꺼운 파란색 선은

미래의 집값을 예측하는, 집 크기를 변수로 하는 함수가 됩니다. 여기는 값이 0인 부분이고

그 다음 우측 부분은 일직선의 일차함수 선이 됩니다. 이렇게해서 방금 맞춰 놓은 집값 함수는 아주 간단한 신경망이란 비슷한 개념으로 생각하시면 됩니다. 가장 간단할 수 있는 신경망이라고 볼 수 있죠. 여기 한번 그려봅시다. 집의 크기를 나타내는 x값을 신경망의 입력값으로 지정하고 이 노드로 들어가는데요,

이렇게 생긴 원형 모양입니다. 이렇게 입력되어 y라는 결과 값이 나옵니다. 이 동그란 원은, 신경망에 있는

1개의 신경세포인데요, 왼쪽에 그린 이 함수를 도입시킵니다. 신경세포가 하는 것은 바로

크기를 입력값으로 갖고, 이 일차함수를 만드는 것이죠. 최대값 0을 갖고, 예상 가격을 결과값으로 추출하는 것입니다. 신경망 분야에서 이 함수를 많이 볼 수 있습니다. 특정 부분까지 0의 값을 갖고, 어느 시점 이후, 일차함수로 값이 증가하는 함수 말이죠. 이 함수는 ReLu(렐류) 함수라고 하는데요, rectified linear units의 약자입니다. R-E-L-U 이죠. 그리고, rectifiy라고 하는 것은 0을 최대값으로 한다는 뜻입니다.

그래서 이런 모양의 함수가 나오게 되는 것이죠. 일단은 ReLU 유닛과 관련해서는 크게 신경쓰실 필요는 없습니다.

나중에 다른 코스에서 다루도록 하겠습니다. 자 그럼, 이게 1개의 신경세포라고하면, 

이렇게 신경망이구요, 아주 작은 신경망이죠. 더 큰 신경망은 신경세포들이 쌓아 뭉쳐져서 만들어집니. 이 신경세포를 하나의 레고블럭이라고 생각하시면 더 큰 신경망은 레고블럭을 같이 쌓으면서

만들어진다고 볼 수 있습니다. 예시를 한번 볼까요? 단순히 집의 크기로 미래의 집값을 예측하기보다는 다른 특성이 있다고 가정해보죠, 호스트에 대해 더 많은 정보를 안다고 해봅시다,

예를 들어, 방의 갯수, 여기에 s를 안 적었군요,

그리고 여러분은 가족의 크기 또한 집값에 영향을 줄 수 있다고 생각할 수 있겠죠? 이 집이 3명으로 구성된 가족에게 적합할지, 4명 가족이 살 수 있을지, 또는 5명 가족 등등 말입니다. 실질적으로 제곱피트 또는 제곱미터의

집 크기와, 방의 개수가 특정 인원의 가족이 살 수 있는지 여부를 결정짓게 됩니다. 추가로, zip code도 알 수 있죠. 다른 나라에서는 zip code를 postal code라고도 합니다. zip code (우편번호)는 미래에 도보가능 여부를

알려주는 요소일 수 있습니다. 이 지역은 걷기에 알맞은가? 장을 보러 걸어갈 수 있는가? 학교는 걸어갈 수 있는가? 운전을 해야하는가? 어떤 사람들은 걸어서 다닐 수 있는 지역을 선호할 수 있습니다. 그럼 zip code와 재산같은 경우에, 미국에선 확실히 그렇고,

다른 나라도 적용될 수 있지만 학교의 질이 얼마나 좋은지 알 수 있습니다. 제가 그리고 있는 조금한 동그라미가

ReLU가 될 수 있습니다. rectified linear units 또는 다른 비선형 함수죠. 그렇게 되면 방의 크기와 개수에 따라서, 가족의 인원수와, 도보 가능한 정도를 알려주는

우편번호와, 우편번호와 재산에 따라 학교의 질을 예측할 수 있는

부분이 있습니다. 마지막으로 사람들이 집값에 값어치를 부여하는 경우, 본인이 가장 중시하는

부분이 있을 수 있습니다. 이 사례 같은 경우엔,

가족 구성 인원 수, 도보가능한 정도,

학교의 질, 들 여러가지 집값의 영향을 줄 수 있는 요소들이 있습니다. 이번 사례에선,

모든 4가지 입력값이 모두 x입니다. 그리고 y는 예측하려고 하는 집값입니다. 그러므로, 신경세포 또는 예측해주는 요소들을 쌓으면서, 앞 슬라이드에서도 보았듯이,

조금 더 큰 신경망을 갖추었습니다. 신경망을 어떻게 관리하냐면,

이를 도입하는 경우에, x의 입력값과, y라는 결과값을 트레이닝세트에 도입시키면 됩니다. 가운데 부분은 알아서 해결됩니다. 그러므로 실질적으로 도입하는 부분은 이것입니다. 여기서는, 4개의 입력값을 가지고 있는 신경망이 있습니다. 입력값의 특성은 크기, 방 개수, zip code 또는 우편번호, 이웃집의 재산 등이

될 수 있습니다. 이런 입력 값의 특성을 바탕으로 y의 값을 예측하는 것이

신경망의 역할입니다. 이 동그라미들은

숨겨진 유닛이라고도 하는데요 이 유닛들은 각각 4가지 특성을 반영합니다. 예를 들어, 첫 번째 노드가 가족 규모를 뜻하고 이 규모는 X1과 X2에 의존한다고 이야기하기보다는, 그 대신에, 신경망이 어떤 것이던 선택할 수 있도록 합니다. 그렇게 하고나서 4가지의 특성을 제공하여

자유로운 옵션을 제공합니다. 층이라고도 하는데,

이 입력 층을 신경망 가운데에 있는 층은 밀집하게 연결되어 있습니다. 그 이유는 모든 입력 값이 모든 동그라미에 연결되어 있기 때문입니다. 신경망의 가장 놀라운 부분은 어느 정도 x와 y에 대한 정보가 있으면, x와y에 대한

충분한 트레이닝 example도 있는 경우, x에서 y를 그리는 함수를 굉장히 잘 파악합니다. 기본적인 신경망에 대한 내용을 다루어 보았는데요, 여러분이 직접 고유의 신경망을 만들어보면, 지도학습 부문에서 매우 유용하고, 강력하다는 것을 느낄 것입니다.

즉, 조금 전에 봤던 집값을 예측하는 사례처럼 x를 이용하여 y를 산출하려고 하는 경우와 같이 말입니다. 다음 비디오에서는 지도학습의 몇가지 예를 더 살펴 보겠습니다. 본인 어플에 큰 도움이 될 수 있는 네트워크 example을 다뤄보도록 하겠습니다.







1-2.supervized learning with neural networks











신경망이 요즘 선풍적인 끌고 있습니다. 잘 작동되고 있기 때문에 아마 이런 인기는 어느 정도 예상할

수 있겠죠. 그런데, 현재까지

지켜보니 신경망과 관련하여 거의 대부분의 경제적인 가치는 지도학습이라는 한 종류의 딥러닝을 통해 만들어 진 것이었습니다. 이게 무슨 뜻인지 보도록 하고,

사례도 같이 보도록 하겠습니다. 지도학습에서는 x 입력

값이 있으면, 해당 값과 연계되는 결과값 y를

배워야 합니다. 예를 들어, 방금

전 우리는 집값을 예측하는 어플을 봤는데요, 집의 특성을 입력 값으로 하여 집값을 예측하는 방법이 있습니다. 신경망이 효과적으로 적용된 다른 사례가 또 있습니다. 신경망이 효과적으로 적용된 다른 사례가 또 있습니다.  최근 가장 수익성이 좋다고도 할 수 있는 어플은 온라인 광고입니다. 의욕을

불러 일으키는 분야라고는 할 수 없겠지만 수익성이 좋은 것은 사실입니다. 웹사이트가 사람에게 표출하려고 하는 특정 정보를 입력 값으로

지정하고, 유저에 대한 정보도 함께 입력 방식으로 사람들이 광고를 클릭하는지 여부를 예측하는데 굉장히 똑똑해졌습니다. 사람들과 유저들에게 가장 볼법하거나 클릭할만한 광고를 보여주면서, 여러 기업들에게는 수익성이 매우 좋은 신경망 어플이 되었습니다. 이유인 즉 슨, 사람들이

가장 클릭할 확률이 높은 광고를 보여주는 것이 결정적으로 온라인 광고 회사에게는 매우 큰 영향을 끼치기 때문입니다. Computer Vision은 최근 몇 년간 놀라운 발전을 이루어 냈습니다. 상당부분 딥러닝에 의해서 말이죠. 이미지를 입력하고 인덱스를 결과값으로 원할 경우,  1에서 1000까지로 지정해서, 1000가지의 다른 이미지 중 하나를 선택할 수 있습니다. 이러한 여러 가지 이미지를 태깅하는데 사용할 수도 있습니다. 제가 생각하기엔 음성인식도 흥미로운 발전을 이루어내고 있습니다. 이제는 오디오 영상을 신경망 입력 값으로 하여, 텍스트를 결과값으로 나오게 할 수 있습니다. 머신 번역 분야 또한 딥러닝을 통해 크게 발전해오고 있습니다. 이제는 신경망 입력 값을 영어 문장으로 지정하여, 중국 문장이 나오도록 지정할 수 있습니다. 자율주행에서는, 이미지를

입력하면, 예를 들어 차 전방에 있는 사진이나 레이더에 확인되는 정보를 기반으로 신경망의 트레이닝을 통하여 도로에 있는 다른 차들의 위치를 파악할 수도 있을 것입니다. 이것이 바로 자율주행의 시스템의 핵심 요소가 되는 것입니다. 신경망이 똑똑하게 x,y값을

선정하는 것으로 상당한 가치가 만들어 졌습니다. 신경망이 똑똑하게 x,y값을

선정하는 것으로 상당한 가치가 만들어 졌습니다. 특정 문제에 이런 러닝 지도학습 부문을 도입시켜, 일반적으로 더 자율주행 자동차와 같은 더 큰 시스템에 적용시킨

뒤 말이죠. 살짝 다른 유형의 신경망들도 다른 어플에 유용하게 쓰이더군요. 예를 들어, 이전

영상에서 봤던 부동산 어플처럼 전 세계 공통적인 구조를 쓰죠? 아마도 부동산이나 온라인 광고 산업 같은 경우, 앞서 본 것처럼, 스탠다드한

신경망이 여서 그럴 것입니다. 이미지 어플에서는

Convolution on Neural Networks를 사용할 것입니다. CNN이라고 자주 줄여서 이야기하죠. 시퀀스 데이터는, 예를 들어, 오디오는

시간적인 요소가 있죠? 오디오는 시간에 따라 재생되기 때문에 일차원적인 타임시리즈 또는 시간적인 시퀀스에 의해 가장 자연스럽게

표현됩니다. 그러므로 시퀀스 데이터로는

RNN을 가장 많이 사용합니다. Recurrent Neural Network의 약자입니다. 언어, 영어와 중국어, 알파벳 또는 단어들은 하나씩 나열되는 특성이 있죠. 언어는 그렇기 때문에 시퀀스 데이터를 통해 가장 자연스럽게 표현됩니다. 조금 더 복잡한 버전의 RNN이

이러한 어플들에 사용됩니다. 그리고 자율주행과 같은 더욱 복잡한 어플들에는 이미지가 있기 때문에 조금 더

CNN과 같은 구조를 가지며, 레이더 정보도 있기 때문에 다르다고 할 수 있습니다. 결과적으로 커스텀 버전이나 또는 복잡한 복합의 hyrid

neural network 구조를 사용하게 될 수 있습니다. 조금 더 명확하게 스탠다드

CNN과 RNN 구조에 대해 설명 드리자면, 문학에서는 아마 이런 류의 사진들을 많이 접하셨을 것입니다. 이게 바로 스탠다드 신경망이라고 할 수 있죠. 이런 사진들도 많이 보셨을 것입니다. 이 사진은

Convolutional Neural Network의 예 입니다. 앞으로 후속 코스에서 이 사진이 무엇을 뜻하는지  그리고 어떻게 시행하는지 볼 것입니다. convolutional networks는 이미지 데이터에 자주 쓰입니다. 이러한 사진들도 아마 많이 보셨을 것입니다. 이것 또한 어떻게 시행하는지 추후 코스에서 배울 것입니다. Recurrent Neural Networks는 이렇게 시간적인 요소를 담고 있는 일차원적인 데이터를 다루는데

좋습니다. 머신러닝에 대한 어플들을 들어보셨을 텐데요 structured data와 unstructured

data가 적용된 어플 말이죠. 이게 바로 그 뜻입니다. structured data는 한마디로 데이터의 데이터베이스들입니다. 예를 들어, 집 값을

예측하는데 데이터베이스 또는 크기나 방의 개수를 알려주는 여러 칼럼이 있죠. 이런 것들이 바로

structured data입니다. 또는 유저가 광고를 클릭할지 여부에 대한 예측을 하는 데에 있어 연령과 같은 유저정보, 광고에 대한 정보, 예측하려고

하는 이유 등 이런 것들이

structured data이고 각각의 특성들이, 집의 크기나, 방의

개수, 유저 연령 등의 데이터는 명확한 뜻을 정의합니다. 반대로 unstructured

data는 오디오, raw 오디오, 이미지와 같이 이미지 또는 텍스트 내부에 있는 내용을  인식하고자 하는 데이터를 이야기합니다. 고유 특성은 이미지의 픽셀 값이나  텍스트에서 개인의 단어가 될 수 있습니다. 역사적으로, 컴퓨터가 unstructured data를 인식하는데 있어

structured data보다 더 많은 어려움이 있었습니다. 인간의 오디오를 인식하는 과정은 이미지를 인식했던 것과 같이 빠르게 진화해왔습니다. 텍스트는 조금 더 이후의 발명이었는데요, 기본적으로 인간은

unstructured data를 매우 잘 인식합니다. 그러므로 신경망의 부상이 흥미로운 것 중에 한가지는, 딥러닝과 신경망의 영향에 따라,

컴퓨터가 unstructured data를 인식하는 실력이 몇 년 전과 비교했을 때, 상당히 발달했다는 점입니다. 이러한 트렌드는 새롭고 흥미로운 어플에 기회를 제공하죠. 음성인식, 이미지

인식, 텍스트를 자연언어 처리하는 기술과 같이 2-3년 전과는 달리 많은 것들이 가능해졌습니다. 제 생각에는 인간은 자연적으로

unstructured data를 이해하려는 공감대가 있기 때문에, 신경망과 unstructured data의  성공 스토리를 미디어 매체에서 많이 접하게 될 것 같습니다. 신경망이 고양이를  인식하는 것은 그 자체로 그냥 멋지죠. 그것이 의미하는 게 어떤지 모두가 쉽게 알 수 있기 때문에 좋아할

것입니다. 그러나, 경제적 가치를

이끌어 온 상당 부분의 신경망 분야는 structured data에 관한 부분이었습니다. 더 나은 광고 시스템, 수익

추천, 그리고 많은 기업들이 정확한 예측을 할 수 있도록 돕는 막대한 양의

데이터베이스들을 프로세싱하는 능력과 같은 부분 말이죠.  많은 기업들이 정확한 예측을 할 수 있도록 돕는 막대한 양의

데이터베이스들을 프로세싱하는 능력과 같은 부분 말이죠. 그러므로 이번 코스에서 다루는 기술들은 structured data와 unstructured

data 2가지 데이터에 모두 적용되겠습니다. 알고리즘을 설명하기 위한 목적으로, unstructured data를 이용한 사례를 조금 더 많이 다루도록 하겠습니다. 각 팀 별로 신경망의 적용사례를 생각해보면서 structured와 unstructured

data의 적용사례를  모두 찾으시기 바랍니다. 신경망은 지도학습에 큰 변화를 가져다 주었는데요 동시에 막대한 경제적 가치도 생겨났습니다. 그러나 신경망의 기본적인 기술적 발상은 사실 수십 년 전부터 존재했습니다. 그런데 도대체 왜 바로 상용화되지 않거나 완벽히 작동되지 않는 것일까요? 다음 비디오에서는 왜 최근에서야 신경망이 우리가 사용할 수 있는 강력한 툴이 되었는지  다루어 보도록 하겠습니다.








+ Recent posts