본문 바로가기
Programming/Deep learning

learning rate, data preprocessing, overfitting

by OKOK 2018. 1. 17.


 실제 사용하는데 필요한 팁들이 있습니다. 러닝 레이트를 조정하는 방법과 선처리 하는 방법, 가장 큰 문제인 오버핏팅을 방지하는 방법에 대해서 이야기 하겠습니다. 코스트 펑션을 정의하고 최소화하는 방법, 그레디언트 디센트 알고리즘이 있습니다 알파값을 이렇게 나타내었습니다. 오케이요. 코스트를 정의하고 이것을 미니마이즈 하고 러닝 레이트를 임의의 값으로 실제로 변형되서 실습을 하였습니다. 러닝 레이트를 잘 정하는 것이 중요한데, 이것을 굉장히 큰 값을 정한다고 생각해봅시다. 이 경사면을 따라서, 한발짝의 스텝이죠. 이 스텝이 크다고 하면, 어떤 일이 발생할 까요. 이동할 때, 이만큼 내려갑니다. 스텝이 크기 때문에 오케잉. 오버 슈팅이 있습니다. 팅겨나갈 수 있습니다. 학습이 코스트 함수를 출력해보면, 숫자가 아닌 값들이 출력 될 수 있습니다. 오버 슈팅이라고 부릅니다. 그래서 값이 러닝 레이트를 정했는데, 코스트가 줄어들지 않을 때, 발산하더라 러닝 레이트를 의심하면 됩니다. 굉장히 작은 러닝 레이트, 조금 줄어들다가 어느 시점에서 스텝을 해보면 최저점이 아닌데도 경향이 있습니다. 이것을 피하기 위해서는 코스트 함수를 화면에 출력한다음에, 굉장히 작은 값으로 변한다면 올려서 합니다. 전반적으로 특별한 답은 없고요, 환경과 데이터에 따라 다릅니다. 처음에 0.01 으로 시작하고 발산하고 스피드에 따라서 변동하도록 합니다. 오케이요. 2번째는 데이터를 선처리해야하는 이유에 대해서 설명합니다.


그레디언트 디센트 알고리즘을 설명합니다. 더블유 웨이트 코스트 함수였습니다. 웨잇이 여러개있다고 해서 2차원상에 표시해보도록 하겠습니다. 경고선처럼 표시하였습니다. 바닥이라고 생각하면 됩니다. 우리가 원하는 것은 어떤 점에서 시작을 하면 우리가 조금 스텝씩 경사면을 따라 내려가, 최고로 낮은 지점에 도착하도록 합니다. 이 이전과 같은 것을 해보면 어떤것인가요. 최소화 시키기 위해서 노력을 하기 때문에 작은값 큰 값이 있습니다. 그러면 어떤 알파값을 잡았을 때, 예를 들어서 알파값이 굉장히 좋은 값이지만 밖으로 가면 튀어나가게 됩니다. 이것ㅇ느 뭔가요. 주의해야합니다. 데이터 값을 큰 차이가 있을 때, 노말라이즈 할 필요가 있습니다. zero-centered data와 normilized data 가 있습니다. 어떤 이 값이 전체 범위가 어떤 형태의 범위안에 항상 들어가도록, 노말라이즈 하는 것입니다. 러닝 레이트도 이상하게 학습이 일어나지 않고 코스트 함수가 발산한다거나, 또 어떤 데이터 중에 프리세싱, 매우 간단합니다. 엑스의 값이 있으면 평균과 분산의 값을 가지고 이렇게 하면 됩니다. 파이썬을 가지고 한다면 이렇게 노말라이제이션을 할 수 있습니다. 표준화할 수 있습니다. 여러가지 형태의 노말라이즈가 있습니다. 한가지 선택해서 처리하면 됩니다. 오케이요. 


