edwith CS50강의를 보며 정리했습니다.

● 인공지능 (자연어처리)

 

우리는 소프트웨어를 작동하거나 컴퓨터 언어(프로그래밍 언어) 를 통해 컴퓨터와 상호작용을 하지만, 인간은 일상에서 컴퓨터 언어가 아닌 언어를 사용한다. 이것을 자연어 라고 부르는데, 컴퓨터가 이를 이해하도록 만들려면 자연어를 이해할 수 있도록 처리해야 한다.

가장 최초의 자연어 처리 프로그램은 1966년 조셉이 만든 ELIZA 라는 소프트웨어이다. ELIZA에서 사용하는 시스템을 패턴 매칭 (pattern matching) 이라고 하는데, 입력 받은 문자의 일부를 활용해 다시 사용자에게 반환해주는 시스템을 의미한다. 요즘은 이러한 시스템을 활용하여 구현된 챗봇을 쉽게 만날 수 있다.

사람의 언어를 기계적으로 분석하여 컴퓨터가 이해할 수 있는 형태로 바꿔 처리하는 것을 자연어 처리라고 한다. 또, 단어들의 순서나 한 단어 뒤에 다른 단어가 나올 확률 등을 확률적으로 계산하여 시스템에 반영할 수 있다.

 

● 음성인식

 

요즘 대부분의 운영체제에는 음성인식 소프트웨어가 탑재되어 있다. 예시로는 iOS의 Siri, 삼성의 빅스비 등이 있다. 이러한 소프트웨어들은 가장 아래에 음성모델, 중간에 발음모델, 그 위에 언어모델을 넣어 이루어진다. 이렇게 여러 층으로 이루어진 소프트웨어로 음성을 인식하고, 인식된 문자를 또 다시 몇 개의 층으로(단계로) 분석한다. 

Syntactic Processing, Semantic Processing, Pragmatic Processing

문장을 인식했다면, 처음엔 그 문장의 구조를 분석하고 각 단어의 의미처리를 한다. 하지만 이 단계는 인간의 말을 그대로 이해하는 것이 아닌, 상징적인 것으로 앞에서와 마찬가지로 단어와 단어의 구조를 패턴화하고 확률적으로 구하는 것이다. 문장이 실제로 어떤 의미를 뜻하는지 인식하기 위해서는 더 복잡한 인지 모델이 필요하다. 

 

우리가 소통하는 요소 중 많은 부분을 차지하는 것이 비언어적 소통이다. 단순히 텍스트만으로 소통하기보다는 물리적 거리, 바라보는 시선, 목소리 톤, 억양, 제스처 등이 함께한다. 위에서 언급한 음성인식 시스템은 이러한 부분까지 고려할 수 없지만 비 언어적 행동까지 커버하는 카메라가 달린 로봇(지보)도 있고, 세상은 조금씩 발전하고 있다.

 

● 머신러닝

 

인공 지능을 구현하기 위한 하나의 분야로, 컴퓨터가 많은 데이터를 스스로 학습하고 그 데이터의 패턴을 파악할 수 있도록 하는 것이다. 일상에서 쉽게 사용할 수 있는 머신 러닝 시스템으로는 스팸 메일 분류기가 있다. 이러한 패턴을 잘 파악하기 위해서는 많은 양의 데이터가 필요하다.

edwith CS50강의를 보며 정리했습니다.

● 가상 현실과 증강 현실

 

우리는 일상에서 쉽게 가상 현실(VR, Virtual Reality)증강 현실(AR, Augmented Reality)을 접한다.
VR은 가상의 환경이나 상황을 컴퓨터로 만들어서 사람들이 실제로 그 상황에 들어와있는 것 처럼 느끼고 상호 작용할 수 있도록 만들어 주는 인터페이스를 뜻한다. AR은 가상현실과 기본적으로 비슷한데, 사용자에게 기존의 주변환경과 분리된 전혀 다른 환경을 경험하게 하지 않고 현재의 환경 위에 영상, 게임 등의 효과를 입히는 기술이다. 

간단한 형태로는 휴대폰을 통해 유튜브나 페이스북으로 3차원 공간을 둘러볼 수 있는데, 네모난 액정 안에 3차원 공간이 다 담긴다. 혹은 구글 카드보드나 삼성 기어, 오큘러스의 리프트, HTC의 바이브 등의 헤드셋을 통해 가상 세계로 갈 수도 있다. (논외지만 가상 현실 세계는 무궁무진하게 커질 것이라 생각해서 나는 카메라 기업들의 산업을 긍정적으로 투자해놨다.)

이러한 기술의 실질적인 목표는 강의실 혹은 해당 공연장에 하나의 창을 만들어서 공간에 없는 사람이라도 멀리서도 그 창을 통해 수업 혹은 공연을 들을 수 있게 하는 것이다.

 

원리

인간이 눈으로 보이는 것들을 입체적으로 느낄 수 있는 이유는 양쪽 눈의 시차가 있기 때문이다.  우리의 양 눈은 서로 떨어져있기 때문에 각각 보는 각도가 달라, 양안시차가 발생하기 때문에 원근감을 느끼고 물체를 입체적으로 인식할 수 있다.

이 원리를 이용하여 VR기기의 양 렌즈에는 사람의 양안 시차만큼 다른 각도로 촬영된 영상이 재생되기 때문에 일반 디스플레이에서 영상을 보는 것과 달리 입체감이 느껴지는 것이다.

