본문 바로가기

카테고리 없음

머신러닝 야학 학습 일지

머신러닝 야학 학습 일지

오픈튜토리얼스 X 구글 X 생활코딩

 

사이트 URL ▶ https://ml.yah.ac/

 

온라인으로 진행

2020.8.13 : 개강

2020.8.27 : 종강

2020.8.31 : 수료식

 

야학 진행 기간 동안의 학습 기록을 남기기 위한 글

 

 


Day1 (08.13)

개강 !!!

 

머신러닝1, 오렌지3, 텐서플로우 중 오렌지3을 제외한 두 강의를 수강하기로 했다.

첫 날이라 수업은 무겁지 않았다.

(전체적으로 쉽고 재미있는 강의 스타일인 것 같다. 나는 호!! 머신러닝은 자체만으로도 충분히 어렵다..)

 

 

강의1. 머신러닝1

 

오리엔테이션과 함께 머신러닝의 개념을 학습했다.

머신러닝, 모델(Model), 학습(Learning), 추측, 의사결정 등등.

 

습관 -> 의지 -> 환경 -> 습관 -> 의지 -> ...

전자가 후자를 이기는 관계라고 설명하였다.

 

"환경이 습관을 이기기 때문에, 습관을 고치고 싶다면 환경을 바꾸는 것이 좋다.

나를 계속 주시하고 감시하여 '습관'이 되는 행동을 저지르면 알려주는 '환경'을 조성하는 데 머신러닝을 이용하면 어떨까?"

=> 영상에서 이러한 발상과 함께 '손톱 물어뜯기'를 예시로 들었다. 좋은 아이디어인 것 같다!

 

코딩하지 않아도 머신러닝을 체험할 수 있는 사이트도 처음 알게되었다.

Teachable Machine ▶ https://teachablemachine.withgoogle.com/

 

 

강의2. 텐서플로우

 

머신러닝1 보다는 조금 더 깊은 개념을 공부하였다.

 

요즘 자주 들리는 단어 '딥러닝', '머신러닝' 그리고 '인공지능'

이들의 관계는

 

딥러닝⊂머신러닝⊂인공지능

 

이라고 한다.

 

인공지능을 구현할 수 있는 가장 유망한 분야가 머신러닝

그 머신러닝의 방법(알고리즘)으로는 Decision Tree, Random Forest, KNN, SVM, Neural Network 가 있다.

이 중 앞으로 강의에서 다룰 것은 Neural Network (=Deep Learning)

그리고 이를 편리하게 구현하기 위한 Library로 Tensorflow를 이용할 것이다.

 

실습 환경은 구글에서 제공하는 Google Colaboratory

 

Jupyter notebook과 매우매우 흡사하다.

 

 

1일차인데 필요 이상으로 길게 쓴 느낌이다. 원래는 서너줄로 간략하게 배운 내용을 요약하려 했는데..

앞으로 내용이 복잡하고 어려워진다면 간략하게 적어나갈 수도 있다!

 

 


Day2 (08.14)

강의1. 머신러닝1

 

Application과 Program의 정의를 통해 이 둘은 '같은 것을 가리키는 다른 표현'이라는 것을 알게 되었다.

두 단어 모두 자주 쓰지만 정의를 찾아본 적은 없었는데(사실 가끔 의미 헷갈림) 이번에 확실히 이해했다.

 

그리고 Day1에서 배웠던 머신러닝 사이트 Teachable Machine 을 통해 만든 모델을 체험해보았다.

(좌)손톱을 물어뜯었을 때 (우)그렇지 않을 때

일정 퍼센트가 넘어가면 글자나 음성도 삽입할 수 있다.

위에서는 확률이 80%이상이면 각각 '손톱', '정상' 글자가 화면에 표시되도록 해본 경우

스크래치 형태라서 누구나 쉽게 조작할 수 있을 거 같다!

 

그리고 머신러닝으로 해결할 수 있을 것 같은 문제에 대해 생각해보는 활동(?)을 했다.

1) 환경 : 직접 수확한 해산물을 판매하고 있는 어부

2) 불만족 : 날씨에 따라 수확량의 차이가 큼. 같은 장소, 같은 시간대여도 잡히는 해산물의 종류와 수확량이 일정하지 않음.