가장 큰 문제인 오버피팅 학습 데이터에 딱 잘 맞는 모델을 만들어 낼 수 있는 것입니다. 학습데이터를 가지고 물어보면 잘 대답하지만 테스타나 실제 사용에는 잘 안맞는 경우가 생깁니다. 모델을 꽈서 만들 수 있습니다. 모델 2가라고 합시다. 첫 번쨰 모델이 있고, 어떤 것이 조금더 일반적이고 좋은 모델 일까요. 이것이 조금 더 모델입니다. 이 모델2은 너무나 가지고 있는 데이터에만 맞춰져 있는 모델입니다. 실제로 사용할 때는 정확도가 떨어질 수 있습니다. 오버 피팅이다 이렇게 이야기를 합니다. 어떻게 줄일 수 있을까요. 가장 중요한 방법은 트레이닝 데이터가 많을수록 오버피팅을 줄일 수 있고, 피쳐의 개수를 줄일 수 있습니다. 그리고 정규화가 있습니다. 오버피팅이라고 설명을 할때, 특정한 데이터에 맞게 데이터를 구부리지 말고 좀 펴자 이것입니다. 값이 조금 더 웨이트가 적은 값을 가진다는 의미이고, 어떤 특정한 것을 가질때 구부려지게 됩니다. 이것을 하기 위해서 코스트 함수의 뒤에 이텀을 추가시켜줍니다. 이 텁을 추가 시켜줍니다. 일반화하는 것이 더블유의 값의 제곱을 한 값을 작아질 수 있도록 이렇게 하는 것입니다. 각각 엘리멘트를 제곱하고 합하고, 이것을 최소화 시키느고 하나의 상수를 둘 수 있습니다. 이것을 일반화 스트렝스라고 합니다 이값이 0이면 사용하지 않겠다 이것입니다. 오케이 이것이 큰 값이면 오케이요. 1이면 중요하다. 조금 하긴 하는데 중요하지 않아 이것입니다. 오케이 정할 수 있는 값을 배웠습니다. 텐셔플로우 일때는 엘2레귤러라는 변수를 하나 만든 다음에 이것이 바로 스퀘어이죠. 이것을 스퀘어를 함한다음에 특정한 상수를 더하면 됩니다. 코스트와 더한다음에 이것을 최소화 시켜라 하면 됩니다. 오 케이 간단하게 서머리 합니다 . 오버피팅이 중요합니다. 방지하는 방법에 대해 설명합니다. 


오케이요 성능 평가 어떤 것이 좋은가요. 어떤 머신러닝 모델을 만들었습니다. 데이터를 가지고 만들었습니다. 학습을 시켰습니다. 이렇게 학습시켰는데, 이 모델이 얼마나 훌륭한거 얼마나 성공적으로 예측할 수 있을까? 어떻게 평가할까요? 이 데이터를 가지고, 트레이닝 셋이라고 불렀습니다. 모델을 학습시키는데, 다시 트레이닝 셋을 가지고 물어보게 되면, 답을 하거나, 오케이요, 예측을 할 수 있습니다. 이것이 공정할 것인가요. 이렇게 물어본다면 머신러닝 알고리즘들은 100 완벽하게. 외우면 되기 때문에, 좋지 않은 방법입니다.  앞부분에 있는 것을 트레이닝 뒤에를 테스트 셋이라고 부릅니다. 오케이. 뒤에 숨겨있다고 가정합니다. 절대로 사용하면 안됩니다. 트레이닝 셋을 가지고 열심히 모델을 만드는 것입니다. 학습을 시키는 것입니다. 이것을 완벽하게 끝났다 라고 했을 때, 단한 번의 것을 실제 답이 무엇인지 알고 있습니다. 와이햇이 있습니다. 실제 값이 있습니다. 실제 값을 비교하게 되면 어느정도 되는지 알 수 있습니다. 실전 문제가 존재합니다. 이런식으로 얼마나 공부했는지 평가했는지, 머신러닝도 똑같은 방법으로 트레이닝 셋과 테스트 셋으로 나누어서 평가를 해야 합니다. 알파라는 러닝레이트를 이야기 했었고, 또 하나의 상수가 란다라고 했는 일반화하는데 스트렝스 였습니다. 이 값들을 튜닝할 필요가 있을 때, 트레이닝 셋을 2개로 나눕니다. 완벽한 것 유효성 셋, 일반적으로 가지고 있는 트레이닝 셋으로 학습시키고, 벨리데이션 셋을 가지고 이런 값들이 어떤 값이 좋은지 튜닝하게 됩니다. 모의 시험을 해보는 것입니다. 완벽하게 되면, 테스팅 데이터 셋이 잘 돌아가는지 살펴보면 됩니다.