또한 사람이 바라보는 방향에 따라 영상을 바꾸기 위해서 모션 트래킹 센서라는 것이 사용된다. 머리에 씌워진 기기 안에 가로, 세로, 높이를 모두 측정하는 센서가 있어 고개를 돌릴 때 마다 영상 화면도 같이 움직일 수 있다.

이 각각의 센서와 이미지를 활용하여 소프트웨어를 활용해 통합, 사용자가 보는 화면에 제공하여 입체감을 함께 느낄 수 있도록 하는 것이다. 보통 이러한 것을 체험하기 위해서는 AR 혹은 VR 기기를 사용하는데, 우리가 세상을 바라보는 눈으로 보면 마치 볼록렌즈처럼 왜곡되어 보이기 때문이다. 해당 기기를 사용해야만 소프트웨어와 연동이 되어 마치 가상현실을 진짜처럼 바라볼 수 있는 것이다.

 

 

가상 현실(VR)과 함께 가상의 정보를 이용한 기술이 증강 현실(AR)이다. 가상 현실과 증강 현실을 혼동하는 경우가 많은데, 가상현실은 가상의 환경에서 가상의 물체와 상호작용 하는 반면에, 증강현실은 현실의 환경에서 가상의 이미지가 겹쳐서 보여지는 것 이다.

AR은 스마트폰과 같이 카메라와 디스플레이가 함께 있는 기기가 필요하다. 카메라를 통해 사람의 시선이 닿는(카메라 렌즈를 통해 들어오는 화면) 장면이 기기에 들어오고 디스플레이에서 출력될 때 가상의 이미지가 덧붙여서 보이게 된다. AR 역시 VR과 마찬가지로 사람의 시선(카메라의 위치)를 계산하기 위하여 위치와 기울기를 측정하는 센서가 필요하다.

 

실제로, 이집트의 피라미드에서는 이 기술을 활용하여 그 곳까지 가지 못하는 사람들에게 가상 환경을 통해 경험할 수 있는 서비스를 제공한다고 한다. 이제는 우리가 접할 수 있는 구글맵의 거리뷰(로드뷰) 또한 3D 기술을 통해 구현된 것이다.

edwith CS50강의를 보며 정리했습니다.

 


● 이미지 파일

추리물을 좋아하는 사람이라면, 혹은 소싯적 TV 프로그램을 많이 봤다면 누구나 아는 프로그램이 있다.

바로 CSI 프로그램이다. 해당 프로그램에서 자주 나오는 화면이 영상을 멈춰서 확대하는 장면이다.

 

위의 이미지를 확대하면,,?

현실은 다르다. 한정된 비트들로 이루어진 이미지를 확대하면 이렇게 이미지가 번지거나 깨지는 현상을 볼 수 있다. 이런 현상이 발생하는 이유는 무엇일까?

우리가 컴퓨터와 해온 상호작용들은 대체로 모니터, 키보드, 마우스 등으로 이루어졌다. (물론 사람마다 다르겠지만) 하드디스크나 파일과 상호작용을 하는 빈도는 비교적 적다. 

 

'파일'은 무엇일까? 위의 사진은 'JPEG'의 확장명을 가지고 있는데, 이러한 파일들은 특정 비트 패턴으로 식별된다.  JPEG, GIF, PNG, WORD, EXCEL 파일 간에 구분되는 점은 무엇일까? 서로 다른 비트 패턴을 사용한다는 것이다. 그러한 비트 패턴들은 보통 파일 초반부에 있다. 

우리가 컴퓨터에서 JPEG 파일이나 워드 문서를 열면 대체로 파일의 첫 비트들을 본다 만약 그 패턴을 인식하여 이미지라는 것을 알면 사용자에게 그래픽으로 보여준다. 만약 그 패턴이 doc 형식이라면 문서형식을 보여줄 것이다.

 

이미지

우리가 사진을 찍어 이미지에 저장하면 보통 JPEG라는 확장자를 가지며 이미지를 압축하여 저장한다. 이미지 파일 형식으로는 비트맵(.bmp), JPG(.jpg), PNG(.png), GIF(.gif) 등이 있다. 각 유형에는 장단점이 있으며 유형에 따라 파일의 크기도 달라진다. 즉, 파일의 비트 데이터들의 구조가 다르다.

예를 들어 JPEG 확장자를 가진 파일의 첫 부분에는 256 216 255 의 숫자로 시작한다. 

비트맵 (BMP) 파일 형식의 경우 압축을 하지 않고 저장을 하며 이미지를 가장 단순하게 저장한다.

 

JPEG 파일은 이미지를 압축하는 장점을 갖고 있으며, GIF 파일이 256색을 표시할 수 있는데 비해 JPEG는 1600만 색상을 나타낼 수 있어 고해상도를 나타내기에 적합합니다. GIF는 이미지의 전송을 빠르게 하기 위한 압축저장 방식을 사용합니다. JPEG보다 압축률은 낮지만 압축 시 이미지의 손상이 적다.

PNG는 GIF와 JPEG의 장점만을 합쳐 놓은 압축방식이다. GIF보다 압축률이 좋고 JPEG보다 원본에 손상이 적어 효과적이다.

 

 

 

 

 

edwith CS50강의를 보며 정리했습니다.