3) 꿈 : 기상 상황과 수온에 따라 수확할 수 있는 해산물의 종류와 양을 예측하고 싶다.

 

이렇게 제출! 다른 사람들의 답변도 볼 수 있었다.

 

 

강의2. 텐서플로우

 

pandas, tensorflow 를 이용하여 실습을 진행했다.

 

1) 데이터 준비 - csv 파일을 불러와 데이터 분리 및 확인해보기

 

(소스코드 원본 github ▶ https://github.com/blackdew/tensorflow1/blob/master/practice1-pandas.ipynb)

 

2) 날씨(온도)에 따른 레몬에이드 판매 예측

(소스코드 원본 github ▶ https://github.com/blackdew/tensorflow1/blob/master/practice2-lemonade.ipynb)

 

모델의 구조를 만드는 코드 중

X = tf.keras.layers.Input(shape=[1])
Y = tf.keras.layers.Dense(1)(X)

위에서의 1은 independent variable의 수, 아래의 1은 dependent variable의 수

 

데이터로 모델을 학습(FIT)할 때 'epochs'란 반복 학습 횟수를 뜻한다.

model.fit(ind_var, d_var, epochs=1000)

=> 1000번 학습하는 경우

 

fit 실행 시 화면에 표시되는 loss는 (예측-결과)^2의 평균값이다.

이 값이 0에 가까워질 수록 학습이 잘 된 모델

loss를 줄이기 위한 여러 방법이 있겠지만, 일단 epoch 수를 늘릴 수록 줄어드는 것을 확인할 수 있었다.

 

2일차까지 쓰고나니 10일치를 2개 글로 나눠야겠다는 생각이 물씬 ,,

 

 


Day3 (08.17)

강의1. 머신러닝1

 

오늘은 주로 '표'와 관련된 개념을 배웠다.

표는 데이터를 다루기 위한 아주 좋은 도구이자 데이터들의 모임 => '데이터 셋(data set)'이라고도 한다.

이러한 표를 머신러닝에 투입한다면 인간의 통찰력을 기계도 발휘할 수 있게 된다.

 

표에서 가로와 세로는 각각 여러 단어로 불린다.

가로는 행(row), 개체(instance), 관측치(observed value), 기록(record), 사례(example), 경우(case)

세로는 열(column), 특성(feature), 속성(attribute), 변수(variable)

각각의 분야마다 쓰이는 단어들이 다르므로 굳이 외울 필요는 없음!

 

오늘 배운 것 중 가장 중요한 것은 독립변수, 종속변수였다.

독립변수(Independent variable) : data set에서 원인이 되는 열. 독립적으로 발생하는 사건

종속변수(Dependent variable) : data set에서 결과가 되는 열. 원인에 종속되어 발생하는 사건

ex) 온도에 따라 판매량이 달라지는 레몬에이드 => 독립변수는 온도, 종속변수는 판매량

 

서로 상관이 있고 영향을 미치는 두 특성의 관계를 '상관관계'라고 한다.

이 중에서 특히 원인과 결과의 관계라면 '인과관계'라고 한다.

상관관계는 인과관계를 포함 => 모든 인과관계는 상관관계이지만 역은 성립하지 않는다.

독립변수와 종속변수는 인과관계에 해당한다.

 

이전에 작성했던 기획안에 독립변수, 종속변수 개념을 더해 추가로 작성, 제출했다!

 

오늘 수업 마지막 부분의 이야기가 인상적이었다.

"공부를 그만두고 싶은 생각이 들 때, 이 감정은 인내심이 부족하기 때문이 아니다.

이 정도 공부면 충분하다는 뇌의 명령이다.

우리의 뇌에는 어떤 행위의 경제성을 판단하는 고도로 정교한 모델이 내장되어있는 것과 같아서

지금 하고 있는 행위가 경제성이 없다고 결정하면 지루함을 발송, 그 다음으로는 절망감을 발송한다.

이 경고를 묵살하면 나중에 관련된 일을 피하기 위해 몸부림을 치게 된다."

 

공부를 게을리해서는 안된다는 뜻이 아니라, 필요하다고 생각될 때 필요한 공부를 하자는 뜻인 거 같다.

뭔가 '무리하지 않아도 된다. 천천히 해도 된다.' 이러한 메시지도 있는 거 같아서 마음이 따땃해졌다.

 

 