실전 모의고사를 보게 됩니다. 실전 시험을 보게 됩니다. 이것이 바로 모의고사의 형태를 지닌 데이터 셋입니다. 벨리데이터셋입니다. 그리고 데이터 셋이 많은 경우에 한번에 다 넣어서 학습을 시키기가 어렵기 때문에 온라인 러닝 학습 방법이 있습니다. 예를 들어 트레이닝 셋이 100만개가 있다고 가정 합니다. 이것을 한번에 넣어서 한번에 넣게 되면 그렇게 하지 않고 잘라서 10만개씩 학습을 시킵니다. 학습시킵니다. 2번째를 학습시키고, 자 이때, 우리 모델이 해야할 일은 첫번째 학습된 모델이 남아있어야 합니다. 2번째 추가, 추가, 추가, 추가, 추가, 온라인 러닝이라고 합니다. 100만개를 데이터를 가지고 10만개의 새로운 데이터가 들어왔습니다. 새로 학습되지 않고, 있는 데이터에 추가로 학습을 시킬 수 있기 때문에 온라인 이라고 할 수 있습니다. 실제 데이터 셋이라고 할 수 있습니다. 미니스트 데이터 셋입니다. 숫자를 컴퓨터가 알아먹는 숫자로 인식할 수 있는지를 테스트 할 수 있는 테스트 셋입니다. 미국 우체국에서 우편번호라는 것을 씁니다. 자동으로 편지르 최소한 우편번호로 분류하기 위해서 사용됩니다. 오케이요. 데이터 셋 트레이닝 셋 테스트 셋으로 나뉘어져 있습니다. 오케이요. 이것 바로 적용할 수 있으리라 생각됩니다. 트레이닝과 테스트 셋으로 나뉘어져 있습니다. 그 의미를 알 수 있습니다. 이렇게 된 다음에 테스트 셋을 가지고 있으면 얼마나 정확한지 측정하는 것은 오케이. 레이블, 모델이 예측한 값을 비교해서 10% 정확한 것이고 90% 정확하다고 볼 수 있습니다. 이미지 인식하는 것에 정확도는 95% 정도를 넘고 있습니다. 굉장히 잘 되고 있는 것입니다. 오케이요. 다음 랩에서 살펴보겠습니다. 다음 시간에는 기대했던 뉴럴 네트워크를 깊게 들어가보도록 하겠습니다. 


학습 웨이트에 대해서 이야기하도록 하겠습니다. 이제부터는 데이터 셋을 나눈다고 보겠습니다. 트레이닝 셋 그리고 테스트 셋이 있습니다. 오케이요. 모델의 입장에서 본적이 없는 모델을 가지고 평가하도록 하겠습니다. 오케이. 반드시 이렇게 나누어야 하는 것입니다. 하나의 ㅇPrk ehlrpTtmqslek. 이 학습이 끝난 다음에 모델을 평가할 때 사용하도록 하겠습니다. 오케이요. 필요한 엑스 와이 있으면 되고 웨이트와 바이어스를 선언하도록 하겠습니다. 코스트, 옵티마이즈 있습니다. 예측 맞는지 아닌지 평균내서 정확성을 내는 것입니다. 동작은 플레이스 홀더가 있습니다. 학습데이터를 훈련할 수 도 있고, 테스트 데이터를 넣을 수 있습니다. 세션 열고 이니셜라이즈, 옵티마이즈를 주목하면 되는데 엑스 데이터 와이데이터 트레이닝 이라고 했던 데이터를 사용하는 것입니다. 그런 다음에 끝납니다. 오케이요. 오나전히 학습을 한다음에 예측을 하거나 정확성을 측정할때 테스트 셋을 던져주게 됩니다. 