● 16진수

 

사진 파일의 확장명인 jpg(jpeg)를 아는가? 모든 JPEG 파일의 첫 3byte는 이렇게 시작한다. 하지만 이렇게 10진수, 2진수만 사용하지는 않고 대체로 16진수 (hexadecimal) 를 사용한다. 0~9 다음부터 10~15의 숫자는 a,b,c,...f 등 알파벳으로 표현한다.

 

위의 숫자들을 2진수, 16진수로 나타내면 8bit 였던 걸 2bit로 구현할 수 있다.

 

하지만 ff, d8, ff 등으로 표현하지는 않고 16진수를 사용할 때는 관례적으로 빈 공간에 0x라는 것을 앞에 넣어서 위와 같은 표현으로 나타낸다.

 

16진수가 유용한 이유는 4bit 패턴과 완벽한 대응을 하기 때문이다. (2의 4제곱). 이를 활용하여 8bit나 1byte 등을 표현하기 용이하다. 실용적이다 ^ㅡ^

edwith CS50강의를 보며 정리했습니다.

● ASCII 코드

컴퓨터가 숫자가 아니라 문자나 다른 것들을 나타내기 위해 하는 것이 있을까? 컴퓨터 업계에서는 숫자를 알파벳 문자에 대응시키는 표준 방법을 채택하였다. ASCII 는 아스키라고 읽으며 글자를 10진수로 대응하는 것이다.

우리가 '문자'를 표현하고 싶지만 컴퓨터는 '숫자'로만 언어를 처리하기 때문에 숫자를 글자로 변환하려면 비트 패턴으로 변환이 필요하다. 그럴 때 사용하는 것이 ASCII 코드이다. 알파벳 'A'는 65로 시작하는데, 2의 6제곱인 64까지 표기를 하고 그 이후에 시작하는 순서이다. 

예를 들어 HI 라고 쓰고 싶다면, ASCII 코드로 숫자 72와 73을 나타내는 비트 패턴으로 전기신호를 보내 저장한다. 비단 문자뿐만 아니라 그래픽, 영상, 음악 등 다양한 것을 저장할 수 있다.

07. 딥러닝

 

07-1 인공 신경망

  • 시작하기 전에




    럭키백의 성공 이후 타깃 고객의 연령대를 대상으로 패션 럭키백을 진행해보려 한다!
    는 사실 패션 mnist 데이터를 사용하기 위한 밑밥..이지만 박해선님의 스토리 라인에 감탄!

 

<패션 MNIST>

시작하기에 앞서, 머신러닝/딥러닝을 입문할 때 사용하는 데이터셋이 있다. 머신러닝에서 붓꽃 데이터셋이 유명하듯, 딥러닝에서는 MNIST dataset이 유명하다. 이 데이터에는 손으로 적은 숫자로 이루어져 있는데, 패션 mnist는 숫자가 아닌 패션 아이템이 들어가있는 데이터셋이다.
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

print(train_input.shape, train_target.shape)
print(test_input.shape, test_target.shape)

패션 MNIST 데이터셋은 워낙 유명하기 때문에 라이브러리를 통해 import하여 사용이 가능하다. load_date() 메서드는 훈련 데이터와 테스트 데이터를 나눠 반환하는 함수다. 크기를 확인해보면 6만개의 이미지를 활용한 훈련 세트와 1만개의 이미지를 활용한 테스트 세트로 이루어진 것을 알 수 있다.

 

6장에서 matplotlib으로 이미지를 출력했던 것처럼 샘플을 출력할 수 있다. 이렇게 샘플 이미지를 확인해보면 데이터를 이해하고 주어진 task를 해결할 때 방향 잡기가 훨씬 수월하다.

 

 

앞서 출력한 10개의 이미지를 레이블과 함께 출력할 수 있다. 위의 레이블과 출력된 값을 비교함으로써 제대로 labelling되었는지 확인할 수 있다. 또한 레이블마다 6,000개의 샘플이 들어있는 것을 확인할 수 있다.

 

<로지스틱 회귀로 패션 아이템 분류하기>

6만개의 데이터를 한꺼번에 훈련하는 것보다 샘플을 하나씩 꺼내서 훈련하는 방법이 더 효율적이지 않을까?

이럴 땐 4장에서 배웠던 경사하강법을 사용해볼 수 있다. 이번 실습에서 사용하는 데이터셋의 경우 각 픽셀이 0-255 사이의 정수값을 가지기 때문에 이를 255로 나누어 0-1사이의 값으로 정규화할 수 있다. 정확한 표준화 방법은 아니지만 이미지를 전처리할 때 널리 사용되는 방법이다.

train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
print(train_scaled.shape)

SGDClassifier 는 2차원 입력을 다루지 못하기 때문에 1차원 배열로 만든 후 크기에 맞춰 지정하면 샘플의 갯수는 변하지 않고 데이터의 차원이 1차원으로 합쳐진다. 변환된 데이터의 크기를 확인해보면 784개의 픽셀로 이뤄진 6만개의 샘플이 준비된 것을 알 수 있다.

 

from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss = 'log', max_iter = 5, random_state=42)
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score']))

경사하강법의 반복 횟수를 max_iter =5로 지정하여 성능을 확인해볼 수 있다.

 

 

