인공지능의 큰 범주 안에 머신러닝이 속하고, 머신러닝의 일부분이 딥러닝인 것이지요. 만일 인공지능이 먹을 수 있는 모든 음식이라고 한다면, 머신러닝은 그 중에 영양가 많은 고기 음식이라 할 수 있고, 딥러닝은 그중에서도 최고급 스테이크 요리쯤 된다고 할 수 있습니다.


머신러닝은 기존 데이터를 이용해 아직 일어나지 않은 미지의 일을 예측하기 위해 만들어진 기법입니다.


자신이 그동안 집도한 수술 환자의 수술 전 상태와 수술 후의 생존율을 정리해 놓은 데이터를 머신러닝 알고리즘에 넣는 것입니다. 기존 환자의 데이터는 머신러닝에 입력되는 순간, 그 패턴과 규칙이 분석됩니다. 그리고 분석 결과를 새로운 환자의 데이터와 비교하여 생존 가능성이 몇 퍼센트인지 알려줍니다. 이것이 바로 머신러닝이 하는 일입니다. 여기서 데이터가 입력되고 패턴이 분석되는 과정을 학습(training)이라고 부릅니다.


랜덤 포레스트, 서포트 벡터 머신 등 많은 방법들이 세상에 소개되었습니다. 딥러닝은 이러한 수많은 머신러닝 방법 가운데 가장 효과적인 방법입니다.


파이썬은 숫자를 1부터 세지 않고 0부터 셉니다. 범위는 콜론(:)앞의 숫자는 범위의 맨 처음을 뜻하고, 콜론 뒤의 숫자는 이 숫자 '바로 앞'이 범위의 마지막이라는 뜻입니다.


딥러닝 프로젝트를 '여행'으로 비유해 본다면 텐서플로는 목적지까지 빠르게 이동시켜주는 '비행기'에 해당하고, 케라스는 비행기의 이륙 및 정확한 지점까지의 도착을 책임지는 '파일럿'에 비유할 수 있습니다.


딥러닝은 여러 층이 쌓여 결과를 만들어 냅니다. Sequential 함수는 딥러닝의 구조를 한 층 한 층 쉽게 쌓아 올릴 수 있게 해 줍니다. 


딥러닝 구조와 층별 옵션을 정하고 나면 compile() 함수를 이용해 이를 실행시킵니다.


딥러닝의 가장 말단에서 이루어지는 가장 기본적인 두 가지 계산 원리를 알아야 합니다. 바로 선형 회귀와 로지스틱 회귀입니다.


가장 훌륭한 예측선 긋기란 통계학 용어인 선형 회귀(linear regression)를 쉽게 풀어서 쓴 것입니다. 


딥러닝을 포함한 머신러닝의 예측은 결국 이러한 기본 접근 방식과 크게 다르지 않습니다. 기존 데이터(정보)를 가지고 어떤 선이 그려질지를 예측한 뒤, 아직 답이 나오지 않은 그 무언가를 그 선에 대입해 보는 것이지요.


def는 함수를 만들 때 사용하는 예약어입니다. 


모든 딥러닝 프로젝트는 이처럼 여러 개의 입력 변수를 다룹니다. 따라서 기울기와 y절편 b를 찾아내는 다른 방법이 필요합니다. 가장 많이 사용하는 방법은 '일단 그리고 조금씩 수정해 나가기'방식입니다. 가설을 하나 세운 뒤 이 값이 주어진 요건을 충족하는지 판단하여 조금씩 변화를 주고, 이 변화가 긍정적이면 오차가 최소가 될 때까지 이 과정을 계속 반복하는 방법입니다. 이는 딥러닝을 가능하게 해 주는 가장 중요한 원리 중 하나입니다. 그런데 선을 긋고 나서 수정하는 과정에서 빠지면 안되는 것이 있습니다. 나중에 그린 선이 먼저 그린 선보다 더 좋은지 나쁜지를 판단하는 방법입니다. 즉, 각 선의 오차를 계산할 수 있어야 하고, 오차가 작은 쪽으로 바꾸는 알고리즘이 필요한 것이지요. 


때로 평군 제곱 오차가 너무 커서 쓰기가 불편할 때가 있습니다. 각 오차를 제곱한 값을 사용하므로 대용량 데이터를 이용할 때는 계산 속도가 느려질 수 있습니다. 이럴 때는 여기에 다시 제곱근을 씌워 줍니다. 이를 평균 제곱근 오차(Root Mean Squared Error)라고 합니다. 


