반응형

01. 빅데이터

스토리지 확보

오브젝트 스토맂

개인정보 보호

 

 

02. 사물인터넷과 분산 인공지능

사물인터넷 IoT Internet of Things은 인터넷에 연결된 사물이 데이터를 주고 받는다는 개념입니다.

 

사물인터넷 로봇을 이용한 분산 인공지능

 

03. 뇌 기능과 로봇

뇌 기능 탐구

 

소뇌의 모델링

 

04. 메타 인지

메타인지 = 자신의 사고와 행동을 객관적으로 파악하고 인식해서 상황에 맞게 설명하거나 조절하는 것

메타인지 기능을 인공지능에 탑재하려는 시도

 

05. 일본 인공지능 기술 동향

기관과 산업 분야의 인공지능 기술 동향

인공지능의 기술 발전 수준 예측

인공지능 서비스 개발 방향

 

 

 출처 : 처음 배우는 인공지능

반응형
반응형

머신러닝과 딥러닝을 이용한 데이터 분석은 대량의 데이터를 다룰 뿐만 아니라 처리 속도가 높아야 하므로 기기의 하드웨어 스펙도 높은 성능을 보유해야 합니다.

 

01. 분산 컴퓨팅과 병렬 컴퓨팅

기본적으로 많은 컴퓨팅 자원이 있어야 하므로 대규모 계산기 시스템 또는 대형 계산기 시스템이라고도 합니다.

 

02. 분산 컴퓨팅 하드웨어 환경

그리드 컴퓨팅

컴퓨터 다수를 서로 연결해서 계산 처리를 분산하는 슈퍼컴퓨터가 있습니다.

스토리지 시스템

컴퓨터 다수가 서로 통신하면서 계산 처리를 하는 컴퓨터 집합을 컴퓨터 클러스트라고 하며 컴퓨터 클러스터를 이용해 대규모 계산량이 필요한 고도의 처리를 고성능 컴퓨팅High Performace computing이라고 합니다. 

 

GCP: GOOGLE CLOUD Platform

GPGPU: 화상 처리 장치 Graphics Processing Unit, GPU :그래픽 가속기의 중심

 

매니코어 cpu

Many-core: 수백개의 코어를 가진 CPU 

 

FPGA: Field-Programmable Gate Array: 전용 개발 환경을 이용해 회로를 자유롭게 고칠 수 있는 것 

장점:

스트리밍 데이터를 고속으로 처리하므로 비디오 압축과 변환 등 실시간 데이터 처리가 필요할 때 이용합니다.

전용 LSI 와 비교했을 때 속도나 회로 집적도는 낮지만 하드웨어와 소프트웨어 모두에 대응한다는 편의성이 있으므로 프로토타입 구축 등에 많이 사용합니다.

gpu등과 비교 했을 떄 소비 전력이 작으므로 부동 소수점 연산까지 정밀도를 요구하지 않는 연산 처리에 유용합니다.

 

03. 분산 컴퓨팅 소프트웨어 환경 

멀티 프로세스 

멀티태스킹은 프로세스마다 처리해야 할  역할이나 데이터를 나눠서 데이터 처리를 효율화하려는 목적이 있습니다.

부모프로세스 , 자식 프로세스 

여러개 cpu에서 프로세스를 병렬 처리하는 표준 규격으로 MPI Message Passing Interface가 있습니다.

 

멀티 스레드

프로세스 안의 메모리 공간을 공유해서 부모 스레드가 자식 스레드를 생성하고 호출할 수 있습니다.

 

아파치 하둡 Apache Hadoop은 야후 리서치의 더그 커팅이 개발한 대규모 분산 처리 프레임워크입니다.

구글에서 개발한 구글 파일 시스템과 맵리듀스의 개념을 기반으로 둔 클론 소프트웨어로 개발한 것입니다.

 

HDFS " 마스터 노드인 네임 노드 와 슬레이브 노드인 데이터 노드로 구성된 클러스터입니다.

 

맵리듀스

여러 프로세스가 각각  키-값 형태로 데이터를 취합하는 맵 처리 , 집계가 끝난 키-값 형태의 데이터를 통합하는 셔플처리 , 맵 처리를 정리하는 리듀스 처리로 나눠 데이터를 다룹니다.

 

YARN Yet-Another-Resource-Negotiator은 하둡의 맵리듀스 처리 부분을 새롭게 만든 하둡 2.0 이상의 자원 처리 플랫폼입니다.

 

아파치 스파크: 하둡 기반 대규모 데이터 분산 처리 시스템

 

04. 머신러닝과 딥러닝 개발 환경

머신러닝 개발에 이용하는 주요 환경

구글 클라우드 플랫폼 => 구글 예측 API

마이크로소프트 애저 머신러닝  => 마이크로 애저 머신러닝(AzureML) ,아마존 머신러닝(AmazonML)

아마존 머신러닝 : AWS와의 친환성이 강점인 머신러닝 환경입니다.

IBM 블루믹스 : 

IBM 왓슨 : 자연어 분류와 대화 , 검색과 순위 매기기, 문서 변환, 음성 인식, 음성 합성 등의 고급 기능을 통해 애플리케이션 개발을 지원하는 플랫폼입니다.

 

딥러닝 개발에 이용하는 주요 환경

카페 : 버클리 버전& 러닝 센터가 중심이 되어 개발하는 딥러닝 프로임워크입니다. 파이썬과 MATLAB에서 사용할 수 있습니다.

테아노: 딥러닝을 위한 파이썬 라이브러리입니다.  이미지 인식 등 특정 처리 용도의 라이브러리가 아니고 수치 계산 전반을 실행하는 딥러닝 도구라는 성격이 강합니다.

체이너  : 일본 기업인 프리퍼터 네트워크스가 제공하는 오픈 소스 딥러닝 프레임워크입니다. 일본어 지원을 받기 쉬운것이 장점입니다.

텐서플로 : 알파고 

MXNet 2016년에 들어 주목받는 딥러닝 라이브러리

케라스 : 

 

머시러닝과 딥러닝 개발을 위한 프로그래밍 언어

 

 

 

 

출처 : 처음 배우는 인공지능

반응형
반응형

01. 데이터베이스

데이터베이스의 종류

정보를 어디에 저장해두어야 합니다.

 

파일 시스템 : 데이터를 관리하려면 OS레벨의 파일 관리가 필수입니다. 

이렇게 데이터를 배치하고 관리하는 체계를 파일 시스템이라고 합니다. 

윈도우를 사용했다면 한번쯤 들어봤을 때 FAT file Allocation Tables와 NTFS New Technology File System

 

FAT : 디스크의 앞에 디렉토리(폴더)를 관리하는 파일 이름 외에 데이터 실제 내용의 위치를 나타내는 디스크 클래스터 번호를 매핑해 디스크에 기록하는 시스템입니다.

리눅스 ext4

솔라리스 ZFS(128 비트 파일 시스템입니다.)등 

 

관계형 데이터베이스 :

데이터를 체계적으로 관리할 때는 관계형 데이터베이스 관리 시스템Relational DataBase Management System RDBMS을 이용합니다.

 

SQL