첫번째 레이블인 티셔츠와 두번째 레이블인 바지에 대해 생각해본다면, 각 레이블마다 다른 가중치(weight) 값과 절편(bias) 값을 적용하여 계산해야 한다. 동일한 픽셀값을 사용하기 때문에 동일한 weight와 bias를 사용한다면 클래스의 구분이 어렵다.

티셔츠를 계산하기 위한 가중치,절편값과 바지를 계산하기 위한 가중치,절편값은 다르다. 회귀를 통해 각 모델 파라미터(가중치,절편)를 찾은 후에는 각 클래스에 대한 확률을 계산하여 얻을 수 있다.

 

<인공 신경망>

인공신경망(Artificial Neural Network, ANN)은 1장에서 배웠듯이, 딥러닝의 다른 이름이기도 하다. 그림으로 신경망을 나타낸다면 위와 같이 나타낼 수 있는데, z1, z2, ..., z10 의 항목들은 티셔츠, 바지,... 등의 항목이다. 여기서 클래스가 총 10개 이므로 z10까지 계산을 하고, 이를 바탕으로 클래스를 예측한다. 신경망의 최종 값을 만든다는 의미에서 출력층(output layer) 이라고 부른다.

인공신경망에서는 z 값을 계산하는 단위를 뉴런(neuron)이라 부르는데, 유닛(unit)이라 부르기도 한다. x1, x2, ..., x784 까지의 항목은 입력층(input layer) 이라 부르는데, 입력층은 픽셀값 자체이고 특별한 계산을 수행하지는 않는다.

z1을 만들기 위해 x1픽셀에 곱해지는 가중치는 w1,1 이라 쓰고 z2를 만들기 위해 x1픽셀에 곱해지는 가중치는 w1,2 이라고 표기하였다. 절편은 뉴런마다 하나씩이기 때문에 b1, b2 등으로 표기하였다.

인공 신경망의 발견으로 올라가자면, (생물학적) 뉴런은 수상 돌기로부터 신호를 받아 신호체에 모은다. 이 신호가 어떤 임계값(threshold)에 도달하면 축삭 돌기를 통해 다른 세포에 신호를 전달한다. (생물학적) 뉴런이 신호를 전달하는 과정에서 영감을 받아 구현한 것이 인공신경망이다. 인공 신경망은 우리 뇌에 있는 뉴런과 같지는 않지만 머신러닝 알고리즘이 해결하지 못했던 문제에서 좋은 성능을 발휘하는 새로운 종류의 머신러닝 알고리즘이다.

인공 신경망, 혹은 심층 신경망(Deep Neural Network, DNN)을 딥러닝이라고 부른다. 심층 신경망은 여러 개의 층을 가진 인공 신경망이다.

 

<텐서플로와 케라스>

텐서플로(tensorflow)는 구글이 오픈소스로 공개한 딥러닝 라이브러리다. 이 때를 기점으로 딥러닝에 관심을 가지는 개발자들이 폭발적으로 증가했고, 텐서플로 출시 이후 알파고가 이세돌9단을 이기며 더욱 폭발적으로 딥러닝 분야가 성장하였다.

텐서플로는 저수준 API와 고수준 API가 있는데, 케라스(keras)가 고수준 API다. 딥러닝 라이브러리가 머신러닝 라이브러리와 다른점은 GPU를 사용하여 인공 신경망을 훈련한다는 점이다. GPU는 벡터연산, 행렬연산에 최적화되어있기 때문에 곱셈과 덧셈계산이 많은 인공 신경망을 계산할 때 많이 사용한다.

케라스 라이브러리는 직접 GPU 연산을 수행하지는 않고, GPU 연산을 수행하는 라이브러리를 백엔드로 사용한다. 예를 들면 텐서플로가 케라스의 백엔드 중 한개이다. 그 외에도 Theano, CNTK 등의 케라스 백엔드 라이브러리가 있다. 구글은 Tensorflow 2.0 이후 대부분의 고수준 API를 정리하고 Keras API만 남겼다. 그래서 거의 Keras와 Tensorflow는 동일한 개념이라고 생각해도 무방하다. 개인적으로 이러한 역사(?) 를 좋아해서 정리해봤다. ㅎㅎㅎ

import tensorflow as tf
from tensorflow import keras

텐서플로에서 케라스를 사용하려면 위와 같이 임포트하여 사용할 수 있다.

 

<인공 신경망으로 모델 만들기>

로지스틱 회귀에서는 교차 검증을 사용하여 모델을 평가하지만, 인공 신경망에서는 교차 검증을 사용하지 않고 검증(validation) 세트를 별도로 덜어내어 사용한다. 그 이유는

첫째로, 딥러닝 데이터셋은 너무 크기 때문이다. 그래서 따로 검증 세트를 덜어내어 사용해도 검증 점수가 안정적이다.
둘째로, 교차 검증을 계산하는 시간이 너무 오래걸린다. 훈련하는 데만 해도 며칠이 걸릴 수 있는데, 검증까지 한다면..?

from sklearn.model_selection import train_test_split
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)

print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)

test_size=0.2 로 지정하여 훈련 세트의 20%를 검증 세트로 덜어내었다. 훈련 세트 48,000개와 검증 세트 12,000개로 나뉘었다!

밀집층(dense layer)