오차를 비교하여 가장 작은 방향으로 이동시키는 ... 미분 기울기를 이용하는 경사 하강법


우리는 학습률(learning rate)이라는 개념을 알 수 있습니다. 기울기의 부호를 바꿔 이동시킬 때 적절한 거리를 찾지 못해 너무 멀리 이동시키면 a값이 한 점으로 모이지 않고 치솟아버립니다. 따라서 어느 만큼 이동시킬지를 신중히 결정해야 하는데, 이때 이동 거리를 정해 주는 것이 바로 학습률입니다. 딥러닝에서 학습률의 값을 적절히 바꾸면서 최적의 학습률을 찾는 것은 중요한 최적화 과정 중 하나입니다.


참고로 케라스는 학습률을 자동으로 조절해 줍니다. 


텐서플로는 구글이 오픈 소스로 리이선스로 공개한 머신러닝 및 딥러닝 전문 라이브러리입니다. 


케라스는 ... 많은 개념을 자동으로 실행하게끔 설계되어 있습니다. 이러한 케라스의 편리성 덕분에 케라스만으로 딥러닝의 동작 원리를 배우기가 어렵습니다.


에포크(Epoch)는 입력 값에 대해 몇 번이나 반복하여 실험했는지를 나타냅니다.


더 정확한 예측을 하려면 추가 정보를 입력해야 하며, 정보를 추가해 새로운 예측값을 구하려면 변수의 개수를 늘려 '다중 선형 회귀'를 만들어 주어야 합니다. 


할 말이 많아도 예 혹은 아니오로만 대답해야 할 때가 있습니다. 그런데 실은 이와 같은 상황이 딥러닝에서도 끊임없이 일어납니다. 전달받은 정보를 놓고 참과 거짓 중에 하나를 판단해 다음 단계로 넘기는 장치들이 딥러닝 내부에서 쉬지 않고 작동하는 것이지요. 딥러닝을 수행한다는 것은 겉으로 드러나지 않는 '미니 판단 장치'들을 이용해서 복잡한 연산을 해낸 끝에 최적의 예측 값을 내놓는 작업이라고 할 수 있습니다. 이렇게 참과 거짓 중에 하나를 내놓는 과정은 로지스틱 회귀(logistic regression)의 원리를 거쳐 이루어집니다. 참인지 거짓인지를 구분하는 로지스틱 회귀의 원리를 이용해 '참, 거짓 미니 판단 장치'를 만들어 주어진 입력 값의 특징을 추출합니다. 이를 저장해서 '모델'을 만듭니다.


텐서플로에서 데이터를 담는 플레이스 홀더(placeholder)를 정해 줍니다. 플레이스 홀더는 입력 값을 저장하는 일종의 그릇입니다. 


입력 값을 통해 출력 값을 구하는 함수 y=a1x1+a2x2+b, x1 x2가 입력되고 각각 가중치 a1 a2를 만납니다. 여기에 b값을 더한 후 시그모이드 함수를 거쳐 1 또는 0의 출력 값 y를 출력합니다. ... 1957년 코넬 항공 연구소의 프랑크 로젠블라트라는 사람은 이 개념을 고안해 발표하고 여기에 '퍼셉트론(perceptron)'이라는 이름을 붙였습니다. 이 퍼셉트론은 그 후 여러 학자들의 노력을 통해 인공 신경망, 오차 역전파 등의 발전을 거쳐 지금의 딥러닝으로 이어지게 됩니다. 


뉴런과 뉴런이 서로 새로운 연결을 만들기도 하고 필요에 따라 위치를 바꾸는 것처럼 여러 층의 퍼셉트론을 연결시키고 복잡하게 조합하여 주어진 입력 값에 대한 판단을 하게 하는 것, 그것이 바로 신경망의 기본 구조입니다. 신경망을 이루는 가장 중요한 기본 단위는 퍼셉트론입니다. 퍼셉트론은 입력 값과 활성화 함수를 사용해 출력 값을 다음으로 넘기는 가장 작은 신경망 단위입니다.


