라벨이 AI독학인 게시물 표시

추천 시스템(Recommend System)

이미지
 이번에 진행할 것은 추천 시스템이다. 추천 시스템의 경우 몇 가지 방법이 있다.  간략하게 설명하면 비슷한 유저를 찾아서 그 유저가 좋아했던 콘텐츠를 추천해 주거나 어느 한 유저가 어떤 콘텐츠를 봤을 때 각 콘텐츠의 유사도를 분석하고 비슷한 콘텐츠를 추천해주는 방식이 있다. 이번에는 후자의 방식을 코드와 함께 소개하고자 한다. 1. 추천 시스템의 설명  위의 그림이 매우 간단하게 추천 시스템을 표현하는 그림이다. 유저B는 유저 A와 유사하다고 할 수 있고 따라서 유저 B에게 콜라를 추천해 줄 수 있는 것이다. 또한 반대로 라면을 먹은 유저들 대부분은 삼각김밥을 먹었기 때문에 유저D에게 삼각김밥을 추천해 줄 수 있는 것이다.  2. 추천 시스템의 알고리즘 및 Task 그럼 추천 시스템에서 머신러닝이 하는 역할은 무엇일까? 바로 위의 표에서 빈 공간을 채우거나 새로운 무언가가 들어왔을 때 하는 것이 바로 추천 시스템에서 인공지능의 역할이다. 위처럼 비어있는 공간이나 아니면 전혀 새로운 유저나 콘텐츠가 들어왔을 경우 아무런 정보 없이 그 선호도를 파악하기 위해 행렬 분해를 사용하고 각각을 채운다. 이는 나중에 논문과 코드를 리뷰해보면서 더욱 자세히 알아보도록 하겠다.  3. 기본적인 협업 필터링 구현 코드 본격적인 인공지능을 이용한 추천 시스템을 하기 전에 기본적인 협업 필터링을 통한 추천 시스템을 구현해 보도록 하겠다. 가장 먼저 데이터를 구비한다. 데이터는 다음과 같이 movie, rating 두가지 파일이 있고 각각은 다음과 같은 형태를 띈다.  movie.csv 파일 rating.csv 파일 보다 싶이 나누어서 영화 이름, 아이디, 장르와 관객 정보, 점수 등이 표시되어 있다. 이제 우리는 이 자료를 가지고 한 사용자에게 다른 영화를 추천해주는 알고리즘을 짜볼 것이다.   일단 사용할 기본적인 라이브러리들과 데이터를 불러왔다.  import pandas as pd from sklearn....

CNN 이미지 분류 모델을 이용한 논문 리뷰.2

이미지
이전 포스트와 이어지는 포스트입니다.  기존 논문에서 3X3 필터 2개를 사용한 경우 5X5 필터와 비슷한 효과를 가지며 3X3 필터 3개를 사용하였을 경우 7X7 필터를 적용한 효과를 가진다. 라고 언급했다. 또한 비선형적인 측면에서 층이 깊어져서 더욱 풍부한 효과를 누릴 수 있다. 라고 언급하였다.  따라서 이전 포스팅에서 언급한 모듈을 이용하여 실험을 하였다. 각 결과는 다음과 같다.  1. 3X3 필터 2개의 경우 약 92%의 정확도를 보였다. 2. 5X5 필터 1개의 경우  약 88%의 정확도를 보였다. 3. 3X3 필터 3개의 경우 약 94%의 정확도를 보였다. 4. 7X7 필터의 경우  약 92%의 정확도를 보였다. 결론 기존의 논문에서 언급한 것처럼  3X3 필터가 층을 쌓으면 충분히 또는 그 이상의 효과를 내는 것을 확인하였다. 또한 더 적은 파라메터의 개수와 더 풍부하게 비선형성을 가진다는 장점 또한 있다고 할 수 있다. 하지만 파라메터 개수를 줄이는데만 급해 레이어를 대폭 늘리면 연산 속도가 느려질 수도 있다는 단점도 분명히 존재한다. 추가 실험 결과  5X5와 7X7 필터의 경우 패팅의 옵션에서 'SAME'(기존 크기 강제 유지)과 'VAILD'(유효한 부분만 정리) 중 VAILD가 더 나은것으로 반대로 3X3필터는 'SAME'이 더 정확도가 높게 나왔다. 이는 개인적인 추론이지만  1. 사진의 크기가 작아 고급 필터 적용시 남는 부분이 너무 많다. 2. 반대로 3X3 필터의 경우 패딩에 큰 상관이 없다. 3. 따라서 INPUT 크기에 따라 다르겠지만 고급 필터의 경우 'VAILD'가 작은 필터의 경우 'SAME'이 더욱 효과적일 것이라 생각한다.