케라스의 레이어에는 다양한 층이 준비되어 있는데, 그 중 가장 기본은 밀집층(dense layer)이다. 바로 위의 그림 중 밀집층의 그림을 보면, 10개의 뉴런이 모두 연결된 것을 생각해본다면 784 개의 픽셀이기 때문에 총 7,840개의 연결된 선을 볼 수 있다. 양쪽의 뉴런을 모두 연결하기 때문에 완전 연결층(Fully Connected Layer) 이라고 부른다.

인공 신경망

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
model = keras.Sequential(dense)

밀집층을 만들기 위해 매개변수를 뉴런 개수를 10개로 지정하고, 뉴런에서 출력되는 값을 확률로 바꾸기 위해서는 softmax 함수를 사용한다. activation 매개변수에 함수를 지정할 수 있고, 만약 2개의 클래스를 분류하는 이진분류라면 sigmoid 함수를 사용할 수 있다.

Sequential 클래스를 사용하면 앞서 만든 밀집층의 객체 dense를 전달할 수 있다. 소프트맥스와 같이 뉴런의 선형 방정식 계산 결과에 적용되는 함수를 활성화 함수(activation function)라 부른다.

 

<인공 신경망으로 패션 아이템 분류하기>

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
print(train_target[:10])

 

케라스 모델에서 손실 함수의 종류를 지정해줘야한다. 이진 분류는 binary_crossentropy, 다중 분류는 sparse_categorical_crossentropy 로 사용한다.

 

이진 크로스 엔트로피 손실을 위해 -log(예측확률)에 타깃값(정답)을 곱할 수 있다. 이진 분류에서는 출력층의 뉴런이 하나이기 때문에 이 뉴런이 출력하는 확률값 a를 사용하여 양성 클래스와 음성 클래스에 대한 crossentropy를 계산할 수 있다.

두번째 뉴런의 활성화 출력만 남기려면 해당 두번째 원소만 1이고 나머지는 0으로 타깃값을 준비해야 한다. 이런 것을 원-핫 인코딩(one-hot encoding)이라 한다.

 

모델을 돌려보면 evaluate() 메서드가 fit() 메서드와 비슷한 출력을 보여주는 것을 알 수 있다.


# 기본미션

7-1.

Q1. 어떤 인공 신경망의 입력 특성이 100개이고 밀집층에 있는 뉴런 개수가 10개일 때 필요한 모델 파라미터의 개수는 몇 개일까? 
> 10개의 뉴런이 100개의 입력과 연결되기 때문에 1,000개의 가중치가 있고 뉴런마다 1개의 절편이 있기 때문에 1,010개의 모델 파라미터가 있다. 

Q2. 케라스의 Dense 클래스를 사용해 신경망의 출력층을 만들려고 한다. 이진 분류 모델이라면 activation 매개변수에 어떤 활성화함수를 지정해야 할까?
> 이진 분류일 경우 sigmoid를 사용한다.

Q3. 케라스 모델에서 손실함수와 측정지표를 지정하는 메서드는 무엇일까?
> compile() 메서드를 통해 loss 매개변수로 손실함수를 지정하고 metrics 매개변수에서 측정하는 지표를 지정할 수 있다.

Q4. 정수 레이블을 타깃으로 가지는 다중 분류 문제일 때 케라스 모델의 compile() 메서드에 지정할 손실함수로 적절한 것은 무엇일까?
> 타깃값이 다중일 경우에 'sparse_categorical_crossentropy' 를 사용한다.

 

# 선택미션

7-2