NoSQL : 각 레코드의 구성이 일정하지 않고 변화하는 데이터를 비젼형 데이터라고 합니다.

 

02. 검색 

덱스트 검색 방법: 데이터로 저장된 텍스트 검색은 패턴 매칭이라고 합니다.

패턴 매칭 : 완전 일치, 전방 일치 , 후방 일치 , 부분 일치 등

 

데이터베이스 검색 

전체 텍스트 검색 

전치 인덱스 => Tokenizer

웨이블릿 행렬 

버로우즈 -휠러 변환 

 

03. 의미 네트워크와 시맨틱 웹

의미 네트워크

온톨로지: 의미 네트워크에 메타 데이터를 더하는 데이터 작성 방법입니다

링크드 데이터 

RDF :웹 상에 있는 개별 자원의 메타 데이터를 기술하는 귝격입니다.

SPARQL: Rdf로 작성한 정보를 검색하거나 추가 업데이트 등을 할 때

 

반응형
반응형

사람이 평소 말하는 언어나 읽는 문장을 자연어라고 합니다. 

언어나 문장을 컴퓨터가 처리 하게 하는 자연어 처리도 이미지 인식이나 음성 인식과 함께 머신러닝의 중요 응용 분야입니다.

 

01. 문장 구조 이해

자연어처리 :

자연어에 대응하는 개념은 인공어 입니다. 

 

기계가 자연어를 분석하고 해석해 의미를 이해한 결과로 사람에게 도움이나 피드백을 주는 것을 자연어 처리 라고 합니다. Natural Language Processing

자연어 처리는 문장을 단어로 나눠서 특징을 추출하고 다른 언어로 번역하는 등의 업무를 합니다. 

텍서트 마이닝이라는 분석 처리는 방대한 양의 문장에서 특징 단어나 문장을 추출해 시각화(그래프 등)합니다 .

 

띄어쓰기와 형태소 분석 

형태소 분석은 단어를 나누고 단어 분할로 얻은 단어의 품사를 인식하는 작업입니다. 품사 정보를 알면 단어 나누기 편히하므로  절 인식과 품사 인식을 함께 합니다. 

한국어 형태소 분석을 위한 개발 환경으로는ㄴ MeCabl, 코엔엘파이 KoNLPy등이 있습니다.

 

형태소 분석과 다른 단어 분할 방법으로 n-gram이 있습니다. 

문장으로 주어진 문자열을 n개 의 문자 창으로 설정해 문자 1개를 중복으로 포함하면서 단어를 생성한느 방법입니다.

문자 단위 n-gram

단어 단위 n-gram

 

형태소 분석이나 n-gram을 통해 단어 열로 분해한 상태(단어 각각의 배열이나 단어의 출현 횟수)를 하나의 묶음으로 나타내는 방법을 Bag-of-Words BoW모델이라고 합니다.

 

한편 베이즈 모델로 띄어쓰기하는 방법도 있습니다. 이를 비모수 베이즈 모델에 근거한 자율단어 분할법이라고 합니다. 

단어 목록이 없는 상황에서도 단어를 나눌 수 있는 것이 특징입니다.

이 방법은 디리클레 과정을 기반으로 둔 n-gram모델을 확장한 피트만-요 과정을 더 확장한 것입니다.

디레클레 과정에서 나타나는 단어 종류가 많을 수록 단어의 확률분포가 정해집니다.

 

그밖에 피트만-요 과정을 계층화한 계층 피트만-요 언어 모델 , 계층 피트만-요 언어 모델을 응용한 중첩 피트만-요 언어 모델도 있습니다. 이들은 공백을 없앤 영어도 단어를 이해할 수 있는 형태로 띄어쓰기할 수 있고 고문이나 해석할 수 없는 미지의 언어 등에도 사용할 수 있습니다.

 

02. 지식 습득과 통계 의미론

지식 획득 knowledge acquisition

컴퓨터 시스템(전문가 시스템 등)에 주어진 자연어 데이터는 지식과 특징을 추출해 정보를 얻을 수 있습니다. 이 정보를 지식 기반에 저장하는 것 

문서의 특징량 지표로 문서 검색에서 일반적으로 이용하는 TF-IDF가 있습니다.

TF 는 단어 빈도 (Term Frequency)라고 하며 문서 안 단어의 출현 빈도를 의미합니다. 

IDF는 역문서 빈도(Inverse Document Frequency)라고 하며 전체 문서 중 어떤 단어가 나오는 문서 수 (전체 문서 수로 나눈 빈도)의 역수를 구한 후 로그를 취한 다음에 1을 더한 값입니다.

 

이를 피하는 방법으로는 잠재 의미 인덱싱 Latent Sematic Indexing LSI이 있습니다.

특잇값 분해로 차원을 압축해서 중요도가 낮아 보이는 단어를 없애 상대적인 유사도를 높입니다.

또한 행렬 분해 기법인 잠재 의미 인덱싱에 확률 요소를 도입한 언언 모델로 확률 잠재 의미 인덱싱 Probabilistic Latent Semantic Indexing , PLSI이 있습니다. 문서에 나오는 단어 주제의 분포에서 단어 분포가 생성된다는 것을 모델화한 것입니다.

 

모델화한 잠재 디리클레 할당

주제 모델 Topic model: 어떤 단어가 어떻게 문서나 주제에서 생성된느지 계산 모델로 검토하는 연구 영역

워드넷 WordNet

word2vec : 단어의 관계를 두 계층의 신경망에서 추정해 백터 공간에 나타낸 모델로 

 

03. 구조 분석

할당 분석

할당은 단어와 단어 사이의 관계를 나타내는 것으로 관계를 파악하면 문장의 의미를 이해할 수 있습니다.

할당받은 구조를 기계적으로 처리해서 관계를 파악하는 방법을 할당 분석이라고 합니다.

 

이동-감축 shift-reduce법이고  두가지 작업을 반복하면  트리 구조를 형성합니다. 

 이동 처리는 분석하지 않은 단어 열의 왼쪽(첫번째)을 트리에 넣는 작업니다. 

 감축 처리는 트리 집합 중 오른쪽 2개의 단어를 화살표로 연결하는 작업니다.

 

최소 생성 트르 Minimum Spanning Tree, Mst : 단어를 노드로 구성하는 그래프를 작성합니다. 

그리고 단어 사이의 관계에 점수를 설정한 후 높은 조합을 남겨서 트리 구조를 생성합니다.

 

이동-감축법이 단어를 하나씩 처리한다면 최소 생성 트리법은 한꺼번에 처리합니다. 

정밀도 측면에서는 최소 생성 트리법이 좋지만 처리 시간이 길어서 시간 효율성은 이동- 감축법이 좋습니다.

 

술어 줄 구조 분석 : 문장의 의미는 술어 대상을 나타내는 명사구 절로 표현할 수 있으므로 이들을 식별하는 처리를 술어 절 구조 분석이라고 합니다.

어구 구조 분석 : 단어 열로 구성된 어구를 통해 구조를 파악하는 방법으로 는 어구 구조 분석이 있습니다.

 

딥러닝

순환 신경망 Long Short-Term Memory를 자주 이용합니다.

순환신경망 이용은 단어 열의 나열을 시계열 상의 입력 데이터로 취급하는 것이 핵심입니다.