CNN 이미지 분류 모델을 이용한 논문 리뷰.1

이미지
 이번 포스트는 저번에 리뷰한 ' Very Deep Convolutional Networks For Large-Scale Image Recognition' 논문을 직접 코드를 짜서 실험해 본것이다.   들어가기 전에 정리하면  1. 합성곱 신경망으로 3*3 필터 3개 VS 7*7 필터 1개와 3*3필터 2개 VS 5*5 필터를 비교한다. 2. 기존 논문과 다르게 매우 깊게 구현하지는 않았다. 그냥 필터의 성능 시험이다. 3. 기존 논문과 다른 점은 Building과 Glacier 이미지 두개를 분류하는 사실상 이진 분류 문제이다. 따라서 Softmax가 아닌 sigmoid 함수를 출력 함수로 사용했으며 loss function 역시 binary-crossentropy이다. 데이터 셋은 여기서 가져왔다. https://www.kaggle.com/puneet6060/intel-image-classification 그럼 먼저 코드를 리뷰해 보도록 하겠다. 일단 사용한 라이브러리들은 다음과 같다. import os import numpy as np from tqdm import tqdm from PIL import Image from keras.preprocessing import image from keras.models import Sequential from keras.layers import Conv2D , MaxPooling2D , Dense , Flatten , Dropout 기본적인 numpy, os, keras등을 임포트 한다. 그 외에 tqdm의 경우 작업 진행량을 표시하기 위해 임포트 하였다. 데이터의 경우를 보면  학습 데이터가 각 파일별로 다음과 같이 정리가 되어있다. 이제 가장 먼저 데이터를 불러오고 각각의 전처리를 하겠다. traindir = "data/seg_test/buildings" dir = os.listdir(traindir) 위와 같이 ...

[논문리뷰] 4. 심층 CNN에 대하여

이미지
논문명:  Very Deep Convolutional Networks for Large-Scale Image Recognition 논문저자: Karen Simonyan & Andrew Zisseman 1. 개요: 이논문은 제목 그대로이다. '깊은' 합성곱 신경망이 얕고 '고급진' 신경망과의 비교를 주로 삼았다고 생각하면 된다.  2. 실험 개요: 전체적인 실험의 조건은 다음과 같았다. 1. 활성화 함수로는 ReLU를 사용 2. 출력 함수로는 Softmax를 사용 3. 224*224 크기의 컬러 이미지를 사용 4. 완전 연결 계층 3개를 사용  본 실험은 위의 표에서 보다 싶이 A~E까지의 경우로 나누어서 실험을 진행했다.  A부터 E는 각 11개~19개의 층을 가지며 완전연결 계층을 제외할 경우 각 8~16개의 합성곱 층을 가지게 된다.  그럼 각각의 경우를 확인해보겠다. A: 가장 얕은 신경망으로 3*3필터가 적용된 층이 총 8개가 존재하며 특이사항은 없다. A-LRN: 전체적인 구성은 동일하지만 LRN, 즉 정규화를 적용하였다. B: A와 비슷하지만 3*3층이 2개 더 추가되었다. C: B에 3개의 층이 추가되었는데 이때 추가된 층의 필터는 3*3이 아닌 1*1필터이다. D: C와 비슷하지만 추가된 층의 필터가 3*3이다. E: D에 3*3필터를 3개를 추가하였다. 그리고 각 경우의 변수는 다음과 같다.   특징으로는 B,C,D를 확인할 수 있는데 B,C는 층이 3개나 차이나지만 변수의 숫자는 크게 차이가 없고 반대로 C,D는 층의 갯수는 동일하지만 변수의 숫자가 차이나는 것을 볼 수 있다. 3. 실험 진행: 실험은 다음과 같이 진행되었다.  1. 확률적 경사하강법을 이용 2. 무작위로 Shift 진행 3. 등방적으로 리스케일링 되기도 함(Q라는 변수)  3.1 Scale Jittering이라는 이름으로 사용됨 4. 다중 GPU를 통한 병렬적 처리  4. 실험 결과...