Q1. 모델의 add() 메서드 사용법이 올바른 것은 어떤 것일까?
> model.add(keras.layers.Dense(10, activation='relu')

Q2. 크기가 300 x 300인 입력을 케라스 층으로 펼치려고 할 때 어떤 층을 사용해야 할까?
> 입력의 차원을 일렬로 펼치려면 Flatten을 사용한다.

Q3. 이미지 분류를 위한 심층 신경망에 널리 사용되는 케라스의 활성화함수는 무엇일까?
> 'relu' 는 이미지 처리를 위해 자주 사용되는 함수이다.

Q4. 적응적 학습률을 사용하지 않는 옵티마이저는 무엇일까?
> 'sgd'는 모두 일정한 학습률을 사용한다.

 


● 마무리

이번 챕터에서는 딥러닝에서 사용하는 기본적인 개념에 대해 배웠다. 딥러닝은 머신러닝과 다른 부분이 다소 있고, '신경망'이라는 개념이 들어가기 때문에 확실히 입체적으로 접근할 수 있다. 하지만 더 깊게 들어가려면 수학적인 지식이 기본적으로 필요하기 때문에, 선수과목으로 선형대수나 통계/행렬을 배우는 것을 추천한다.

코랩에서 실행한 파일을 공유드리니, 필요하신 분은 다운받아 사용하시면 됩니다.

Chapter07_deep_learning.ipynb
0.05MB

edwith CS50강의를 보며 정리했습니다.

● 2진수

 

입력과 출력은 무엇일까? 우리는 컴퓨터가 0과 1만 사용하고 0,1로만 이해한다는 것을 안다. 하지만 과연 0,1 두 숫자로 노트북이나 pc가 어떻게 작동하는지 설명할 수 있을까? 

일상생활에서는 일반적으로 10진수(decimal)를 사용한다. '10'이라고 하는 이유는 0에서 9까지의 숫자 10개를 사용하기 때문이다. 2진수(binary)는 0과 1까지의 숫자 2개만을 사용한다. 컴퓨터는 0과 1만으로도 어떤 데이터든 충분히 표현할 수 있다. 숫자, 문자, 그래픽, 영상 등 모든 정보가 가능하다. 

 

우리가 위의 그림을 본다면 본능적으로 1,2,3 숫자 3개로 인식할 것이다. 왜냐하면 우리가 어릴 때 숫자를 배울 때 10 단위로 생각하도록 배웠기 때문이다.

 

하지만 사실은 이렇게 각 자리수에 스케일을 곱해서 나온 결과 값을 모두 더한 것이다. 컴퓨터도 2진수를 사용할 때 우리와 같은 언어를 사용한다. 다만 우리보다 숫자 갯수가 적을 뿐이다. 우리는 10진수로 계산하기 때문에 10개의 숫자를 사용하지만 컴퓨터는 2개만 사용한다, 우리가 각 자리수에 10의 제곱을 하듯 컴퓨터는 2의 제곱을 통해 계산한다.

 

이처럼 각자 사용하는 진수에 따라 표현방식이 다르지만, 모두 같은 숫자를 나타냄을 알 수 있다. 

우리는 방의 불을 끄거나 켤 수 있다. 이것을 어떻게 표현할까? API라는 것을 통해 표현할 수 있다. API는 Application Programming Interface의 약자다. 우리가 웹 서버로 메시지를 보내듯 API를 통해 메시지를 보낼 수 있다.

edwith CS50강의를 보며 정리했습니다.

 


● 비트

단위

정보의 최소 단위인 비트의 개념을 설명하려 한다. '손 들어', '불 꺼' 등과 같은 정보를 실생활에서는 컴퓨터 세계에서는 전기의 유무로 판단한다. True/False 등을 0,1 의 비트 개념으로 부호화할 수 있다. 하지만 하나의 비트로 쓰이는 것은 비효율적이기 때문에 최소 8개의 비트를 사용하여 하나의 문자를 표현한다. 즉, 1바이트(byte) 는 8비트(bit)로 이루어져 있다. 

하지만 1바이트도 유용하지는 않다. 우리가 일상생활에서 대화를 하거나 메시지, 메일을 보낼 때에는 여러 바이트가 필요하기 때문에 보통은 바이트의 단위가 아닌 킬로바이트(kb)의 단위로 사용을 하기 시작한다. 1kb는 1,000byte로 이루어져 있다. 사실 정확히 1,000byte는 아니고 2의 제곱으로 표현할 수 있는 1,024의 수치를 가진다. 1바이트가 8비트, 즉 2의 세제곱인 것처럼 말이다. 왜냐하면 0과 1로 이진 분류하면 판독과 표기가 쉽기 때문에 2의 제곱으로 표현한다.

우리가 메모리를 사서 컴퓨터에 꼽으면 막상 표기된 것보다 더 적은 용량의 메모리가 사용이 가능한 이유는 무엇일까? 
제조사는 kb를 법에 맞춰 1,000바이트의 개념으로 광고하고 컴퓨터는 크기를 1,024바이트의 단위로 계산하기 때문이다. 그래서 수를 1,000이 아닌 1,024로 나눈다면 계속해서 1GB가 아니라 900MB를 보게 되는 것이고 그 단위가 커질수록 차이도 크게 나게 되는 것이다. 단위가 하나씩 올라갈수록 크기는 1,000배씩 커진다.

우리가 문서를 작성하며 많은 글자수, 혹은 이미지/표 등을 넣게 되면 메가바이트의 용량을 차지할 수도있다. 1mb는 1,000,000byte로 이루어져 있다. 메가바이트의 다음 단위는 기가바이트(gb)이다. 이는 10억 byte와 같은 뜻이다. 만약 1GB의 용량이 있다는 것은 10억 바이트, 또는 80억 비트의 용량이 있다는 것과 같다.

기가바이트의 다음 단위는 테라바이트(TB)다. 이는 1조 byte와 같은 뜻이다. 이렇게 큰 단위의 메모리를 하드를 누가쓸까? 보통 서버에 이를 많이 사용한다. 구글과 같은 대용량의 데이터가 있는 사이트의 경우는 안전한 공간에 보관된 컴퓨터에 많은 양의 html과 웹페이지를 저장한다. 또한 요새는 사진 기술의 발달로 디지털 사진 파일의 크기도 증가하고 있기 때문에 사진을 저장하는 데 사용할 수도 있다. 기술의 발달에 따라 소비자들도 점점 더 큰 용량을 요구하고 있다.

더 큰 용량인 페타바이트와 엑사바이트도 존재하지만 아직 일반 소비자들에게는 거리가 먼 단위이다. (몇 년안에 달라질수도)

기억

보통 USB 메모리에는 하드 드라이브가 들어있지 않고, '플래시 기억장치'라는 것이 들어있다. USB에는 내부에 움직이는 부품이 없으며, 전기 신호로 자료를 저장한다.

우리가 자료를 분실하지 않기 위해서는 자료를 '백업'해야 한다. 즉, 자료를 분실할 것을 대비하여 지금 가지고 있는 것을 두 개씩 저장하고 있다는 것이다. 문제는 이 백업 자료를 저장하기 위해 점점 더 많은 돈을 지불해야 한다는 것이다.

Chapter 5.

회귀 모델은 시계열 y 를 예측할 때 이것이 다른 시계열 x와 선형 관계가 있다고 가정하는 것이 기본 개념이다. 목표 예상변수(forecast variable) y 는 회귀선, 종속변수, 피설명 변수라고 부르기도 한다. 예측변수(predictor variable) x는 회귀자, 독립변수, 설명 변수라고 부르기도 한다.

 

5.1 선형 모델

단순 선형 회귀

회귀 모델이 목표 예상 변수 y 와 하나의 예측 변수 x 사이의 선형 관계를 다루는 경우가 가장 간단하다.

와 는 각각 직선의 절편과 기울기를 나타내며, 은 x가 0일 때 예측되는 y의 값을 나타낸다. 는 x가 1만큼 증가했을 때 예측되는 y의 변화를 의미한다. 여기서 주목해야 할 것은 관측값이 직선 위에 있는 것이 아니라 주위에 퍼져있다는 점이다. 또한 “오차(error)” 를 생각해볼 수 있다. “오차(error)”라는 단어는 실수를 의미하는 것이 아니라, 관측값이 기본 직선 모델로부터 얼마나 떨어져 있는지를 의미한다.

 

다중 선형 회귀

두 개 이상의 예측변수가 있을 때, 다중 회귀 모델(multiple linear regression)이라 부른다. 수식은 k개의 예측변수가 있어야 하고 각각은 숫자 형태여야 한다. 계수들은 다른 모든 예측변수의 효과를 고려한 뒤의 각 예측변수의 효과를 나타낸다. 다중 선형 회귀 모델은 잠재적으로 더 정확한 예측값을 낼 수 있다. 

선형 회귀 모델에서 중요한 가정 몇가지가 있는데, 목표 예상변수와 예측변수의 관계는 선형 관계식을 만족한다는 점, 오차의 평균이 0이란 점이 있다. 또한 오차는 자기상관관계, 예측변수, 상관관계가 없다는 점과 예측 변수는 확률 변수가 아니라는 점이다. 

 

5.2 최소 제곱 추정

적합값

실제 관측값을 가지고 있다고 하여도 계수 값을 모르기 때문에 데이터로부터 추정해야 한다. 최소 제곱 원리(least square principle)는 제곱 오차의 합을 최소화하여 계수를 효과적으로 선택할 수 있는 방법이다.

오차의 제곱을 더한 값의 최소값을 나타내기 때문에 '최소 제곱 추정' 이라 부른다. 가장 좋은 계수를 추정하는 것을 보통 'fitting' 한다고 하거나 학습, 훈련(training) 시킨다고 부른다. tslm() 메서드는 선형 회귀 모델을 시계열 데이터에 맞춘다. lm() 함수와 비슷하지만 tslm() 은 시계열을 위한 추가 기능을 제공한다.

다중 회귀식에서 얻은 계수를 사용하고 오차항을 0으로 두어 y의 예측값을 얻을 수 있다. 각 값에 숫자를 대입하면 얻는 예측값을 적합값(fitted value)이라 부르는데, 이는 모델을 추정하기 위해 사용한 데이터의 예측값이다.

 

적합도

선형 회귀 모델이 데이터에 얼마나 잘 맞는지 요약하는 방법은 결정 계수(coefficient of determination) 혹은 R²(알스퀘어)를 사용하는 것이다. 머신러닝 게시글에도 자세히 설명해놨는데, 타깃에 가까워 질수록 1에 가까워진다고 생각하면 된다. 만약 실제 값과 관련이 없다면 0에 가까울 것이고, 모든 출력 값은 0과 1사이의 값을 가진다.

결정계수를 수식으로 표현하면 위와 같이 계산할 수 있는데, 관측한 값과 예측한 값 사이의 상관관계의 제곱으로 계산할 수 있다. 예측 변수(predictor variable)를 추가한다면 R²값이 줄어들지 않고 이는 오히려 과대적합(over-fitting)으로 이어질 수 있다. 어떨 때는 R²값을 측정하는 것보다 모델의 예측 성능을 확인하는 것이 더 나을수도 있다.

 

회귀 분석의 표준 오차

잔차 표준 편차인 "잔차 표준 오차(redisual standard error)"를 통해 모델이 데이터에 얼마나 잘 들어맞는지에 대해 알 수 있다.

표준 오차는 모델이 내는 평균 오차의 크기와 관련이 있다. 이 오차를 y의 표본 평균이나 표준 편차와 비교함으로써 모델의 정확도에 대해 파악할 수 있다. 주의해야 할 점은 스케일(scale)에 따라 평가하는 것도 달라질 수 있다는 점이다.

 

5.3 회귀 모델 평가

관측값과 예측값의 차이를 잔차(residual)로 정의할 수 있는데, 각 잔차는 관련된 관측값의 예측할 수 없는 성분이다. 이를 통해 모델을 평가하기 전에 잔차의 성질부터 먼저 알아야한다. 잔차는 평균이 0이고, 잔차와 관측값 사이의 상관관계도 0이다. 회귀 변수를 고르고 모델을 맞춘 다음 모델의 적합성을 평가하기 위해서는 그래프를 그려봐야 한다.

 

잔차의 ACF 그래프

시계열 데이터에서 현재 시점에 관측한 변수의 값은 대부분 이전, 혹은 그 이전의 값과 비슷하다. 보통 회귀 모델을 사용해서 시계열 데이터를 예측할 때 잔차의 자기상관관계(autocorrelation)를 찾는 작업을 하는데, 만약 자기 상관관계가 있을 경우에는 예측이 비효율적일 수 있다. 이러한 경우에는 더 나은 예측을 하기 위해서는 다른 정보들을 추가적으로 고려해야 한다. 자기상관이 있는 모델로 낸 예측치가 잘못된 것은 아니지만 보통 더 큰 예측구간(prediction interval)을 가지기 때문에 잔차의 ACF(Auto-Correlation Function) 그래프를 살펴봐야 한다.

브로이쉬-갓프레이(Breusch-GodFrey) 방법도 있는데, 자기상관(autocorrelation)이 없다는 결합 가설(joint hypothesis)을 검증하는 데 사용한다. 

 

잔차의 히스토그램

잔차가 정규분포를 따르는지 확인하는 단계를 통해 예측 구간을 훨씬 쉽게 계산할 수 있게 된다.

 

예측 변수에 대한 잔차 그래프

잔차가 체계적이기 않고 무작위로 뿌려진 형태로 나타났을 때 가장 빠르게 확인하는 방법은 예측 변수에 대한 잔차의 산점도(scatterplot)를 살펴보는 것이다. 산점도 패턴이 나타난다면 관계가 비선형적일 수 있어서 모델을 수정해야 한다.

 

적합값에 대한 잔차 그래프

적합값에 대한 잔차를 그렸을 때 패턴이 나타난다면 잘못된 것이다. 즉, 이분산성(heteroscedasticity)이 있을 수 있다는 것인데, 잔차의 분산이 일정하지 않을 수 있다는 것을 의미한다. 만약 패턴이 나타난다면 로그나 제곱근 등의 변환을 취해서 확인해야 할 수도 있다.

 

이상값과 영향력 있는 관측값

대다수의 데이터에 비해 극단적인 관측값을 이상값(outliers)이라 부르는데, 만약 회귀 모형의 계수에 주는 영향이 크다면 영향력있는 관측값이라고 부르기도 한다. 이를 찾아내는 방법은 산점도를 그리는 것이다. 보통은 데이터 입력 실수로 인해 이상값이 나타나는 경우 혹은 관측값이 단순히 이상한 경우가 많다.

 

허위회귀(Spurious Regression)

대부분의 시계열 데이터는 정상성(stationarity)이 나타나지 않고, 시계열의 값이 일정한 평균이나 분산으로 변하지 않는다.

 

구글 클라우드 플랫폼(Google Cloud Platform) 은 구글에서 제공하는 클라우드 컴퓨팅 서비스다. 고객에게 서비스를 하기 위해 내부적으로 구글에서 사용하는 것과 동일한 infra structure 위에서 호스팅을 제공하는 서비스로, Amazon Web Services, Microsoft Azure 에 이어 전 세계 클라우드 컴퓨팅 시장에서 3위를 차지하고 있다.

 

구글 클라우드를 사용하려면 공식 홈페이지에서 사용이 가능하다.

위처럼, 신규 회원에게는 $300 의 크레딧이 제공되며, 90일간 무료로 사용할 수 있다. 구글 계정이 있는 경우 무료로 시작하기를 눌러 그대로 사용하면 되며 다른 클라우드 플랫폼과 마찬가지로 신용카드/체크카드 등의 결제수단을 등록해야 한다.

카드를 등록하는 이유는 프로그램을 이용한 자동 가입을 방지하기 위해서일뿐, 사용 기간이 종료된다고 해서 자동으로 결제되지 않는다고 한다.

평생 무료 사양(free tier)은 2021년 8월 이후 기준 듀얼 vCPU와 1GB RAM, 스토리지 30GB/월, 트래픽 1GB/월 등의 사양을 제공하고 있다. 평생 무료 사양의 VM instance를 생성 할 때는 미국 내 Region인 오리건(us-west1), 아이오와(us-central1), 사우스캐롤라이나(us-east1)중 한 곳을 선택하고, e2-micro 등급의 비 선점형 VM 인스턴스, 최대 30GB 표준 영구 디스크 저장공간을 선택해서 생성하면 된다고 한다. (출처 : 나무위키)

 

무료로 시작하기를 클릭한 후 국가를 선택해준다. 한국에 있지만 나무위키에 위와 같이 설명이 되어 있길래 서비스를 제공 받고자 미국으로 선택하려 했으나 다음 단계에서 휴대폰 인증이 필요하기 때문에 어려웠다.

인증을 마무리 하면 마지막 단계가 진행된다.

 

마지막으로 결제 정보를 입력해주어야 하는데, 계정 유형은 개인과 사업자 중에 선택이 가능하다. 만약 사업자 계정이라면 간이 과세인지 일반 과세인지도 선택해야 한다.

 

개인정보를 전부 입력하면 이처럼 휴대폰 인증을 진행하고, 결제 수단을 등록해야 한다.

카드 등록이 완료되면 무료 평가판 시작하기 버튼이 활성화되고 클릭하면 바로 평가판을 시작할 수 있다.

 

평가판을 시작하면 start 화면이 뜨고 좌측에서 항목을 골라 원하는 서비스를 이용할 수 있다. 만약 쿠버네티스 엔진을 사용하고 싶다고 하면 사진의 목록 중 원하는 것을 골라 사용하면 된다.

+ Recent posts