Long Short-Term Memory은 순환 신경망을 더 안정적으로 처리할 필요가 있을 때 사용합니다

한편 절 구조를 갖는 트리 구조로 단어 열을 다루면 재귀 신경망을 이용할 수 도 있습니다.

 

04. 텍스트 생성

기계번역: 기계를 통해 이해하기 어려운 문장을 원래의 문장으로 되돌리는 처리

어순의 차이는 기계 번역의 큰 장애물입니다.

목적 언어의 구조 정보를 이용  string - to - tree : 목적 언어의 구조 분석에 의존하는 장점과 처리 비용이 높다는 단점이 있습니다.

원래 언어의 구조 정보를 이용  tree-to-string : 번역문 생성은 단 시간에 된다는 장점이 있고 , 입력 문장의 구조에 따라 성능은 제각각이라는 단점이 있습니다.

양쪽 언어의 구조 정보를 이용 tree-to-tree

 => 순서가 크게 다르면 번역하는데 어려움이 있습니다.

구글은 더 자연스러운 번역 Google Neral Machine Translation GNMT

 

자동요약 

단일 문서의 추출형 요약 중 가장 단순하고 효과적인 방법으로 리드법이 있습니다.

 

통계 요약 Maximal Marginal Relevance, MMR알고리즘

문서 요약은 불필요한 구문 삭제 ,문장 결합, 구문 변형, 어휘 의역, 추상화/구체화 , 정렬 등의 여러가지 작업이 있습니다.

최대 피복 문제 Maximum coverage problem와 시설 입지 문제 Facility location problem 에 귀착시키는 것 등이 있습니다.

 

이미지에 설명 추가 및 문장 창작

집중 매커니즘 Attention mechanism: 인코더 -디코더 방법을 사용해 번역의 정화도를 높이는 것

Long Short-Term Memory을 이용한 음악 생성

순환 신경망을 이용한 영화 각본 생성

Conversation as a Platform-린나

린나는 TF-IDF와 word2vec 개념 외에도 순환 신경망을 중심으로 둔 딥러닝을 이용한다고 발표했습니다.

Deep Structured Semantic Models,DSSM

RNN-GPU Gated Recurrent Unit

GRU는 LSTM네트워크를 실현하는 블록의 하나입니다.

 

 

 

출처 : 처음 배우는 인공지능

반응형
반응형

소스코드.py
0.00MB

머신러닝을 이용한 패턴 인식의 대표적인 응용 사례는 이미지 인식과 음성 인식이 있습니다.

01. 패턴 인식 

 

패턴 인식

지도 학습은 특히 이미지와 소리 같은 데이터는 데이터 속의 일정한 패턴을 추출하고 조합해 학습하기 좋습니다. 이를 패턴 인식 프로그램이라고 하며 고전적인 머신러닝을 이용한 구축 방법과 2010년대 이후 트랜드인 딥러닝을 이용한 구축 방법이 있습니다.

 

딥러닝을 이용한 패턴 인식은 네트워크를 설계하는 것이 모델 검토입니다.

설계한 네트워크를 기반에 두고 자동으로 특징을 추출해서 얻은 특징량 정보와 함께 학습기로 사용합니다. 

따라서 딥러닝은 다음 문제를 해결해야 합니다.

1. 네트워크 설계의 시행착오를 줄여야 합니다.

2. 예상하지 않은 학습 결과가 나왔을 때 원인을 찾아야 합니다.

 

02. 특징 추출 방법

 

고전 해석학을 이용한 특징 추출 : 특징 추출의 전통적이고 기본적인 방법은 해석학을 이용한 접근입니다.

푸리에 변환 : 어떤 함수를 삼각함수와 비슷하게 나타낼 때를 생각해봅시다.

웨이블릿 벼환:

에이블릿은 0을 중심으로 증가와 감소를 반복한느 진폭을 수반한 파도와 같은 진동을 말합니다.

행렬 분핼르 이용한 특징 추출

 

03. 이미지 인식

컴퓨터 비전

디지털 이미지는 픽셀의 집합이며 픽셀 각각이 갖는 화소 값 데이터로 구성되어 있습니다.

얼굴및 사물 인식

검색 챙에 얼굴 이미지를 넣고 특징량을 구하면 얼굴 인식 학습기가 완성됩니다. 검색 창 안에 다시 하위 검색 창을 설정하면 더 작은 얼굴 영역의 특징량을 구할 수 도 있습니다. 이를 바이ㄹ올라-존스방법이라고 하며 openCV에서 사용합니다.

 

딥러닝 이용하기

특정 영역을 설정해 사물을 인식하는 합성곱 신경망에는 R-CNN이 있습니다.

R-CNN은 일반적인 합성곱 신경망 과는 달리 고전적인 사물 인식 방법으로 이용하는 영역 자르기CROPPING를 전처리한 것입니다.

 

R-CNN을 개선해 속도를 향상시킨 네트워크로는 Fast R-cnn, Faster R-CNN등이 있습니다.

 

특징 추출을 이용한 이미지 변환

super-resolution imaging : 영상 인식 외에 합성곱 신경망으로 이미지 인식 네트워크를 구현한 예는 축소된 이미지를 깔끔하게 확대할 수 있는 초해상도 이미지 인식이 있습니다.

 

2015년에 공개한 waifu2x 단순 확대

http://waifu2x.udp.jp/index.ko.html

 

waifu2x

waifu2x 컨볼루션 신경망(CNN) 시스템을 통한 딥 러닝으로 2차원 이미지의 해상도를 개선합니다. 그림뿐만 아니라 사진도 지원합니다. 실제 예제 보기 | GitHub에서 보기 This website uses Google Analytics to h

waifu2x.udp.jp

그래서 지금까지는 단순히 주변 픽셀과 평활화해서 안티 앨리어싱 anti aliasing했습니다만 그래도 어색한 느낌이 남아 있는 이미지 입니다. 

 

또 하나의 자율 학습 네트워크로 GAN generative Adversarial Network

Adversarial : 반대의 적대적인 의미라는 의미입니다. 

즉, 이미 완성된 학습기를 이용해 얻는 출력 결과 확률이 연속적이라는 점을 이용해 신경망을 통과하는 입력 이미지를 지정한 확률로 변환합니다.

GAN과 합성곱 신경망을 조합한 DCGAN Deep Convolutional GAN도 있습니다. 이를 이용한 이미지 생성 을 스타일 변환style transfer이라고 합니다.

 

04. 음성 인식

소리의 정보 표현

소리는 공기를 진동시켜서 전달합니다.

 

소리의 크기는 진폭, 높이는 단위 시간당 진동수로 결정됩니다.

소리 데이터를 읽고 , 쓰고 , 해석하려면 파형 데이터를 처리할 수 있는 프로그램이 필요합니다.

 

음성 인식 방법 

사람이 말한 소리에는 특정 주파수가 있습니다.

따라서 소리의 진폭을 푸리에 변환하면 주파수 특성을 알 수 있습니다.

공기의 진동 

음원인 성대는 소스가 되고 필터의 조합으로 소리가 들리므로 이를 소스 필터 모델이라고 합니다.

 