학습을 시킬 때 러닝 레이트를 준다고 했을 때, 실습을 제대로 보도록 하겠습니다. 러닝 레이트가 좋은 값이 선정되지 않으면 2가지 문제가 있을 수 있습니다. 값이 너무 크다면 러닝 레이트가 너무 크다면 기울기 스텝 움직이는 것 더블유가 작게 가기를 원합니다. 너무 크다면 여기서 조금만 내려가는데, 이만큼 넘어가게 됩니다. 여기서 반대로 가야하는데 반대로 하다가 밖으로 가게 됩니다. 반대로 이거 이렇게 하면 위험한데, 조심스럽게 어떤 점에서 학습이 더디게 일어납니다. 학습이 안될 수도 있고, 중간에 조금한 로컬 미니멈에 갇힐 수 있습니다. 로컬 미니마에 빠질 수 있습니다. 2가지 문제가 있는데요, 2가지 이전과 똑같은 소스 코드인데 러닝 레이트만바꾸어주었습니다.


 데이터가 이루어졌습니다. 엔에이엔이 발생합니다. 미니마이즈가 있는데, 내려오게 되는데, 똑같은 형태의 리니어 레그레션이 있습니다. 오케이요. min max 가 있습니다. 어떤 방향으로 가더라도 밖으로 튕겨나가지 않게 됩니다. 오케이 왠만하면 수렴하게 됩니다. 똑같은 소시코드입니다. 작은 러닝 레이트를 사용해서 돌려보도록 합니다. 아주 잘 학습이 된다고 할 수 있습니다. 반드시 노멀라이즈를 하는 것이 좋습니다. 오케이요.