강의2. 텐서플로우

 

- 보스턴 집값 예측

(소스코드 원본 github ▶ https://github.com/blackdew/tensorflow1/blob/master/practice3-boston.ipynb)

 

모델의 구조를 만드는 코드

X =tf.keras.layers.Input(shape=[13])
Y =tf.keras.layers.Dense(1)(X)
model =tf.keras.models.Model(X, Y)
model.compile(loss='mse')

=> 13개의 입력으로부터 1개의 출력을 만드는 구조

 

완전한 표현은 아래와 같다.

 

y = w1x1 + w2x2 + ... + w12x12 + w13x13 + b​

 

x1, ... x13 은 13개의 독립변수, y는 종속변수

컴퓨터는 입력되는 데이터를 통해 w1, w2, ... , w13, b를 찾는다.

 

여기서 w1,w2, ..., w13은 '가중치(Weight)', b는 '편향(bias)'이다.

또한 인공신경망에서 뉴런의 역할을 하는 것이 이러한 모형과 수식인데, 이 모형을 '퍼셉트론(Perceptron)'이라고 한다.

 

만약 종속변수가 2개(y1, y2)라면 각각의 수식에서 weight 12개, bias 1개이므로 총 13*2 = 26개의 수를 찾아야 한다.

 

 

- 딥러닝 워크북

스프레드 시트 환경에서 딥러닝 워크북을 활용하여 가중치를 찾아나가는 방식을 이해해보았다.

이 부분은 꽤나 복잡하고 어려웠다. 복습 필요!!

 

 


Day4 (08.18)

강의1. 머신러닝1

 

머신러닝에 대한 심화개념들을 학습하였다.

우선 머신러닝의 분야는 다음과 같다.

1. 지도학습(supervised learning) : 정답이 있는 문제를 해결하는 것

- 분류(classification), 회귀(regression)

2. 비지도학습(unsupervised learning) : 무언가에 대한 관찰을 통해 새로운 의미나 관계를 밝혀내는 것

- 군집화(clustering), 변환(transform), 연관(association)

3. 강화학습(reinforcement learning) : 더 좋은 보상을 받기 위해서 수련하는 것

오늘은 이 중에서 '지도학습(supervised learning)'에 대해 알아보았다.

지도학습은 '역사'와 비슷하다.

역사를 알면 어떤 사건이 일어났을 때, 그것의 결과로 어떤 일이 일어날지 예측할 수 있게 된다.

마찬가지로, 지도학습은 과거의 데이터로부터 학습해서 결과를 예측하는 데 주로 사용된다.

지도학습을 하기 위해서는 과거의 데이터가 있어야 한다.

그리고 그 데이터를 독립변수(원인)와 종속변수(결과)로 분리해야 한다.

이 둘의 관계를 컴퓨터에게 학습시키면 컴퓨터는 그 관계를 설명할 수 있는 공식을 만들어낸다.

=> 그 공식을 '모델(model)'이라고 한다.

지도학습의 회귀(regression)과 분류(classification)는 종속변수의 상태에 따라 구분된다.

종속변수가 숫자일 때 => 회귀

ex) (독립변수 - 종속변수)

공부시간 - 시험점수

역세권, 조망 - 집 값

자동차 속도 - 충돌 시 사망 확률

종속변수가 이름일 때 => 분류

ex) (독립변수 - 종속변수)

공부시간 - 합격 여부(합격/불합격)

품종, 산도, 당도, 지역, 연도 - 와인의 등급

메일 발신인, 제목, 본문 내용 - 스팸 메일 여부

강의2. 텐서플로우

오늘 텐서플로우 강의는 머신러닝1의 내용과 겹치는 부분이 꽤 있었다.

종속변수 데이터가

양적 => 회귀(regression)

범주형 => 분류(classification)

기존에 했던 실습들은 숫자로 된 데이터를 예측하는 회귀였고, 오늘은 iris의 품종을 예측하는 분류 실습이었다.

- Iris(붓꽃) 품종 분류