음성 인식 시스템 음절, 단어 , 단어열

음성 합성 은 말소리의 음성을 기계가 자동으로 만들어 내는 기술을 말합니다.

 

05. 텐서플로를 이용한 GAN구현하기

GAN는 오토인코더와 마찬가지로 대표적인 자율학습 모델의 하나입니다.

이번에는 위페범과 경찰이 연관된 위조화폐 제작과 감별을 gan으로 구현하겠습니다. 

다음 조건이 있습니다. 

 

위폐범은 위조화폐를 정교하게 만들고자 최선을 다합니다. 즉, 경찰이 위조화폐를 감별하지 못할 확률을 높이려고 노력합니다.

경찰은 위조화폐를 감별하는 데 최선을 다합니다. 즉 , 자신이 실수할 확률을 낮추려고 노력합니다.

위폐범(G)의 네트워크를 생성 네트워크(Generative Netowork)라고 합니다.

경찰(D)의 네트워크를 식별 네트워크 (Discriminator Networ)라고 합니다.

G는 D가 실수할 확률을 높이려고 노력(maximize)라고 , D는 자신의 실수 확률을 낮추려고 노력(minimize)하므로 이는 미니맥스 문제(minimax problem)입니다.

GAN에서는 어려운 확률분포를 다루지 않고 확률을 통해 생성한 샘플을 다룹니다.

G는 Z를 입력받으므로 G(Z) 라고 합니다. 이때 Z는 확률분포ㅎ와 맵핑하는 prior라는 개념입니다. 무작위 노이즈(Random noise)가 됩니다.

G(Z)의 결과는 위조화폐입니다.

D는 이미지 X를 입력받으므로 D(X)라고 합니다. D(X)의 결과물은 0~1 사이의 확률입니다.

양자의 균형을 맞추는 평행 상태에 이르면 G는 진짜 화폐와 100%같은 위조화폐를 만들며 D가 이를 감별할 확률은 0.5입니다.

 

필요한 모듈 불러오기

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('data/mnist', one_hot = True)

 

가중치 초기화

가중치의 초기화에 좋은 성능을 보이는 세이비어 초기화 xavier initialization함수로 만들어서 이용합니다.

def xavier_init(size):
    in_dim = size[0]
    xavier_stddev = 1. / tf.sqrt(in_dim/2)
    return tf.random_normal(shape= size, stddev = xavier_stddev)

 

식별 네트워크 노드수는 784->128->1 

#식별 네트워크
X = tf.placeholder(tf.float32, shape=[None, 784] , name = 'X')

W1_dis = tf.Variable(xavier_init([784, 128]), name = 'W1_dis')
b1_dis = tf.Variable(tf.zeros(shape=[128]), name = 'b1_dis')

W2_dis = tf.Variable(xavier_init([128, 1]), name = 'W2_dis')
b2_dis = tf.Variable(tf.zeros(shape=[1]), name = 'b2_dis')

theta_dis = [W1_dis, W2_dis, b1_dis, b2_dis]

 

생성 네트워크 노드수는 100->128->784

#생성 네트워크
Z = tf.placeholder(tf.float32, shape=[None, 100] , name = 'X')

W1_gen = tf.Variable(xavier_init([100, 128]), name = 'W1_gen')
b1_gen = tf.Variable(tf.zeros(shape=[128]), name = 'b1_gen')

W2_gen = tf.Variable(xavier_init([128, 784]), name = 'W2_gen')
b2_gen = tf.Variable(tf.zeros(shape=[784]), name = 'b2_gen')

theta_gen = [W1_gen, W2_gen, b1_gen, b2_gen]
def random_Z(z1, z2):
    return np.random.uniform(-1., 1., size=[z1, z2])

 

생성 네트워크 구축

def gen(z):
    h1_gen = tf.nn.relu(tf.matmul(z, W1_gen) + b1_gen) 
    log_prob_gen = tf.matmul(h1_gen, W2_gen) + b2_gen
    prob_gen = tf.nn.sigmoid(log_prob_gen)
    
    return prob_gen

 

식별 네트워크 구축

def dis(x):
    h1_dis = tf.nn.relu(tf.matmul(x, W1_dis) + b1_dis) 
    logit_dis = tf.matmul(h1_dis, W2_dis) + b2_dis
    prob_dis = tf.nn.sigmoid(logit_dis)
    
    return prob_dis, logit_dis
def plot(samples):
    fig = plt.figure(figsize= (4,4))
    grid = gridspec.GridSpec(4,4)
    grid.update(wspace= 0.1,  hspace = 0.1)
    
    for i , sample in enumerate(samples):
        ax = plt.subplot(grid[i])
        plt.axis('off')
        ax.set_xticklabels([])
        ax.set_yticklabels([])
        ax.set_aspect('equal')
        plt.imshow(sample.reshape(28,28) , cmap = 'gray')
        
    return fig

GAN학습하기

sample_gen = gen(Z)
real_dis, logit_real_dis = dis(X)
fake_dis, logit_fake_dis = dis(sample_gen)
loss_real_dis = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits= logit_real_dis, labels = tf.ones_like(logit_real_dis)))
loss_fake_dis = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit_fake_dis, labels=tf.zeros_like(logit_fake_dis) ))
loss_dis = loss_real_dis + loss_fake_dis
loss_gen = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = logit_fake_dis, labels= tf.ones_like(logit_fake_dis)))
solver_dis = tf.train.AdamOptimizer().minimize(loss_dis, var_list = theta_dis)
solver_gen = tf.train.AdamOptimizer().minimize(loss_gen, var_list = theta_gen)
batch_size = 128
dim_Z= 100
sess = tf.Session()
sess.run(tf.global_variables_initializer())
i = 0
for j in range(100000):
    if j % 2000 == 0:
        samples = sess.run(sample_gen, feed_dict={Z:random_Z(16, dim_Z)})
        fig = plot(samples)
        plt.show()
        i += 1
        
        plt.close(fig)
        
    X_batch, _ =  mnist.train.next_batch(batch_size)
    _, loss_curr_dis = sess.run([solver_dis, loss_dis], feed_dict = {X: X_batch, Z: random_Z(batch_size, dim_Z)})
    _, loss_curr_gen = sess.run([solver_gen, loss_gen], feed_dict = {Z: random_Z(batch_size, dim_Z)})
    
    if j % 2000==0:
        print('Iteration: {}'.format(j))
        print('Discriminator loss: {:.3}'.format(loss_curr_dis))
        print('Generator loss: {:.3}'.format(loss_curr_gen))
        print()

 

출처 : 처음으로 배우는 인공지능

반응형
반응형

합성공 신경망 CNN과 순환 신경망 RNN

 

01. 신경망의 다층화

다층 퍼셉트론

 

활성화 함수와 기울기 소실 문제

신경망의 활성화 함수는 출력 계층의 값이 커지면 최종 출력이 1로 수렴하는 단위 계단 함수와 로지스틱 함수를 사용했습니다.

 

쌍곡탄젠트 함수와 소프트 플러스 

선형 유닛Rectified Linear Unit ReLU

 

시그모이드 함수와 쌍곡 탄젠트 함수는 미분 계산을 기반으로 두는 함수지만 ReLU는 0 또는 입력값을 그대로 내보내므로 계산이 편리합니다.

