일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 드림핵
- siss
- lob
- 백준
- 숙명여자대학교 정보보안 동아리
- CSS
- Sookmyung Information Security Study
- 웹페이지 만들기
- SWEA
- PHP 웹페이지 만들기
- The Loard of BOF
- c
- C언어
- WarGame
- 생활코딩
- BOJ
- 숙명여자대학교 정보보안동아리
- 머신러닝
- Python
- 파이썬
- 풀이
- c++
- 기계학습
- BOJ Python
- hackctf
- Javascript
- XSS Game
- 자료구조 복습
- HTML
- hackerrank
- Today
- Total
혜랑's STORY
[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 2 본문
[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 2
hyerang0125 2021. 9. 4. 22:18Part 1에서는 기계 학습(Machine Learning)이 문제를 해결하기 위해 코드를 전혀 작성하지 않고도, 일반 알고리즘(generic algorithm)을 사용해서 주어진 데이터에서 흥미로운 것을 알아낼 수 있다는 것을 알 수 있었다.
이번에는 신경망(neural network)와 기존의 슈퍼 마리오 레벨들을 통해서 사람들이 만든 것처럼 보이는 새로운 레벨을 제작할 것이다.
#1. 좀 더 영리하게 추측하기
Part 1에서, 주택의 속성을 기반으로 주택 가치를 추정하는 간단한 알고리즘을 만들었다. 어떤 주택에 대한 데이터가 다음과 같다고 가정해 보자.
좀 더 간단한 추정 함수(estimation function)를 만들었다:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
price = 0
# 이건 한 꼬집 넣고
price += num_of_bedrooms * 0.123
# 그리고 저건 한 스픈 정도 넣고
price += sqft * 0.41
# 이건 아마도 한 줌 넣고
price += neighborhood * 0.57
return price
즉, 각 속성에 가중치를 곱하여 주택 가격을 추정했다. 그런 다음 이 값들을 더해서 주택의 최종 가치를 얻었다.
코드를 사용하는 대신, 다음과 같이 함수를 표현할 수 있다.
하지만, 이 알고리즘은 입력데이터와 결과 사이에 선형(linear) 관계가 있는 단순한 문제에 대해서만 동작한다.
그러나 선형 관계가 아닌 여러 복잡한 세부사항이 적용하기 위해 각각 다른 경우에 적용되는 서로 다른 가중치를 사용해서 알고리즘을 여러 번 실행해 볼 수 있다.
이제 서로 다른 네가지의 가격 예측이 있고, 이 네 가지 가격 예측들을 하나의 최종 예측으로 결합할 것이다.
최종 해답을 위해 네 가지 시도의 예측들을 결합하였다. 이러한 방법을 이용하면, 하나의 간단한 모델에서 다룰 수 있는 것보다 더 많은 사례에 대한 모델링을 할 수 있다.
#2. 신경망(Neural Network)이란 무엇인가?
앞서 진행한 네가지 시도를 하나의 큰 다이어그램으로 결합해 보자.
이것이 바로 신경망(Neural Network)이다. 각 노드는 이련의 입력을 받아 들여 가중치를 적용하고, 출력 값을 계산하는 방법을 알고 있다. 이렇게 많은 노드를 서로 연결함으로써, 우리는 복잡한 함수를 모델링할 수 있다.
- 뉴런(neuron) : 일련의 입력을 받고 가중치를 곱해 출력을 얻는 간단한 추정 함수
- 단순한 뉴런들(neurons)을 서로 연결함으로써, 하나의 단일 뉴런으로 모델링하기에는 너무 복잡한 함수를 모델링 할 수 있다.
#3. 신경망(Neural Network)에 메모리 주기
앞서 살펴본 신경망은 동일한 입력을 주면 항상 같은 결과를 반환한다. 메모리(기억 장치)가 없기 때문이다. 다시말해 상태 비저장 알고리즘(stateless algorithm)이다. 그러나 이런 종류의 모델은 시간이 지남에 따라 변하는 데이터의 패턴에 대응하지 못한다.
예를 들어 사람들에게 이야기를 하나 써보라고 할 때 타이핑 할 첫 번째 글자를 예측하는 문제가 있다고 하자. 과거에 쓴 이야기를 보고 시작 부분에서 일반적으로 사용하는 단어를 바탕으로 범위를 좁혀나갈 수 있다. 일단 모든 데이터가 확보되면, 신경망을 구축해서 글을 시작할 때 특정 글자를 얼마나 사용할 가능성이 있는지를 모델링할 수 있다.
모델은 아마 다음과 같을 것이다.
문제를 좀 더 어렵게 만들어서 이야기의 어느 부분에서든 입력 할 다음 글자를 추측해야 한다고 가정해 보자.
어니스트 헤밍웨이(Ernest Hemingway)의 The Sun Also Rieses의 처음 몇 단어를 예로 들어 보자.
Robert Cohn was once middleweight boxi
다음에 올 글자는 무엇일까?
우리는 저 문장에서 보이는 글자들과 영어의 일반적인 단어에 대한 지식을 바탕으로 'n'이 올 것으로 추측할 것이다. 그리고 그 단어는 아마도 boxing 일 것이다. 또한, '미들급(middleweight)'이라는 단어는 권투에 대해 이야기하고 있다는 추가 단서를 제공해 준다.
신경망으로 이 문제를 해결하려면, 모델에 상태(state)를 추가해야 한다. 신경망에 응답을 요청할 때마다 중간 계산 결과들을 저장하고 다음 입력의 일부로서 다시 사용할 수 있다. 그렇게 하면, 모델은 최근의 입력을 기반으로 예측을 조정하게 된다.
모델에서 상태를 기록해 두면 그 이야기에서 가장 가능성있는 첫글자를 예측하는 것이 아니라 이전의 모든 문자를 고려해서 가장 가능성있는 다음 글자를 예측할 수 있게 된다.
ex) 핸드폰 키보드에 있는 자동 예측(auto-predict) 기능
#4. 이야기 만들기
허밍웨이의 다음 문장을 어떻게 추측 할 수 있는지 알아보았다. 이제 허밍웨이 스타일로 전체 이야기를 만들어 보자. 이를 위해 Andrej Karpathy가 작성한 순환 긴경망 구현(Recurrent Neural Network implementation)을 사용할 것이다.
84개의 고유한 문자(구두점, 대문자/소문자 등 포함)를 사용해서 총 362,239 글자로 쓰여진 The Sun Also Rises의 전체 텍스트로부터 모델을 제작할 것이다.
RNN 훈련을 100회 반복한 후 작성된 내용은 다음과 같다.
hjCTCnhoofeoxelif edElobe negnk e iohehasenoldndAmdaI ayio pe e h’e
btentmuhgehi bcgdltt. gey heho grpiahe.
Ddelnss.eelaishaner” cot AAfhB ht ltny
ehbih a”on bhnte ectrsnae abeahngy
amo k ns aeo?cdse nh a taei.rairrhelardr er deffijha
단어들 사이에 가끔씩 공백이 있다는 정도는 알아냈지만, 이게 전부이다.
1,000회 반복 한 후에는 가능성이 조금 보인다.
hing soor ither. And the caraos, and the crowebel for figttier and ale the room
of me? Streat was not to him Bill-stook of the momansbed mig out ust on the
bull, out here. I been soms
inick stalling that aid.
“Hon’t me and acrained on .Hw’s don’t you for the roed,” In’s pair.”
“Alough marith him.”
모델은 이제 기본 문장 구조의 패턴을 시벽하기 시작했다. 문장의 끝 부분에 마침표를 찍고 심지어 묻고 답하는 대화도 추가했다. 몇 마디는 알아볼 수 있지만, 여전히 많은 부분이 말도 안된다.
그러나 수천 번의 훈련을 수행하니 꽤 괜찮아 보인다.
He went over to the gate of the café. It was like a country bed.
“Do you know it’s been me.”
“Damned us,” Bill said.
“I was dangerous,” I said. “You were she did it and think I would a fine cape you,” I said.
“I can’t look strange in the cab.”
“You know I was this is though,” Brett said.
“It’s a fights no matter?”
“It makes to do it.”
“You make it?”
“Sit down,” I said. “I wish I wasn’t do a little with the man.”
“You found it.”
“I don’t know.”
“You see, I’m sorry of chatches,” Bill said. “You think it’s a friend off back and make you really drunk.”
이 시점에서, 알고리즘은 허밍웨이의 짧고 직접적인 대화 방식의 기본 패턴을 감지해 냈다. 또한 몇가지 문장은 대충 말이 된다.
실제 책에 있는 텍스트와 비교해 보자.
There were a few people inside at the bar, and outside, alone, sat Harvey Stone. He had a pile of saucers in front of him, and he needed a shave.
“Sit down,” said Harvey, “I’ve been looking for you.”
“What’s the matter?”
“Nothing. Just looking for you.”
“Been out to the races?”
“No. Not since Sunday.”
“What do you hear from the States?”
“Nothing. Absolutely nothing.”
“What’s the matter?”
한 번에 한 글자를 예측하는 패턴을 찾는 것만으로도 올바른 형식으로 그럴듯하게 보이는 산문을 재현해 냈다.
이 아이디어는 패턴이 있는 모든 종류의 데이터에 적용할 수 있다.
#5. 실제로 마리오 게임 레벨을 만들지 않고 마리오 게임 레벨 만들기
2015년, Nintendo사는 Wii U 게임 시스템 용 Super Mario Maker를 출시했다.
이 게임을 사용하면 게임패드에서 자신만의 슈퍼 마리오 브라더스(Super MArio Brothers) 레벨을 그릴 수 있고, 이를 인터넷에 업로드하면 친구들이 이 레벨을 플레이할 수도 있다.
가짜로 허밍웨이의 글을 만들어 낸 동일한 모델을 사용해서 가짜 슈퍼 마리오 브라더스 레벨을 만들어 낼 수 있을까?
우선, 모델을 훈련시킬 데이터 세트가 필요하다. 1985년에 출시된 진짜 슈퍼 마리오 브라더스 게임의 모든 야외 레벨(outdoor levels)을 사용할 것이다. 각 레벨의 디자인을 얻기 위해서, 게임 원본의 게임 메모리에서 레벨 디자인을 빼내는 프로그램을 작성하였다.
게임에서 추출한 첫 번째 레벨이다.
자세히 살펴보면 레벨은 단순한 격자 객체들로 구성되어 있음을 알 수 있다.
우리는 각 객체를 표현하는 문자를 사용해서 이 격자를 일련의 문자열로 쉽게 나타낼 수 있다.
- '-' : 빈공간
- '=' : 딱딱한 블럭
- '#' : 깰 수 있는 벽돌
- '?' : 코인 블럭
등등 레벨에 있는 여러 객체들에 각각 다른 문자를 사용했다.
이 텍스트 파일을 살펴보면, 마리오의 레벨은 줄(line) 단위로 보면 실제로 별 다른 패턴이 없다는 것을 알 수 있다.
줄 단위로 읽어보면 실제로 캡처할 패턴이 없다. 많은 줄들이 완전히 비어있다.
레벨의 패턴은 레벨을 일련의 열(column)으로 생각할 때 들어나게 된다.
열 단위로 보면 실제 패턴이 있다. 예를 들어, 각 열은 '='로 끝난다.
따라서 알고리즘이 데이터에서 패턴을 찾을 수 있게 하기 위해서는 데이터를 열별로 제공(feed)해야한다. 입력 데이터의 가장 효과적인 표현을 찾는 것(feature selection)은 기계 학습 알고리즘을 잘 사용하기 위한 중요한 요수 중에 하나이다.
모델을 훈련시키기 위해서, 텍스트 파일을 90도 회전해야 했다. 이를 통해 패터이 보다 쉽게 들어나는 순서에 따라 모델이 문자열을 제공(feed)할 수 있었다.
모델 훈련시키기
허밍웨이의 산물을 위한 모델을 만들 때 확인했듯이, 훈현시킬 수록 모델은 향상된다.
약간의 훈련 후 살펴보니 아직 쓸모없는 것을 만들고 있다.
현재는 '-'와 '='가 많ㅇ히 나타나야 한다는 생각을 가지고 있지만, 그 뿐이다. 아직 패턴을 전혀 알아내지 못하였다.
수천 번의 반복을 진행하자, 이제 다음과 같은걸 보기 시작한다.
이제 각 줄이 동일한 길이여야 한다는 것을 거의 알아냈다. 또한 Mario의 로직 일부를 이해하기 시작했다. (마리오에서 파이프는 항상 2 블럭 넓이이고 높이는 최소 2 블럭 이상이므로 데이터에 "P"들은 2x2 클러스터(cluster)로 나타나야 한다.)
더 많은 훈련을 하면, 모델은 결국 완벽하게 유효한 데이터를 생성하게 된다.
모델에서 만들어진 전체 레벨의 가치 있는 데이터를 가져와 수평으로 회전시켜 보자.
- 진짜 마리오 레벨처럼 Lakitu(구름을 타고 떠다니는 괴물)를 레벨의 사작되는 하늘에 집어 넣는다.
- 파이프는 그냥 공중에 떠있는 것이 아니라 반드시 딱딱한 블럭들 위에 있어야 한다는 것을 알고 있다.
- 적절한 장소에 적을 배치한다.
- 플레이어가 앞으로 나아갈 수 없도록 막는 어떠한 것도 만들지 않는다.
- 게임에 들어있는 실제 레벨에서 그 스타일을 따왔기 때문에, 슈퍼 마리오 브라더스 1의 실제 레벨 같이 느껴진다.
이 레벨을 가져와 Super Mario Maker에서 재현해 보자.
#6. 장난감 vs. 실제 애플리케이션
우리가 모델을 훈련시키는데 사용한 순환 신경망(recurrent neural network 또는 RNN) 알고리즘은 실제 회사에서 음석 인식이나 번역과 같은 어려운 문제를 해결하는 데 사용하는 알고리즘과 같은 종류이다.
더 많은 산업 분야에서 기계 학습이 더욱 중요해 짐에 따라, 좋은 프로그램과 나쁜 프로그램의 차이는 모델을 훈련시기는 데 얼마나 많은 양의 데이터를 확보했느냐가 될 것이다.
'무지성 작업실 > WSS 세미나 - Face Recognition' 카테고리의 다른 글
[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 4 (0) | 2021.09.08 |
---|---|
[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 3 (0) | 2021.09.05 |
[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 1 (2) | 2021.09.04 |