기울기 a는 퍼셉트론에서는 가중치를 의미하는 w(weight)로 표기됩니다. ... y절편은 바이어스의 b ... 입력값(x)과 가중치(w)의 곱을 모두 더한 다음 바이어스를 더한 값을 가중합(weighted sum)이라고 합니다. 가중합의 결과를 놓고 1또는 0을 출력해서 다음으로 보냅니다. 여기서 0과 1을 판단하는 함수가 있는데, 이를 활성화 함수(activation function)라고 합니다. 앞서 배웠던 시그모이드 함수가 바로 대표적인 활성화 함수입니다. 


퍼셉트론의 한계를 설명할 때 등장하는 XOR 문제입니다. XOR 문제는 논리 회로에 등장하는 개념입니다. ... XOR게이트는 둘 중 하나만 1일 때 1이 출력됩니다. 


AND와 OR게이트는 직선을 그어 결과값이 1인 값을 구별할 수 있습니다. 그러나 XOR의 경우 선을 그어 구분할 수 없습니다. 인공지능 분야의 선구자였던 MIT 마빈 민스키 교수가 1969년에 발표한 퍼셉트론즈라는 논문에 나오는 내용입니다.  ... 알고보니 간단한 XOR 문제조차 해결할 수 없었던 것입니다. 이 논문 이후 인공지능 연구가 한동안 침체기를 겪게 됩니다. 10여년이 지난 후에야 이 문제가 해결되는데, 이를 해결한 개념이 바로 다층 퍼셉트론입니다. 


XOR문제를 해결하기 위해서 우리는 두 개의 퍼셉트론을 한 번에 계산할 수 있어야 합니다. 이를 가능하게 하려면 숨어있는 층, 즉 은닉층을 만들면 됩니다. ...은닉층을 만들어 공간을 왜곡하면 두 영역을 가로지르는 선이 직선으로 바뀝니다. 


AND게이트의 정반대 값을 출력하는 방식 NAND,  NAND게이트와 OR게이트 이 두가지를 내재한 각각의 퍼셉트론이 다중 레이어 안에서 각각 작동하고, 이 두 가지의 값에 대해 AND게이트를 수행한 값이 바로 우리가 구하고자 하는 Y값임을 알 수 있습니다. 


신경망 내부의 가중치는 오차 역전파 방법을 사용해 수정합니다. 오차 역전파는 ... 경사 하강법의 확장 개념입니다. 


다층 퍼셉트론 역시 결괏값의 오차를 구해 이를 토대로 하나 앞선 가중치를 차례로 거슬러 올라가며 조정해 갑니다. 그러다 보니 최적화 계산 방향이 출력충에서 시작해 앞으로 진행됩니다. 그래서 다층 퍼셉트론에서의 최적화 과정을 오차 역전파(back propagation)라고 부릅니다. 


'오차가 작아지는 방향으로 업데이트한다'는 의미는 미분값이 0에 가까워지는 방향으로 나아간다는 말입니다. 즉 '기울기가 0이 되는 방향'으로 나아가야 하는데, 이 말은 가중치에서 기울기를 뺐을 때 가중치의 변화가 전혀 없는 상태를 말합니다. 따라서 오차 역전파를 다른 방식으로 표현하면 가중치에서 기울기를 빼도 값의 변화가 없을 때까지 계속해서 가중치 수정 작업을 반복하는 것입니다.


오차 역전파는 출력층으로부터 하나씩 앞으로 되돌아가며 각 층의 가중치를 수정하는 방법입니다. 가중치를 수정하려면 미분 값, 즉 기울기가 필요하다고 배웠습니다. 그런데 층이 늘어나면서 기울기가 중간에 0이 되어버리는 기울기 소실 문제가 발생하기 시작했습니다. 이는 활성화 함수로 사용된 시그모이드 함수의 특성 때문입니다. 시그모이드를 미분하면 최대치가 0.3입니다. 1보다 작으므로 계속 곱하다보면 0에 가까워집니다. 따라서 층을 거쳐 갈수록 기울기가 사라져 가중치을 수정하기가 어려워지는 것입니다.


토론토대학교의 제프리 힌튼 교수가 제안한 룰루(ReLU)는 시그모이드의 대안으로 떠오르며 현재 가장 많이 사용되는 활성화 함수입니다. 렐루는 x가 0보다 작을때는 모두 0으로 처리하고 0보다 큰 값은 x를 그대로 사용하는 방법입니다. 이 방법을 쓰면 x가 0보다 크기만 하면 미분값이 1이 됩니다. 따라서 여러 은닉층을 거치며 곱해지더라도 맨 처음 층까지 사라지지 않고 남아있을 수 있습니다. ... 이후 렐루의 0이 되는 순간을 완화한 소프트플러스등 렐루를 변형한 함수도 개발중이며, 좀 더 나은 활성화 함수를 만들기 위한 노력이 이어지고 있습니다.