심층 신경망 Deep Neural Network,DNN은 시그모이드 함수에 전파와 역전파를 여러 번 적용하다 보면 가중치가 발산하거나 곡선의 기울기가 0이 되어 버리는 기울기 소실 문제가vanishing gradient problem 발생하므로 ReLU를 사용합니다.

 

확률 기반 경사 하강법 sgd stochastic gradient Descent : 신경망 학습에서는 데이터 일부를 뽑은 미니 배치를 이용해 가중치를 반복해서 업데이트 하는 것

 

훈련 오차와 테스트 오차

학습 과정에서 얼마나 지도 학습 데이터에 오차가 발생하는지 나타내는 값을 훈련 오차라고 합니다.

학습기 구축 과정의 목표는 훈련 오차를 작게 만드는 것입니다.

매개변수 업데이트 횟수를 가로축으로 , 오차를 세로축으로 설정했을 때 만들어지는 곡선을 학습 곡선이라고 합니다.

 

미지의 데이터를 준비하는 것은 어려우므로 테스트 데이터를 이용해 오차를 확인합니다. 이때 오차를 테스트 오차라고 합니다.

 

정규화와 드롭아웃

과적합을 억제하는 방법으로 가중치 계수에 제한을 가하는 정규화가 있습니다.

신경먕에서 과적합을 억제하는 또 한가지 방법으로는 드롭아웃이 있습니다.

드롭아웃은 확률 기반으로 다층 네트워크 유닛을 선별한 상태에서 학습을 실행하는 것입니다.

 

그밖의 신경망 학습

데이터 정규화 

정규화 normalization

표준화 standardization

"평균을 0으로 한다." "분산(표준 편차)을 1로 한다."

"상관관계를 0으로 한다 " 같은 작업을 백색화 whitening라고 합니다.

정규화를 전처리 

 

데이터 확장

 

여러가지 네트워크 이용

구조가 다른 여러 개의 신경망을 구축하고 각각 학습한 다음 모델의 평균을 구하면 학습의 일반화 성능을 향상시킬 수 있습니다.

 

학습률 ε의 결정 방법

학습률을 자동으로 결정하는 알고리즘으로 확률적 경사 하강법의 하나인 에이다그래드 AdaGrad를 많이 사용합니다.

 

02. 제한 볼츠만 머신

볼츠만 머신과 제한 볼츠만 머신

볼츠만 머신은 노드들이 무향 그래프로 연결된 네트워크입니다.

볼츠만 머신은 퍼셉트론처럼 입력과 출력을 하는 유향 그래프가 아니므로 계산하기 어렵습니다.

제한한 것이 제한 볼츠만 머신Restricted Boltzmann Machine,RBM

제한 볼츠만 머신은 볼츠만 머신의 두 계층 중 같은 계층의 유닛은 서로 연결하지 않도록 구성되어 있습니다.

 

선행 학습 pre-training 

다층 네트워크를 입력받은 순서대로 제한 볼츠만 머신 같은 두 계층의 네트워크로 분리(오토인코더로 설정)합니다.

다층 네트워크는 기울기 소실 문제가 발생해 학습이 제대로 되지 않을 때가 있습니다. 계층을 깊게 할 수록 그 영향이 더 두드러집니다. 가중치 매개변수의 초깃값을 무작위로 결정하는 것도 원인 중 하나입니다. 이를 해결하는 방법으로 선행 학습이 있습니다.

 

03. 심층 신경망

지도학습과 자율 학습

심층 신경망: 유닛 수와 계층 수가 3가지 이상이 되도록 다층 구조를 취하는 신경망은 심층 신경망이라고 합니다. 

심층 신경망을 사용하는 학습을 딥러닝이라고 합니다. 

 

심층 신뢰 신경망 :

이 기술은 가시 계층에서 순서대로 제한 볼츠만 머신의 구조를 꺼내 학습합니다. 

심층 신뢰 신경망은 제한 볼츠만 머신의 축적만으로는 단순한 자율학습입니다.

 

오토인코더

오토인코더는 전파형 네트워크의 하나입니다.

특징:

1. 입력 데이터 1을 통해 얻은 출력 데이터 1을 다시 입력 데이터 2로 설정합니다.

2. 입력 데이터 2에서 얻은 출력 데이터 2를 입력 데이터 1과 비교합니다.

3. 출력 데이터 2와 입력 데이터 1이 서로 더 가까운 상태가 되는 특징을 얻습니다.

4. 얻은 특정을 통해 더 나은 데이터를 얻습니다.

오토인코더는 지도 데이터가 없는 자율학습입니다.

 

스파스 코딩

수학에서는 백터나 행렬의 많은 원소가 0일 때 이를 스파스하다고 합니다.

 

04. 합성공 신경망

합성곱 처리 

합성곱 신경망의 C는 합성공 Convolutional을 의미합니다.

2개의 함수 중 하나를 평행 이동시키면서 합성공을 취한 적분 값을 계산합니다. 

 

합성공 신경망의 구성

합성공 계층과 풀링 계층을 거쳐 입력 이미지의 특징을 추출해서 출력하는 이미지인 특징 맵을 얻습니다.

 

합성공 계층과 풀링 계층 사이에 정규화 계층을 포함하기도 합니다.

정규화 계층을 합성곱 계층에서 처리된 이미지에 관해 전체 화소 값의 평균을 0으로 하는 감산 정규화 또는 분산을 정력하는 나누기 정규화 등을 수행합니다.

 

이처럼 합성곱 계층과 풀링 계층 사이를 반복해서 거친 후 마지막에는 완전 연결 계층 fully connected layer을 구성해서 출력합니다.

 

 

출력 내용으로 분류 결과 또는 식별 결과(라벨링한 사물의 이름)을 얻고 싶을 때는 소프트맥스 softmax함수를 이용합니다. 각 라벨을 모두 합한 값이 1이게 변환(정규화)해서 확률 형태로 나타낼 수 있습니다.

 

풀링 계층에서는 단순히 미이지를 축소합니다.
축소 처리는 필수는 아니지만 후속 네트워크에서의 처리 부담을 가볍게 하는 효과와 축소 처리에 의한 특징량의 압축 효과가 있습니다.

 

05. 순환 신경망

순환 신경망 : Recurrent Neral Network , RNN은 몇 단계 전으로 거슬러 올라가 데이터를 반영할 수 있는 신경망입니다.

시계열 데이터 등의 맥락을 고려해 학습할 수 있으므로 음성 같은 파형 데이터나 자연어 등의 학습에 이용합니다.

 

순환 신경망의 학습은 확률적 경사 하강법을 이용하며 실시간 순환 학습 Real-Time Recurrent Learning, RTRL이나 시간 기반 오차역전파BackPropagation Through Time, BPTT로 가중치를 업데이트합니다.

 

심층 순환 신경망Deep RNN과 양방향 순환 신경망 Bidirectional RNN도 있습니다.

 

Long Short- Term Memory LSTM

순환 신경망은 거슬러 올라가는 단계 수가 많아지면 기울기 소실 문제 때문에 제대로 학습할 수 없습니다. 이문제를 개선한 것이 Long Short -Term Memory입니다.