사용하는 데이터는 엠니스는 테이터셋입니다. 오케이요. 손글씨를 인식하기 위해서 사용됩니다.  데이터 셋을 조금만 더 자세히 보도록 하겠습니다. 28 28 의 데이터 셋입니다. 784개가 됩니다. 엑스의 쉐이프 그리고 와이데이터는 무엇인가요. 예측을 하게 됩니다. 소프트 맥스에서 원 핫 인코딩을 사용하였습니다. 이렇게 10개의 출력을 하게 됩니다. 이런 형태의 데이터를 보았을 때, 복잡하니, 아주 간단하게 라이브러리를 만들어둔 것이 있습니다. 이줄을 인풋을 한다음에 데이터를 읽어와라 하고 디렉토리를 줄여줍니다. 오케이요. 이렇게 해서 데이터를 읽었으면 트레인 하고 다음 배치 100개 100개의 엑스와 와이가 읽어지게 됩니다. 메모리를 너무 많이 차지 하기 때문에, 오케이 이런식입니다. 그런다음에 학습을 할 것입니다. 학습이 끝나게 되면 테스트 셋을 하게 됩니다. 학습에 한번도 사용되지 않은 것입니다. 엑스로 넘겨주게 됩니다. 와이로 넘겨주게 됩니다. 오케이 원하을 트루로 하고 원핫으로 읽어오게 됩니다. 읽어올때 원핫으로 처리가능합니다. 그런다음에 전체적으로 일거옹는 것을 보게 됩니다. 클래스가 10개가 됩니다. 그런 다음에 엑스 와이 쉐임에 중의하게 됩니다. 그런 다음에 몇개의 출력인가 클래스가 몇개인가 살펴보도록 합니다. 그런다음에 엑스 와이가 정해졌으면 소프트 클래스맥슬르 사용합니다. 더블유의 세이프를 신경씁니다. 오케이요. 나가는 것 몇개인가 사이즈를 대입하면 됩니다. 이렇게 정의를 했으면 소프트 맥스를 그대로 사용하면 됩니다. 그대로 사용하면 엑스와 더블유이고 비가 있습니다. 오케이요. 그런다음에 코스트는 어떻게 계산하면 되는지 사용하는가 와이 그리고 원핫으로 정해준것 가설을 사용합니다. 오케이요. 여기에 있는 것을 축 1로 해서 합을 구하고 평균 냅니다. 그런다음에 코스트로 사용할 수 있습니다. 미니마이즈 하면 됩니다. 레이블 같은 값인지 비교합니다. 그대로 사용합니다. 그런다음에 트레이닝 에포치 배치가 무엇인가요. 조금씩 배치로 잘라서 학습을 시킵니다. 몇개 씩을 배치 사이즈로 주어지게 됩니다. 에포취를 사용하게 됩니다. 몇개인지를 모릅니다. 전체데이터 셋이 있습니다. 한번 학습시킨것을 1이라고 합니다. 에포크 전체 데이터 셋을 한번 학습하게 됩니다. 한번 돈 것을 의미합니다. 오케이 그런데 오케이 배치 사이즈라고 합니다. 100개씩 한다 이런 용어가 있다는 것을 알아두면 됩니다. 전체 데이터가 1000개가 있다 500이다. 원에복을 위해서는 2번 배치를 돌면 됩니다. 오케이요. 전체가 돕니다. 이렇게 할 수 있습니다. 이 텀을 그대로 사용할 것 입니다. 배치 사이즈가 몇개 일지 많을수록 좋겠습니다. 기본적으로 이니셜라이즈 하면 됩니다. 몇번 에폭을 할 것인가 15번? 와우 15번 에폭을 하는구나, 이터레이션을 몇번할 것인가. 전체 데이터의 개수를 배치사이즈로 나누면 됩니다. 100개면 100번입니다. 네네 계산을 한것이고요. 그 다음에 토탈배치만큼하였습니다. 엠니스트 100개씩을 학습시킵니다. 네네. 그런다음에 코스트를 계산하고 루프를 돌도록 합니다. 원에폭이 크고 다음에폭으로 가게됩니다. 오케이요 이부분을 보면 이 함수의 100개의 전체 중에 그 다음은 100~101 하고, 100개씩 잘라줍니다. 오케이요. 일반적인 놈이라고 할 수 있는 것입니다. 바로 이런 의미가 있다 기억하면 됩니다. 이렇게 한다음에 평가를 할 수 있을까요. 트레이닝 데이터를 학습 가능합니다. 오케이요. 세션 런을 할때 이런 것을 보여줍니다. 오케이요. 다른 방법은 텐서에다가 이벨이라는 함수를 호출하면 됩니다. 이렇게 하는 것도 편하게 하기 위햇 하나만 하기 위해서는 이렇게 하게 됩니다. 오케이요.전체 소스코드 앞의것 외에는 한페이지 안에 들어가게 됩니다. 한 페이지 밖에 되지 않습니다. 오케이 코스트는 쭉 떨어지게 됩니다. 정확도는 88의 정확도가 나오게 됩니다. 아주 간단한 모델입니다. 오케이요. 굉장히 잘 된다는 것을 볼 수 있습니다. 재미를 더하기 위해서 잘하는 것인지 한번 보기 위해서 매플로라이브러리를 해서 출력해보도록 합니다. 랜덤하게 하나를 읽어오고 하나 읽어와서 오켕 레벨이 얼마인지 살펴보도록 합니다. 1인가 2인가 3인가 6인가 보도록 합니다. 이렇게 하고 예측해보도록 합니다. 하이파이스를 하고 이미즐 던져주게 됩니다. 아그맥스를 하게 되면 예측값이 나오게 됩니다. 6이 나옵니다. 오케이 프린트를 하고 화면에 나오게 됩니다. 텐서 플로우를 하면 오케이.