(소스코드 원본 github ▶ https://github.com/blackdew/tensorflow1/blob/master/practice4-iris.ipynb)

 

먼저 '원핫인코딩'이 필요하다.

원핫인코딩이란 범주형의 데이터를 1과 0의 데이터로 바꿔주는 과정이다.

종속변수가 범주형 데이터일 경우, 딥러닝 모델을 사용하기 위해서는 모든 데이터를 원핫인코딩 해줘야 한다.

말만 들어도 복잡할 거 같지만 다행스럽게도 pandas에서 제공해준다.

iris = pd.get_dummies(iris)

이 한 줄의 코드만 추가하면 된다! 좋은 세상,,

아이리스의 품종(종속변수)이 y1, y2, y3 3가지, 독립변수가 4가지라면

 

y1 =  w1x1 + w2x2 + w3x3 + w4x4 + b

y2 =  w1x1 + w2x2 + w3x3 + w4x4 + b

y3 =  w1x1 + w2x2 + w3x3 + w4x4 + b

 

컴퓨터는 3가지 수식에 대한 가중치를 모두 찾아야한다.

iris 품종 예측 모델을 만드는 코드는 다음과 같다.

X = tf.keras.layers.Input(shape=[4])
Y = tf.keras.layers.Dense(3, activation = 'softmax')(X)
model = tf.keras.models.Model(X, Y)
model.compile(loss = 'categorical_crossentropy', metrics = 'accuracy')

원핫인코딩을 했으므로 종속변수의 개수를 넣는 부분은 1이 아닌 3이어야 한다.

activation = 'softmax'

이 부분은 0~100% 사이의 확률값으로 분류를 표현하기 위한 것이다.

분류모델이 분류를 예측하는 것을 확률로 표현해주는 도구가 바로 Sigmoid와 Softmax

이번에는 softmax를 사용하였다.

y1 = softmax(w1x1+w2x2+...+w4x4+b)

이렇게 수식들을 softmax 함수로 감싸주어 0과 1사이의 데이터를 얻을 수 있게 되는 것이다.

분류모델에서는 이러한 softmax 함수,

숫자를 예측하는 회귀모델에서는 입력을 그대로 출력으로 만드는 identity 함수(y=x)가 있다.

=> 퍼셉트론의 출력이 어떤 형태로 나가야하는지 조절하는 역할을 한다.

이외에도 이러한 용도로 사용되는 함수들을 Activation(활성화 함수)라고 한다.

model.compile(loss = 'categorical_crossentropy', metrics = 'accuracy')

분류에 사용하는 loss는 crossentropy, 회귀에 사용하는 loss는 mse 이다.

'metrics = 'accruracy''를 compile 부분에 추가해주면 학습이 진행되면서 변화하는 정확도를 확인할 수 있다.

 

 


Day5 (08.20)

강의1. 머신러닝1

 

오늘은 비지도학습(Unsupervised learning)과 강화학습(Reinforcement learning)을 배웠다.

비지도학습(unsupervised learning)에는 다음 3가지 방법론이 있다.

군집화(clustering), 변환(transform), 연관(association)

1) 군집화(clustering)

: 어떤 대상들을 구분해서 그룹을 만드는 것

분류(classificatiion)과 비슷하면서도 다른 개념이다.

(분류는 어떤 대상이 어떤 그룹에 속하는지를 판단하는 것)

이 군집화 도구에 1000만개의 관측치(행)을 입력하고 100개의 클러스터가 필요하다고 알려주면,

유사한 속성을 가진 관측치끼리 분류하여 총 100개의 클러스터를 만들어준다.

2) 연관규칙학습(Association rule learning)

: 서로 연관된 특징을 찾아내는 것. 일명 '장바구니 분석'이라고도 불린다.

ex) 상품 구매 표를 봤을 때, 라면을 구입한 사람이 계란도 구입할 확률이 높다

=> 다음에 라면을 구입할 때 계란을 추천한다. (라면-계란 상관관계)

이 외에도 음악 추천, 영화 추천, 검색어 추천, 동영상 추천 등

'추천'이 이름 뒤에 붙은 것들은 거의 연관규칙을 이용한 것

군집화와 연관규칙학습을 정리해보면

군집화는 서로 가까운 관측치를 찾아주는 머신러닝의 기법. 관측치(행)을 그룹핑

연관규칙은 서로 관련이 있는 특성(열)을 찾아주는 머신러닝의 기법. 특성(열)을 그룹핑

3) 변환(transform)

: 숙제(?)로 내주셨기에 간단하게나마 조사해본 결과,