[논문리뷰] 3. CNN에 대하여

이미지
논문명: Going Deeper with Convolutions 논문저자: Christian Szegedy 외 다수  개요: 전체적으로는 기존의 CNN뿐만 아니라 사실상 모든 기계학습에서 나타나는 문제점인 '층을 깊게하여 학습할 경우 생기는 문제'에 대해 해결책을 제시하면서도 성능을 향상시킨 그런 논문이다.   1. 기존 구조의 문제점 기존의 구조에서는 학습의 깊이를 더욱 깊게 하기 위해 층을 늘리는 방식으로 진행한다. 하지만 층을 늘릴수록 계산해야하는 파라미터의 개수가 기하급수적으로 늘어난다.  위의 예시 표와 같이 매우 간단한 148*148 형태의 input이 단 3개의 계층만 거쳐도 147584개의 파라미터가 필요하게 된다. 그럼 만일 더 큰 형태로 수많은 층을 구현한다고 하면 엄청난 수의 파라미터가 필요할 것이고 이는 CPU,GPU가 발달한 현재에서도 쉽지 않은 일이다.  또한 단순하게 심층 구조를 이용할 경우 위의 파라미터의 과한 갯수와 맞물려 오버피팅이 일어나기 쉽다는 특성을 가지고 있다.  그리고 본 논문에서는 이에 대한 해답으로 희소구조 + 완전 연결 계층의 사용을 언급한다. (희소구조란? 조밀한 구조의 반대로 실제로 사용되지 않는(무언가를 표현하지 않는 데이터가 대부분인)데이터가 많은 데이터 구조를 이야기 한다.  예시로 희소행렬은  0     0     1     0     5     0        0     0     0     0     0     0     0     0     0     0     0     1     0 ...

[논문리뷰] 2.NIN 신경망 구조

이미지
논문명: Network In Network 논문저자: Min Lin 외 2명 개요  본 논문의 전체적인 내용은 CNN(합성곱 신경망)의 단점과 그것의 보완점을 제시한다. 1. 논문에서 제시된 기존 CNN 구조의 문제점 본 논문에서 제시된 기존 CNN 구조의 문제점은 크게 2가지이다. 첫째  컨볼루션(convolution) 레이어에서는 기존의 입력값을 특징 맵으로 변환하는 과정을 거친다. ㄷ이때 기존의 CNN구조에서는 선형적으로 변환을 진행한다. 선형적으로만 변환을 진행하면 당연히 비선형적 연산에 비해 정확도가 떨어 질 수 밖에 없다. 따라서 본 논문에서는 이를 보완하기 위한 방법으로 다증퍼셉트론(MLP)를 도입했다. 구조는 다음과 같다. 위와 같은 구조를 통해 기존의 선형 연산이였던 것을 비선형 연산을 통해 정확도를 높인것을 본 논문에서는 MLPconvolutional Layer 라고 칭하며 이 Layer들이 쌓여있는 것이 NIN(Network in Network)구조이다.  둘째  마지막 출력 부분(또는 레이어)에서 완전연결 계층의 문제점이다. 가장 큰 문제는 CNN자체가 입체적인 데이터를 다루는데 이런식으로 연결되면 입체적인 INPUT과 거리감이 생긴다는 것이고 다음으로는 완전연결 계층 그 자체의 문제인 Overfitting 문제가 있다. 따라서 본 논문에서는 Global Average Pooling 이라는 레이어를 사용했다.  간략히 설명하면 마지막 출력부분에서 완전연결 계층을 대신해 각각의 Classification에 사용될 category를 특성맵으로 만들고 전부 평균을 내어 softmax함수에 집어 넣어 출력하는 방식으로 진행했다. 구조를 보면 다음과 같다.  위에 보다 싶이 완전연결계층이 아닌 각각의 특성 맵을 만들어 이를 softmax함수에 넣는 것을 볼 수 있다. 이를 통해 좀 더 입력값에 건장해지고 더해서 오버피팅을 방지할수 있다는 장점이 있다.  총 구조  총 구조는 다음...

Mecab과 Keras를 이용한 뉴스 말뭉치 구분 모델 구현.2 (NLP)

 1. 기존 포스트 정리 1.1 국립국어원에서 내려받은 말뭉치가 Json 형태로 구성되어있어 따로 접근을 시도했다. 1.2 따로 학습을 시도하기보다는 라벨링 하나하나를 위해 데이터와 라벨링을 한번에 학습했다.  1.3 데이터 전처리는 케라스에서 제공하는 모듈들을 이용했다. 2.데이터 전처리  tokenizerr.fit_on_texts(topics) topic_train = tokenizerr.texts_to_sequences(topics) tokenizerr.fit_on_texts(newtext) textdata_train = tokenizerr.texts_to_sequences(newtext) fit_on_texts와 texts_to_sequences는 단어를 하나의 정수와 연결해 딥러닝에 사용될 수 있도록 해준다. 여기서는 각 말뭉치를 형태소 분석기로 분해한 본문과 주제를 하나하나의 정수와 매칭시켰고 확인 결과 약 1000개의 단어 종류를 확인할 수 있었다.  textdata_train = pad_sequences(textdata_train , maxlen = 170 ) topic_train = pad_sequences(topic_train , maxlen = 1 ) 여기서는 전체 길이를 맞춤과 동시에 빈자리를 Null 채우지 않기 위해 Padding하는 작업이다. 작업하는 방법으로는 pad_sequences를 이용하였다. maxlen는 기존의 본문을 분석한 결과 약 150~170단어 사이로 하나의 본문이 이루워져 있었고 따라서 최대 길이를 170으로 맞추어 Padding했다. 토픽(주제)은 하나의 정수로 이루어져 있었기에 1로 맞추었다. 3.모델 구현 model = Sequential() model.add(Embedding( 1000 , 128 )) model.add(LSTM( 128 )) model.add(Dense( 10 , activation = 'softmax' )) 일단 모델의 임베딩 레이어의 크기를 설정했다 임...

Mecab과 Keras를 이용한 뉴스 말뭉치 구분 모델 구현.1 (NLP)

이미지
AI의 지도학습에는 크게 두 가지가 있다. 바로 분류(Classification)와 회귀(Regression)이다. 간략하게 설명하자면 들어온 input 자료들을 일정 기준으로 나누는 건 분류 들어온 자료들을 통해 다음 데이터를 예측하는 방식을 회귀라고 생각하면 편하다. 그리고 이번 포스트에서는 뉴스 말뭉치(말 자료들)을 이용하여 뉴스가 어느 분류에 속하는지에 분류하는 모델을 구현해 보겠다.  모델의 구현에 들어가기 전 미리 알아두어야 할 것들을 먼저 소개하겠다. 1. LSTM, RNN에 대하여    https://soobarkbar.tistory.com/74 본 포스팅에서 사용할 것은 LSTM 모델이다. 기존의 신경망의 단점을 보완한 것이라고 생각하면 편하다. 위의 블로그를 방문해서 공부하는 것을 추천한다. 2. Mecab 우리말 형태소 분석기 (은전한닢) http://eunjeon.blogspot.com/ 은전한잎이라는 우리말 형태소 분석기다. konlpy 기반으로 제작되었다고 하며 형태소 단위로 분류하는 것이 가능하게 만들어 준다. 다양한 종류의 분석기 중 은전한잎을 사용하겠다. 설치방법, 파일등은 위 사이트를 이용하기 바란다. 3. 케라스 API https://keras.io/api/ 본 포스팅에서 사용될 API들이다. 미리 학습하면 포스팅을 이해하는데 큰 도움이 된다. 4. 자연어 처리  https://www.sas.com/ko_kr/insights/analytics/what-is-natural-language-processing-nlp.html 자연어 처리 (NLP)에 대한 내용이다.  본 모델의 이야기이기 때문에 기본적으로 알아야 하는 내용들이다. 5. 감성분류 예제 (추가학습)  https://wikidocs.net/44249 네이버 영화 리뷰를 긍정:1 부정:0 으로 라벨링한 데이터를 이용해 학습을 진행하고 구현하는 방법을 알려주는 블로그 포스트이다. 이번 포스트와 많은 차이가 있지만...

[논문리뷰] 1. Deep CNN을 이용한 이미지 Classification

이미지
논문명: ImageNet Classification with Deep Convolutional Neural Networks 저자: Alex Krizhevsky 외 2명 1. 개요  위 논문은 9장 정도 되는 길지는 않은 논문이지만 딥러닝 분야에서 CNN(합성곱 신경망)을 획기적으로 발전시킨 전설적인 논문이다. 이미지 인식 딥러닝의 기초를 쌓았고 더 이상 딥러닝을 연구실이 아닌 생활까지 가져오게 한 일등 공신이라고 할 수 있다.  여기서 만들어진 Alex Net이라고도 불리는 이 구조와 GPU연동은 현재까지도 딥러닝에 광범위 하게 사용되고 있다.  2. 리뷰 일단 시작은 이렇다. 기본적으로 CNN은 연산 처리량이 어마어마하고 결점투성이였다. 실제로도 오차가 심해 일상생활에 적용하기는 어려운 수준이였다. 그래서 연구팀은 이런 점을 보완하기 위해 몇가지 시도를 한다. 2.1 실험 환경 기본적으로 실험을 진행한 환경에 대해 먼저 이야기 해 보겠다.  실험 데이터는 다음과 같다. ILSVRC(이미지 인식 대회)에서 2010년, 2012년 자료를 가져와 인식시켰다.  IMGNET라는 이미지 데이터베이스에는 총 1500만개의 이미지가 있었으며 2만2천개의 카테고리가 존재했는데 그 중 120만개의 학습용 이미지 5000개의 확인용 이미지 그리고 15만개의 테스팅용 이미지를 가져와 학습을 진행했다.  각각의 이미지는 256*256의 사이즈로 변환시켜 학습을 진행했으며 컬러(RGB)값 역시 학습했다. 학습에는  1. 기존 포스트에 리뷰되었던 ReLU함수를 사용했다. 기존까지는 tanh나 시그모이드 함수등을 사용했으며 보완을 위해 몇몇 시도를 하던 중이었다. 그리고 이 연구팀이 처음으로 ReLU함수를 실제로 사용했다. 2. GPU(그래픽카드)를 사용했다. 기본적으로 CNN의 연산량 자체가 많은데 엄청난 양의 데이터와 후술할 수천만개의 변수(가중치)를 설정하려면 엄청난 메모리와 연산 기능이 필요했다. 따라서 연구팀은 CP...

오버피팅

 머신러닝을 진행하다보면 후년데이터에 너무 적응해 그외에 시험 데이터는 좋지 못한 정답을 보여주는 경우가 있는데 이걸 오버피팅이라고 말합니다. 이번 포스팅에서는 그런 오버피팅을 해결하는 몇가지 방법을 알아보겠습니다. 1. 가중치 감소(weight decay)  큰 가중치는 큰 영향을 미치며 이는 오버피팅으로 들어갈 확률이 높아집니다. 그래서 우리는 이런 가중치에 크기에 비례하는 패널티를 부과하는 방식으로 오버피팅을 방지할 수 있는데 이를 가중치 감소라고 합니다. 가중치 감소에서는 가중치의 양만큼 소실함수에 더해주는 방식으로 진행됩니다. 이러면 손실함수를 최소로 유지하려는 머신러닝의 목적과 가중치가 증가되는 가중치 감소의 메커니즘이 서로 상쇄되면서 가중치를 적당한 값으로 유지하고 이는 오버피팅을 막을 수 있습니다.  2. 드롭아웃(Dropout) 가중치가 분명히 중요한 역할을 하는 것은 맞습니다만 신경망 모델이 복잡해지면 복잡해질 수록 가중치 감소만으로는 점점 대응하기 어려워집니다. 이럴 경우 사용하는 방법이 바로 드롭아웃입니다. 드롭아웃은 말 그대로 복잡한 신경망에서 몇몇 노드를 인위적으로 드롭아웃(제외)시키는 방법으로 오버피팅을 방지한다.  보통 구현은 순전파시 삭제할 뉴런의 값을 false로 표기하고 사용하는 방법을 이용하고 역전파시에도 동일하게 적용한다.