LSTM은 신경망의 중간 계층에서의 각 유닛을 LSTM블록이라는 메모리 유닛으로 치환한 구조입니다. 

LSTM블록에는 입력 INPUT게이트, 망각 forget게이트 , 출력 output 게이트 라는 세가지 게이트가 있으며 메모리 셀에 저장된 1단계 이전의 상태를 망각 게이트에서 참조(요소곱)합니다. 그리고 입력 게이트와 망각 게이트를 잘 여닫으면서 출력을 조정합니다.

 

06. 텐서플로를 이용한 오토인코더 예제

오토인코더 모델 구성

오토인고더는 다음과 같은 조건으로 구성합니다.

1. 입력값으로 이미지만 포함합니다.(라벨 없음).

2. 은닉 계층의 노드 수가 입력 계층의 노드 수보다 적도록 구성합니다.

3. 출력 계층의 노드 수는 입력 계층의 노드 수와 같습니다.

4. 은닉 계층의 노드 수가 적으므로 주요 특징량(feature)위주로 추출합니다. 마치 주성분 분석과 비슷한 효과를 얻을 수 있습니다.

5. 출력 계층에서는 입력 계층의 값을 복원(reconstruction)할 수 있습니다.

 

필요한 모듈 불러오기

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./data/mnist/',one_hot = True)

 

이 경우 다시 수행하기 

하이퍼파라미터 설정하기

#모델 관련 하이퍼파라미터 설정
num_input = 28 * 28
#'입력 계층 노드 수 == 출력 계층 노드 수'이므로 num_output은 따로 정의하지 않습니다.
num_hidden = 256

#학습 관련 하이퍼파라미터 설정
learning_rate = 0.01
training_epoch = 10
batch_size = 100

#평가 관련 하이퍼파라미터 설정
num_output_sample = 10

 모델 만들기

오토인코더에는 라벨이 없습니다.

x_true = tf.placeholder(tf.float32, [None, num_input])

손실 함수의 기준으로 삼기 위해 y_true를 x_true와 같게 설정합니다.

y_true = x_true

인코더: 입력 계층 -> 은닉 계층

디코더: 은닉 계층 -> 출력 계층

 

인코더

weight_encoder = tf.Variable(tf.truncated_normal([num_input, num_hidden]))
bias_encoder = tf.Variable(tf.truncated_normal([num_hidden]))

디코더 

weight_decoder = tf.Variable(tf.truncated_normal([num_hidden, num_input]))
bias_decoder = tf.Variable(tf.truncated_normal([num_input]))

인코더와 디코더를 설정합니다. 그리고 선형 연산과 비선형 연산을 적용합니다.

encoder = tf.nn.sigmoid(tf.add(tf.matmul(x_true, weight_encoder), bias_encoder))
decoder = tf.nn.sigmoid(tf.add(tf.matmul(encoder, weight_decoder), bias_decoder))

cost optimizer

cost = tf.reduce_mean(tf.square(y_true - decoder))
optimizer = tf.train.AdamOptimizer(learning_rate)
optimizer = optimizer.minimize(cost)

 

모델의 학습 시작하기

sess = tf.Session()
sess.run(tf.global_variables_initializer())
total_batch = mnist.train.num_examples/batch_size #550
total_batch