경사 하강법의 불필요하게 많은 계산은 속도를 느리게 할 뿐 아니라, 최적 해를 찾기 전에 최적화 과정을 멈출 수도 있습니다. 확률적 경사 하강법(Stochastic Gradient Descent,SGD)는 이러난 속도의 단점을 보완한 방법입니다. 전체 데이터를 사용하는 것이 아니라, 랜덤하게 추출한 일부 데이터를 사용합니다. 


모멘텀 SGD란 말 그대로 경사 하강법에 탄력을 더해 주는 것입니다. ... 지그재그로 일어나는 현상이 줄어들고, 이전 이동 값을 고려하여 일정 비율만큼만 다음 값을 결정하므로 관성의 효과를 낼 수 있습니다.


아담(Adam)은 현재 가장 많이 사용되는 고급 경사 하강법입니다. 


epochs=1000으로 지정한 것은 각 샘플이 처음부터 끝까지 1,000번 재사용될 때까지 실행을 반복하라는 뜻입니다. ... batch_size=10은 전체 470개의 샘플을 10개씩 끊어서 집어넣으라는 뜻이 됩니다. 


seaborn 라이브러리 중 각 항목 간의 상관관계를 나타내 주는 heapmap 함수를 통해 그래프를 표시해 봅니다. ... 결과에 미치는 영향이 큰 항목을 발견하는 것이 데이터 전처리 과정의 한 예입니다. 데이터 전처리 과정은 딥러닝을 비롯하여 모든 머신러닝의 성능 향상에 중요한 역할을 합니다.


최종 딥러닝 결과는 여러번 실행하여 평균을 구하는 것이 가장 적절합니다.


참과 거짓으로 해결하는 것이 아니라 ... 여러 개의 답 중 하나를 고르는 분류 문제를 다중 분류라고 합니다.


활성화 함수... 소프트맥스는 총합이 1인 형태로 바꿔서 계산해 주는 함수입니다.


MNIST 데이터셋은 미국 국립표준 기술원이 고등학생과 인구조사국 직원등이 쓴 손글씨를 이용해 만든 데이터로 구성되어 있습니다. 


기본 딥러닝 프레임에 이미지 인식 분야에서 강력한 성능을 보이는 컨볼루션 신경망(Convolutional Neural Network, CNN)


컨볼루션 층을 통해 이미지 특징을 도출하였습니다. 하지만 그 결과가 여전히 크고 복잡하면 이를 다시 한번 축소해야 합니다. 이 과정을 풀링(pooling)또는 서브 샘플링이라고 합니다. ... pool_size 는 풀링 창의 크기를 정하는 것으로, 2로 정하면 전체 크기가 절반으로 줄어듭니다.


노드가 많아지거나 층이 많아진다고 해서 학습이 무조건 좋아지는 것이 아니라는 점을 과적합의 의미를 공부하며 배웠습니다. 딥러닝 학습을 실행할 때 가장 중요한 것은 과적합을 얼마나 효과적으로 피해가는지에 달려 있다고 해도 과언이 아닙니다. 따라서 그동안 이러한 과정을 도와주는 기법이 연구되어 왔습니다. 그중 간단하지만 효과가 큰 기법이 바로 드롭아웃 기법입니다. 드롭아웃은 은닉층에 배치된 노드 중 일부를 임으로 꺼주는 것입니다.


문장을 학습하는 것은 우리가 지금까지 공부한 내용과는 성질이 조금 다릅니다. 문장은 여러 개의 단어로 이루어져 있는데, 그 의미를 전달하려면 각 단어가 정해진 순서대로 입력되어야 하기 때문입니다. 즉, 여러 데이터가 순서와 관계없이 입력되던 것과는 다르게, 이번에는 과거에 입력된 데이터와 나중에 입력된 데이터 사이의 관계를 고려해야하는 문제가 생기는 것입니다. 이를 해결하기 위하여 순환 신경망(Recurrent Neural Network, RNN)방법이 고안되었습니다.


텐서플로는 AMD 계열의 GPU가 아니라 NVIDIA의 GPU만을 지원합니다.




댓글(0) 먼댓글(0) 좋아요(2)
좋아요
북마크하기찜하기 thankstoThanksTo