데이터를 새롭게 표현하여 다른 머신러닝 알고리즘이 원래 데이터보다 쉽게 해석할 수 있도록 만드는 방법이라고 한다.

이러한 비지도학습의 성격은 탐험적이다.

미지의 세계를 파악하듯이 데이터들의 성격을 파악하는 것을 목적으로 한다.

지도학습의 경우 종속변수와 독립변수의 구분이 필요하지만, 비지도학습은 변수들 사이의 구분 없이 데이터만 있으면 된다.

다음으로 강화학습(Reinforcement learning)

단어에서 뭔가 어려울 거 같다는 느낌이 들었는데, 생각보다 이해가 잘 됐다.

지도학습이 배움을 통해 실력을 키운다면, 강화학습은 일단 해보면서 경험을 통해 실력을 키워나간다.

행동의 결과가 자신에게 유리한 것이었다면 상을, 불리한 것이었다면 벌을 받는다.

그리고 이 과정을 매우 많이 반복해서 더 많은 보상을 받을 수 있는 더 좋은 답을 찾아가는 것이 강화학습의 기본 아이디어!

인간의 경우로 예를 들어보면

게이머는 게임을 하면서 화면으로부터 현재 상태를 관찰한다.

관찰 결과에 따라 게임을 조작하면서 어떻게 해야 상을 더 많이 받고, 벌을 더 적게 받을 수 있는지 알게 된다.

이러한 관찰과 행동을 위해서는 판단력이 필요하며, 과정을 반복할 수록 판단력은 강화된다.

위의 용어들을 강화학습에서 사용하는 용어로 바꿔보면

게임 -> 환경(environment)

게이머 -> 에이전트(agent)

게임화면 -> 상태(state)

게이머의 조작 -> 행동(action)

상과 벌 -> 보상(reward)

게이머의 판단력 -> 정책(policy)

더 많은 보상을 받을 수 있는 정책을 만드는 것이 핵심!!

 

나는 길안내 로봇에 강화학습을 적용한 사례를 알아보고 등록했다.