for epoch in range(training_epoch):
    total_cost = 0
    for i in range(total_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        _, cost_value = sess.run([optimizer, cost],{x_true:batch_xs})
        total_cost += cost_value
    print("Epoch : {0}, Cost : {1}.format(epoch+1, total_cost/total_batch))
    
print("최적화를 완료했습니다.")

for epoch in range(training_epoch):
    total_cost = 0
    for i in range(int(total_batch)):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        _, cost_value = sess.run([optimizer, cost],{x_true:batch_xs})
        total_cost += cost_value
    print("Epoch : {0}, Cost : {1}".format(epoch+1, total_cost/total_batch))
    
print("최적화를 완료했습니다.")

평가하기

samples = sess.run(decoder, {x_true : mnist.test.images[:num_output_sample]})
fig, ax = plt.subplots(2, num_output_sample, figsize= (num_output_sample, 2))
for i in range(num_output_sample):
    ax[0][i].set_axis_off
    ax[1][i].set_axis_off
    ax[0][i].imshow(np.reshape(mnist.test.images[i], (28,28)))
    ax[1][i].imshow(np.reshape(samples[i], (28,28)))
plt.show()    

07. 텐서플로를 이용한 합성곱 신경망 예제

여기에서는 합성공 신경망을 구축하고 학습시켜 MNIST데이터를 얼마만큼 정확하게 분석하는지 확인하겠습니다.

 

필요한 모델 불러오기

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./data/mnist/',one_hot = True)

합성곱 신경망 모델 만들기

x_true = tf.placeholder(tf.float32, [None, 28,28,1])
y_true = tf.placeholder(tf.float32, [None, 10])

은닉 계층 1을 정의합니다.

(3,3) 크기를 가지는 필터를 설정합니다.

Stride와 padding을 설정해 합성곱을 구합니다.(tf.nn.conv2d()이용)

비선형 ReLU함수(tf.nn.relu()이용)를 적용합니다.

최대 풀링(Max pooling , tf.nn.max_pool()이용)합니다.

0.8의 확률로 드롭아웃(dropout, tf.nn.droupout()이용)합니다.

 

weight_1 = tf.Variable(tf.truncated_normal([3,3,1,32], stddev = 0.01))
hidden_1 = tf.nn.conv2d(x_true, weight_1, strides= [1,1,1,1] , padding= 'SAME')
hidden_1 = tf.nn.relu(hidden_1)
hidden_1 = tf.nn.max_pool(hidden_1, ksize = [1,2,2,1] , strides = [1,2,2,1] , padding = 'SAME')
hidden_1 = tf.nn.dropout(hidden_1, keep_prob= 0.8)
weight_2 = tf.Variable(tf.truncated_normal([3,3,32,64], stddev = 0.01))
hidden_2 = tf.nn.conv2d(hidden_1, weight_2, strides= [1,1,1,1] , padding= 'SAME')
hidden_2 = tf.nn.relu(hidden_2)
hidden_2 = tf.nn.max_pool(hidden_2, ksize = [1,2,2,1] , strides = [1,2,2,1] , padding = 'SAME')
hidden_2 = tf.reshape(hidden_2, [-1, 7*7*64])
hidden_2 = tf.nn.dropout(hidden_2, keep_prob = 0.8)
weight_3 = tf.Variable(tf.truncated_normal([7*7*64 , 256], stddev = 0.01))
fc_1 = tf.matmul(hidden_2, weight_3)
fc_1 = tf.nn.relu(fc_1)
fc_1 = tf.nn.dropout(fc_1, 0.5)
weight_4 = tf.Variable(tf.truncated_normal([256 , 10], stddev = 0.01))
y_pred = tf.matmul(fc_1, weight_4)

 

cost = tf.nn.softmax_cross_entropy_with_logits(logits= y_pred, labels= y_true)
cost = tf.reduce_mean(cost)
optimizer = tf.train.AdamOptimizer(learning_rate= 0.01)
optimizer = optimizer.minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
batch_size = 100
num_batch = int(mnist.train.num_examples/batch_size) #550
for epoch in range(10):
    total_cost = 0
    for i in range(num_batch):
        batch_xs, batch_ys = mnist.train.next_batch(batch_size)
        #,합성곱 신경망 모델을 위한 데이터 타입인 [28,28,1]의 형태로 reshaping
        batch_xs = batch_xs.reshape(-1, 28, 28, 1)
        _, cost_value = sess.run([optimizer, cost],{x_true:batch_xs, y_true:batch_ys})
        total_cost += cost_value
    print("Epoch : {0}, Cost : {1}".format(epoch+1, total_cost/num_batch))
    
print("최적화를 완료했습니다.")

 

평가하기

correct_prediction = tf.equal(tf.argmax(y_pred, 1) , tf.argmax(y_true, 1))
accuracy =  tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print("정확도 : {0}".format(sess.run(accuracy, {x_true:mnist.test.images.reshape(-1,28,28,1), y_true:mnist.test.labels})))

소스코드.py
0.00MB

 

출처 : 처음 배우는 인공지능

반응형
반응형

01. 앙상블 학습 ensemble learning

학습기 하나로 원하는 성능을 낼 수 없을 때 앙상블 학습이 효과적입니다.

앙상블 학습은 개별로 학습한 여러 학습기를 조합해 일반화 성능을 향상할 수 있습니다.

 

배깅 bagging

배깅은 부트스트랩 방법을 이용해 학습 데이터에서 m개의 복원 추출을 B회만큼 반복합니다.

그러면 작게 나눈 m개의 데이터를 포함하는 B회의 학습 데이터를 생성할 수 있습니다.

부트스트랩 방법은 데이터를 샘플링해 의사 데이터 세트를 생성하는 리샘플링 방법으로 통계의 편향이나 분산을 추정할 때 사용합니다.

 

각각의 학습 데이터로 학습하면서 약학습기 h를 구축한 후 통합하면 학습기 H가 됩니다. H는 학습 데이터의 식별이나 확인에는 가장 우수한 결과를 선택하며 회귀일 때는 h의 평균을 이용합니다.

 

랜덤포레스트와의 차이

랜덤포레스트도 배깅과 마찬가지로 무작위 데이터를 추출한 후 작은 데이터 세트에서 학습을 실행합니다.

배깅은 학습 데이터의 설명 변수를 모두 사용하며 랜덤포레스트는 설명 변수도 무작위로 추출한다는 차이가 있습니다.

 

부스팅

약학습기를 순서대로 하나씩 결합해 강학습기를 얻는 방법입니다.

기대하는 인식 결과를 내고 싶은 데이터 세트와 그렇지 않은 데이터 세트로 나눈 후 특화된 데이터마다 만드는 약학습기를 순서대로 결합하면 인식 결과의 정확도가 높은 강학습기를 얻을 수 있습니다.

 

에이다부스트 알고리즘

2개의 값 분류에 관한 약학습기 구축 알고리즘입니다.

 

오류율은 선택한 약학습기의 인식률이 얼마나 높은지를 나타냅니다. 

오류율이 0.5를 넘으면 예측보다 정밀도가 낮다는 뜻이므로 약학습기 만들기를 종료합니다.

그리고 오류율에서 중요도를 계산한 후 그 값을 이용해 가중치 D를 업데이트 합니다.

 

 

02. 강화 학습

기계가 사람처럼 미지의 데이터에도 대응하도록 스스로 학습기를 변화시킬 수 있는 구조가 필요합니다. 이를 뒷발질하는 것이 강화학습니다.

 

강화 학습이라는 이름은 심리학의 조작적 조건화에 기반을 두고 자발적인 행동의 빈도를 증가시키는 것을 강화라고 하는 데서 유래했습니다.

 

확률시스템:

통계 기반 머신러닝에서는 베이즈 추론을 제외하고 동적 계획법 같은 배치 처리 최적화 기법을 이용할 때가 많았습니다. 이러한 최적화 기법을 이용하는 대상을 확정 시스템이라고 합니다.

 

정책과 강화 학습

보상은 상태와 행동을 기준으로 결정합니다.

강화 학습은 좋은 정책을 계속 채택하는 것이 목표이므로 "미래에 얻을 수 있는 보상의 기대치를 극대화하는 정책을 결정해 가는 것"으로 말할 수 있습니다.

 

보상과 가치 함수

할인 누적 보상 

도중 어떤 상태에서 누적 보상을 극대화하려고 미래의 상태와 행동을 평가하는 함수를 가치 함수라고 합니다.

 

상태 가치 함수

행동 가치 함수

행동 가치 함수를 최대화하는 함수를 최적 행동 가치 함수 라고 합니다.

 

벨멘 방정식

 

 

Q학습

 

그리디 방법: 탐욕 알고리즘이라고 하며 q값이 가장 높은 행동만을 선택합니다.

 

랜덤 방법: 무작위로 선택합니다.

 

03. 전이 학습 transfer learning 

도메인과 도메인 적용 

전이 학습 새로운 작업을 효율적으로 해결할려고 기존 작업에서 얻은 학습데이터와 학습 결과를 재사용하는 것입니다.

 

준 지도 학습과의 차이점

식별하려는 데이터와 지도 학습 데이터가 다른 분포를 따를 때 (실제로 많습니다) 가 있습니다. 이때 식별하려는 데이터의 일반화 성능을 향상시킬 때는 전이 학습을 이용하며 소수의 지도 학습 데이터와 다수의 라벨이 없는 데이터를 다룰 때는 준 지도 학습을 이용합니다.

 

멀티태스킹 학습 

원 도메인과 목표 도메인 사이에서 서로 지식을 보내고 받으면서 공통 부분의 지식을 향상시키는 방법

 

메타 학습 : " 학습 방법을 학습한다." 라고 설명할 수 있습니다.

 

04. 분산 인공지능

 

지능형 에이전트 

학습하는 능력을 얻은 프로그램은 환경을 인식해 스스로 행동을 결정할 수 있게 됩니다. 이 동작 주체를  지능형 에이전트 혹은 에이전트라고 합니다. 비록 장치 등의 실체 없이 정기적 /비정기적인 입력 구동으로 동작하는 소트트웨어 에이전트도 지능형 에이전트입니다.

 

칠판 모델

여러 개의 에이전트가 협업하는 작업에 대응할 때 기억 영역을 공유하는 것 

 

 

 

 

 

출처: 처음 배우는 인공지능

반응형
반응형

소스코드.py
0.00MB

01. 자율 학습

자율 학습

unsupervised learning: 정답 정보가 없는 상태에서 학습을 통해 모델을 만드는 것입니다.

 

클러스터 분석과 k-평균 알고리즘

01. 자율 학습

 

자율 학습

 

unsupervised learning: 정답 정보가 없는 상태에서 학습을 통해 모델을 만드는 것입니다.

 

클러스터 분석과 k-평균 알고리즘

클러스터 분석 cluster analysis: 자율학습의 대표적인 접근 방법

평면상에 그려져 있는 점들을 그룹으로 만듭니다.그룹으로 만들 때는 점들 사이가 어느 정도 떨어져 있는지를 지표로 삼습니다.

 

k-평균 알고리즘 과정

우선 전체를 k개의 그룹으로 나눕니다.

각 점에 무작위로 그룹을 할당한 다음 그룹 각각의 중심(보통은 무게 중심)과의 거리(유클리드 거리 등)를 계산합니다.

어떤 그룹에 속해 있는 점이 다른 그룹과 거리가 더 가깝다면 해당 점을 거리가 가까운 그룹으로 변경합니다.

이러한 작업을 반복해서 가까운 점끼리 묶어 k개의 그룹으로 나눕니다.

 

그룹의 중심점만 기준으로 삼다가 잘못된 그룹으로 할당할 수 있는 문제나 계산 시간이 길어지는 등의 문제가 있습니다.

최초에 정하는 k값은 감으로 결정할 때가 많지만 계산으로 구해서 결정할 수 도 있습니다.

k를 결정할 때는 혼합 디리클레 모델을 사용합니다.

혼합 디리클레 모델은 베이즈 모델 기반의 접근 방식으로 디리클레 분포가 다항분포의 결합 사전 분포라는 점을 이용합니다.

 

주성분 분석 principal component analysis

데이터 처리 방식

고차원의 데이터를 저차원으로 정리해 차원 압축(차원 감소)을 실행합니다.

주성분 분석 외에 고차원 데이터를 차원 압축하는 방법으로 t-SNE가 있습니다. t-SNE는 정규분포를 따르는 확률로 고차원 거리를 계산해 고차원으로 옮깁니다.

 

특잇값 분해: SVD

주성분을 분석할 때는 행렬로 데이터를 나타낸 후 공분산 행렬을 계산해 고윳갑솨 고유 벡터를 구합니다.

 

독립 성분 분석 Independent compositin analysis ICA : 통계 독립성을 극대화하는 예측 성분을 찾는 것

자기조직화지도 Self organization Map ,som : 자율학습의 출력 결과를 이용해 클러스터 분석한 것은 자기조직화의 연관이 커서 자기조직화지도라고 합니다.

 

 

02. 지도학습

정답 정보가 들어 있는 데이터를 기준으로 모델을 만드는 지도학습이라고 합니다. supervised Learning

 

서포트 백터 머신: support vector machine svm은 데이터 분포를 나누는 기준을 결정하는 지도학습모델중 하나입니다.

베이즈 필터와 단순 베이즈 분류 : 베이즈 정리는 학습과의 친화성이 높아 지도 학습 알고리즘에 이용합니다. 특히 베이즈 필터중에서 단순(나이브) 베이즈 분류 Naive Bayes Classification가 유명합니다.

베이즈 필터를 이용하는 대표적인 예는 스팸 메일 판정이나 문서의 카테고리 분류입니다.

 

ID3: 

정답 데이터를 이용해 결정 트리를 만드는 알고리즘의 하나가 ID3가 있습니다. ID3는 의사 결정 트리를 기반으로 모든 데이터를 제대로 분류할 때까지 노드를 추가합니다.

 

랜덤포레스트

서포트 백터 머신과 함께 데이터의 분포를 분류하는 유명한 방법은 랜덤포레스트입니다.

랜덤 프레스트는 무작위로 뽑은 데이터를 이용해 학습하면서 많은 결정 트리를 구축하며 의사 결정 트리를 만들 때 마다 결정 트리 구성을 약간씩 변화시킵니다.

 

타당성 검증 validation:

모델을 만들 때는 모델이 얼마나 정확한 결고를 계산하는지를 객관적으로 측정해야 합니다.

 

식별 모델의 평가와 ROC곡선

roc곡선 Receiver operating characteristic은 식별 모델의 성능을 평가하는 방법입니다.

 

홀드 아웃 검증과 교차 검증

홀드 아웃 검증 holdout method: 데이터를 훈련 데이터와 테스트 데이터를 사용하지 않는 검증 방법입니다.

k겹 교차 검증 k-fold croos-validation : 데이터를 K개의 그룹으로 나눈 후 그룹 하나를 제외한 나머지 데이터를 훈련 데이터로 설정합니다.

LOOCV(LEAVE-ONT-OUT CROSS -VALIDATION) :K켭 교차 검증에서 K가 데이터 개수와 같을 때를 뜻합니다. 데이터 수가 적을 때 사용합니다.

 

03. 텐서플로를 이용한 K-평균 예제

필요한 모델 불러오기

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

데이터 정의하기

num_dots = 1000
num_clusters = 3
num_epochs = 100

데이터 정의

dots = []
for i in range(num_dots):
    if np.random.random() > 0.66:
        dots.append([np.random.normal(0.0, 1.0) , np.random.normal(2.0, 0.5)])
    elif np.random.random() > 0.33:
        dots.append([np.random.normal(2.0, 1.3) , np.random.normal(-1.0, 0.6)])
    else:
        dots.append([np.random.normal(-1.0, 0.8) , np.random.normal(-2.0, 1.2)])

pandas 라이브러리를 이용해 좌표를 데이터 프레임 형태로 저장합니다.

df = pd.DataFrame({"x":[v[0] for v in dots] , "y":[v[1] for v in dots]})
df.head(10)

마지막으로 seaborn라이브러리를 이용해 데이터를 시각화 해봅니다.

sns.lmplot("x","y", data = df, fit_reg = False, size = 7)
plt.show()

시각화 결과

k-평균 그래프 생성하기

vectors = tf.constant(dots)
vectors.get_shape()

TensorShape([Dimension(1000), Dimension(2)])

 

tf.Variable 사용하여 무작위로 섞기

centroids = tf.Variable(tf.slice(tf.random_shuffle(vectors), [0,0] , [num_clusters, -1]))
centroids.get_shape()

TensorShape([Dimension(3), Dimension(2)])

 

차원

expanded_vectors = tf.expand_dims(vectors, 0)
expanded_centroids = tf.expand_dims(centroids, 1)

print(expanded_vectors.get_shape())
print(expanded_centroids.get_shape())

(1, 1000, 2)

(3, 1, 2)

distance = tf.reduce_sum(tf.square(tf.subtract(expanded_vectors, expanded_centroids)) , 2)
assignments = tf.argmin(distance, 0)
assignments.get_shape()

TensorShape([Dimension(1000)])

 

means = tf.concat([tf.reduce_mean(tf.gather(vectors, tf.reshape(tf.where(tf.equal(assignments,c)), [1,-1])),reduction_indices = [1])
    for c in range(num_clusters)],0)
centroids_updated = tf.assign(centroids, means)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(num_epochs):
        _, centroid_values, assignment_values = sess.run([centroids_updated, centroids, assignments])
print("중심점")
print(centroid_values)

시각화해 보여주기

data = {"x":[],"y":[],"cluster":[]}
for i in range(len(assignment_values)):
    data["x"].append(dots[i][0])
    data["y"].append(dots[i][1])
    data["cluster"].append(assignment_values[i])
df = pd.DataFrame(data)
sns.lmplot("x","y", data = df, fit_reg = False, size = 7, hue = "cluster", legend= False)
plt.show()

출처 : 처음 배우는 인공지능

반응형

+ Recent posts