(동영상 링크 ▶ https://youtu.be/jkaaU2yG9LQ)

강의2. 텐서플로우

딥러닝 모델 완성 마지막

퍼셉트론 하나만 사용한 모델 말고, 퍼셉트론을 깊게 연결한 진짜 신경망을 배우고 실습해보았다.

신경망을 깊게 만들기 위해서는 기존의 퍼셉트론을 여러개 사용하여 연결하면 된다.

인풋 레이어와 아웃풋 레이어 사이에 히든 레이어를 추가해 준다.

인풋 레이어가 x1, ... , x13 (13개)

히든 레이어가 h1, ... , h5 (5개)

아웃풋 레이어 y (1개)

이러한 경우, 결과를 만들기 위해서는 히든 레이어의 모든 값들을 입력으로 받는 하나의 퍼셉트론이 필요하다.

또한 히든 레이어의 첫 번째 결과를 만들기 위해서는 역시나 하나의 퍼셉트론이 필요하다.

=> 총 5개의 노드가 있으니 5개의 퍼셉트론 필요

히든 레이어 - 아웃풋 레이어 부분만 보면

5개의 입력을 받고 1개의 출력을 만드는 모델이라고 할 수 있다.

입력 레이어 - 히든 레이어 부분만 보면

13개의 입력을 받고 5개의 출력을 만드는 모델이라고 할 수 있다.

이러한 각각의 모델을 연속적으로 연결하여 하나의 거대한 신경망을 만드는 것이 바로 딥러닝(인공 신경망)!

기존에 만들었던 보스톤 집값 예측, 아이리스 품종 분류 모델에 적용해보는 실습을 했다.

(좌) 보스톤 집값 예측 모델, (우) 아이리스 품종 분류 모델

각각 히든 레이어를 1개, 3개 적용해보았다.

실제로 기존의 모델로 학습시켰을 때보다 loss가 감소한 것을 확인할 수 있었다.

(소스코드 원본 github ▶ https://github.com/blackdew/tensorflow1/blob/master/practice5-multilayer.ipynb)

       

X = tf.keras.layers.Input(shape=[13]) 
H = tf.keras.layers.Dense(10, activation='swish')(X) 
Y = tf.keras.layers.Dense(1)(H) # Dense(1)(X)가 아니라 Dense(1)(H)가 되어야 한다. 
model = tf.keras.models.Model(X, Y) model.compile(loss='mse')

 

모델의 구조를 만드는 기존의 코드에서

H = tf.keras.layers.Dense(10, activation='swish')(X)

이 한 줄을 추가하면 히든 레이어 1개를 사용한 모델이 된다.

(swish는 최근에 발표된 성능 좋은 activation 함수이다.)

 

X = tf.keras.layers.Input(shape=[13]) 
H = tf.keras.layers.Dense(5, activation='swish')(X) 
H = tf.keras.layers.Dense(3, activation='swish')(X) 
H = tf.keras.layers.Dense(3, activation='swish')(X) 
Y = tf.keras.layers.Dense(1)(H)

이것은 히든 레이어를 추가하여 총 3개를 사용한 모델이다.

첫 번째 레이어는 5개의 노드, 두 번째와 세 번째 레이어는 3개의 노드를 가진 모델이 되어 최종으로 하나의 출력을 만든다.

여기서 주의할 것은, 3번째 줄에 주석으로 표기해놓은 부분!

X가 아니라 H를 넣어주어야 한다.

이후 appendix 1, 2 강의를 통해 대표적으로 발생할 수 있는 오류를 해결하는 방법, 더 정확한 모델을 만드는 법을 배웠다.

원핫인코딩 시 데이터 타입을 범주형으로 인식하지 못하는 경우, NA값이 있는 경우를 처리해보는 실습을 진행하였다.

직접 만든 데이터 셋을 이용할 때 특히 자주 마주할 수 있는 오류들!

​(소스코드 원본 github ▶https://github.com/blackdew/tensorflow1/blob/master/appendix1-data.ipynb)

Dense 부분과 Activation을 분리하고 BatchNormalization을 이용하여 더 정확한 모델을 만들어보는 실습을 진행하였다.

히든 레이어를 추가했을 때도 loss가 줄어들긴 했지만, 이 방법을 이용했을 때 그보다 훨씬 눈에 띄는 효과를 볼 수 있었다.

(​​소스코드 원본 github ▶https://github.com/blackdew/tensorflow1/blob/master/appendix2-model.ipynb)

 

텐서플로우 종강 !

5일차를 마지막으로 텐서플로우 강의가 끝이 났다.(머신러닝1은 하루치 더 남아있다)

아직 높은 수준의 모델을 만들어보지는 못했지만, 기초부터 차근차근 배운 덕에 모든 과정을 확실히 이해할 수 있었다.

앞으로 내가 직접 만든 데이터, 혹은 관심있는 데이터를 가지고 스스로 모델을 만들고 나만의 분석 결과를 정리해보아야겠다.

 

 


Day6 (08.23)

강의1. 머신러닝1

 

종강

정규 야학 진행 기간은 주말을 제외한 10일이지만, 진도표에 따르면 강의는 오늘로서 끝!

여유있게 10일로 정해놓으신 거 같다.

지금까지 배운 것을 토대로 주어진 상황에서 어떤 머신러닝 기법을 적용해야하는지 구분할 수 있게 되었다.

아직 더더욱 배울 것이 많지만, 내가 이 강의를 신청하면서 원했던 학습 목표에는 도달한 거 같다.

기존에 머신러닝에 대해 가지고 있던 '복잡하고 어려운 것'이라는 생각이 완전히 가시지는 않았다.

하지만 '아무나 시작할 수 없는 것' 혹은 '넘사벽'이라는 편견은 없앨 수 있었다.

누구나, 머신러닝을 공부하고 또 활용할 수 있다. 앞으로 더 알기 쉬운 형태로 사람들과 가까워질 것이라고 확신한다.

 

 


 

2020.08.13. ~ 2020.08.23.

학습 완료

원래 커리큘럼은 머신러닝1 > 텐서플로우 같은데

나는 머신러닝1과 텐서플로우를 병행했기에 조금 일찍 종강하게 되었다.

강의 러닝타임이 길지는 않았지만, 꾸준히 듣고 정리해온 것에 조금 뿌듯함을 느낀다.

앞으로 해야할 것 & 해보고 싶은 것

1. 강의때 사용한 예제 말고 다른 데이터 셋으로 적용해보기

2. Collaborative filtering 공부하기